Commit 4d802cc6 authored by Tanmoy Mollik's avatar Tanmoy Mollik Committed by Commit Bot

[Android] Add SyncOffPreference in ManageSyncSettings page

This cl adds the SyncOffPreference in the ManageSyncSettings page. It
also adds "Advanced" category after the Preference. The preference is
only shown after the user has signed in. So it is not shown in the
advanced sync consent flow.
The code for ClearDataProgressDialog from AccountManagementFragment
is reused here.

Bug: 1092410
Change-Id: I0b70ad5cfc32d4c8325680f9929aaae6ccfca65f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2273193
Commit-Queue: Tanmoy Mollik <triploblastic@chromium.org>
Reviewed-by: default avatarBoris Sazonov <bsazonov@chromium.org>
Cr-Commit-Position: refs/heads/master@{#795840}
parent 925755b2
...@@ -53,6 +53,15 @@ ...@@ -53,6 +53,15 @@
android:title="@string/sync_settings" android:title="@string/sync_settings"
android:persistent="false"/> android:persistent="false"/>
<org.chromium.chrome.browser.sync.settings.SyncOffPreference
android:key="turn_off_sync"
app:isPreferenceVisible="false"/>
<PreferenceCategory
android:key="advanced_category"
android:title="@string/prefs_section_advanced"
app:isPreferenceVisible="false"/>
<org.chromium.components.browser_ui.settings.ChromeBasePreference <org.chromium.components.browser_ui.settings.ChromeBasePreference
android:key="google_activity_controls" android:key="google_activity_controls"
android:title="@string/sign_in_google_activity_controls_title" android:title="@string/sign_in_google_activity_controls_title"
......
...@@ -40,9 +40,13 @@ import org.chromium.chrome.browser.autofill.PersonalDataManager; ...@@ -40,9 +40,13 @@ import org.chromium.chrome.browser.autofill.PersonalDataManager;
import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.help.HelpAndFeedback; import org.chromium.chrome.browser.help.HelpAndFeedback;
import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.profiles.ProfileAccountManagementMetrics;
import org.chromium.chrome.browser.settings.ChromeManagedPreferenceDelegate; import org.chromium.chrome.browser.settings.ChromeManagedPreferenceDelegate;
import org.chromium.chrome.browser.settings.SettingsActivity; import org.chromium.chrome.browser.settings.SettingsActivity;
import org.chromium.chrome.browser.signin.IdentityServicesProvider; import org.chromium.chrome.browser.signin.IdentityServicesProvider;
import org.chromium.chrome.browser.signin.SignOutDialogFragment;
import org.chromium.chrome.browser.signin.SigninManager;
import org.chromium.chrome.browser.signin.SigninUtils;
import org.chromium.chrome.browser.signin.UnifiedConsentServiceBridge; import org.chromium.chrome.browser.signin.UnifiedConsentServiceBridge;
import org.chromium.chrome.browser.sync.ProfileSyncService; import org.chromium.chrome.browser.sync.ProfileSyncService;
import org.chromium.chrome.browser.sync.TrustedVaultClient; import org.chromium.chrome.browser.sync.TrustedVaultClient;
...@@ -51,8 +55,10 @@ import org.chromium.chrome.browser.sync.ui.PassphraseDialogFragment; ...@@ -51,8 +55,10 @@ import org.chromium.chrome.browser.sync.ui.PassphraseDialogFragment;
import org.chromium.chrome.browser.sync.ui.PassphraseTypeDialogFragment; import org.chromium.chrome.browser.sync.ui.PassphraseTypeDialogFragment;
import org.chromium.components.browser_ui.settings.ChromeSwitchPreference; import org.chromium.components.browser_ui.settings.ChromeSwitchPreference;
import org.chromium.components.browser_ui.settings.SettingsUtils; import org.chromium.components.browser_ui.settings.SettingsUtils;
import org.chromium.components.signin.GAIAServiceType;
import org.chromium.components.signin.base.CoreAccountInfo; import org.chromium.components.signin.base.CoreAccountInfo;
import org.chromium.components.signin.identitymanager.ConsentLevel; import org.chromium.components.signin.identitymanager.ConsentLevel;
import org.chromium.components.signin.metrics.SignoutReason;
import org.chromium.components.sync.ModelType; import org.chromium.components.sync.ModelType;
import org.chromium.components.sync.PassphraseType; import org.chromium.components.sync.PassphraseType;
import org.chromium.content_public.browser.UiThreadTaskTraits; import org.chromium.content_public.browser.UiThreadTaskTraits;
...@@ -69,9 +75,12 @@ public class ManageSyncSettings extends PreferenceFragmentCompat ...@@ -69,9 +75,12 @@ public class ManageSyncSettings extends PreferenceFragmentCompat
implements PassphraseDialogFragment.Listener, PassphraseCreationDialogFragment.Listener, implements PassphraseDialogFragment.Listener, PassphraseCreationDialogFragment.Listener,
PassphraseTypeDialogFragment.Listener, Preference.OnPreferenceChangeListener, PassphraseTypeDialogFragment.Listener, Preference.OnPreferenceChangeListener,
ProfileSyncService.SyncStateChangedListener, ProfileSyncService.SyncStateChangedListener,
SettingsActivity.OnBackPressedListener { SettingsActivity.OnBackPressedListener,
SignOutDialogFragment.SignOutDialogListener {
private static final String IS_FROM_SIGNIN_SCREEN = "ManageSyncSettings.isFromSigninScreen"; private static final String IS_FROM_SIGNIN_SCREEN = "ManageSyncSettings.isFromSigninScreen";
private static final String FRAGMENT_CANCEL_SYNC = "cancel_sync_dialog"; private static final String FRAGMENT_CANCEL_SYNC = "cancel_sync_dialog";
private static final String CLEAR_DATA_PROGRESS_DIALOG_TAG = "clear_data_progress";
private static final String SIGN_OUT_DIALOG_TAG = "sign_out_dialog_tag";
@VisibleForTesting @VisibleForTesting
public static final String FRAGMENT_ENTER_PASSPHRASE = "enter_password"; public static final String FRAGMENT_ENTER_PASSPHRASE = "enter_password";
...@@ -99,6 +108,9 @@ public class ManageSyncSettings extends PreferenceFragmentCompat ...@@ -99,6 +108,9 @@ public class ManageSyncSettings extends PreferenceFragmentCompat
@VisibleForTesting @VisibleForTesting
public static final String PREF_SYNC_SETTINGS = "sync_settings"; public static final String PREF_SYNC_SETTINGS = "sync_settings";
@VisibleForTesting @VisibleForTesting
public static final String PREF_TURN_OFF_SYNC = "turn_off_sync";
private static final String PREF_ADVANCED_CATEGORY = "advanced_category";
@VisibleForTesting
public static final String PREF_GOOGLE_ACTIVITY_CONTROLS = "google_activity_controls"; public static final String PREF_GOOGLE_ACTIVITY_CONTROLS = "google_activity_controls";
@VisibleForTesting @VisibleForTesting
public static final String PREF_ENCRYPTION = "encryption"; public static final String PREF_ENCRYPTION = "encryption";
...@@ -125,6 +137,7 @@ public class ManageSyncSettings extends PreferenceFragmentCompat ...@@ -125,6 +137,7 @@ public class ManageSyncSettings extends PreferenceFragmentCompat
private CheckBoxPreference mSyncPasswords; private CheckBoxPreference mSyncPasswords;
private CheckBoxPreference mSyncRecentTabs; private CheckBoxPreference mSyncRecentTabs;
private CheckBoxPreference mSyncSettings; private CheckBoxPreference mSyncSettings;
private SyncOffPreference mTurnOffSync;
// Contains preferences for all sync data types. // Contains preferences for all sync data types.
private CheckBoxPreference[] mSyncTypePreferences; private CheckBoxPreference[] mSyncTypePreferences;
...@@ -172,6 +185,14 @@ public class ManageSyncSettings extends PreferenceFragmentCompat ...@@ -172,6 +185,14 @@ public class ManageSyncSettings extends PreferenceFragmentCompat
mSyncRecentTabs = (CheckBoxPreference) findPreference(PREF_SYNC_RECENT_TABS); mSyncRecentTabs = (CheckBoxPreference) findPreference(PREF_SYNC_RECENT_TABS);
mSyncSettings = (CheckBoxPreference) findPreference(PREF_SYNC_SETTINGS); mSyncSettings = (CheckBoxPreference) findPreference(PREF_SYNC_SETTINGS);
mTurnOffSync = (SyncOffPreference) findPreference(PREF_TURN_OFF_SYNC);
if (ChromeFeatureList.isEnabled(ChromeFeatureList.MOBILE_IDENTITY_CONSISTENCY)
&& !mIsFromSigninScreen) {
mTurnOffSync.setVisible(true);
findPreference(PREF_ADVANCED_CATEGORY).setVisible(true);
}
mGoogleActivityControls = findPreference(PREF_GOOGLE_ACTIVITY_CONTROLS); mGoogleActivityControls = findPreference(PREF_GOOGLE_ACTIVITY_CONTROLS);
mSyncEncryption = findPreference(PREF_ENCRYPTION); mSyncEncryption = findPreference(PREF_ENCRYPTION);
mSyncEncryption.setOnPreferenceClickListener( mSyncEncryption.setOnPreferenceClickListener(
...@@ -292,6 +313,27 @@ public class ManageSyncSettings extends PreferenceFragmentCompat ...@@ -292,6 +313,27 @@ public class ManageSyncSettings extends PreferenceFragmentCompat
return true; return true;
} }
@Override
public void onDisplayPreferenceDialog(Preference preference) {
if (preference instanceof SyncOffPreference) {
if (!IdentityServicesProvider.get()
.getIdentityManager(Profile.getLastUsedRegularProfile())
.hasPrimaryAccount()) {
return;
}
SigninUtils.logEvent(ProfileAccountManagementMetrics.TOGGLE_SIGNOUT,
GAIAServiceType.GAIA_SERVICE_TYPE_NONE);
SignOutDialogFragment signOutFragment =
SignOutDialogFragment.create(GAIAServiceType.GAIA_SERVICE_TYPE_NONE);
signOutFragment.setTargetFragment(this, 0);
signOutFragment.show(getParentFragmentManager(), SIGN_OUT_DIALOG_TAG);
return;
}
super.onDisplayPreferenceDialog(preference);
}
/** /**
* ProfileSyncService.SyncStateChangedListener implementation, listens to sync state changes. * ProfileSyncService.SyncStateChangedListener implementation, listens to sync state changes.
* *
...@@ -656,4 +698,29 @@ public class ManageSyncSettings extends PreferenceFragmentCompat ...@@ -656,4 +698,29 @@ public class ManageSyncSettings extends PreferenceFragmentCompat
fragment.cancelSync(); fragment.cancelSync();
} }
} }
// SignOutDialogListener implementation:
@Override
public void onSignOutClicked(boolean forceWipeUserData) {
// In case sign-out happened while the dialog was displayed, we guard the sign out so
// we do not hit a native crash.
if (!IdentityServicesProvider.get().getIdentityManager().hasPrimaryAccount()) return;
final DialogFragment clearDataProgressDialog = new ClearDataProgressDialog();
IdentityServicesProvider.get().getSigninManager().signOut(
SignoutReason.USER_CLICKED_SIGNOUT_SETTINGS, new SigninManager.SignOutCallback() {
@Override
public void preWipeData() {
clearDataProgressDialog.show(
getChildFragmentManager(), CLEAR_DATA_PROGRESS_DIALOG_TAG);
}
@Override
public void signOutComplete() {
if (clearDataProgressDialog.isAdded()) {
clearDataProgressDialog.dismissAllowingStateLoss();
}
}
}, forceWipeUserData);
}
} }
...@@ -4,6 +4,12 @@ ...@@ -4,6 +4,12 @@
package org.chromium.chrome.browser.sync; package org.chromium.chrome.browser.sync;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.matcher.RootMatchers.isDialog;
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
import static androidx.test.espresso.matcher.ViewMatchers.withText;
import android.app.Dialog; import android.app.Dialog;
import android.support.test.InstrumentationRegistry; import android.support.test.InstrumentationRegistry;
import android.widget.Button; import android.widget.Button;
...@@ -213,6 +219,26 @@ public class ManageSyncSettingsTest { ...@@ -213,6 +219,26 @@ public class ManageSyncSettingsTest {
Assert.assertTrue(SyncTestUtil.isSyncRequested()); Assert.assertTrue(SyncTestUtil.isSyncRequested());
} }
@Test
@LargeTest
@Feature({"Sync"})
@Features.EnableFeatures(ChromeFeatureList.MOBILE_IDENTITY_CONSISTENCY)
public void testPressingTurnOffSyncAndSignOutShowsSignOutDialog() {
mSyncTestRule.setUpAccountAndSignInForTesting();
mSyncTestRule.setChosenDataTypes(true, null);
mSyncTestRule.startSync();
ManageSyncSettings fragment = startManageSyncPreferences();
Preference turnOffSyncPreference =
fragment.findPreference(ManageSyncSettings.PREF_TURN_OFF_SYNC);
Assert.assertTrue("Turn off sync and sign out button should be shown",
turnOffSyncPreference.isVisible());
TestThreadUtils.runOnUiThreadBlocking(
fragment.findPreference(ManageSyncSettings.PREF_TURN_OFF_SYNC)::performClick);
InstrumentationRegistry.getInstrumentation().waitForIdleSync();
onView(withText(R.string.signout_title)).inRoot(isDialog()).check(matches(isDisplayed()));
}
@Test @Test
@SmallTest @SmallTest
@Feature({"Sync"}) @Feature({"Sync"})
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment