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;
2386708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasaniimport android.content.ContentResolver;
2486708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasaniimport android.content.Intent;
2586708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasaniimport android.graphics.drawable.Drawable;
2686708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasaniimport android.os.Bundle;
2786708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasaniimport android.preference.CheckBoxPreference;
2886708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasaniimport android.preference.Preference;
2986708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasaniimport android.preference.Preference.OnPreferenceChangeListener;
3086708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasaniimport android.preference.PreferenceScreen;
3186708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasaniimport android.util.Log;
3286708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
3386708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasaniimport com.android.settings.AccountPreference;
3486708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasaniimport com.android.settings.DialogCreatable;
3586708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasaniimport com.android.settings.R;
3686708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
3786708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasaniimport java.util.ArrayList;
3886708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
3986708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasanipublic class SyncSettings extends AccountPreferenceBase
4086708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        implements OnAccountsUpdateListener, DialogCreatable {
4186708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
4286708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    private static final String KEY_SYNC_SWITCH = "sync_switch";
4386708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
4486708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    private String[] mAuthorities;
4586708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
4686708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    private SettingsDialogFragment mDialogFragment;
4786708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    private CheckBoxPreference mAutoSyncPreference;
4886708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
4986708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    @Override
5086708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    public void onCreate(Bundle icicle) {
5186708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        super.onCreate(icicle);
5286708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
5386708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        addPreferencesFromResource(R.xml.sync_settings);
5486708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        mAutoSyncPreference =
5586708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                (CheckBoxPreference) getPreferenceScreen().findPreference(KEY_SYNC_SWITCH);
5686708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        mAutoSyncPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
5786708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            @Override
5886708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            public boolean onPreferenceChange(Preference preference, Object newValue) {
5986708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                ContentResolver.setMasterSyncAutomatically((Boolean) newValue);
6086708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                return true;
6186708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            }
6286708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        });
6386708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
6486708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        setHasOptionsMenu(true);
6586708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    }
6686708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
6786708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    @Override
6886708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    public void onStart() {
6986708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        super.onStart();
7086708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        Activity activity = getActivity();
7186708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        AccountManager.get(activity).addOnAccountsUpdatedListener(this, null, true);
7286708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    }
7386708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
7486708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    @Override
7586708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    public void onActivityCreated(Bundle savedInstanceState) {
7686708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        super.onActivityCreated(savedInstanceState);
7786708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
7886708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        final Activity activity = getActivity();
7986708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        mAutoSyncPreference.setChecked(ContentResolver.getMasterSyncAutomatically());
8086708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        mAuthorities = activity.getIntent().getStringArrayExtra(AUTHORITIES_FILTER_KEY);
8186708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
8286708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        updateAuthDescriptions();
8386708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    }
8486708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
8586708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    @Override
8686708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    public void onStop() {
8786708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        super.onStop();
8886708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        final Activity activity = getActivity();
8986708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        AccountManager.get(activity).removeOnAccountsUpdatedListener(this);
9086708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    }
9186708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
9286708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    @Override
9386708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    public boolean onPreferenceTreeClick(PreferenceScreen preferences, Preference preference) {
9486708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        if (preference instanceof AccountPreference) {
9586708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            startAccountSettings((AccountPreference) preference);
9686708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        } else {
9786708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            return false;
9886708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        }
9986708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        return true;
10086708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    }
10186708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
10286708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    private void startAccountSettings(AccountPreference acctPref) {
10386708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        Intent intent = new Intent("android.settings.ACCOUNT_SYNC_SETTINGS");
10486708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        intent.putExtra(AccountSyncSettings.ACCOUNT_KEY, acctPref.getAccount());
10586708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
10686708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        startActivity(intent);
10786708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        finish();
10886708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    }
10986708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
11086708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    @Override
11186708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    public void showDialog(int dialogId) {
11286708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        if (mDialogFragment != null) {
11386708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            Log.e(TAG, "Old dialog fragment not null!");
11486708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        }
11586708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        mDialogFragment = new SettingsDialogFragment(this, dialogId);
11686708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        mDialogFragment.show(getActivity().getFragmentManager(), Integer.toString(dialogId));
11786708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    }
11886708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
11986708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    private void removeAccountPreferences() {
12086708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        PreferenceScreen parent = getPreferenceScreen();
12186708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        for (int i = 0; i < parent.getPreferenceCount(); ) {
12286708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            if (parent.getPreference(i) instanceof AccountPreference) {
12386708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                parent.removePreference(parent.getPreference(i));
12486708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            } else {
12586708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                i++;
12686708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            }
12786708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        }
12886708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    }
12986708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
13086708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    @Override
13186708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    public void onAccountsUpdated(Account[] accounts) {
13286708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        if (getActivity() == null) return;
13386708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
13486708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        removeAccountPreferences();
13586708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        for (int i = 0, n = accounts.length; i < n; i++) {
13686708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            final Account account = accounts[i];
13786708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            final ArrayList<String> auths = getAuthoritiesForAccountType(account.type);
13886708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
13986708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            boolean showAccount = true;
14086708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            if (mAuthorities != null && auths != null) {
14186708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                showAccount = false;
14286708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                for (String requestedAuthority : mAuthorities) {
14386708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                    if (auths.contains(requestedAuthority)) {
14486708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                        showAccount = true;
14586708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                        break;
14686708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                    }
14786708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                }
14886708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            }
14986708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
15086708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            if (showAccount) {
15186708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                final Drawable icon = getDrawableForType(account.type);
15286708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                final AccountPreference preference =
15386708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                        new AccountPreference(getActivity(), account, icon, auths, true);
15486708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                getPreferenceScreen().addPreference(preference);
15586708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                preference.setSummary(getLabelForType(account.type));
15686708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            }
15786708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        }
15886708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        onSyncStateUpdated();
15986708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    }
16086708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani
16186708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    @Override
16286708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    protected void onAuthDescriptionsUpdated() {
16386708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        // Update account icons for all account preference items
16486708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        for (int i = 0; i < getPreferenceScreen().getPreferenceCount(); i++) {
16586708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            Preference pref = getPreferenceScreen().getPreference(i);
16686708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            if (pref instanceof AccountPreference) {
16786708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                AccountPreference accPref = (AccountPreference)
16886708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                        getPreferenceScreen().getPreference(i);
16986708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                accPref.setIcon(getDrawableForType(accPref.getAccount().type));
17086708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani                accPref.setSummary(getLabelForType(accPref.getAccount().type));
17186708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            }
17286708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        }
17386708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    }
17486708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani}
175