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