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;
+        }
+    }
 }