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}