1f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler/*
2f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler * Copyright (C) 2015 The Android Open Source Project
3f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler *
4f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler * Licensed under the Apache License, Version 2.0 (the "License");
5f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler * you may not use this file except in compliance with the License.
6f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler * You may obtain a copy of the License at
7f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler *
8f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler *      http://www.apache.org/licenses/LICENSE-2.0
9f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler *
10f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler * Unless required by applicable law or agreed to in writing, software
11f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler * distributed under the License is distributed on an "AS IS" BASIS,
12f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler * See the License for the specific language governing permissions and
14f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler * limitations under the License
15f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler */
16f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
17f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantlerpackage com.android.tv.settings.accounts;
18f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
19f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantlerimport android.accounts.Account;
20f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantlerimport android.accounts.AccountManager;
21f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantlerimport android.app.Activity;
22f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantlerimport android.content.ContentResolver;
23f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantlerimport android.content.Context;
24f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantlerimport android.content.Intent;
25f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantlerimport android.content.SyncAdapterType;
26f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantlerimport android.content.SyncInfo;
27f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantlerimport android.content.SyncStatusInfo;
28f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantlerimport android.content.SyncStatusObserver;
29f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantlerimport android.content.pm.PackageManager;
30f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantlerimport android.content.pm.ProviderInfo;
31f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantlerimport android.os.Bundle;
32f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantlerimport android.os.Handler;
33f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantlerimport android.os.UserHandle;
34f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantlerimport android.support.v17.preference.LeanbackPreferenceFragment;
35f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantlerimport android.support.v7.preference.Preference;
36f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantlerimport android.support.v7.preference.PreferenceGroup;
37f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantlerimport android.text.TextUtils;
38f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantlerimport android.text.format.DateUtils;
39f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantlerimport android.util.Log;
40f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
41f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantlerimport com.android.settingslib.accounts.AuthenticatorHelper;
42f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantlerimport com.android.tv.settings.R;
43f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantlerimport com.google.android.collect.Lists;
44f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
45f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantlerimport java.util.ArrayList;
46f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantlerimport java.util.Collections;
47f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantlerimport java.util.List;
48f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
49f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantlerpublic class AccountSyncFragment extends LeanbackPreferenceFragment implements
50f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        AuthenticatorHelper.OnAccountsUpdateListener {
51f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    private static final String TAG = "AccountSyncFragment";
52f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
53f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    private static final String ARG_ACCOUNT = "account";
54f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    private static final String KEY_REMOVE_ACCOUNT = "remove_account";
55f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    private static final String KEY_SYNC_NOW = "sync_now";
56f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    private static final String KEY_SYNC_ADAPTERS = "sync_adapters";
57f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
58f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    private Object mStatusChangeListenerHandle;
59f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    private UserHandle mUserHandle;
60f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    private Account mAccount;
61f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    private ArrayList<SyncAdapterType> mInvisibleAdapters = Lists.newArrayList();
62f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
63f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    private PreferenceGroup mSyncCategory;
64f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
65f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    private final Handler mHandler = new Handler();
66f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    private SyncStatusObserver mSyncStatusObserver = new SyncStatusObserver() {
67f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        public void onStatusChanged(int which) {
68f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            mHandler.post(new Runnable() {
69f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                public void run() {
70f7344303126e44daa6e47b6ba829b9555264cfa7Tony Mantler                    if (isResumed()) {
71f7344303126e44daa6e47b6ba829b9555264cfa7Tony Mantler                        onSyncStateUpdated();
72f7344303126e44daa6e47b6ba829b9555264cfa7Tony Mantler                    }
73f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                }
74f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            });
75f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        }
76f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    };
77f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    private AuthenticatorHelper mAuthenticatorHelper;
78f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
79f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    public static AccountSyncFragment newInstance(Account account) {
80f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        final Bundle b = new Bundle(1);
81440517f61de3f603755b1e99c7581fe274314b47Tony Mantler        prepareArgs(b, account);
82f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        final AccountSyncFragment f = new AccountSyncFragment();
83f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        f.setArguments(b);
84f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        return f;
85f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    }
86440517f61de3f603755b1e99c7581fe274314b47Tony Mantler
87440517f61de3f603755b1e99c7581fe274314b47Tony Mantler    public static void prepareArgs(Bundle b, Account account) {
88440517f61de3f603755b1e99c7581fe274314b47Tony Mantler        b.putParcelable(ARG_ACCOUNT, account);
89440517f61de3f603755b1e99c7581fe274314b47Tony Mantler    }
90f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
91f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    @Override
92f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    public void onCreate(Bundle savedInstanceState) {
93f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        mUserHandle = new UserHandle(UserHandle.myUserId());
94f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        mAccount = getArguments().getParcelable(ARG_ACCOUNT);
95f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        mAuthenticatorHelper = new AuthenticatorHelper(getActivity(), mUserHandle, this);
96f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
97f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        super.onCreate(savedInstanceState);
98f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
99f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        if (!accountExists(mAccount)) {
100f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            Log.e(TAG, "Account provided does not exist: " + mAccount);
101f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            if (!getFragmentManager().popBackStackImmediate()) {
102f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                getActivity().finish();
103f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            }
104f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            return;
105f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        }
106f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        if (Log.isLoggable(TAG, Log.VERBOSE)) {
107f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            Log.v(TAG, "Got account: " + mAccount);
108f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        }
109f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    }
110f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
111f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    @Override
112f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    public void onStart() {
113f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        super.onStart();
114f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        mStatusChangeListenerHandle = ContentResolver.addStatusChangeListener(
115f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE
116f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                        | ContentResolver.SYNC_OBSERVER_TYPE_STATUS
117f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                        | ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS,
118f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                mSyncStatusObserver);
119f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        onSyncStateUpdated();
120f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        mAuthenticatorHelper.listenToAccountUpdates();
121f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        mAuthenticatorHelper.updateAuthDescriptions(getActivity());
1220fb47bdee43e880ee60057a6c95a39692b457ac3Tony Mantler    }
1230fb47bdee43e880ee60057a6c95a39692b457ac3Tony Mantler
1240fb47bdee43e880ee60057a6c95a39692b457ac3Tony Mantler    @Override
1250fb47bdee43e880ee60057a6c95a39692b457ac3Tony Mantler    public void onResume() {
1260fb47bdee43e880ee60057a6c95a39692b457ac3Tony Mantler        super.onResume();
127f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        onAccountsUpdate(mUserHandle);
128f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    }
129f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
130f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    @Override
131f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    public void onStop() {
132f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        super.onStop();
133f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        ContentResolver.removeStatusChangeListener(mStatusChangeListenerHandle);
134f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        mAuthenticatorHelper.stopListeningToAccountUpdates();
135f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    }
136f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
137f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    @Override
138f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
139f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        setPreferencesFromResource(R.xml.account_preference, null);
140f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
141f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        getPreferenceScreen().setTitle(mAccount.name);
142f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
143f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        final Preference removeAccountPref = findPreference(KEY_REMOVE_ACCOUNT);
144f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        removeAccountPref.setIntent(new Intent(getActivity(), RemoveAccountDialog.class)
145f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                .putExtra(AccountSyncActivity.EXTRA_ACCOUNT, mAccount.name));
146f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
147f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        mSyncCategory = (PreferenceGroup) findPreference(KEY_SYNC_ADAPTERS);
148f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    }
149f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
150f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    @Override
151f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    public boolean onPreferenceTreeClick(Preference preference) {
152f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        if (preference instanceof SyncStateSwitchPreference) {
153f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            SyncStateSwitchPreference syncPref = (SyncStateSwitchPreference) preference;
154f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            String authority = syncPref.getAuthority();
155f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            Account account = syncPref.getAccount();
156f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            final int userId = mUserHandle.getIdentifier();
157f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            if (syncPref.isOneTimeSyncMode()) {
158f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                requestOrCancelSync(account, authority, true);
159f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            } else {
160f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                boolean syncOn = syncPref.isChecked();
161f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                boolean oldSyncState = ContentResolver.getSyncAutomaticallyAsUser(account,
162f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                        authority, userId);
163f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                if (syncOn != oldSyncState) {
164f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                    // if we're enabling sync, this will request a sync as well
165f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                    ContentResolver.setSyncAutomaticallyAsUser(account, authority, syncOn, userId);
166f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                    // if the master sync switch is off, the request above will
167f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                    // get dropped.  when the user clicks on this toggle,
168f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                    // we want to force the sync, however.
169f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                    if (!ContentResolver.getMasterSyncAutomaticallyAsUser(userId) || !syncOn) {
170f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                        requestOrCancelSync(account, authority, syncOn);
171f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                    }
172f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                }
173f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            }
174f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            return true;
175f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        } else if (TextUtils.equals(preference.getKey(), KEY_SYNC_NOW)) {
176f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            boolean syncActive = !ContentResolver.getCurrentSyncsAsUser(
177f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                    mUserHandle.getIdentifier()).isEmpty();
178f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            if (syncActive) {
179f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                cancelSyncForEnabledProviders();
180f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            } else {
181f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                startSyncForEnabledProviders();
182f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            }
183f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            return true;
184f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        } else {
185f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            return super.onPreferenceTreeClick(preference);
186f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        }
187f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    }
188f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
189f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    private void startSyncForEnabledProviders() {
190f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        requestOrCancelSyncForEnabledProviders(true /* start them */);
191f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        final Activity activity = getActivity();
192f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        if (activity != null) {
193f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            activity.invalidateOptionsMenu();
194f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        }
195f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    }
196f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
197f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    private void cancelSyncForEnabledProviders() {
198f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        requestOrCancelSyncForEnabledProviders(false /* cancel them */);
199f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        final Activity activity = getActivity();
200f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        if (activity != null) {
201f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            activity.invalidateOptionsMenu();
202f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        }
203f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    }
204f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
205f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    private void requestOrCancelSyncForEnabledProviders(boolean startSync) {
206f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        // sync everything that the user has enabled
207f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        int count = mSyncCategory.getPreferenceCount();
208f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        for (int i = 0; i < count; i++) {
209f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            Preference pref = mSyncCategory.getPreference(i);
210f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            if (! (pref instanceof SyncStateSwitchPreference)) {
211f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                continue;
212f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            }
213f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            SyncStateSwitchPreference syncPref = (SyncStateSwitchPreference) pref;
214f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            if (!syncPref.isChecked()) {
215f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                continue;
216f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            }
217f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            requestOrCancelSync(syncPref.getAccount(), syncPref.getAuthority(), startSync);
218f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        }
219f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        // plus whatever the system needs to sync, e.g., invisible sync adapters
220f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        if (mAccount != null) {
221f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            for (SyncAdapterType syncAdapter : mInvisibleAdapters) {
222f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                requestOrCancelSync(mAccount, syncAdapter.authority, startSync);
223f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            }
224f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        }
225f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    }
226f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
227f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    private void requestOrCancelSync(Account account, String authority, boolean flag) {
228f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        if (flag) {
229f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            Bundle extras = new Bundle();
230f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            extras.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
231f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            ContentResolver.requestSyncAsUser(account, authority, mUserHandle.getIdentifier(),
232f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                    extras);
233f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        } else {
234f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            ContentResolver.cancelSyncAsUser(account, authority, mUserHandle.getIdentifier());
235f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        }
236f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    }
237f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
238f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    private boolean isSyncing(List<SyncInfo> currentSyncs, Account account, String authority) {
239f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        for (SyncInfo syncInfo : currentSyncs) {
240f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            if (syncInfo.account.equals(account) && syncInfo.authority.equals(authority)) {
241f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                return true;
242f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            }
243f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        }
244f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        return false;
245f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    }
246f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
247f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    private boolean accountExists(Account account) {
248f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        if (account == null) return false;
249f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
250f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        Account[] accounts = AccountManager.get(getActivity()).getAccountsByTypeAsUser(
251f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                account.type, mUserHandle);
252f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        for (final Account other : accounts) {
253f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            if (other.equals(account)) {
254f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                return true;
255f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            }
256f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        }
257f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        return false;
258f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    }
259f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
260f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    @Override
261f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    public void onAccountsUpdate(UserHandle userHandle) {
2620fb47bdee43e880ee60057a6c95a39692b457ac3Tony Mantler        if (!isResumed()) {
2630fb47bdee43e880ee60057a6c95a39692b457ac3Tony Mantler            return;
2640fb47bdee43e880ee60057a6c95a39692b457ac3Tony Mantler        }
265f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        if (!accountExists(mAccount)) {
266f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            // The account was deleted
267f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            if (!getFragmentManager().popBackStackImmediate()) {
268f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                getActivity().finish();
269f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            }
270f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            return;
271f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        }
272f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        updateAccountSwitches();
273f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        onSyncStateUpdated();
274f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    }
275f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
276f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    private void onSyncStateUpdated() {
277f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        // iterate over all the preferences, setting the state properly for each
278f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        final int userId = mUserHandle.getIdentifier();
279f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        List<SyncInfo> currentSyncs = ContentResolver.getCurrentSyncsAsUser(userId);
280f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler//        boolean syncIsFailing = false;
281f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
282f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        // Refresh the sync status switches - some syncs may have become active.
283f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        updateAccountSwitches();
284f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
285f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        for (int i = 0, count = mSyncCategory.getPreferenceCount(); i < count; i++) {
286f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            Preference pref = mSyncCategory.getPreference(i);
287f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            if (! (pref instanceof SyncStateSwitchPreference)) {
288f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                continue;
289f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            }
290f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            SyncStateSwitchPreference syncPref = (SyncStateSwitchPreference) pref;
291f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
292f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            String authority = syncPref.getAuthority();
293f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            Account account = syncPref.getAccount();
294f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
295f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            SyncStatusInfo status = ContentResolver.getSyncStatusAsUser(account, authority, userId);
296f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            boolean syncEnabled = ContentResolver.getSyncAutomaticallyAsUser(account, authority,
297f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                    userId);
298f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            boolean authorityIsPending = status != null && status.pending;
299f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            boolean initialSync = status != null && status.initialize;
300f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
301f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            boolean activelySyncing = isSyncing(currentSyncs, account, authority);
302f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            boolean lastSyncFailed = status != null
303f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                    && status.lastFailureTime != 0
304f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                    && status.getLastFailureMesgAsInt(0)
305f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                    != ContentResolver.SYNC_ERROR_SYNC_ALREADY_IN_PROGRESS;
306f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            if (!syncEnabled) lastSyncFailed = false;
307f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler//            if (lastSyncFailed && !activelySyncing && !authorityIsPending) {
308f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler//                syncIsFailing = true;
309f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler//            }
310f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            if (Log.isLoggable(TAG, Log.VERBOSE)) {
311f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                Log.v(TAG, "Update sync status: " + account + " " + authority +
312f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                        " active = " + activelySyncing + " pend =" +  authorityIsPending);
313f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            }
314f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
315f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            final long successEndTime = (status == null) ? 0 : status.lastSuccessTime;
316f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            if (!syncEnabled) {
317f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                syncPref.setSummary(R.string.sync_disabled);
318f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            } else if (activelySyncing) {
319f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                syncPref.setSummary(R.string.sync_in_progress);
320f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            } else if (successEndTime != 0) {
321f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                final String timeString = DateUtils.formatDateTime(getActivity(), successEndTime,
322f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                        DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_TIME);
323f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                syncPref.setSummary(getResources().getString(R.string.last_synced, timeString));
324f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            } else {
325f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                syncPref.setSummary("");
326f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            }
327f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            int syncState = ContentResolver.getIsSyncableAsUser(account, authority, userId);
328f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
329f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            syncPref.setActive(activelySyncing && (syncState >= 0) &&
330f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                    !initialSync);
331f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            syncPref.setPending(authorityIsPending && (syncState >= 0) &&
332f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                    !initialSync);
333f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
334f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            syncPref.setFailed(lastSyncFailed);
335f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            final boolean oneTimeSyncMode = !ContentResolver.getMasterSyncAutomaticallyAsUser(
336f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                    userId);
337f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            syncPref.setOneTimeSyncMode(oneTimeSyncMode);
338f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            syncPref.setChecked(oneTimeSyncMode || syncEnabled);
339f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        }
340f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    }
341f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
342f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    private void updateAccountSwitches() {
343f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        mInvisibleAdapters.clear();
344f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
345f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        SyncAdapterType[] syncAdapters = ContentResolver.getSyncAdapterTypesAsUser(
346f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                mUserHandle.getIdentifier());
347f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        ArrayList<String> authorities = new ArrayList<>(syncAdapters.length);
348f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        for (SyncAdapterType sa : syncAdapters) {
349f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            // Only keep track of sync adapters for this account
350f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            if (!sa.accountType.equals(mAccount.type)) continue;
351f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            if (sa.isUserVisible()) {
352f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                if (Log.isLoggable(TAG, Log.VERBOSE)) {
353f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                    Log.v(TAG, "updateAccountSwitches: added authority " + sa.authority
354f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                            + " to accountType " + sa.accountType);
355f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                }
356f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                authorities.add(sa.authority);
357f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            } else {
358f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                // keep track of invisible sync adapters, so sync now forces
359f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                // them to sync as well.
360f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                mInvisibleAdapters.add(sa);
361f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            }
362f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        }
363f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
364f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        mSyncCategory.removeAll();
365f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        final List<Preference> switches = new ArrayList<>(authorities.size());
366f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
367f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        if (Log.isLoggable(TAG, Log.VERBOSE)) {
368f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            Log.v(TAG, "looking for sync adapters that match account " + mAccount);
369f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        }
370f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        for (final String authority : authorities) {
371f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            // We could check services here....
372f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            int syncState = ContentResolver.getIsSyncableAsUser(mAccount, authority,
373f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                    mUserHandle.getIdentifier());
374f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            if (Log.isLoggable(TAG, Log.VERBOSE)) {
375f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                Log.v(TAG, "  found authority " + authority + " " + syncState);
376f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            }
377f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            if (syncState > 0) {
378f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                final Preference pref = createSyncStateSwitch(mAccount, authority);
379f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                switches.add(pref);
380f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            }
381f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        }
382f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
383f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        Collections.sort(switches);
384f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        for (final Preference pref : switches) {
385f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            mSyncCategory.addPreference(pref);
386f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        }
387f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    }
388f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
389f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    private Preference createSyncStateSwitch(Account account, String authority) {
390f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        final Context themedContext = getPreferenceManager().getContext();
391f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        SyncStateSwitchPreference preference =
392f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                new SyncStateSwitchPreference(themedContext, account, authority);
393f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        preference.setPersistent(false);
394f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        final PackageManager packageManager = getActivity().getPackageManager();
395f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        final ProviderInfo providerInfo = packageManager.resolveContentProviderAsUser(
396f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler                authority, 0, mUserHandle.getIdentifier());
397f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        if (providerInfo == null) {
398f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            return null;
399f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        }
400f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        CharSequence providerLabel = providerInfo.loadLabel(packageManager);
401f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        if (TextUtils.isEmpty(providerLabel)) {
402f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            Log.e(TAG, "Provider needs a label for authority '" + authority + "'");
403f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler            return null;
404f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        }
405f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        String title = getString(R.string.sync_item_title, providerLabel);
406f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        preference.setTitle(title);
407f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        preference.setKey(authority);
408f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler        return preference;
409f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler    }
410f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler
411f8f46b82ae0900e83bf265cf6c3231ffa39a18c4Tony Mantler}
412