1d7aae18f8b927b479f240db3e352a5d051256e06Doris Ling/*
2d7aae18f8b927b479f240db3e352a5d051256e06Doris Ling * Copyright (C) 2016 The Android Open Source Project
3d7aae18f8b927b479f240db3e352a5d051256e06Doris Ling *
4d7aae18f8b927b479f240db3e352a5d051256e06Doris Ling * Licensed under the Apache License, Version 2.0 (the "License");
5d7aae18f8b927b479f240db3e352a5d051256e06Doris Ling * you may not use this file except in compliance with the License.
6d7aae18f8b927b479f240db3e352a5d051256e06Doris Ling * You may obtain a copy of the License at
7d7aae18f8b927b479f240db3e352a5d051256e06Doris Ling *
8d7aae18f8b927b479f240db3e352a5d051256e06Doris Ling *      http://www.apache.org/licenses/LICENSE-2.0
9d7aae18f8b927b479f240db3e352a5d051256e06Doris Ling *
10d7aae18f8b927b479f240db3e352a5d051256e06Doris Ling * Unless required by applicable law or agreed to in writing, software
11d7aae18f8b927b479f240db3e352a5d051256e06Doris Ling * distributed under the License is distributed on an "AS IS" BASIS,
12d7aae18f8b927b479f240db3e352a5d051256e06Doris Ling * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d7aae18f8b927b479f240db3e352a5d051256e06Doris Ling * See the License for the specific language governing permissions and
14d7aae18f8b927b479f240db3e352a5d051256e06Doris Ling * limitations under the License.
15d7aae18f8b927b479f240db3e352a5d051256e06Doris Ling */
16d7aae18f8b927b479f240db3e352a5d051256e06Doris Lingpackage com.android.settings.accounts;
17d7aae18f8b927b479f240db3e352a5d051256e06Doris Ling
181d583e125faf3ae4c9cd82636d8f3ecf1cdec3aaTony Mantlerimport static android.provider.Settings.EXTRA_AUTHORITIES;
191d583e125faf3ae4c9cd82636d8f3ecf1cdec3aaTony Mantler
207520e81ab5b75097a6a1c76e19e89b455a18cf58Fan Zhangimport android.app.Activity;
21d7aae18f8b927b479f240db3e352a5d051256e06Doris Lingimport android.content.Context;
227520e81ab5b75097a6a1c76e19e89b455a18cf58Fan Zhangimport android.os.UserHandle;
236e88635e97b200e4d070480e215c70ffc0ae9b37Fan Zhangimport android.provider.SearchIndexableResource;
24fe80fa5e807832ebba37ad66b33127eb4c15287cFan Zhangimport android.text.BidiFormatter;
25fc4d46495d7b8d42a330a1284f162910bb682239Doris Lingimport android.text.TextUtils;
266e88635e97b200e4d070480e215c70ffc0ae9b37Fan Zhang
27265d3c2a0c36251bf8a9f571d7239b6dd404d942Tamas Berghammerimport com.android.internal.logging.nano.MetricsProto.MetricsEvent;
28d7aae18f8b927b479f240db3e352a5d051256e06Doris Lingimport com.android.settings.R;
29d7aae18f8b927b479f240db3e352a5d051256e06Doris Lingimport com.android.settings.dashboard.DashboardFragment;
307520e81ab5b75097a6a1c76e19e89b455a18cf58Fan Zhangimport com.android.settings.dashboard.SummaryLoader;
316e88635e97b200e4d070480e215c70ffc0ae9b37Fan Zhangimport com.android.settings.search.BaseSearchIndexProvider;
32ad47e1aada475325039dca3c4f2d9a61cecd71eaFan Zhangimport com.android.settings.users.AutoSyncDataPreferenceController;
33ad47e1aada475325039dca3c4f2d9a61cecd71eaFan Zhangimport com.android.settings.users.AutoSyncPersonalDataPreferenceController;
34ad47e1aada475325039dca3c4f2d9a61cecd71eaFan Zhangimport com.android.settings.users.AutoSyncWorkDataPreferenceController;
35fe80fa5e807832ebba37ad66b33127eb4c15287cFan Zhangimport com.android.settingslib.accounts.AuthenticatorHelper;
361d583e125faf3ae4c9cd82636d8f3ecf1cdec3aaTony Mantlerimport com.android.settingslib.core.AbstractPreferenceController;
376e88635e97b200e4d070480e215c70ffc0ae9b37Fan Zhang
38c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Lingimport java.util.ArrayList;
396e88635e97b200e4d070480e215c70ffc0ae9b37Fan Zhangimport java.util.Arrays;
40d7aae18f8b927b479f240db3e352a5d051256e06Doris Lingimport java.util.List;
41d7aae18f8b927b479f240db3e352a5d051256e06Doris Ling
42881d5796204262f045d1f30596b824505ad8c0b5Fan Zhangpublic class AccountDashboardFragment extends DashboardFragment {
43881d5796204262f045d1f30596b824505ad8c0b5Fan Zhang
44881d5796204262f045d1f30596b824505ad8c0b5Fan Zhang    private static final String TAG = "AccountDashboardFrag";
45d7aae18f8b927b479f240db3e352a5d051256e06Doris Ling
46d7aae18f8b927b479f240db3e352a5d051256e06Doris Ling
47d7aae18f8b927b479f240db3e352a5d051256e06Doris Ling    @Override
48d7aae18f8b927b479f240db3e352a5d051256e06Doris Ling    public int getMetricsCategory() {
49d7aae18f8b927b479f240db3e352a5d051256e06Doris Ling        return MetricsEvent.ACCOUNT;
50d7aae18f8b927b479f240db3e352a5d051256e06Doris Ling    }
51d7aae18f8b927b479f240db3e352a5d051256e06Doris Ling
52d7aae18f8b927b479f240db3e352a5d051256e06Doris Ling    @Override
53d7aae18f8b927b479f240db3e352a5d051256e06Doris Ling    protected String getLogTag() {
54d7aae18f8b927b479f240db3e352a5d051256e06Doris Ling        return TAG;
55d7aae18f8b927b479f240db3e352a5d051256e06Doris Ling    }
56d7aae18f8b927b479f240db3e352a5d051256e06Doris Ling
57d7aae18f8b927b479f240db3e352a5d051256e06Doris Ling    @Override
58d7aae18f8b927b479f240db3e352a5d051256e06Doris Ling    protected int getPreferenceScreenResId() {
59881d5796204262f045d1f30596b824505ad8c0b5Fan Zhang        return R.xml.accounts_dashboard_settings;
60d7aae18f8b927b479f240db3e352a5d051256e06Doris Ling    }
61d7aae18f8b927b479f240db3e352a5d051256e06Doris Ling
62d7aae18f8b927b479f240db3e352a5d051256e06Doris Ling    @Override
63e0b0e9f9025038d72f8129606cc1f432afcb54e0Fan Zhang    public int getHelpResource() {
64179645eecd1a2321e7dd8992678b47799e60f9e6Fan Zhang        return R.string.help_url_user_and_account_dashboard;
65179645eecd1a2321e7dd8992678b47799e60f9e6Fan Zhang    }
66179645eecd1a2321e7dd8992678b47799e60f9e6Fan Zhang
67179645eecd1a2321e7dd8992678b47799e60f9e6Fan Zhang    @Override
68f7843adabd4e8e1cc84a52721daabefa3a1410fdFan Zhang    protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
691d583e125faf3ae4c9cd82636d8f3ecf1cdec3aaTony Mantler        final List<AbstractPreferenceController> controllers = new ArrayList<>();
70881d5796204262f045d1f30596b824505ad8c0b5Fan Zhang        final String[] authorities = getIntent().getStringArrayExtra(EXTRA_AUTHORITIES);
71bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling        final AccountPreferenceController accountPrefController =
726e88635e97b200e4d070480e215c70ffc0ae9b37Fan Zhang                new AccountPreferenceController(context, this, authorities);
73bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling        getLifecycle().addObserver(accountPrefController);
74bfac31b517e1fa2f217fe932192ecd0c57b33525Doris Ling        controllers.add(accountPrefController);
75ad47e1aada475325039dca3c4f2d9a61cecd71eaFan Zhang        controllers.add(new AutoSyncDataPreferenceController(context, this /*parent */));
76ad47e1aada475325039dca3c4f2d9a61cecd71eaFan Zhang        controllers.add(new AutoSyncPersonalDataPreferenceController(context, this /*parent */));
77ad47e1aada475325039dca3c4f2d9a61cecd71eaFan Zhang        controllers.add(new AutoSyncWorkDataPreferenceController(context, this /* parent */));
78c7e2ed8e79bffbd557d0d637384987cb21d0ecfcDoris Ling        return controllers;
79d7aae18f8b927b479f240db3e352a5d051256e06Doris Ling    }
80d7aae18f8b927b479f240db3e352a5d051256e06Doris Ling
817520e81ab5b75097a6a1c76e19e89b455a18cf58Fan Zhang    private static class SummaryProvider implements SummaryLoader.SummaryProvider {
827520e81ab5b75097a6a1c76e19e89b455a18cf58Fan Zhang
837520e81ab5b75097a6a1c76e19e89b455a18cf58Fan Zhang        private final Context mContext;
847520e81ab5b75097a6a1c76e19e89b455a18cf58Fan Zhang        private final SummaryLoader mSummaryLoader;
857520e81ab5b75097a6a1c76e19e89b455a18cf58Fan Zhang
867520e81ab5b75097a6a1c76e19e89b455a18cf58Fan Zhang        public SummaryProvider(Context context, SummaryLoader summaryLoader) {
877520e81ab5b75097a6a1c76e19e89b455a18cf58Fan Zhang            mContext = context;
887520e81ab5b75097a6a1c76e19e89b455a18cf58Fan Zhang            mSummaryLoader = summaryLoader;
897520e81ab5b75097a6a1c76e19e89b455a18cf58Fan Zhang        }
907520e81ab5b75097a6a1c76e19e89b455a18cf58Fan Zhang
917520e81ab5b75097a6a1c76e19e89b455a18cf58Fan Zhang        @Override
927520e81ab5b75097a6a1c76e19e89b455a18cf58Fan Zhang        public void setListening(boolean listening) {
937520e81ab5b75097a6a1c76e19e89b455a18cf58Fan Zhang            if (listening) {
94fe80fa5e807832ebba37ad66b33127eb4c15287cFan Zhang                final AuthenticatorHelper authHelper = new AuthenticatorHelper(mContext,
95fe80fa5e807832ebba37ad66b33127eb4c15287cFan Zhang                        UserHandle.of(UserHandle.myUserId()), null /* OnAccountsUpdateListener */);
96fe80fa5e807832ebba37ad66b33127eb4c15287cFan Zhang                final String[] types = authHelper.getEnabledAccountTypes();
97fe80fa5e807832ebba37ad66b33127eb4c15287cFan Zhang
98fe80fa5e807832ebba37ad66b33127eb4c15287cFan Zhang                final BidiFormatter bidiFormatter = BidiFormatter.getInstance();
99fe80fa5e807832ebba37ad66b33127eb4c15287cFan Zhang
100fe80fa5e807832ebba37ad66b33127eb4c15287cFan Zhang                CharSequence summary = null;
101dc2a3528d51d7292a8b4c39e176b8b3b3f0eff86Fan Zhang                if (types == null || types.length == 0) {
102dc2a3528d51d7292a8b4c39e176b8b3b3f0eff86Fan Zhang                    summary = mContext.getString(R.string.account_dashboard_default_summary);
103dc2a3528d51d7292a8b4c39e176b8b3b3f0eff86Fan Zhang                } else {
104fc4d46495d7b8d42a330a1284f162910bb682239Doris Ling                    // Show up to 3 account types, ignore any null value
105fc4d46495d7b8d42a330a1284f162910bb682239Doris Ling                    int accountToAdd = Math.min(3, types.length);
106dc2a3528d51d7292a8b4c39e176b8b3b3f0eff86Fan Zhang
107fc4d46495d7b8d42a330a1284f162910bb682239Doris Ling                    for (int i = 0; i < types.length && accountToAdd > 0; i++) {
108dc2a3528d51d7292a8b4c39e176b8b3b3f0eff86Fan Zhang                        final CharSequence label = authHelper.getLabelForType(mContext, types[i]);
109fc4d46495d7b8d42a330a1284f162910bb682239Doris Ling                        if (TextUtils.isEmpty(label)) {
110fc4d46495d7b8d42a330a1284f162910bb682239Doris Ling                            continue;
111fc4d46495d7b8d42a330a1284f162910bb682239Doris Ling                        }
112dc2a3528d51d7292a8b4c39e176b8b3b3f0eff86Fan Zhang                        if (summary == null) {
113dc2a3528d51d7292a8b4c39e176b8b3b3f0eff86Fan Zhang                            summary = bidiFormatter.unicodeWrap(label);
114dc2a3528d51d7292a8b4c39e176b8b3b3f0eff86Fan Zhang                        } else {
115dc2a3528d51d7292a8b4c39e176b8b3b3f0eff86Fan Zhang                            summary = mContext.getString(R.string.join_many_items_middle, summary,
116dc2a3528d51d7292a8b4c39e176b8b3b3f0eff86Fan Zhang                                    bidiFormatter.unicodeWrap(label));
117dc2a3528d51d7292a8b4c39e176b8b3b3f0eff86Fan Zhang                        }
118fc4d46495d7b8d42a330a1284f162910bb682239Doris Ling                        accountToAdd--;
119fe80fa5e807832ebba37ad66b33127eb4c15287cFan Zhang                    }
120fe80fa5e807832ebba37ad66b33127eb4c15287cFan Zhang                }
121fe80fa5e807832ebba37ad66b33127eb4c15287cFan Zhang                mSummaryLoader.setSummary(this, summary);
1227520e81ab5b75097a6a1c76e19e89b455a18cf58Fan Zhang            }
1237520e81ab5b75097a6a1c76e19e89b455a18cf58Fan Zhang        }
1247520e81ab5b75097a6a1c76e19e89b455a18cf58Fan Zhang    }
1257520e81ab5b75097a6a1c76e19e89b455a18cf58Fan Zhang
1267520e81ab5b75097a6a1c76e19e89b455a18cf58Fan Zhang    public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY
1277520e81ab5b75097a6a1c76e19e89b455a18cf58Fan Zhang            = new SummaryLoader.SummaryProviderFactory() {
1287520e81ab5b75097a6a1c76e19e89b455a18cf58Fan Zhang        @Override
1297520e81ab5b75097a6a1c76e19e89b455a18cf58Fan Zhang        public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
1307520e81ab5b75097a6a1c76e19e89b455a18cf58Fan Zhang                SummaryLoader summaryLoader) {
1317520e81ab5b75097a6a1c76e19e89b455a18cf58Fan Zhang            return new SummaryProvider(activity, summaryLoader);
1327520e81ab5b75097a6a1c76e19e89b455a18cf58Fan Zhang        }
1337520e81ab5b75097a6a1c76e19e89b455a18cf58Fan Zhang    };
1347520e81ab5b75097a6a1c76e19e89b455a18cf58Fan Zhang
1356e88635e97b200e4d070480e215c70ffc0ae9b37Fan Zhang    public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
1366e88635e97b200e4d070480e215c70ffc0ae9b37Fan Zhang            new BaseSearchIndexProvider() {
1376e88635e97b200e4d070480e215c70ffc0ae9b37Fan Zhang                @Override
1386e88635e97b200e4d070480e215c70ffc0ae9b37Fan Zhang                public List<SearchIndexableResource> getXmlResourcesToIndex(
1396e88635e97b200e4d070480e215c70ffc0ae9b37Fan Zhang                        Context context, boolean enabled) {
1406e88635e97b200e4d070480e215c70ffc0ae9b37Fan Zhang                    final SearchIndexableResource sir = new SearchIndexableResource(context);
141881d5796204262f045d1f30596b824505ad8c0b5Fan Zhang                    sir.xmlResId = R.xml.accounts_dashboard_settings;
1426e88635e97b200e4d070480e215c70ffc0ae9b37Fan Zhang                    return Arrays.asList(sir);
1436e88635e97b200e4d070480e215c70ffc0ae9b37Fan Zhang                }
1446e88635e97b200e4d070480e215c70ffc0ae9b37Fan Zhang            };
14520d4b041f7870796f4f186729add8cd1b42f2dddDoris Ling}