Revert "Revert "Move global sync settings to AccountSettings.""

This reverts commit 4869faf46559c54a34b969b5ae5391a208e723af.

Change-Id: I58df9b8161d711a9c0187af1f1a1dc279fb9d9ab
diff --git a/src/com/android/settings/DataUsageSummary.java b/src/com/android/settings/DataUsageSummary.java
index dbef6cb..bdae072 100644
--- a/src/com/android/settings/DataUsageSummary.java
+++ b/src/com/android/settings/DataUsageSummary.java
@@ -489,6 +489,7 @@
                 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 895e9ea..01149f3 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -69,6 +69,7 @@
     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 751d478..90abf0a 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -66,6 +66,7 @@
 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;
@@ -262,6 +263,7 @@
             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 13878d7..88f47bc 100644
--- a/src/com/android/settings/accounts/AccountSettings.java
+++ b/src/com/android/settings/accounts/AccountSettings.java
@@ -19,7 +19,9 @@
 
 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;
@@ -29,7 +31,11 @@
 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;
 
@@ -54,7 +60,6 @@
         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";
 
@@ -68,6 +73,7 @@
     private UserManager mUm;
     private SparseArray<ProfileData> mProfiles;
     private ManagedProfileBroadcastReceiver mManagedProfileBroadcastReceiver;
+    private boolean mIsSingleProfileUi = true;
 
     /**
      * Holds data related to the accounts belonging to one profile.
@@ -97,6 +103,50 @@
         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() {
@@ -117,12 +167,13 @@
             if (managedProfile == null) {
                 updateSingleProfileUi();
             } else {
-                updateProfileUi(currentProfile,
-                        KEY_CATEGORY_PERSONAL, KEY_ADD_ACCOUNT_PERSONAL, new ArrayList<String>());
-                final ArrayList<String> unusedPreferences = new ArrayList<String>(1);
+                mIsSingleProfileUi = false;
+                updateProfileUi(currentProfile, KEY_CATEGORY_PERSONAL, KEY_ADD_ACCOUNT_PERSONAL,
+                        new ArrayList<String>());
+                final ArrayList<String> unusedPreferences = new ArrayList<String>(2);
                 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());
             }
@@ -141,8 +192,8 @@
                 unusedPreferences);
     }
 
-    private void updateProfileUi(UserHandle userHandle, String categoryKey, String addAccountKey,
-            ArrayList<String> unusedPreferences) {
+    private void updateProfileUi(final 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));
@@ -345,6 +396,28 @@
             }
         }
     }
+
+    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
deleted file mode 100644
index 3248113..0000000
--- a/src/com/android/settings/accounts/SyncSettings.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * 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
deleted file mode 100644
index 014c24d..0000000
--- a/src/com/android/settings/accounts/SyncSettingsActivity.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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