Mholloway has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/358488 )

Change subject: Delete remote reading list data when user disables syncing
......................................................................

Delete remote reading list data when user disables syncing

Bug: T167311
Change-Id: Ia57c829669512d0324533226c3fae56888292ac5
---
M app/src/main/java/org/wikipedia/readinglist/sync/ReadingListSynchronizer.java
M app/src/main/java/org/wikipedia/settings/Prefs.java
M app/src/main/java/org/wikipedia/settings/SettingsPreferenceLoader.java
M app/src/main/res/values-qq/strings.xml
M app/src/main/res/values/preference_keys.xml
M app/src/main/res/values/strings.xml
6 files changed, 126 insertions(+), 16 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia 
refs/changes/88/358488/1

diff --git 
a/app/src/main/java/org/wikipedia/readinglist/sync/ReadingListSynchronizer.java 
b/app/src/main/java/org/wikipedia/readinglist/sync/ReadingListSynchronizer.java
index e741175..bc44678 100644
--- 
a/app/src/main/java/org/wikipedia/readinglist/sync/ReadingListSynchronizer.java
+++ 
b/app/src/main/java/org/wikipedia/readinglist/sync/ReadingListSynchronizer.java
@@ -54,14 +54,14 @@
     }
 
     public void sync() {
-        // TODO: remove when ready for beta/production
-        if (!ReleaseUtil.isPreBetaRelease()) {
+        if (!ReleaseUtil.isPreBetaRelease()  // TODO: remove when ready for 
beta/production
+                || !User.isLoggedIn()
+                || !isReadingListSyncEnabled()) {
             syncSavedPages();
-            return;
-        }
-        if (!User.isLoggedIn() || !isReadingListSyncEnabled()) {
-            L.d("Skipping sync of reading lists.");
-            syncSavedPages();
+            if (Prefs.isReadingListsRemoteDeletePending()) {
+                deleteRemoteReadingLists();
+            }
+            L.d("Skipped sync of reading lists.");
             return;
         }
         CallbackTask.execute(new CallbackTask.Task<Void>() {
@@ -113,6 +113,23 @@
         WikipediaApp.getInstance().startService(new 
Intent(WikipediaApp.getInstance(), SavedPageSyncService.class));
     }
 
+    public void deleteRemoteReadingLists() {
+        CallbackTask.execute(new CallbackTask.Task<Void>() {
+            @Override public Void execute() throws Throwable {
+                UserOptionDataClientSingleton.instance().post(new 
UserOption(READING_LISTS_SYNC_OPTION, null));
+                return null;
+            }
+        }, new CallbackTask.Callback<Void>() {
+            @Override public void success(Void result) {
+                L.i("Remote reading lists deleted");
+                Prefs.setReadingListsRemoteDeletePending(false);
+            }
+            @Override public void failure(Throwable caught) {
+                Prefs.setReadingListsRemoteDeletePending(true);
+            }
+        });
+    }
+
     private class SyncRunnable implements Runnable {
         @Override
         public void run() {
diff --git a/app/src/main/java/org/wikipedia/settings/Prefs.java 
b/app/src/main/java/org/wikipedia/settings/Prefs.java
index 411fe49..5771afa 100644
--- a/app/src/main/java/org/wikipedia/settings/Prefs.java
+++ b/app/src/main/java/org/wikipedia/settings/Prefs.java
@@ -488,5 +488,17 @@
         return getBoolean(R.string.preference_key_sync_reading_lists, true);
     }
 
+    public static void setReadingListSyncEnabled(boolean enabled) {
+        setBoolean(R.string.preference_key_sync_reading_lists, enabled);
+    }
+
+    public static boolean isReadingListsRemoteDeletePending() {
+        return 
getBoolean(R.string.preference_key_reading_lists_remote_delete_pending, false);
+    }
+
+    public static void setReadingListsRemoteDeletePending(boolean pending) {
+        
setBoolean(R.string.preference_key_reading_lists_remote_delete_pending, 
pending);
+    }
+
     private Prefs() { }
 }
diff --git 
a/app/src/main/java/org/wikipedia/settings/SettingsPreferenceLoader.java 
b/app/src/main/java/org/wikipedia/settings/SettingsPreferenceLoader.java
index 7b1fa12..8d260e3 100644
--- a/app/src/main/java/org/wikipedia/settings/SettingsPreferenceLoader.java
+++ b/app/src/main/java/org/wikipedia/settings/SettingsPreferenceLoader.java
@@ -3,12 +3,17 @@
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.support.annotation.NonNull;
+import android.support.v7.app.AlertDialog;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceFragmentCompat;
+import android.support.v7.preference.SwitchPreferenceCompat;
+import android.widget.Toast;
 
 import org.wikipedia.BuildConfig;
 import org.wikipedia.R;
 import org.wikipedia.WikipediaApp;
+import org.wikipedia.concurrency.CallbackTask;
+import org.wikipedia.readinglist.sync.ReadingListSynchronizer;
 
 import static org.apache.commons.lang3.StringUtils.defaultString;
 
@@ -27,16 +32,11 @@
             loadPreferences(R.xml.preferences_zero);
 
             findPreference(R.string.preference_key_zero_interstitial)
-                    .setOnPreferenceChangeListener(new 
Preference.OnPreferenceChangeListener() {
-                @Override
-                public boolean onPreferenceChange(Preference preference, 
Object newValue) {
-                    if (newValue == Boolean.FALSE) {
-                        
WikipediaApp.getInstance().getWikipediaZeroHandler().getZeroFunnel().logExtLinkAlways();
-                    }
-                    return true;
-                }
-            });
+                    
.setOnPreferenceChangeListener(showZeroInterstitialListener);
         }
+
+        findPreference(R.string.preference_key_sync_reading_lists)
+                .setOnPreferenceChangeListener(syncReadingListsListener);
 
         loadPreferences(R.xml.preferences_about);
 
@@ -94,4 +94,80 @@
         Preference languagePref = 
findPreference(R.string.preference_key_language);
         
languagePref.setSummary(WikipediaApp.getInstance().getAppOrSystemLanguageLocalizedName());
     }
+
+    private Preference.OnPreferenceChangeListener showZeroInterstitialListener
+            = new Preference.OnPreferenceChangeListener() {
+        @Override
+        public boolean onPreferenceChange(Preference preference, Object 
newValue) {
+            if (newValue == Boolean.FALSE) {
+                
WikipediaApp.getInstance().getWikipediaZeroHandler().getZeroFunnel().logExtLinkAlways();
+            }
+            return true;
+        }
+    };
+
+    private Preference.OnPreferenceChangeListener syncReadingListsListener
+            = new Preference.OnPreferenceChangeListener() {
+        @Override public boolean onPreferenceChange(final Preference 
preference, Object newValue) {
+            final ReadingListSynchronizer synchronizer = 
ReadingListSynchronizer.instance();
+            if (newValue == Boolean.TRUE) {
+                ((SwitchPreferenceCompat) preference).setChecked(true);
+                Prefs.setReadingListSyncEnabled(true);
+                synchronizer.sync();
+            } else {
+                new AlertDialog.Builder(getActivity())
+                        
.setMessage(R.string.reading_lists_confirm_remote_delete)
+                        .setPositiveButton(R.string.yes, new 
DeleteRemoteListsYesListener(preference, synchronizer))
+                        .setNegativeButton(R.string.no, new 
DeleteRemoteListsNoListener(preference))
+                        .show();
+            }
+            // clicks are handled and preferences updated accordingly; don't 
pass the result through
+            return false;
+        }
+    };
+
+    private final class DeleteRemoteListsYesListener implements 
DialogInterface.OnClickListener {
+        private Preference preference;
+        private ReadingListSynchronizer synchronizer;
+
+        private DeleteRemoteListsYesListener(Preference preference, 
ReadingListSynchronizer synchronizer) {
+            this.preference = preference;
+            this.synchronizer = synchronizer;
+        }
+
+        @Override public void onClick(DialogInterface dialog, int which) {
+            ((SwitchPreferenceCompat) preference).setChecked(false);
+            Prefs.setReadingListSyncEnabled(false);
+            // Attempt a final sync, then delete the remotely stored lists
+            CallbackTask.execute(new CallbackTask.Task<Void>() {
+                @Override public Void execute() throws Throwable {
+                    synchronizer.sync();
+                    return null;
+                }
+            }, new CallbackTask.Callback<Void>() {
+                @Override public void success(Void result) {
+                    synchronizer.deleteRemoteReadingLists();
+                    Toast.makeText(getActivity(), 
R.string.reading_lists_remote_deleted,
+                            Toast.LENGTH_LONG).show();
+                }
+
+                @Override public void failure(Throwable caught) {
+                    synchronizer.deleteRemoteReadingLists();
+                }
+            });
+        }
+    }
+
+    private final class DeleteRemoteListsNoListener implements 
DialogInterface.OnClickListener {
+        private Preference preference;
+
+        private DeleteRemoteListsNoListener(Preference preference) {
+            this.preference = preference;
+        }
+
+        @Override public void onClick(DialogInterface dialog, int which) {
+            ((SwitchPreferenceCompat) preference).setChecked(true);
+            Prefs.setReadingListSyncEnabled(true);
+        }
+    }
 }
diff --git a/app/src/main/res/values-qq/strings.xml 
b/app/src/main/res/values-qq/strings.xml
index 6233904..653fc96 100644
--- a/app/src/main/res/values-qq/strings.xml
+++ b/app/src/main/res/values-qq/strings.xml
@@ -317,6 +317,8 @@
   <string name="reading_list_confirm_remove_article_from_offline">Label for a 
dialog button confirming that the user wants to remove the selected list from 
offline availability for all reading lists.</string>
   <string name="reading_list_confirm_remove_article_from_offline_title">Title 
for a dialog warning the user that the page the user has selected to remove 
from offline availability appears in multiple lists.</string>
   <string 
name="reading_list_confirm_remove_article_from_offline_message">Message for a 
dialog warning the user that the page the user has selected to remove from 
offline availability appears in multiple lists.  The names of the lists appear 
below.  The \"%s\" symbol is the title of the page of the user selected to 
remove.</string>
+  <string name="reading_lists_confirm_remote_delete">Warning message shown to 
a user to confirm that remotely stored reading list data used for syncing 
across devices should be deleted.</string>
+  <string name="reading_lists_remote_deleted">Message informing the user that 
remote reading list data was successfully deleted</string>
   <string name="user_option_sync_label">Checkbox title for Wikimedia account 
preference synchronization.\n{{Identical|Preferences}}</string>
   <string name="notification_button_view_user">Button label for navigating to 
the talk page of the user who is the agent of the notification.</string>
   <string name="notification_talk_title">Title for notification when the user 
receives a new message on their Talk page.</string>
diff --git a/app/src/main/res/values/preference_keys.xml 
b/app/src/main/res/values/preference_keys.xml
index 51b2b85..fd642ce 100644
--- a/app/src/main/res/values/preference_keys.xml
+++ b/app/src/main/res/values/preference_keys.xml
@@ -51,4 +51,5 @@
     <string 
name="preference_key_last_description_edit_time">lastDescriptionEditTime</string>
     <string 
name="preference_key_total_anon_descriptions_edited">totalAnonDescriptionsEdited</string>
     <string name="preference_key_sync_reading_lists">syncReadingLists</string>
+    <string 
name="preference_key_reading_lists_remote_delete_pending">readingListsRemoteDeletePending</string>
 </resources>
diff --git a/app/src/main/res/values/strings.xml 
b/app/src/main/res/values/strings.xml
index 33fff95..86ce47f 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -340,6 +340,8 @@
     <string name="reading_list_confirm_remove_article_from_offline">Remove 
from offline</string>
     <string 
name="reading_list_confirm_remove_article_from_offline_title">Article appears 
in multiple lists</string>
     <string name="reading_list_confirm_remove_article_from_offline_message">%s 
will no longer be available offline for all reading lists:</string>
+    <string name="reading_lists_confirm_remote_delete">This will delete any 
previously synced reading lists from remote storage. Proceed?</string>
+    <string name="reading_lists_remote_deleted">Remote reading lists data 
deleted</string>
     <!-- /Reading lists -->
 
     <!-- User options -->

-- 
To view, visit https://gerrit.wikimedia.org/r/358488
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ia57c829669512d0324533226c3fae56888292ac5
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Mholloway <mhollo...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to