Revert "Move global sync settings to AccountSettings."

This reverts commit 64fde6f4e9404a363f577a9fda424affcb5138e4.

Change-Id: I61940b6e2936c7c7f048af222602226e5588c268
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index a71f84e..a0563b4 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1485,19 +1485,6 @@
                 android:resource="@id/battery_settings" />
         </activity>
 
-        <activity android:name="Settings$AccountSettingsActivity"
-            android:label="@string/account_settings_title"
-            android:taskAffinity=""
-            android:parentActivityName="Settings">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <action android:name="android.settings.SYNC_SETTINGS" />
-                <category android:name="android.intent.category.DEFAULT" />
-            </intent-filter>
-            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
-                android:value="com.android.settings.accounts.AccountSettings" />
-        </activity>
-
         <activity android:name="Settings$AccountSyncSettingsActivity"
             android:label="@string/account_sync_settings_title"
             android:taskAffinity=""
@@ -1513,6 +1500,19 @@
                 android:resource="@id/account_settings" />
         </activity>
 
+        <activity android:name=".accounts.SyncSettingsActivity"
+            android:label="@string/account_sync_settings_title">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <action android:name="android.settings.SYNC_SETTINGS" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+                       android:value="com.android.settings.accounts.AccountSyncSettings" />
+            <meta-data android:name="com.android.settings.TOP_LEVEL_HEADER_ID"
+                       android:resource="@id/account_settings" />
+        </activity>
+
         <activity android:name="com.android.settings.accounts.AddAccountSettings"
             android:theme="@android:style/Theme.Translucent.NoTitleBar"
             android:configChanges="orientation|keyboardHidden|screenSize"
diff --git a/res/menu/account_settings.xml b/res/menu/account_settings.xml
deleted file mode 100644
index 88feb66..0000000
--- a/res/menu/account_settings.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2014 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
-    <item
-        android:id="@+id/account_settings_menu_auto_sync"
-        android:title="@string/account_settings_menu_auto_sync"
-        android:checkable="true" />
-    <item
-        android:id="@+id/account_settings_menu_auto_sync_personal"
-        android:title="@string/account_settings_menu_auto_sync_personal"
-        android:checkable="true" />
-    <item
-        android:id="@+id/account_settings_menu_auto_sync_work"
-        android:title="@string/account_settings_menu_auto_sync_work"
-        android:checkable="true" />
-</menu>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 9b54086..bbce4e4 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -4798,12 +4798,6 @@
     <string name="data_usage_menu_metered">Mobile hotspots</string>
     <!--  Title for menu option to enable global auto-sync of account data -->
     <string name="data_usage_menu_auto_sync">Auto-sync data</string>
-    <!--  Title for menu option to enable global auto-sync of personal account data [CHAR LIMIT=30] -->
-    <string name="account_settings_menu_auto_sync">Auto-sync data</string>
-    <!--  Title for menu option to enable global auto-sync of personal account data [CHAR LIMIT=30] -->
-    <string name="account_settings_menu_auto_sync_personal">Auto-sync personal data</string>
-    <!--  Title for menu option to enable global auto-sync of work account data [CHAR LIMIT=30] -->
-    <string name="account_settings_menu_auto_sync_work">Auto-sync work data</string>
 
     <!-- Title for option to change data usage cycle day. [CHAR LIMIT=32] -->
     <string name="data_usage_change_cycle">Change cycle\u2026</string>
diff --git a/src/com/android/settings/DataUsageSummary.java b/src/com/android/settings/DataUsageSummary.java
index bdae072..dbef6cb 100644
--- a/src/com/android/settings/DataUsageSummary.java
+++ b/src/com/android/settings/DataUsageSummary.java
@@ -489,7 +489,6 @@
                 hasReadyMobileRadio(context) && isOwner && !appDetailMode);
         mMenuRestrictBackground.setChecked(mPolicyManager.getRestrictBackground());
 
-        // TODO: Define behavior of this sync button. See: http://b/16076571
         mMenuAutoSync = menu.findItem(R.id.data_usage_menu_auto_sync);
         mMenuAutoSync.setChecked(ContentResolver.getMasterSyncAutomatically());
         mMenuAutoSync.setVisible(!appDetailMode);
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index 01149f3..895e9ea 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -69,7 +69,6 @@
     public static class PowerUsageSummaryActivity extends SettingsActivity { /* empty */ }
     public static class BatterySaverSettingsActivity extends SettingsActivity { /* empty */ }
     public static class AccountSyncSettingsActivity extends SettingsActivity { /* empty */ }
-    public static class AccountSettingsActivity extends SettingsActivity { /* empty */ }
     public static class AccountSyncSettingsInAddAccountActivity extends SettingsActivity { /* empty */ }
     public static class CryptKeeperSettingsActivity extends SettingsActivity { /* empty */ }
     public static class DeviceAdminSettingsActivity extends SettingsActivity { /* empty */ }
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 90abf0a..751d478 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -66,7 +66,6 @@
 import com.android.internal.util.XmlUtils;
 import com.android.settings.accessibility.AccessibilitySettings;
 import com.android.settings.accessibility.CaptionPropertiesFragment;
-import com.android.settings.accounts.AccountSettings;
 import com.android.settings.accounts.AccountSyncSettings;
 import com.android.settings.applications.InstalledAppDetails;
 import com.android.settings.applications.ManageApplications;
@@ -263,7 +262,6 @@
             WifiDisplaySettings.class.getName(),
             PowerUsageSummary.class.getName(),
             AccountSyncSettings.class.getName(),
-            AccountSettings.class.getName(),
             CryptKeeperSettings.class.getName(),
             DataUsageSummary.class.getName(),
             DreamSettings.class.getName(),
diff --git a/src/com/android/settings/accounts/AccountSettings.java b/src/com/android/settings/accounts/AccountSettings.java
index 88f47bc..13878d7 100644
--- a/src/com/android/settings/accounts/AccountSettings.java
+++ b/src/com/android/settings/accounts/AccountSettings.java
@@ -19,9 +19,7 @@
 
 import android.accounts.Account;
 import android.accounts.AccountManager;
-import android.app.ActivityManager;
 import android.content.BroadcastReceiver;
-import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
@@ -31,11 +29,7 @@
 import android.os.UserManager;
 import android.util.Log;
 import android.util.SparseArray;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.MenuItem;
 import android.preference.Preference;
-import android.preference.Preference.OnPreferenceChangeListener;
 import android.preference.Preference.OnPreferenceClickListener;
 import android.preference.PreferenceGroup;
 
@@ -60,6 +54,7 @@
         implements AuthenticatorHelper.OnAccountsUpdateListener,
         OnPreferenceClickListener {
     public static final String TAG = "AccountSettings";
+
     private static final String KEY_ACCOUNT = "account";
     private static final String KEY_ADD_ACCOUNT = "add_account";
 
@@ -73,7 +68,6 @@
     private UserManager mUm;
     private SparseArray<ProfileData> mProfiles;
     private ManagedProfileBroadcastReceiver mManagedProfileBroadcastReceiver;
-    private boolean mIsSingleProfileUi = true;
 
     /**
      * Holds data related to the accounts belonging to one profile.
@@ -103,50 +97,6 @@
         mUm = (UserManager) getSystemService(Context.USER_SERVICE);
         mProfiles = new SparseArray<ProfileData>(2);
         updateUi();
-        setHasOptionsMenu(true);
-    }
-
-    @Override
-    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
-        inflater.inflate(R.menu.account_settings, menu);
-        final UserHandle currentProfile = UserHandle.getCallingUserHandle();
-        if (mIsSingleProfileUi) {
-            menu.findItem(R.id.account_settings_menu_auto_sync)
-                    .setVisible(true)
-                    .setOnMenuItemClickListener(new MasterSyncStateClickListener(currentProfile));
-            menu.removeItem(R.id.account_settings_menu_auto_sync_personal);
-            menu.removeItem(R.id.account_settings_menu_auto_sync_work);
-        } else {
-            final UserHandle managedProfile = Utils.getManagedProfile(mUm);
-
-            menu.findItem(R.id.account_settings_menu_auto_sync_personal)
-                    .setVisible(true)
-                    .setOnMenuItemClickListener(new MasterSyncStateClickListener(currentProfile));
-            menu.findItem(R.id.account_settings_menu_auto_sync_work)
-                    .setVisible(true)
-                    .setOnMenuItemClickListener(new MasterSyncStateClickListener(managedProfile));
-            menu.removeItem(R.id.account_settings_menu_auto_sync);
-        }
-        super.onCreateOptionsMenu(menu, inflater);
-    }
-
-    @Override
-    public void onPrepareOptionsMenu(Menu menu) {
-        final UserHandle currentProfile = UserHandle.getCallingUserHandle();
-        if (mIsSingleProfileUi) {
-            menu.findItem(R.id.account_settings_menu_auto_sync)
-                    .setChecked(ContentResolver.getMasterSyncAutomaticallyAsUser(
-                            currentProfile.getIdentifier()));
-        } else {
-            final UserHandle managedProfile = Utils.getManagedProfile(mUm);
-
-            menu.findItem(R.id.account_settings_menu_auto_sync_personal)
-                    .setChecked(ContentResolver.getMasterSyncAutomaticallyAsUser(
-                            currentProfile.getIdentifier()));
-            menu.findItem(R.id.account_settings_menu_auto_sync_work)
-                    .setChecked(ContentResolver.getMasterSyncAutomaticallyAsUser(
-                            managedProfile.getIdentifier()));
-            }
     }
 
     void updateUi() {
@@ -167,13 +117,12 @@
             if (managedProfile == null) {
                 updateSingleProfileUi();
             } else {
-                mIsSingleProfileUi = false;
-                updateProfileUi(currentProfile, KEY_CATEGORY_PERSONAL, KEY_ADD_ACCOUNT_PERSONAL,
-                        new ArrayList<String>());
-                final ArrayList<String> unusedPreferences = new ArrayList<String>(2);
+                updateProfileUi(currentProfile,
+                        KEY_CATEGORY_PERSONAL, KEY_ADD_ACCOUNT_PERSONAL, new ArrayList<String>());
+                final ArrayList<String> unusedPreferences = new ArrayList<String>(1);
                 unusedPreferences.add(KEY_ADD_ACCOUNT);
-                updateProfileUi(managedProfile, KEY_CATEGORY_WORK, KEY_ADD_ACCOUNT_WORK,
-                        unusedPreferences);
+                updateProfileUi(managedProfile,
+                        KEY_CATEGORY_WORK, KEY_ADD_ACCOUNT_WORK, unusedPreferences);
                 mManagedProfileBroadcastReceiver = new ManagedProfileBroadcastReceiver();
                 mManagedProfileBroadcastReceiver.register(getActivity());
             }
@@ -192,8 +141,8 @@
                 unusedPreferences);
     }
 
-    private void updateProfileUi(final UserHandle userHandle, String categoryKey,
-            String addAccountKey, ArrayList<String> unusedPreferences) {
+    private void updateProfileUi(UserHandle userHandle, String categoryKey, String addAccountKey,
+            ArrayList<String> unusedPreferences) {
         final int count = unusedPreferences.size();
         for (int i = 0; i < count; i++) {
             removePreference(unusedPreferences.get(i));
@@ -396,28 +345,6 @@
             }
         }
     }
-
-    private class MasterSyncStateClickListener implements MenuItem.OnMenuItemClickListener {
-        private final UserHandle mUserHandle;
-
-        public MasterSyncStateClickListener(UserHandle userHandle) {
-            mUserHandle = userHandle;
-        }
-
-        @Override
-        public boolean onMenuItemClick(MenuItem item) {
-            // TODO: Add confirmation dialogs. See: http://b/16076571
-            if (ActivityManager.isUserAMonkey()) {
-                Log.d(TAG, "ignoring monkey's attempt to flip sync state");
-            } else {
-                boolean newSyncState = !item.isChecked();
-                item.setChecked(newSyncState);
-                ContentResolver.setMasterSyncAutomaticallyAsUser(newSyncState,
-                        mUserHandle.getIdentifier());
-            }
-            return true;
-        }
-    }
     // TODO Implement a {@link SearchIndexProvider} to allow Indexing and Search of account types
     // See http://b/15403806
 }
diff --git a/src/com/android/settings/accounts/SyncSettings.java b/src/com/android/settings/accounts/SyncSettings.java
new file mode 100644
index 0000000..3248113
--- /dev/null
+++ b/src/com/android/settings/accounts/SyncSettings.java
@@ -0,0 +1,179 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.accounts;
+
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.accounts.OnAccountsUpdateListener;
+import android.app.Activity;
+import android.app.ActivityManager;
+import android.content.ContentResolver;
+import android.content.Intent;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.preference.CheckBoxPreference;
+import android.preference.Preference;
+import android.preference.Preference.OnPreferenceChangeListener;
+import android.preference.PreferenceScreen;
+import android.util.Log;
+
+import com.android.settings.AccountPreference;
+import com.android.settings.DialogCreatable;
+import com.android.settings.R;
+
+import java.util.ArrayList;
+
+public class SyncSettings extends AccountPreferenceBase
+        implements OnAccountsUpdateListener, DialogCreatable {
+
+    private static final String KEY_SYNC_SWITCH = "sync_switch";
+
+    private String[] mAuthorities;
+
+    private SettingsDialogFragment mDialogFragment;
+    private CheckBoxPreference mAutoSyncPreference;
+
+    @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+
+        addPreferencesFromResource(R.xml.sync_settings);
+        mAutoSyncPreference =
+                (CheckBoxPreference) getPreferenceScreen().findPreference(KEY_SYNC_SWITCH);
+        mAutoSyncPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
+            @Override
+            public boolean onPreferenceChange(Preference preference, Object newValue) {
+                if (ActivityManager.isUserAMonkey()) {
+                    Log.d("SyncSettings", "ignoring monkey's attempt to flip sync state");
+                } else {
+                    ContentResolver.setMasterSyncAutomatically((Boolean) newValue);
+                }
+                return true;
+            }
+        });
+
+        setHasOptionsMenu(true);
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        Activity activity = getActivity();
+        AccountManager.get(activity).addOnAccountsUpdatedListener(this, null, true);
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+
+        final Activity activity = getActivity();
+        mAutoSyncPreference.setChecked(ContentResolver.getMasterSyncAutomatically());
+        mAuthorities = activity.getIntent().getStringArrayExtra(AUTHORITIES_FILTER_KEY);
+
+        updateAuthDescriptions();
+    }
+
+    @Override
+    public void onStop() {
+        super.onStop();
+        final Activity activity = getActivity();
+        AccountManager.get(activity).removeOnAccountsUpdatedListener(this);
+    }
+
+    @Override
+    public boolean onPreferenceTreeClick(PreferenceScreen preferences, Preference preference) {
+        if (preference instanceof AccountPreference) {
+            startAccountSettings((AccountPreference) preference);
+        } else {
+            return false;
+        }
+        return true;
+    }
+
+    private void startAccountSettings(AccountPreference acctPref) {
+        Intent intent = new Intent("android.settings.ACCOUNT_SYNC_SETTINGS");
+        intent.putExtra(AccountSyncSettings.ACCOUNT_KEY, acctPref.getAccount());
+        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        startActivity(intent);
+        finish();
+    }
+
+    @Override
+    public void showDialog(int dialogId) {
+        if (mDialogFragment != null) {
+            Log.e(TAG, "Old dialog fragment not null!");
+        }
+        mDialogFragment = new SettingsDialogFragment(this, dialogId);
+        mDialogFragment.show(getActivity().getFragmentManager(), Integer.toString(dialogId));
+    }
+
+    private void removeAccountPreferences() {
+        PreferenceScreen parent = getPreferenceScreen();
+        for (int i = 0; i < parent.getPreferenceCount(); ) {
+            if (parent.getPreference(i) instanceof AccountPreference) {
+                parent.removePreference(parent.getPreference(i));
+            } else {
+                i++;
+            }
+        }
+    }
+
+    @Override
+    public void onAccountsUpdated(Account[] accounts) {
+        if (getActivity() == null) return;
+
+        removeAccountPreferences();
+        for (int i = 0, n = accounts.length; i < n; i++) {
+            final Account account = accounts[i];
+            final ArrayList<String> auths = getAuthoritiesForAccountType(account.type);
+
+            boolean showAccount = true;
+            if (mAuthorities != null && auths != null) {
+                showAccount = false;
+                for (String requestedAuthority : mAuthorities) {
+                    if (auths.contains(requestedAuthority)) {
+                        showAccount = true;
+                        break;
+                    }
+                }
+            }
+
+            if (showAccount) {
+                final Drawable icon = getDrawableForType(account.type);
+                final AccountPreference preference =
+                        new AccountPreference(getActivity(), account, icon, auths, true);
+                getPreferenceScreen().addPreference(preference);
+                preference.setSummary(getLabelForType(account.type));
+            }
+        }
+        onSyncStateUpdated();
+    }
+
+    @Override
+    protected void onAuthDescriptionsUpdated() {
+        // Update account icons for all account preference items
+        for (int i = 0; i < getPreferenceScreen().getPreferenceCount(); i++) {
+            Preference pref = getPreferenceScreen().getPreference(i);
+            if (pref instanceof AccountPreference) {
+                AccountPreference accPref = (AccountPreference)
+                        getPreferenceScreen().getPreference(i);
+                accPref.setIcon(getDrawableForType(accPref.getAccount().type));
+                accPref.setSummary(getLabelForType(accPref.getAccount().type));
+            }
+        }
+    }
+}
diff --git a/src/com/android/settings/accounts/SyncSettingsActivity.java b/src/com/android/settings/accounts/SyncSettingsActivity.java
new file mode 100644
index 0000000..014c24d
--- /dev/null
+++ b/src/com/android/settings/accounts/SyncSettingsActivity.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.accounts;
+
+import android.content.Intent;
+
+import com.android.settings.SettingsActivity;
+
+/**
+ * Launcher activity for the SyncSettings fragment.
+ *
+ */
+public class SyncSettingsActivity extends SettingsActivity {
+    @Override
+    public Intent getIntent() {
+        Intent modIntent = new Intent(super.getIntent());
+        modIntent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT, SyncSettings.class.getName());
+        return modIntent;
+    }
+
+    @Override
+    protected boolean isValidFragment(String fragmentName) {
+        if (SyncSettings.class.getName().equals(fragmentName)) return true;
+        return false;
+    }
+}
\ No newline at end of file