186708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani/*
286708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani * Copyright (C) 2008 The Android Open Source Project
386708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani *
486708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani * Licensed under the Apache License, Version 2.0 (the "License");
586708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani * you may not use this file except in compliance with the License.
686708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani * You may obtain a copy of the License at
786708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani *
886708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani *      http://www.apache.org/licenses/LICENSE-2.0
986708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani *
1086708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani * Unless required by applicable law or agreed to in writing, software
1186708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani * distributed under the License is distributed on an "AS IS" BASIS,
1286708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1386708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani * See the License for the specific language governing permissions and
1486708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani * limitations under the License.
1586708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani */
1686708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
1786708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasanipackage com.android.settings.accounts;
1886708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
1986708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasaniimport android.accounts.Account;
2086708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasaniimport android.accounts.AccountManager;
2186708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasaniimport android.accounts.OnAccountsUpdateListener;
2286708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasaniimport android.app.Activity;
23167ba2af93e25500e8d9499b3433f7b2c67fad58Guang Zhuimport android.app.ActivityManager;
2486708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasaniimport android.content.ContentResolver;
2586708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasaniimport android.content.Intent;
2686708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasaniimport android.graphics.drawable.Drawable;
2786708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasaniimport android.os.Bundle;
2886708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasaniimport android.preference.CheckBoxPreference;
2986708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasaniimport android.preference.Preference;
3086708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasaniimport android.preference.Preference.OnPreferenceChangeListener;
3186708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasaniimport android.preference.PreferenceScreen;
3286708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasaniimport android.util.Log;
3386708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
3486708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasaniimport com.android.settings.AccountPreference;
3586708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasaniimport com.android.settings.DialogCreatable;
3686708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasaniimport com.android.settings.R;
3786708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
3886708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasaniimport java.util.ArrayList;
3986708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
4086708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasanipublic class SyncSettings extends AccountPreferenceBase
4186708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        implements OnAccountsUpdateListener, DialogCreatable {
4286708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
4386708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    private static final String KEY_SYNC_SWITCH = "sync_switch";
4486708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
4586708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    private String[] mAuthorities;
4686708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
4786708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    private SettingsDialogFragment mDialogFragment;
4886708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    private CheckBoxPreference mAutoSyncPreference;
4986708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
5086708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    @Override
5186708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    public void onCreate(Bundle icicle) {
5286708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        super.onCreate(icicle);
5386708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
5486708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        addPreferencesFromResource(R.xml.sync_settings);
5586708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        mAutoSyncPreference =
5686708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                (CheckBoxPreference) getPreferenceScreen().findPreference(KEY_SYNC_SWITCH);
5786708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        mAutoSyncPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
5886708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            @Override
5986708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            public boolean onPreferenceChange(Preference preference, Object newValue) {
60167ba2af93e25500e8d9499b3433f7b2c67fad58Guang Zhu                if (ActivityManager.isUserAMonkey()) {
61167ba2af93e25500e8d9499b3433f7b2c67fad58Guang Zhu                    Log.d("SyncSettings", "ignoring monkey's attempt to flip sync state");
62167ba2af93e25500e8d9499b3433f7b2c67fad58Guang Zhu                } else {
63167ba2af93e25500e8d9499b3433f7b2c67fad58Guang Zhu                    ContentResolver.setMasterSyncAutomatically((Boolean) newValue);
64167ba2af93e25500e8d9499b3433f7b2c67fad58Guang Zhu                }
6586708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                return true;
6686708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            }
6786708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        });
6886708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
6986708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        setHasOptionsMenu(true);
7086708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    }
7186708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
7286708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    @Override
7386708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    public void onStart() {
7486708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        super.onStart();
7586708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        Activity activity = getActivity();
7686708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        AccountManager.get(activity).addOnAccountsUpdatedListener(this, null, true);
7786708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    }
7886708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
7986708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    @Override
8086708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    public void onActivityCreated(Bundle savedInstanceState) {
8186708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        super.onActivityCreated(savedInstanceState);
8286708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
8386708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        final Activity activity = getActivity();
8486708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        mAutoSyncPreference.setChecked(ContentResolver.getMasterSyncAutomatically());
8586708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        mAuthorities = activity.getIntent().getStringArrayExtra(AUTHORITIES_FILTER_KEY);
8686708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
8786708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        updateAuthDescriptions();
8886708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    }
8986708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
9086708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    @Override
9186708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    public void onStop() {
9286708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        super.onStop();
9386708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        final Activity activity = getActivity();
9486708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        AccountManager.get(activity).removeOnAccountsUpdatedListener(this);
9586708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    }
9686708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
9786708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    @Override
9886708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    public boolean onPreferenceTreeClick(PreferenceScreen preferences, Preference preference) {
9986708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        if (preference instanceof AccountPreference) {
10086708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            startAccountSettings((AccountPreference) preference);
10186708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        } else {
10286708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            return false;
10386708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        }
10486708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        return true;
10586708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    }
10686708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
10786708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    private void startAccountSettings(AccountPreference acctPref) {
10886708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        Intent intent = new Intent("android.settings.ACCOUNT_SYNC_SETTINGS");
10986708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        intent.putExtra(AccountSyncSettings.ACCOUNT_KEY, acctPref.getAccount());
11086708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
11186708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        startActivity(intent);
11286708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        finish();
11386708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    }
11486708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
11586708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    @Override
11686708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    public void showDialog(int dialogId) {
11786708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        if (mDialogFragment != null) {
11886708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            Log.e(TAG, "Old dialog fragment not null!");
11986708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        }
12086708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        mDialogFragment = new SettingsDialogFragment(this, dialogId);
12186708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        mDialogFragment.show(getActivity().getFragmentManager(), Integer.toString(dialogId));
12286708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    }
12386708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
12486708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    private void removeAccountPreferences() {
12586708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        PreferenceScreen parent = getPreferenceScreen();
12686708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        for (int i = 0; i < parent.getPreferenceCount(); ) {
12786708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            if (parent.getPreference(i) instanceof AccountPreference) {
12886708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                parent.removePreference(parent.getPreference(i));
12986708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            } else {
13086708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                i++;
13186708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            }
13286708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        }
13386708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    }
13486708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
13586708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    @Override
13686708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    public void onAccountsUpdated(Account[] accounts) {
13786708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        if (getActivity() == null) return;
13886708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
13986708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        removeAccountPreferences();
14086708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        for (int i = 0, n = accounts.length; i < n; i++) {
14186708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            final Account account = accounts[i];
14286708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            final ArrayList<String> auths = getAuthoritiesForAccountType(account.type);
14386708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
14486708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            boolean showAccount = true;
14586708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            if (mAuthorities != null && auths != null) {
14686708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                showAccount = false;
14786708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                for (String requestedAuthority : mAuthorities) {
14886708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                    if (auths.contains(requestedAuthority)) {
14986708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                        showAccount = true;
15086708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                        break;
15186708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                    }
15286708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                }
15386708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            }
15486708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
15586708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            if (showAccount) {
15686708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                final Drawable icon = getDrawableForType(account.type);
15786708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                final AccountPreference preference =
15886708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                        new AccountPreference(getActivity(), account, icon, auths, true);
15986708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                getPreferenceScreen().addPreference(preference);
16086708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                preference.setSummary(getLabelForType(account.type));
16186708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            }
16286708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        }
16386708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        onSyncStateUpdated();
16486708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    }
16586708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
16686708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    @Override
16786708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    protected void onAuthDescriptionsUpdated() {
16886708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        // Update account icons for all account preference items
16986708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        for (int i = 0; i < getPreferenceScreen().getPreferenceCount(); i++) {
17086708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            Preference pref = getPreferenceScreen().getPreference(i);
17186708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            if (pref instanceof AccountPreference) {
17286708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                AccountPreference accPref = (AccountPreference)
17386708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                        getPreferenceScreen().getPreference(i);
17486708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                accPref.setIcon(getDrawableForType(accPref.getAccount().type));
17586708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                accPref.setSummary(getLabelForType(accPref.getAccount().type));
17686708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            }
17786708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        }
17886708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    }
17986708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani}
180