Merge "Disable the sync now menu while no any synced item" into rvc-dev
diff --git a/src/com/android/settings/accounts/AccountSyncPreferenceController.java b/src/com/android/settings/accounts/AccountSyncPreferenceController.java
index cea8843..5a00d19 100644
--- a/src/com/android/settings/accounts/AccountSyncPreferenceController.java
+++ b/src/com/android/settings/accounts/AccountSyncPreferenceController.java
@@ -66,8 +66,8 @@
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 e05fad6..a56dc94 100644
--- a/src/com/android/settings/accounts/AccountSyncSettings.java
+++ b/src/com/android/settings/accounts/AccountSyncSettings.java
@@ -42,6 +42,7 @@
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 @@
// 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 @@
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 dd1778f..bdf1290 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.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 @@
@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 @@
@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;
+ }
+ }
}