From 0030d78b623af4407d38d611ca9da3b9880563c9 Mon Sep 17 00:00:00 2001 From: Sunny Shao Date: Mon, 16 Mar 2020 22:16:33 +0800 Subject: [PATCH] Disable the sync now menu while no any synced item - Check the number of the switch on for all SyncStateSwitchPreferences to enable/disable the sync now menu item. Fixes: 147030748 Test: make RunSettingsRoboTests -j ROBOTEST_FILTER=com.android.settings.accounts Change-Id: I88e4b042e6d236b98866b9e8bff9ec2c64b41b87 --- .../AccountSyncPreferenceController.java | 4 +- .../accounts/AccountSyncSettings.java | 21 ++++++- .../accounts/AccountSyncSettingsTest.java | 62 +++++++++++++++++-- 3 files changed, 77 insertions(+), 10 deletions(-) diff --git a/src/com/android/settings/accounts/AccountSyncPreferenceController.java b/src/com/android/settings/accounts/AccountSyncPreferenceController.java index cea88439734..5a00d195fcd 100644 --- a/src/com/android/settings/accounts/AccountSyncPreferenceController.java +++ b/src/com/android/settings/accounts/AccountSyncPreferenceController.java @@ -66,8 +66,8 @@ public class AccountSyncPreferenceController extends AbstractPreferenceControlle new SubSettingLauncher(mContext) .setDestination(AccountSyncSettings.class.getName()) .setArguments(args) - .setSourceMetricsCategory( SettingsEnums.ACCOUNT) - .setTitleRes( R.string.account_sync_title) + .setSourceMetricsCategory(SettingsEnums.ACCOUNT) + .setTitleRes(R.string.account_sync_title) .launch(); return true; diff --git a/src/com/android/settings/accounts/AccountSyncSettings.java b/src/com/android/settings/accounts/AccountSyncSettings.java index e05fad6e87d..a56dc94c2a3 100644 --- a/src/com/android/settings/accounts/AccountSyncSettings.java +++ b/src/com/android/settings/accounts/AccountSyncSettings.java @@ -42,6 +42,7 @@ import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; +import androidx.annotation.VisibleForTesting; import androidx.appcompat.app.AlertDialog; import androidx.preference.Preference; @@ -221,9 +222,8 @@ public class AccountSyncSettings extends AccountPreferenceBase { // Note that this also counts accounts that are not currently displayed boolean syncActive = !ContentResolver.getCurrentSyncsAsUser( mUserHandle.getIdentifier()).isEmpty(); - menu.findItem(MENU_SYNC_NOW_ID).setVisible(!syncActive); + menu.findItem(MENU_SYNC_NOW_ID).setVisible(!syncActive).setEnabled(enabledSyncNowMenu()); menu.findItem(MENU_SYNC_CANCEL_ID).setVisible(syncActive); - } @Override @@ -562,6 +562,23 @@ public class AccountSyncSettings extends AccountPreferenceBase { return R.string.help_url_accounts; } + @VisibleForTesting + boolean enabledSyncNowMenu() { + boolean enabled = false; + for (int i = 0, count = getPreferenceScreen().getPreferenceCount(); i < count; i++) { + final Preference pref = getPreferenceScreen().getPreference(i); + if (!(pref instanceof SyncStateSwitchPreference)) { + continue; + } + final SyncStateSwitchPreference syncPref = (SyncStateSwitchPreference) pref; + if (syncPref.isChecked()) { + enabled = true; + break; + } + } + return enabled; + } + private static String formatSyncDate(Context context, Date date) { return DateUtils.formatDateTime(context, date.getTime(), DateUtils.FORMAT_SHOW_DATE diff --git a/tests/robotests/src/com/android/settings/accounts/AccountSyncSettingsTest.java b/tests/robotests/src/com/android/settings/accounts/AccountSyncSettingsTest.java index dd1778f95fc..bdf12901ce8 100644 --- a/tests/robotests/src/com/android/settings/accounts/AccountSyncSettingsTest.java +++ b/tests/robotests/src/com/android/settings/accounts/AccountSyncSettingsTest.java @@ -15,6 +15,8 @@ */ package com.android.settings.accounts; +import static com.google.common.truth.Truth.assertThat; + import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; @@ -24,10 +26,13 @@ import android.content.Context; import android.os.UserHandle; import androidx.fragment.app.FragmentActivity; +import androidx.preference.PreferenceManager; +import androidx.preference.PreferenceScreen; import com.android.settings.testutils.shadow.ShadowContentResolver; import org.junit.After; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; @@ -38,6 +43,14 @@ import org.robolectric.util.ReflectionHelpers; @RunWith(RobolectricTestRunner.class) @Config(shadows = {ShadowContentResolver.class}) public class AccountSyncSettingsTest { + private Context mContext; + private AccountSyncSettings mAccountSyncSettings; + + @Before + public void setUp() { + mContext = RuntimeEnvironment.application; + mAccountSyncSettings = spy(new TestAccountSyncSettings(mContext)); + } @After public void tearDown() { @@ -46,15 +59,52 @@ public class AccountSyncSettingsTest { @Test public void onPreferenceTreeClick_nullAuthority_shouldNotCrash() { - final Context context = RuntimeEnvironment.application; - final AccountSyncSettings settings = spy(new AccountSyncSettings()); - when(settings.getActivity()).thenReturn(mock(FragmentActivity.class)); - final SyncStateSwitchPreference preference = new SyncStateSwitchPreference(context, + when(mAccountSyncSettings.getActivity()).thenReturn(mock(FragmentActivity.class)); + final SyncStateSwitchPreference preference = new SyncStateSwitchPreference(mContext, new Account("acct1", "type1"), "" /* authority */, "testPackage", 1 /* uid */); preference.setOneTimeSyncMode(false); - ReflectionHelpers.setField(settings, "mUserHandle", UserHandle.CURRENT); + ReflectionHelpers.setField(mAccountSyncSettings, "mUserHandle", UserHandle.CURRENT); - settings.onPreferenceTreeClick(preference); + mAccountSyncSettings.onPreferenceTreeClick(preference); // no crash } + + @Test + public void enabledSyncNowMenu_noSyncStateSwitchPreference_returnFalse() { + assertThat(mAccountSyncSettings.enabledSyncNowMenu()).isFalse(); + } + + @Test + public void enabledSyncNowMenu_addSyncStateSwitchPreferenceAndSwitchOn_returnTrue() { + final SyncStateSwitchPreference preference = new SyncStateSwitchPreference(mContext, + new Account("acct1", "type1"), "" /* authority */, "testPackage", 1 /* uid */); + preference.setChecked(true); + mAccountSyncSettings.getPreferenceScreen().addPreference(preference); + + assertThat(mAccountSyncSettings.enabledSyncNowMenu()).isTrue(); + } + + @Test + public void enabledSyncNowMenu_addSyncStateSwitchPreferenceAndSwitchOff_returnFalse() { + final SyncStateSwitchPreference preference = new SyncStateSwitchPreference(mContext, + new Account("acct1", "type1"), "" /* authority */, "testPackage", 1 /* uid */); + preference.setChecked(false); + mAccountSyncSettings.getPreferenceScreen().addPreference(preference); + + assertThat(mAccountSyncSettings.enabledSyncNowMenu()).isFalse(); + } + + public static class TestAccountSyncSettings extends AccountSyncSettings { + private PreferenceScreen mScreen; + + public TestAccountSyncSettings(Context context) { + final PreferenceManager preferenceManager = new PreferenceManager(context); + mScreen = preferenceManager.createPreferenceScreen(context); + } + + @Override + public PreferenceScreen getPreferenceScreen() { + return mScreen; + } + } }