diff options
Diffstat (limited to 'src')
134 files changed, 2014 insertions, 1482 deletions
diff --git a/src/com/android/settings/DateTimeSettings.java b/src/com/android/settings/DateTimeSettings.java index 2a4934c3f6..16c6ff5bcf 100644 --- a/src/com/android/settings/DateTimeSettings.java +++ b/src/com/android/settings/DateTimeSettings.java @@ -38,11 +38,13 @@ import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.datetime.ZoneGetter; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.Calendar; import java.util.List; +@SearchIndexable public class DateTimeSettings extends DashboardFragment implements TimePreferenceController.TimePreferenceHost, DatePreferenceController.DatePreferenceHost { diff --git a/src/com/android/settings/DisplaySettings.java b/src/com/android/settings/DisplaySettings.java index fef56ad582..4c8b311a18 100644 --- a/src/com/android/settings/DisplaySettings.java +++ b/src/com/android/settings/DisplaySettings.java @@ -40,10 +40,12 @@ import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.List; +@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC) public class DisplaySettings extends DashboardFragment { private static final String TAG = "DisplaySettings"; diff --git a/src/com/android/settings/LegalSettings.java b/src/com/android/settings/LegalSettings.java index e9b2694b82..3538cc9ef8 100644 --- a/src/com/android/settings/LegalSettings.java +++ b/src/com/android/settings/LegalSettings.java @@ -16,113 +16,47 @@ package com.android.settings; -import android.app.Activity; import android.content.Context; -import android.content.Intent; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; -import android.os.Bundle; import android.provider.SearchIndexableResource; -import android.support.annotation.VisibleForTesting; -import android.support.v7.preference.PreferenceGroup; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; -import com.android.settings.R; +import com.android.settings.dashboard.DashboardFragment; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; +import com.android.settingslib.search.SearchIndexable; import java.util.Arrays; import java.util.List; -public class LegalSettings extends SettingsPreferenceFragment implements Indexable { +@SearchIndexable +public class LegalSettings extends DashboardFragment { - private static final String KEY_TERMS = "terms"; - private static final String KEY_LICENSE = "license"; - private static final String KEY_COPYRIGHT = "copyright"; - private static final String KEY_WEBVIEW_LICENSE = "webview_license"; - @VisibleForTesting static final String KEY_WALLPAPER_ATTRIBUTIONS = "wallpaper_attributions"; - - public void onCreate(Bundle icicle) { - super.onCreate(icicle); - addPreferencesFromResource(R.xml.about_legal); - - final Activity act = getActivity(); - // These are contained in the "container" preference group - PreferenceGroup parentPreference = getPreferenceScreen(); - Utils.updatePreferenceToSpecificActivityOrRemove(act, parentPreference, KEY_TERMS, - Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY); - Utils.updatePreferenceToSpecificActivityOrRemove(act, parentPreference, KEY_LICENSE, - Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY); - Utils.updatePreferenceToSpecificActivityOrRemove(act, parentPreference, KEY_COPYRIGHT, - Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY); - Utils.updatePreferenceToSpecificActivityOrRemove(act, parentPreference, KEY_WEBVIEW_LICENSE, - Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY); - - checkWallpaperAttributionAvailability(act); - } + private static final String TAG = "LegalSettings"; @Override public int getMetricsCategory() { return MetricsEvent.ABOUT_LEGAL_SETTINGS; } - @VisibleForTesting - void checkWallpaperAttributionAvailability(Context context) { - if (!context.getResources().getBoolean( - R.bool.config_show_wallpaper_attribution)) { - removePreference(KEY_WALLPAPER_ATTRIBUTIONS); - } + @Override + protected String getLogTag() { + return TAG; } - public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = - new BaseSearchIndexProvider() { - - @Override - public List<SearchIndexableResource> getXmlResourcesToIndex( - Context context, boolean enabled) { - final SearchIndexableResource sir = new SearchIndexableResource(context); - sir.xmlResId = R.xml.about_legal; - return Arrays.asList(sir); - } - - @Override - public List<String> getNonIndexableKeys(Context context) { - final List<String> keys = super.getNonIndexableKeys(context); - if (!checkIntentAction(context, "android.settings.TERMS")) { - keys.add(KEY_TERMS); - } - if (!checkIntentAction(context, "android.settings.LICENSE")) { - keys.add(KEY_LICENSE); - } - if (!checkIntentAction(context, "android.settings.COPYRIGHT")) { - keys.add(KEY_COPYRIGHT); - } - if (!checkIntentAction(context, "android.settings.WEBVIEW_LICENSE")) { - keys.add(KEY_WEBVIEW_LICENSE); - } - keys.add(KEY_WALLPAPER_ATTRIBUTIONS); - return keys; - } - - private boolean checkIntentAction(Context context, String action) { - final Intent intent = new Intent(action); + @Override + protected int getPreferenceScreenResId() { + return R.xml.about_legal; + } - // Find the activity that is in the system image - final PackageManager pm = context.getPackageManager(); - final List<ResolveInfo> list = pm.queryIntentActivities(intent, 0); - final int listSize = list.size(); + public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider() { - for (int i = 0; i < listSize; i++) { - ResolveInfo resolveInfo = list.get(i); - if ((resolveInfo.activityInfo.applicationInfo.flags & - ApplicationInfo.FLAG_SYSTEM) != 0) { - return true; - } + @Override + public List<SearchIndexableResource> getXmlResourcesToIndex( + Context context, boolean enabled) { + final SearchIndexableResource sir = new SearchIndexableResource(context); + sir.xmlResId = R.xml.about_legal; + return Arrays.asList(sir); } - - return false; - } - }; - + }; } diff --git a/src/com/android/settings/PrivacySettings.java b/src/com/android/settings/PrivacySettings.java deleted file mode 100644 index 24774e0657..0000000000 --- a/src/com/android/settings/PrivacySettings.java +++ /dev/null @@ -1,248 +0,0 @@ -/* - * Copyright (C) 2009 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.settings; - -import android.app.backup.IBackupManager; -import android.content.ContentResolver; -import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; -import android.os.Bundle; -import android.os.RemoteException; -import android.os.ServiceManager; -import android.os.UserHandle; -import android.os.UserManager; -import android.provider.SearchIndexableResource; -import android.provider.Settings; -import android.support.annotation.VisibleForTesting; -import android.support.v14.preference.SwitchPreference; -import android.support.v7.preference.Preference; -import android.support.v7.preference.Preference.OnPreferenceChangeListener; -import android.support.v7.preference.PreferenceScreen; -import android.util.Log; - -import com.android.internal.logging.nano.MetricsProto.MetricsEvent; -import com.android.settings.search.BaseSearchIndexProvider; -import com.android.settings.search.Indexable; -import com.android.settingslib.RestrictedLockUtils; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -/** - * Gesture lock pattern settings. - */ -public class PrivacySettings extends SettingsPreferenceFragment { - - // Vendor specific - private static final String GSETTINGS_PROVIDER = "com.google.settings"; - @VisibleForTesting - static final String BACKUP_DATA = "backup_data"; - @VisibleForTesting - static final String AUTO_RESTORE = "auto_restore"; - @VisibleForTesting - static final String CONFIGURE_ACCOUNT = "configure_account"; - @VisibleForTesting - static final String DATA_MANAGEMENT = "data_management"; - private static final String BACKUP_INACTIVE = "backup_inactive"; - private static final String TAG = "PrivacySettings"; - private IBackupManager mBackupManager; - private Preference mBackup; - private SwitchPreference mAutoRestore; - private Preference mConfigure; - private Preference mManageData; - private boolean mEnabled; - - @Override - public int getMetricsCategory() { - return MetricsEvent.PRIVACY; - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - // Don't allow any access if this is not an admin user. - // TODO: backup/restore currently only works with owner user b/22760572 - mEnabled = UserManager.get(getActivity()).isAdminUser(); - if (!mEnabled) { - return; - } - - addPreferencesFromResource(R.xml.privacy_settings); - final PreferenceScreen screen = getPreferenceScreen(); - mBackupManager = IBackupManager.Stub.asInterface( - ServiceManager.getService(Context.BACKUP_SERVICE)); - - setPreferenceReferences(screen); - - Set<String> keysToRemove = new HashSet<>(); - getNonVisibleKeys(getActivity(), keysToRemove); - final int screenPreferenceCount = screen.getPreferenceCount(); - for (int i = screenPreferenceCount - 1; i >= 0; --i) { - Preference preference = screen.getPreference(i); - if (keysToRemove.contains(preference.getKey())) { - screen.removePreference(preference); - } - } - - updateToggles(); - } - - @Override - public void onResume() { - super.onResume(); - - // Refresh UI - if (mEnabled) { - updateToggles(); - } - } - - @VisibleForTesting - void setPreferenceReferences(PreferenceScreen screen) { - mBackup = screen.findPreference(BACKUP_DATA); - - mAutoRestore = (SwitchPreference) screen.findPreference(AUTO_RESTORE); - mAutoRestore.setOnPreferenceChangeListener(preferenceChangeListener); - - mConfigure = screen.findPreference(CONFIGURE_ACCOUNT); - mManageData = screen.findPreference(DATA_MANAGEMENT); - } - - private OnPreferenceChangeListener preferenceChangeListener = new OnPreferenceChangeListener() { - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - if (!(preference instanceof SwitchPreference)) { - return true; - } - boolean nextValue = (Boolean) newValue; - boolean result = false; - if (preference == mAutoRestore) { - try { - mBackupManager.setAutoRestore(nextValue); - result = true; - } catch (RemoteException e) { - mAutoRestore.setChecked(!nextValue); - } - } - return result; - } - }; - - - /* - * Creates toggles for each backup/reset preference. - */ - private void updateToggles() { - ContentResolver res = getContentResolver(); - - boolean backupEnabled = false; - Intent configIntent = null; - String configSummary = null; - Intent manageIntent = null; - String manageLabel = null; - try { - backupEnabled = mBackupManager.isBackupEnabled(); - String transport = mBackupManager.getCurrentTransport(); - configIntent = validatedActivityIntent( - mBackupManager.getConfigurationIntent(transport), "config"); - configSummary = mBackupManager.getDestinationString(transport); - manageIntent = validatedActivityIntent( - mBackupManager.getDataManagementIntent(transport), "management"); - manageLabel = mBackupManager.getDataManagementLabel(transport); - - mBackup.setSummary(backupEnabled - ? R.string.accessibility_feature_state_on - : R.string.accessibility_feature_state_off); - } catch (RemoteException e) { - // leave it 'false' and disable the UI; there's no backup manager - mBackup.setEnabled(false); - } - - mAutoRestore.setChecked(Settings.Secure.getInt(res, - Settings.Secure.BACKUP_AUTO_RESTORE, 1) == 1); - mAutoRestore.setEnabled(backupEnabled); - - final boolean configureEnabled = (configIntent != null) && backupEnabled; - mConfigure.setEnabled(configureEnabled); - mConfigure.setIntent(configIntent); - setConfigureSummary(configSummary); - - final boolean manageEnabled = (manageIntent != null) && backupEnabled; - if (manageEnabled) { - mManageData.setIntent(manageIntent); - if (manageLabel != null) { - mManageData.setTitle(manageLabel); - } - } else { - // Hide the item if data management intent is not supported by transport. - getPreferenceScreen().removePreference(mManageData); - } - } - - private Intent validatedActivityIntent(Intent intent, String logLabel) { - if (intent != null) { - PackageManager pm = getPackageManager(); - List<ResolveInfo> resolved = pm.queryIntentActivities(intent, 0); - if (resolved == null || resolved.isEmpty()) { - intent = null; - Log.e(TAG, "Backup " + logLabel + " intent " + intent - + " fails to resolve; ignoring"); - } - } - return intent; - } - - private void setConfigureSummary(String summary) { - if (summary != null) { - mConfigure.setSummary(summary); - } else { - mConfigure.setSummary(R.string.backup_configure_account_default_summary); - } - } - - @Override - public int getHelpResource() { - return R.string.help_url_backup_reset; - } - - private static void getNonVisibleKeys(Context context, Collection<String> nonVisibleKeys) { - final IBackupManager backupManager = IBackupManager.Stub.asInterface( - ServiceManager.getService(Context.BACKUP_SERVICE)); - boolean isServiceActive = false; - try { - isServiceActive = backupManager.isBackupServiceActive(UserHandle.myUserId()); - } catch (RemoteException e) { - Log.w(TAG, "Failed querying backup manager service activity status. " + - "Assuming it is inactive."); - } - boolean vendorSpecific = context.getPackageManager(). - resolveContentProvider(GSETTINGS_PROVIDER, 0) == null; - if (vendorSpecific || isServiceActive) { - nonVisibleKeys.add(BACKUP_INACTIVE); - } - if (vendorSpecific || !isServiceActive) { - nonVisibleKeys.add(BACKUP_DATA); - nonVisibleKeys.add(AUTO_RESTORE); - nonVisibleKeys.add(CONFIGURE_ACCOUNT); - } - } -} diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java index 3f7bd2582c..0268ca4881 100644 --- a/src/com/android/settings/accessibility/AccessibilitySettings.java +++ b/src/com/android/settings/accessibility/AccessibilitySettings.java @@ -59,6 +59,7 @@ import com.android.settingslib.RestrictedLockUtils; import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import com.android.settingslib.RestrictedPreference; import com.android.settingslib.accessibility.AccessibilityUtils; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.Collection; @@ -70,6 +71,7 @@ import java.util.Set; /** * Activity with the accessibility settings. */ +@SearchIndexable public class AccessibilitySettings extends SettingsPreferenceFragment implements Preference.OnPreferenceChangeListener, Indexable { diff --git a/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java b/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java index bc164ab515..1510ae46cf 100644 --- a/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java +++ b/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java @@ -36,10 +36,12 @@ import com.android.settings.R; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settingslib.accessibility.AccessibilityUtils; +import com.android.settingslib.search.SearchIndexable; /** * Settings page for accessibility shortcut */ +@SearchIndexable public class AccessibilityShortcutPreferenceFragment extends ToggleFeaturePreferenceFragment implements Indexable { diff --git a/src/com/android/settings/accessibility/MagnificationPreferenceFragment.java b/src/com/android/settings/accessibility/MagnificationPreferenceFragment.java index 44d5b7942c..e79dd54098 100644 --- a/src/com/android/settings/accessibility/MagnificationPreferenceFragment.java +++ b/src/com/android/settings/accessibility/MagnificationPreferenceFragment.java @@ -32,10 +32,12 @@ import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; +import com.android.settingslib.search.SearchIndexable; import java.util.Arrays; import java.util.List; +@SearchIndexable public final class MagnificationPreferenceFragment extends DashboardFragment { private static final String TAG = "MagnificationPreferenceFragment"; diff --git a/src/com/android/settings/accessibility/VibrationSettings.java b/src/com/android/settings/accessibility/VibrationSettings.java index 83a5af6ac8..37207e743e 100644 --- a/src/com/android/settings/accessibility/VibrationSettings.java +++ b/src/com/android/settings/accessibility/VibrationSettings.java @@ -23,6 +23,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.List; @@ -30,6 +31,7 @@ import java.util.List; /** * Accessibility settings for the vibration. */ +@SearchIndexable public class VibrationSettings extends DashboardFragment { private static final String TAG = "VibrationSettings"; diff --git a/src/com/android/settings/accounts/AccountDashboardFragment.java b/src/com/android/settings/accounts/AccountDashboardFragment.java index b97694031e..094390c2e0 100644 --- a/src/com/android/settings/accounts/AccountDashboardFragment.java +++ b/src/com/android/settings/accounts/AccountDashboardFragment.java @@ -34,11 +34,13 @@ import com.android.settings.users.AutoSyncPersonalDataPreferenceController; import com.android.settings.users.AutoSyncWorkDataPreferenceController; import com.android.settingslib.accounts.AuthenticatorHelper; import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +@SearchIndexable public class AccountDashboardFragment extends DashboardFragment { private static final String TAG = "AccountDashboardFrag"; diff --git a/src/com/android/settings/accounts/AccountPreferenceBase.java b/src/com/android/settings/accounts/AccountPreferenceBase.java index 54ddf64eaa..bdf9c98a05 100644 --- a/src/com/android/settings/accounts/AccountPreferenceBase.java +++ b/src/com/android/settings/accounts/AccountPreferenceBase.java @@ -33,8 +33,6 @@ import com.android.settings.Utils; import com.android.settingslib.accounts.AuthenticatorHelper; import com.android.settingslib.utils.ThreadUtils; -import java.util.Date; - abstract class AccountPreferenceBase extends SettingsPreferenceFragment implements AuthenticatorHelper.OnAccountsUpdateListener { @@ -129,9 +127,4 @@ abstract class AccountPreferenceBase extends SettingsPreferenceFragment protected CharSequence getLabelForType(final String accountType) { return mAuthenticatorHelper.getLabelForType(getActivity(), accountType); } - - protected String formatSyncDate(Date date) { - // TODO: Switch to using DateUtils.formatDateTime - return mDateFormat.format(date) + " " + mTimeFormat.format(date); - } } diff --git a/src/com/android/settings/accounts/AccountSyncSettings.java b/src/com/android/settings/accounts/AccountSyncSettings.java index 6b60e87f85..fd2e2c557b 100644 --- a/src/com/android/settings/accounts/AccountSyncSettings.java +++ b/src/com/android/settings/accounts/AccountSyncSettings.java @@ -37,6 +37,7 @@ import android.os.UserHandle; import android.os.UserManager; import android.support.v7.preference.Preference; import android.text.TextUtils; +import android.text.format.DateUtils; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; @@ -462,7 +463,7 @@ public class AccountSyncSettings extends AccountPreferenceBase { syncPref.setSummary(R.string.sync_in_progress); } else if (successEndTime != 0) { date.setTime(successEndTime); - final String timeString = formatSyncDate(date); + final String timeString = formatSyncDate(getContext(), date); syncPref.setSummary(getResources().getString(R.string.last_synced, timeString)); } else { syncPref.setSummary(""); @@ -575,4 +576,11 @@ public class AccountSyncSettings extends AccountPreferenceBase { public int getHelpResource() { return R.string.help_url_accounts; } + + private static String formatSyncDate(Context context, Date date) { + return DateUtils.formatDateTime(context, date.getTime(), + DateUtils.FORMAT_SHOW_DATE + | DateUtils.FORMAT_SHOW_YEAR + | DateUtils.FORMAT_SHOW_TIME); + } } diff --git a/src/com/android/settings/accounts/ContactSearchPreferenceController.java b/src/com/android/settings/accounts/ContactSearchPreferenceController.java new file mode 100644 index 0000000000..578a5cb3a7 --- /dev/null +++ b/src/com/android/settings/accounts/ContactSearchPreferenceController.java @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ +package com.android.settings.accounts; + +import static android.provider.Settings.Secure.MANAGED_PROFILE_CONTACT_REMOTE_SEARCH; + +import android.content.Context; +import android.os.UserHandle; +import android.provider.Settings; +import android.support.v7.preference.Preference; + +import com.android.settings.core.BasePreferenceController; +import com.android.settings.slices.SliceData; +import com.android.settingslib.RestrictedLockUtils; +import com.android.settingslib.RestrictedSwitchPreference; + +public class ContactSearchPreferenceController extends BasePreferenceController implements + Preference.OnPreferenceChangeListener { + + private UserHandle mManagedUser; + + public ContactSearchPreferenceController(Context context, String key) { + super(context, key); + } + + public void setManagedUser(UserHandle managedUser) { + mManagedUser = managedUser; + } + + @Override + public int getAvailabilityStatus() { + return (mManagedUser != null) ? AVAILABLE : DISABLED_FOR_USER; + } + + @Override + public void updateState(Preference preference) { + super.updateState(preference); + if (preference instanceof RestrictedSwitchPreference) { + final RestrictedSwitchPreference pref = (RestrictedSwitchPreference) preference; + pref.setChecked(isChecked()); + if (mManagedUser != null) { + final RestrictedLockUtils.EnforcedAdmin enforcedAdmin = + RestrictedLockUtils.checkIfRemoteContactSearchDisallowed( + mContext, mManagedUser.getIdentifier()); + pref.setDisabledByAdmin(enforcedAdmin); + } + } + } + + private boolean isChecked() { + if (mManagedUser == null) { + return false; + } + return 0 != Settings.Secure.getIntForUser(mContext.getContentResolver(), + MANAGED_PROFILE_CONTACT_REMOTE_SEARCH, 0, mManagedUser.getIdentifier()); + } + + private boolean setChecked(boolean isChecked) { + if (mManagedUser != null) { + final int value = isChecked ? 1 : 0; + Settings.Secure.putIntForUser(mContext.getContentResolver(), + MANAGED_PROFILE_CONTACT_REMOTE_SEARCH, value, mManagedUser.getIdentifier()); + } + return true; + } + + @Override + public final boolean onPreferenceChange(Preference preference, Object newValue) { + return setChecked((boolean) newValue); + } + + @Override + @SliceData.SliceType + public int getSliceType() { + return SliceData.SliceType.SWITCH; + } +}
\ No newline at end of file diff --git a/src/com/android/settings/accounts/ManagedProfileSettings.java b/src/com/android/settings/accounts/ManagedProfileSettings.java index 09330428d3..07e5845898 100644 --- a/src/com/android/settings/accounts/ManagedProfileSettings.java +++ b/src/com/android/settings/accounts/ManagedProfileSettings.java @@ -23,69 +23,61 @@ import android.content.IntentFilter; import android.os.Bundle; import android.os.UserHandle; import android.os.UserManager; -import android.provider.Settings; -import android.support.v14.preference.SwitchPreference; -import android.support.v7.preference.Preference; import android.util.Log; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; -import com.android.settings.SettingsPreferenceFragment; import com.android.settings.Utils; -import com.android.settingslib.RestrictedLockUtils; -import com.android.settingslib.RestrictedSwitchPreference; - -import static android.provider.Settings.Secure.MANAGED_PROFILE_CONTACT_REMOTE_SEARCH; +import com.android.settings.dashboard.DashboardFragment; /** * Setting page for managed profile. * FIXME: It currently assumes there is only one managed profile. */ -public class ManagedProfileSettings extends SettingsPreferenceFragment - implements Preference.OnPreferenceChangeListener { - - private SwitchPreference mWorkModePreference; - private RestrictedSwitchPreference mContactPrefrence; +public class ManagedProfileSettings extends DashboardFragment { private UserManager mUserManager; private UserHandle mManagedUser; - private Context mContext; private ManagedProfileBroadcastReceiver mManagedProfileBroadcastReceiver; - private static final String KEY_WORK_MODE = "work_mode"; - private static final String KEY_CONTACT = "contacts_search"; - private static final String TAG = "ManagedProfileSettings"; @Override - public void onCreate(Bundle icicle) { - super.onCreate(icicle); - addPreferencesFromResource(R.xml.managed_profile_settings); - mWorkModePreference = (SwitchPreference) findPreference(KEY_WORK_MODE); - mWorkModePreference.setOnPreferenceChangeListener(this); - mContactPrefrence = (RestrictedSwitchPreference) findPreference(KEY_CONTACT); - mContactPrefrence.setOnPreferenceChangeListener(this); - mContext = getActivity().getApplicationContext(); + protected String getLogTag() { + return TAG; + } + + @Override + protected int getPreferenceScreenResId() { + return R.xml.managed_profile_settings; + } + + @Override + public void onAttach(Context context) { + super.onAttach(context); mUserManager = (UserManager) getSystemService(Context.USER_SERVICE); mManagedUser = getManagedUserFromArgument(); if (mManagedUser == null) { getActivity().finish(); } - mManagedProfileBroadcastReceiver = new ManagedProfileBroadcastReceiver(); - mManagedProfileBroadcastReceiver.register(getActivity()); + use(WorkModePreferenceController.class).setManagedUser(mManagedUser); + use(ContactSearchPreferenceController.class).setManagedUser(mManagedUser); } @Override - public void onResume() { - super.onResume(); - loadDataAndPopulateUi(); + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + mManagedProfileBroadcastReceiver = new ManagedProfileBroadcastReceiver(); + mManagedProfileBroadcastReceiver.register(getActivity()); } @Override public void onDestroy() { super.onDestroy(); - mManagedProfileBroadcastReceiver.unregister(getActivity()); + if (mManagedProfileBroadcastReceiver != null) { + mManagedProfileBroadcastReceiver.unregister(getActivity()); + } } private UserHandle getManagedUserFromArgument() { @@ -102,59 +94,21 @@ public class ManagedProfileSettings extends SettingsPreferenceFragment return Utils.getManagedProfile(mUserManager); } - private void loadDataAndPopulateUi() { - if (mWorkModePreference != null) { - updateWorkModePreference(); - } - - if (mContactPrefrence != null) { - int value = Settings.Secure.getIntForUser(getContentResolver(), - MANAGED_PROFILE_CONTACT_REMOTE_SEARCH, 0, mManagedUser.getIdentifier()); - mContactPrefrence.setChecked(value != 0); - RestrictedLockUtils.EnforcedAdmin enforcedAdmin = - RestrictedLockUtils.checkIfRemoteContactSearchDisallowed( - mContext, mManagedUser.getIdentifier()); - mContactPrefrence.setDisabledByAdmin(enforcedAdmin); - } - } - @Override public int getMetricsCategory() { return MetricsProto.MetricsEvent.ACCOUNTS_WORK_PROFILE_SETTINGS; } - private void updateWorkModePreference() { - boolean isWorkModeOn = !mUserManager.isQuietModeEnabled(mManagedUser); - mWorkModePreference.setChecked(isWorkModeOn); - mWorkModePreference.setSummary(isWorkModeOn - ? R.string.work_mode_on_summary - : R.string.work_mode_off_summary); - } - - - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - if (preference == mWorkModePreference) { - boolean quietModeEnabled = !(boolean) newValue; - mUserManager.requestQuietModeEnabled(quietModeEnabled, mManagedUser); - return true; - } - if (preference == mContactPrefrence) { - int value = ((boolean) newValue == true) ? 1 : 0; - Settings.Secure.putIntForUser(getContentResolver(), - MANAGED_PROFILE_CONTACT_REMOTE_SEARCH, value, mManagedUser.getIdentifier()); - return true; - } - return false; - } - private class ManagedProfileBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { + if (intent == null) { + return; + } final String action = intent.getAction(); Log.v(TAG, "Received broadcast: " + action); - if (action.equals(Intent.ACTION_MANAGED_PROFILE_REMOVED)) { + if (Intent.ACTION_MANAGED_PROFILE_REMOVED.equals(action)) { if (intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL) == mManagedUser.getIdentifier()) { getActivity().finish(); @@ -162,23 +116,12 @@ public class ManagedProfileSettings extends SettingsPreferenceFragment return; } - if (action.equals(Intent.ACTION_MANAGED_PROFILE_AVAILABLE) - || action.equals(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE)) { - if (intent.getIntExtra(Intent.EXTRA_USER_HANDLE, - UserHandle.USER_NULL) == mManagedUser.getIdentifier()) { - updateWorkModePreference(); - } - return; - } Log.w(TAG, "Cannot handle received broadcast: " + intent.getAction()); } - public void register(Context context) { IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_REMOVED); - intentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE); - intentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE); context.registerReceiver(this, intentFilter); } @@ -186,5 +129,4 @@ public class ManagedProfileSettings extends SettingsPreferenceFragment context.unregisterReceiver(this); } } - } diff --git a/src/com/android/settings/accounts/WorkModePreferenceController.java b/src/com/android/settings/accounts/WorkModePreferenceController.java new file mode 100644 index 0000000000..e3fb15d5e8 --- /dev/null +++ b/src/com/android/settings/accounts/WorkModePreferenceController.java @@ -0,0 +1,146 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ +package com.android.settings.accounts; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.UserHandle; +import android.os.UserManager; +import android.support.annotation.VisibleForTesting; +import android.support.v7.preference.Preference; +import android.support.v7.preference.PreferenceScreen; +import android.support.v7.preference.TwoStatePreference; +import android.util.Log; + +import com.android.settings.R; +import com.android.settings.core.BasePreferenceController; +import com.android.settings.slices.SliceData; +import com.android.settingslib.core.lifecycle.LifecycleObserver; +import com.android.settingslib.core.lifecycle.events.OnStart; +import com.android.settingslib.core.lifecycle.events.OnStop; + +public class WorkModePreferenceController extends BasePreferenceController implements + Preference.OnPreferenceChangeListener, LifecycleObserver, OnStart, OnStop { + + private static final String TAG = "WorkModeController"; + + private UserManager mUserManager; + private UserHandle mManagedUser; + + private Preference mPreference; + private IntentFilter mIntentFilter; + + public WorkModePreferenceController(Context context, String key) { + super(context, key); + mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); + mIntentFilter = new IntentFilter(); + mIntentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE); + mIntentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE); + } + + public void setManagedUser(UserHandle managedUser) { + mManagedUser = managedUser; + } + + @Override + public void onStart() { + mContext.registerReceiver(mReceiver, mIntentFilter); + } + + @Override + public void onStop() { + mContext.unregisterReceiver(mReceiver); + } + + @Override + public int getAvailabilityStatus() { + return (mManagedUser != null) ? AVAILABLE : DISABLED_FOR_USER; + } + + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + mPreference = screen.findPreference(getPreferenceKey()); + } + + @Override + public CharSequence getSummary() { + return mContext.getText(isChecked() + ? R.string.work_mode_on_summary + : R.string.work_mode_off_summary); + } + + private boolean isChecked() { + boolean isWorkModeOn = false; + if (mUserManager != null && mManagedUser != null) { + isWorkModeOn = !mUserManager.isQuietModeEnabled(mManagedUser); + } + return isWorkModeOn; + } + + private boolean setChecked(boolean isChecked) { + if (mUserManager != null && mManagedUser != null) { + final boolean quietModeEnabled = !isChecked; + mUserManager.requestQuietModeEnabled(quietModeEnabled, mManagedUser); + } + return true; + } + + @Override + public void updateState(Preference preference) { + super.updateState(preference); + if (preference instanceof TwoStatePreference) { + ((TwoStatePreference) preference).setChecked(isChecked()); + } + } + + @Override + public final boolean onPreferenceChange(Preference preference, Object newValue) { + return setChecked((boolean) newValue); + } + + /** + * Receiver that listens to {@link Intent#ACTION_MANAGED_PROFILE_AVAILABLE} and + * {@link Intent#ACTION_MANAGED_PROFILE_UNAVAILABLE}, and updates the work mode + */ + @VisibleForTesting + final BroadcastReceiver mReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (intent == null) { + return; + } + final String action = intent.getAction(); + Log.v(TAG, "Received broadcast: " + action); + + if (Intent.ACTION_MANAGED_PROFILE_AVAILABLE.equals(action) + || Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE.equals(action)) { + if (intent.getIntExtra(Intent.EXTRA_USER_HANDLE, + UserHandle.USER_NULL) == mManagedUser.getIdentifier()) { + updateState(mPreference); + } + return; + } + Log.w(TAG, "Cannot handle received broadcast: " + intent.getAction()); + } + }; + + @Override + @SliceData.SliceType + public int getSliceType() { + return SliceData.SliceType.SWITCH; + } +}
\ No newline at end of file diff --git a/src/com/android/settings/applications/AppAndNotificationDashboardFragment.java b/src/com/android/settings/applications/AppAndNotificationDashboardFragment.java index eb74fb1386..aaf1d5825e 100644 --- a/src/com/android/settings/applications/AppAndNotificationDashboardFragment.java +++ b/src/com/android/settings/applications/AppAndNotificationDashboardFragment.java @@ -28,11 +28,13 @@ import com.android.settings.dashboard.DashboardFragment; import com.android.settings.notification.EmergencyBroadcastPreferenceController; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +@SearchIndexable public class AppAndNotificationDashboardFragment extends DashboardFragment { private static final String TAG = "AppAndNotifDashboard"; diff --git a/src/com/android/settings/applications/DefaultAppSettings.java b/src/com/android/settings/applications/DefaultAppSettings.java index 7fc405f3d3..8def015738 100644 --- a/src/com/android/settings/applications/DefaultAppSettings.java +++ b/src/com/android/settings/applications/DefaultAppSettings.java @@ -37,11 +37,13 @@ import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settings.widget.PreferenceCategoryController; import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +@SearchIndexable public class DefaultAppSettings extends DashboardFragment { static final String TAG = "DefaultAppSettings"; diff --git a/src/com/android/settings/applications/SpecialAccessSettings.java b/src/com/android/settings/applications/SpecialAccessSettings.java index 6387ec7053..da41a18a97 100644 --- a/src/com/android/settings/applications/SpecialAccessSettings.java +++ b/src/com/android/settings/applications/SpecialAccessSettings.java @@ -26,9 +26,12 @@ import com.android.settings.dashboard.DashboardFragment; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.search.SearchIndexable; + import java.util.ArrayList; import java.util.List; +@SearchIndexable public class SpecialAccessSettings extends DashboardFragment { private static final String TAG = "SpecialAccessSettings"; diff --git a/src/com/android/settings/applications/assist/ManageAssist.java b/src/com/android/settings/applications/assist/ManageAssist.java index 82db01ff3d..cd85aca897 100644 --- a/src/com/android/settings/applications/assist/ManageAssist.java +++ b/src/com/android/settings/applications/assist/ManageAssist.java @@ -27,6 +27,7 @@ import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.Arrays; @@ -35,6 +36,7 @@ import java.util.List; /** * Settings screen to manage everything about assist. */ +@SearchIndexable public class ManageAssist extends DashboardFragment { private static final String TAG = "ManageAssist"; diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java index 301e71bfe4..f720432ef5 100644 --- a/src/com/android/settings/applications/manageapplications/ManageApplications.java +++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java @@ -155,6 +155,7 @@ public class ManageApplications extends InstrumentedFragment private static final String EXTRA_SHOW_SYSTEM = "showSystem"; private static final String EXTRA_HAS_ENTRIES = "hasEntries"; private static final String EXTRA_HAS_BRIDGE = "hasBridge"; + private static final String EXTRA_FILTER_TYPE = "filterType"; // attributes used as keys when passing values to AppInfoDashboardFragment activity public static final String APP_CHG = "chg"; @@ -232,6 +233,7 @@ public class ManageApplications extends InstrumentedFragment private boolean mIsWorkOnly; private int mWorkUserId; private View mEmptyView; + private int mFilterType; @Override public void onCreate(Bundle savedInstanceState) { @@ -312,6 +314,8 @@ public class ManageApplications extends InstrumentedFragment if (savedInstanceState != null) { mSortOrder = savedInstanceState.getInt(EXTRA_SORT_ORDER, mSortOrder); mShowSystem = savedInstanceState.getBoolean(EXTRA_SHOW_SYSTEM, mShowSystem); + mFilterType = + savedInstanceState.getInt(EXTRA_FILTER_TYPE, AppFilterRegistry.FILTER_APPS_ALL); } mInvalidSizeStr = activity.getText(R.string.invalid_size_value); @@ -494,6 +498,7 @@ public class ManageApplications extends InstrumentedFragment outState.putBoolean(EXTRA_SHOW_SYSTEM, mShowSystem); outState.putBoolean(EXTRA_HAS_ENTRIES, mApplications.mHasReceivedLoadEntries); outState.putBoolean(EXTRA_HAS_BRIDGE, mApplications.mHasReceivedBridgeCallback); + outState.putInt(EXTRA_FILTER_TYPE, mFilter.getFilterType()); if (mApplications != null) { mApplications.onSaveInstanceState(outState); } @@ -790,6 +795,16 @@ public class ManageApplications extends InstrumentedFragment mManageApplications.mFilterSpinner.setSelection(0); mManageApplications.onItemSelected(null, null, 0, 0); } + if (mFilterOptions.size() > 1) { + if (filterType == mManageApplications.mFilterType) { + int index = mFilterOptions.indexOf(filter); + if (index != -1) { + mManageApplications.mFilterSpinner.setSelection(index); + mManageApplications.onItemSelected(null, null, index, 0); + mManageApplications.mFilterType = AppFilterRegistry.FILTER_APPS_ALL; + } + } + } } public void disableFilter(@AppFilterRegistry.FilterType int filterType) { diff --git a/src/com/android/settings/backup/AutoRestorePreferenceController.java b/src/com/android/settings/backup/AutoRestorePreferenceController.java new file mode 100644 index 0000000000..7bcf350e3d --- /dev/null +++ b/src/com/android/settings/backup/AutoRestorePreferenceController.java @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.settings.backup; + +import android.app.backup.IBackupManager; +import android.content.ContentResolver; +import android.content.Context; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.provider.Settings; +import android.support.v14.preference.SwitchPreference; +import android.support.v7.preference.Preference; +import android.util.Log; + +import com.android.settings.core.TogglePreferenceController; + +public class AutoRestorePreferenceController extends TogglePreferenceController { + private static final String TAG = "AutoRestorePrefCtrler"; + + private PrivacySettingsConfigData mPSCD; + private Preference mPreference; + + public AutoRestorePreferenceController(Context context, String key) { + super(context, key); + } + + public void setPrivacySettingsConfigData(final PrivacySettingsConfigData pData) { + mPSCD = pData; + } + + @Override + public int getAvailabilityStatus() { + if (!PrivacySettingsUtils.isAdminUser(mContext)) { + return DISABLED_FOR_USER; + } + if (PrivacySettingsUtils.isInvisibleKey(mContext, PrivacySettingsUtils.AUTO_RESTORE)) { + return DISABLED_UNSUPPORTED; + } + return AVAILABLE; + } + + @Override + public void updateState(Preference preference) { + super.updateState(preference); + mPreference = preference; + preference.setEnabled(mPSCD.isBackupEnabled()); + } + + @Override + public boolean isChecked() { + final ContentResolver res = mContext.getContentResolver(); + + return Settings.Secure.getInt(res, + Settings.Secure.BACKUP_AUTO_RESTORE, 1) == 1; + } + + @Override + public boolean setChecked(boolean isChecked) { + final boolean nextValue = isChecked; + boolean result = false; + + final IBackupManager backupManager = IBackupManager.Stub.asInterface( + ServiceManager.getService(Context.BACKUP_SERVICE)); + + try { + backupManager.setAutoRestore(nextValue); + result = true; + } catch (RemoteException e) { + ((SwitchPreference) mPreference).setChecked(!nextValue); + Log.e(TAG, "Error can't set setAutoRestore", e); + } + + return result; + } +}
\ No newline at end of file diff --git a/src/com/android/settings/backup/BackupDataPreferenceController.java b/src/com/android/settings/backup/BackupDataPreferenceController.java new file mode 100644 index 0000000000..0a0f581c1f --- /dev/null +++ b/src/com/android/settings/backup/BackupDataPreferenceController.java @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.settings.backup; + +import android.content.Context; +import android.support.v7.preference.Preference; + +import com.android.settings.core.BasePreferenceController; +import com.android.settings.R; + +public class BackupDataPreferenceController extends BasePreferenceController { + private PrivacySettingsConfigData mPSCD; + + public BackupDataPreferenceController(Context context, String key) { + super(context, key); + } + + public void setPrivacySettingsConfigData(final PrivacySettingsConfigData pData) { + mPSCD = pData; + } + + @Override + public int getAvailabilityStatus() { + if (!PrivacySettingsUtils.isAdminUser(mContext)) { + return DISABLED_FOR_USER; + } + if (PrivacySettingsUtils.isInvisibleKey(mContext, PrivacySettingsUtils.BACKUP_DATA)) { + return DISABLED_UNSUPPORTED; + } + return AVAILABLE; + } + + @Override + public void updateState(Preference preference) { + super.updateState(preference); + if (mPSCD.isBackupGray()) { + preference.setEnabled(false); + } + } + + @Override + public CharSequence getSummary() { + if (!mPSCD.isBackupGray()) { + return mPSCD.isBackupEnabled() + ? mContext.getText(R.string.accessibility_feature_state_on) + : mContext.getText(R.string.accessibility_feature_state_off); + } + return null; + } +}
\ No newline at end of file diff --git a/src/com/android/settings/backup/BackupInactivePreferenceController.java b/src/com/android/settings/backup/BackupInactivePreferenceController.java new file mode 100644 index 0000000000..d44801e97e --- /dev/null +++ b/src/com/android/settings/backup/BackupInactivePreferenceController.java @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.settings.backup; + +import android.content.Context; + +import com.android.settings.core.BasePreferenceController; + +public class BackupInactivePreferenceController extends BasePreferenceController { + + public BackupInactivePreferenceController(Context context, String key) { + super(context, key); + } + + @Override + public int getAvailabilityStatus() { + if (!PrivacySettingsUtils.isAdminUser(mContext)) { + return DISABLED_FOR_USER; + } + if (PrivacySettingsUtils.isInvisibleKey(mContext, PrivacySettingsUtils.BACKUP_INACTIVE)) { + return DISABLED_UNSUPPORTED; + } + return AVAILABLE; + } +}
\ No newline at end of file diff --git a/src/com/android/settings/backup/BackupSettingsActivity.java b/src/com/android/settings/backup/BackupSettingsActivity.java index d78af32d36..c69414eac0 100644 --- a/src/com/android/settings/backup/BackupSettingsActivity.java +++ b/src/com/android/settings/backup/BackupSettingsActivity.java @@ -31,6 +31,7 @@ import com.android.settings.R; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settings.search.SearchIndexableRaw; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.List; @@ -40,6 +41,7 @@ import java.util.List; * The activity used to launch the configured Backup activity or the preference screen * if the manufacturer provided their backup settings. */ +@SearchIndexable public class BackupSettingsActivity extends Activity implements Indexable { private static final String TAG = "BackupSettingsActivity"; private FragmentManager mFragmentManager; diff --git a/src/com/android/settings/backup/BackupSettingsFragment.java b/src/com/android/settings/backup/BackupSettingsFragment.java index e9bcc6fe9e..d21e2e4636 100644 --- a/src/com/android/settings/backup/BackupSettingsFragment.java +++ b/src/com/android/settings/backup/BackupSettingsFragment.java @@ -26,6 +26,7 @@ import com.android.settings.dashboard.DashboardFragment; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.List; @@ -33,6 +34,7 @@ import java.util.List; /** * Fragment showing the items to launch different backup settings screens. */ +@SearchIndexable public class BackupSettingsFragment extends DashboardFragment { private static final String TAG = "BackupSettings"; diff --git a/src/com/android/settings/backup/ConfigureAccountPreferenceController.java b/src/com/android/settings/backup/ConfigureAccountPreferenceController.java new file mode 100644 index 0000000000..f1bcee9150 --- /dev/null +++ b/src/com/android/settings/backup/ConfigureAccountPreferenceController.java @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.settings.backup; + +import android.content.Context; +import android.content.Intent; +import android.support.v7.preference.Preference; + +import com.android.settings.core.BasePreferenceController; +import com.android.settings.R; + +public class ConfigureAccountPreferenceController extends BasePreferenceController { + private PrivacySettingsConfigData mPSCD; + + public ConfigureAccountPreferenceController(Context context, String key) { + super(context, key); + } + + public void setPrivacySettingsConfigData(final PrivacySettingsConfigData pData) { + mPSCD = pData; + } + + @Override + public int getAvailabilityStatus() { + if (!PrivacySettingsUtils.isAdminUser(mContext)) { + return DISABLED_FOR_USER; + } + if (PrivacySettingsUtils.isInvisibleKey(mContext, PrivacySettingsUtils.CONFIGURE_ACCOUNT)) { + return DISABLED_UNSUPPORTED; + } + return AVAILABLE; + } + + @Override + public void updateState(Preference preference) { + super.updateState(preference); + final Intent configIntent = mPSCD.getConfigIntent(); + final boolean configureEnabled = (configIntent != null) && mPSCD.isBackupEnabled(); + preference.setEnabled(configureEnabled); + preference.setIntent(configIntent); + } + + @Override + public CharSequence getSummary() { + final String configSummary = mPSCD.getConfigSummary(); + return configSummary != null + ? configSummary + : mContext.getText(R.string.backup_configure_account_default_summary); + } +}
\ No newline at end of file diff --git a/src/com/android/settings/backup/DataManagementPreferenceController.java b/src/com/android/settings/backup/DataManagementPreferenceController.java new file mode 100644 index 0000000000..de987abbde --- /dev/null +++ b/src/com/android/settings/backup/DataManagementPreferenceController.java @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.settings.backup; + +import android.content.Context; +import android.support.v7.preference.Preference; + +import com.android.settings.core.BasePreferenceController; + +public class DataManagementPreferenceController extends BasePreferenceController { + private PrivacySettingsConfigData mPSCD; + private boolean mManageEnabled; + + public DataManagementPreferenceController(Context context, String key) { + super(context, key); + } + + public void setPrivacySettingsConfigData(final PrivacySettingsConfigData pData) { + mPSCD = pData; + mManageEnabled = (mPSCD.getManageIntent() != null) && mPSCD.isBackupEnabled(); + } + + @Override + public int getAvailabilityStatus() { + if (!PrivacySettingsUtils.isAdminUser(mContext)) { + return DISABLED_FOR_USER; + } + if (!mManageEnabled) { + return DISABLED_UNSUPPORTED; + } + return AVAILABLE; + } + + @Override + public void updateState(Preference preference) { + if (mManageEnabled) { + preference.setIntent(mPSCD.getManageIntent()); + final String manageLabel = mPSCD.getManageLabel(); + if (manageLabel != null) { + preference.setTitle(manageLabel); + } + } + } +}
\ No newline at end of file diff --git a/src/com/android/settings/backup/PrivacySettings.java b/src/com/android/settings/backup/PrivacySettings.java new file mode 100644 index 0000000000..9b342e7477 --- /dev/null +++ b/src/com/android/settings/backup/PrivacySettings.java @@ -0,0 +1,96 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.backup; + +import android.content.Context; +import android.provider.SearchIndexableResource; + +import com.android.internal.logging.nano.MetricsProto.MetricsEvent; +import com.android.settings.R; +import com.android.settings.dashboard.DashboardFragment; +import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settingslib.search.SearchIndexable; + +import java.util.Arrays; +import java.util.List; + +@SearchIndexable +public class PrivacySettings extends DashboardFragment { + private static final String TAG = "PrivacySettings"; + + @Override + public int getMetricsCategory() { + return MetricsEvent.PRIVACY; + } + + @Override + protected String getLogTag() { + return TAG; + } + + @Override + protected int getPreferenceScreenResId() { + return R.xml.privacy_settings; + } + + @Override + public int getHelpResource() { + return R.string.help_url_backup_reset; + } + + @Override + public void onAttach(Context context) { + super.onAttach(context); + updatePrivacySettingsConfigData(context); + } + + @Override + protected void updatePreferenceStates() { + updatePrivacySettingsConfigData(getContext()); + super.updatePreferenceStates(); + } + + private void updatePrivacySettingsConfigData(final Context context) { + final PrivacySettingsConfigData pData = new PrivacySettingsConfigData(); + if (PrivacySettingsUtils.isAdminUser(context)) { + PrivacySettingsUtils.updatePrivacyBuffer(context, pData); + } + + use(BackupDataPreferenceController.class).setPrivacySettingsConfigData(pData); + use(ConfigureAccountPreferenceController.class).setPrivacySettingsConfigData(pData); + use(DataManagementPreferenceController.class).setPrivacySettingsConfigData(pData); + use(AutoRestorePreferenceController.class).setPrivacySettingsConfigData(pData); + } + + public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider() { + @Override + public List<SearchIndexableResource> getXmlResourcesToIndex(Context context, + boolean enabled) { + final SearchIndexableResource sir = new SearchIndexableResource(context); + sir.xmlResId = R.xml.privacy_settings; + return Arrays.asList(sir); + } + + @Override + protected boolean isPageSearchEnabled(Context context) { + final BackupSettingsHelper backupHelper = new BackupSettingsHelper(context); + return !backupHelper.isBackupProvidedByManufacturer() && + !backupHelper.isIntentProvidedByTransport(); + } + }; +} diff --git a/src/com/android/settings/backup/PrivacySettingsConfigData.java b/src/com/android/settings/backup/PrivacySettingsConfigData.java new file mode 100644 index 0000000000..9b72a829a2 --- /dev/null +++ b/src/com/android/settings/backup/PrivacySettingsConfigData.java @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.settings.backup; + +import android.content.Intent; + +public class PrivacySettingsConfigData { + private boolean mBackupEnabled; + private boolean mBackupGray; + private Intent mConfigIntent; + private String mConfigSummary; + private Intent mManageIntent; + private String mManageLabel; + + public PrivacySettingsConfigData() { + mBackupEnabled = false; + mBackupGray = false; + mConfigIntent = null; + mConfigSummary = null; + mManageIntent = null; + mManageLabel = null; + } + + public boolean isBackupEnabled() { + return mBackupEnabled; + } + + public void setBackupEnabled(final boolean backupEnabled) { + mBackupEnabled = backupEnabled; + } + + public boolean isBackupGray() { + return mBackupGray; + } + + public void setBackupGray(final boolean backupGray) { + mBackupGray = backupGray; + } + + public Intent getConfigIntent() { + return mConfigIntent; + } + + public void setConfigIntent(final Intent configIntent) { + mConfigIntent = configIntent; + } + + public String getConfigSummary() { + return mConfigSummary; + } + + public void setConfigSummary(final String configSummary) { + mConfigSummary = configSummary; + } + + public Intent getManageIntent() { + return mManageIntent; + } + + public void setManageIntent(final Intent manageIntent) { + mManageIntent = manageIntent; + } + + public String getManageLabel() { + return mManageLabel; + } + + public void setManageLabel(final String manageLabel) { + mManageLabel = manageLabel; + } +} diff --git a/src/com/android/settings/backup/PrivacySettingsUtils.java b/src/com/android/settings/backup/PrivacySettingsUtils.java new file mode 100644 index 0000000000..f8f21ddeef --- /dev/null +++ b/src/com/android/settings/backup/PrivacySettingsUtils.java @@ -0,0 +1,122 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.settings.backup; + +import android.app.backup.IBackupManager; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.os.UserHandle; +import android.os.UserManager; +import android.util.Log; + +import java.util.List; +import java.util.Set; +import java.util.TreeSet; + +public class PrivacySettingsUtils { + private static final String TAG = "PrivacySettingsUtils"; + private static final String GSETTINGS_PROVIDER = "com.google.settings"; + + static final String BACKUP_DATA = "backup_data"; + static final String AUTO_RESTORE = "auto_restore"; + static final String CONFIGURE_ACCOUNT = "configure_account"; + static final String BACKUP_INACTIVE = "backup_inactive"; + + // Don't allow any access if this is not an admin user. + // TODO: backup/restore currently only works with owner user b/22760572 + static boolean isAdminUser(final Context context) { + return UserManager.get(context).isAdminUser(); + } + + /** + * Send a {@param key} to check its preference will display in PrivacySettings or not. + */ + static boolean isInvisibleKey(final Context context, final String key) { + final Set<String> keysToRemove = getInvisibleKey(context); + if (Log.isLoggable(TAG, Log.DEBUG)) { + Log.d(TAG, + "keysToRemove size=" + keysToRemove.size() + " keysToRemove=" + keysToRemove); + } + if (keysToRemove.contains(key)) { + return true; + } + return false; + } + + private static Set<String> getInvisibleKey(final Context context) { + final IBackupManager backupManager = IBackupManager.Stub.asInterface( + ServiceManager.getService(Context.BACKUP_SERVICE)); + boolean isServiceActive = false; + try { + isServiceActive = backupManager.isBackupServiceActive(UserHandle.myUserId()); + } catch (RemoteException e) { + Log.w(TAG, "Failed querying backup manager service activity status. " + + "Assuming it is inactive."); + } + boolean vendorSpecific = context.getPackageManager(). + resolveContentProvider(GSETTINGS_PROVIDER, 0) == null; + final Set<String> inVisibleKeys = new TreeSet<>(); + if (vendorSpecific || isServiceActive) { + inVisibleKeys.add(BACKUP_INACTIVE); + } + if (vendorSpecific || !isServiceActive) { + inVisibleKeys.add(BACKUP_DATA); + inVisibleKeys.add(AUTO_RESTORE); + inVisibleKeys.add(CONFIGURE_ACCOUNT); + } + return inVisibleKeys; + } + + public static void updatePrivacyBuffer(final Context context, PrivacySettingsConfigData data) { + final IBackupManager backupManager = IBackupManager.Stub.asInterface( + ServiceManager.getService(Context.BACKUP_SERVICE)); + + try { + data.setBackupEnabled(backupManager.isBackupEnabled()); + String transport = backupManager.getCurrentTransport(); + data.setConfigIntent(validatedActivityIntent(context, + backupManager.getConfigurationIntent(transport), "config")); + data.setConfigSummary(backupManager.getDestinationString(transport)); + data.setManageIntent(validatedActivityIntent(context, + backupManager.getDataManagementIntent(transport), "management")); + data.setManageLabel(backupManager.getDataManagementLabel(transport)); + data.setBackupGray(false); + } catch (RemoteException e) { + // leave it 'false' and disable the UI; there's no backup manager + // mBackup.setEnabled(false); + data.setBackupGray(true); + } + } + + private static Intent validatedActivityIntent(final Context context, Intent intent, + String logLabel) { + if (intent != null) { + PackageManager pm = context.getPackageManager(); + List<ResolveInfo> resolved = pm.queryIntentActivities(intent, 0); + if (resolved == null || resolved.isEmpty()) { + intent = null; + Log.e(TAG, "Backup " + logLabel + " intent " + intent + + " fails to resolve; ignoring"); + } + } + return intent; + } +}
\ No newline at end of file diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java b/src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java index 8679b5566c..ba7cf54e94 100644 --- a/src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java +++ b/src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java @@ -73,6 +73,16 @@ public class BluetoothDetailsHeaderController extends BluetoothDetailsController mHeaderController.setIcon(pair.first); mHeaderController.setIconContentDescription(pair.second); mHeaderController.setSummary(summaryText); + mHeaderController.setEditListener(v -> showEditDeviceNameDialog()); + mHeaderController.setButtonActions( + EntityHeaderController.ActionType.ACTION_EDIT_PREFERENCE, + EntityHeaderController.ActionType.ACTION_NONE); + } + + @VisibleForTesting + void showEditDeviceNameDialog() { + RemoteDeviceNameDialogFragment.newInstance(mCachedDevice).show( + mFragment.getFragmentManager(), RemoteDeviceNameDialogFragment.TAG); } @Override diff --git a/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java b/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java index 1e8288922e..aa3b42948b 100644 --- a/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java +++ b/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java @@ -22,9 +22,6 @@ import android.bluetooth.BluetoothDevice; import android.content.Context; import android.os.Bundle; import android.support.annotation.VisibleForTesting; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; @@ -41,9 +38,6 @@ public class BluetoothDeviceDetailsFragment extends RestrictedDashboardFragment public static final String KEY_DEVICE_ADDRESS = "device_address"; private static final String TAG = "BTDeviceDetailsFrg"; - @VisibleForTesting - static int EDIT_DEVICE_NAME_ITEM_ID = Menu.FIRST; - /** * An interface to let tests override the normal mechanism for looking up the * CachedBluetoothDevice and LocalBluetoothManager, and substitute their own mocks instead. @@ -60,9 +54,12 @@ public class BluetoothDeviceDetailsFragment extends RestrictedDashboardFragment @VisibleForTesting static TestDataFactory sTestDataFactory; - private String mDeviceAddress; - private LocalBluetoothManager mManager; - private CachedBluetoothDevice mCachedDevice; + @VisibleForTesting + String mDeviceAddress; + @VisibleForTesting + LocalBluetoothManager mManager; + @VisibleForTesting + CachedBluetoothDevice mCachedDevice; public BluetoothDeviceDetailsFragment() { super(DISALLOW_CONFIG_BLUETOOTH); @@ -118,24 +115,6 @@ public class BluetoothDeviceDetailsFragment extends RestrictedDashboardFragment } @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - MenuItem item = menu.add(0, EDIT_DEVICE_NAME_ITEM_ID, 0, R.string.bluetooth_rename_button); - item.setIcon(R.drawable.ic_mode_edit); - item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); - super.onCreateOptionsMenu(menu, inflater); - } - - @Override - public boolean onOptionsItemSelected(MenuItem menuItem) { - if (menuItem.getItemId() == EDIT_DEVICE_NAME_ITEM_ID) { - RemoteDeviceNameDialogFragment.newInstance(mCachedDevice).show( - getFragmentManager(), RemoteDeviceNameDialogFragment.TAG); - return true; - } - return super.onOptionsItemSelected(menuItem); - } - - @Override protected List<AbstractPreferenceController> createPreferenceControllers(Context context) { ArrayList<AbstractPreferenceController> controllers = new ArrayList<>(); diff --git a/src/com/android/settings/bluetooth/Utf8ByteLengthFilter.java b/src/com/android/settings/bluetooth/Utf8ByteLengthFilter.java index ab498183bc..536f4cc939 100644 --- a/src/com/android/settings/bluetooth/Utf8ByteLengthFilter.java +++ b/src/com/android/settings/bluetooth/Utf8ByteLengthFilter.java @@ -16,6 +16,7 @@ package com.android.settings.bluetooth; +import android.support.annotation.Keep; import android.text.InputFilter; import android.text.Spanned; @@ -40,6 +41,7 @@ import android.text.Spanned; public class Utf8ByteLengthFilter implements InputFilter { private final int mMaxBytes; + @Keep Utf8ByteLengthFilter(int maxBytes) { mMaxBytes = maxBytes; } diff --git a/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceDashboardFragment.java b/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceDashboardFragment.java index 45794c5a20..e347c3fc04 100644 --- a/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceDashboardFragment.java +++ b/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceDashboardFragment.java @@ -28,6 +28,7 @@ import com.android.settings.print.PrintSettingPreferenceController; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.Arrays; @@ -36,6 +37,7 @@ import java.util.List; /** * This fragment contains all the advanced connection preferences(i.e, Bluetooth, NFC, USB..) */ +@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC) public class AdvancedConnectedDeviceDashboardFragment extends DashboardFragment { private static final String TAG = "AdvancedConnectedDeviceFrag"; diff --git a/src/com/android/settings/connecteddevice/BluetoothDashboardFragment.java b/src/com/android/settings/connecteddevice/BluetoothDashboardFragment.java index ec616c8682..d56f1c22c3 100644 --- a/src/com/android/settings/connecteddevice/BluetoothDashboardFragment.java +++ b/src/com/android/settings/connecteddevice/BluetoothDashboardFragment.java @@ -34,6 +34,7 @@ import com.android.settings.search.SearchIndexableRaw; import com.android.settings.widget.SwitchBar; import com.android.settings.widget.SwitchBarController; import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settingslib.search.SearchIndexable; import com.android.settingslib.widget.FooterPreference; import java.util.ArrayList; @@ -43,6 +44,7 @@ import java.util.List; * Dedicated screen for allowing the user to toggle bluetooth which displays relevant information to * the user based on related settings such as bluetooth scanning. */ +@SearchIndexable(forTarget = SearchIndexable.ALL) public class BluetoothDashboardFragment extends DashboardFragment { private static final String TAG = "BluetoothDashboardFrag"; diff --git a/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java b/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java index 227fd9b8ad..b2ee023c68 100644 --- a/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java +++ b/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java @@ -28,11 +28,13 @@ import com.android.settings.nfc.NfcPreferenceController; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC) public class ConnectedDeviceDashboardFragment extends DashboardFragment { private static final String TAG = "ConnectedDeviceFrag"; diff --git a/src/com/android/settings/connecteddevice/PreviouslyConnectedDeviceDashboardFragment.java b/src/com/android/settings/connecteddevice/PreviouslyConnectedDeviceDashboardFragment.java index 195daf372f..0b74861342 100644 --- a/src/com/android/settings/connecteddevice/PreviouslyConnectedDeviceDashboardFragment.java +++ b/src/com/android/settings/connecteddevice/PreviouslyConnectedDeviceDashboardFragment.java @@ -22,6 +22,7 @@ import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.SearchIndexableRaw; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.List; @@ -29,6 +30,7 @@ import java.util.List; /** * This fragment contains previously connected device */ +@SearchIndexable(forTarget = SearchIndexable.MOBILE) public class PreviouslyConnectedDeviceDashboardFragment extends DashboardFragment { private static final String TAG = "PreConnectedDeviceFrag"; diff --git a/src/com/android/settings/connecteddevice/usb/ConnectedUsbDeviceUpdater.java b/src/com/android/settings/connecteddevice/usb/ConnectedUsbDeviceUpdater.java index 098cdb46ea..451faba03a 100644 --- a/src/com/android/settings/connecteddevice/usb/ConnectedUsbDeviceUpdater.java +++ b/src/com/android/settings/connecteddevice/usb/ConnectedUsbDeviceUpdater.java @@ -42,8 +42,8 @@ public class ConnectedUsbDeviceUpdater { UsbConnectionBroadcastReceiver.UsbConnectionListener mUsbConnectionListener = (connected, functions, powerRole, dataRole) -> { if (connected) { - mUsbPreference.setSummary(getSummary(mUsbBackend.getCurrentFunctions(), - mUsbBackend.getPowerRole())); + mUsbPreference.setSummary(getSummary(dataRole == UsbPort.DATA_ROLE_DEVICE + ? functions : UsbManager.FUNCTION_NONE, powerRole)); mDevicePreferenceCallback.onDeviceAdded(mUsbPreference); } else { mDevicePreferenceCallback.onDeviceRemoved(mUsbPreference); diff --git a/src/com/android/settings/connecteddevice/usb/UsbDetailsFragment.java b/src/com/android/settings/connecteddevice/usb/UsbDetailsFragment.java index 662abbfcfd..044d4a8d10 100644 --- a/src/com/android/settings/connecteddevice/usb/UsbDetailsFragment.java +++ b/src/com/android/settings/connecteddevice/usb/UsbDetailsFragment.java @@ -27,6 +27,7 @@ import com.android.settings.dashboard.DashboardFragment; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.search.SearchIndexable; import com.google.android.collect.Lists; @@ -36,6 +37,7 @@ import java.util.List; /** * Controls the USB device details and provides updates to individual controllers. */ +@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC) public class UsbDetailsFragment extends DashboardFragment { private static final String TAG = UsbDetailsFragment.class.getSimpleName(); diff --git a/src/com/android/settings/core/PreferenceControllerListHelper.java b/src/com/android/settings/core/PreferenceControllerListHelper.java index 738a6952e8..5879ba443b 100644 --- a/src/com/android/settings/core/PreferenceControllerListHelper.java +++ b/src/com/android/settings/core/PreferenceControllerListHelper.java @@ -54,7 +54,8 @@ public class PreferenceControllerListHelper { List<Bundle> preferenceMetadata; try { preferenceMetadata = PreferenceXmlParserUtils.extractMetadata(context, xmlResId, - MetadataFlag.FLAG_NEED_KEY | MetadataFlag.FLAG_NEED_PREF_CONTROLLER); + MetadataFlag.FLAG_NEED_KEY | MetadataFlag.FLAG_NEED_PREF_CONTROLLER + | MetadataFlag.FLAG_INCLUDE_PREF_SCREEN); } catch (IOException | XmlPullParserException e) { Log.e(TAG, "Failed to parse preference xml for getting controllers", e); return controllers; diff --git a/src/com/android/settings/core/gateway/SettingsGateway.java b/src/com/android/settings/core/gateway/SettingsGateway.java index aa9d7b5487..be9b722a5a 100644 --- a/src/com/android/settings/core/gateway/SettingsGateway.java +++ b/src/com/android/settings/core/gateway/SettingsGateway.java @@ -21,7 +21,6 @@ import com.android.settings.DeviceAdminSettings; import com.android.settings.DisplaySettings; import com.android.settings.IccLockSettings; import com.android.settings.MasterClear; -import com.android.settings.PrivacySettings; import com.android.settings.Settings; import com.android.settings.TestingSettings; import com.android.settings.TetherSettings; @@ -51,6 +50,7 @@ import com.android.settings.applications.appinfo.WriteSettingsDetails; import com.android.settings.applications.appops.BackgroundCheckSummary; import com.android.settings.applications.assist.ManageAssist; import com.android.settings.applications.manageapplications.ManageApplications; +import com.android.settings.backup.PrivacySettings; import com.android.settings.backup.ToggleBackupSettingFragment; import com.android.settings.bluetooth.BluetoothDeviceDetailsFragment; import com.android.settings.connecteddevice.AdvancedConnectedDeviceDashboardFragment; diff --git a/src/com/android/settings/datausage/ChartDataUsagePreference.java b/src/com/android/settings/datausage/ChartDataUsagePreference.java index 3ddfd47828..6773a0fb62 100644 --- a/src/com/android/settings/datausage/ChartDataUsagePreference.java +++ b/src/com/android/settings/datausage/ChartDataUsagePreference.java @@ -51,8 +51,8 @@ public class ChartDataUsagePreference extends Preference { public ChartDataUsagePreference(Context context, AttributeSet attrs) { super(context, attrs); setSelectable(false); - mLimitColor = Utils.getColorAttr(context, android.R.attr.colorError); - mWarningColor = Utils.getColorAttr(context, android.R.attr.textColorSecondary); + mLimitColor = Utils.getColorAttrDefaultColor(context, android.R.attr.colorError); + mWarningColor = Utils.getColorAttrDefaultColor(context, android.R.attr.textColorSecondary); setLayoutResource(R.layout.data_usage_graph); } diff --git a/src/com/android/settings/datausage/DataUsageSummary.java b/src/com/android/settings/datausage/DataUsageSummary.java index afe148d88c..bfde89e9d0 100644 --- a/src/com/android/settings/datausage/DataUsageSummary.java +++ b/src/com/android/settings/datausage/DataUsageSummary.java @@ -44,6 +44,7 @@ import com.android.settings.search.Indexable; import com.android.settingslib.NetworkPolicyEditor; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.net.DataUsageController; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.List; @@ -51,6 +52,7 @@ import java.util.List; /** * Settings preference fragment that displays data usage summary. */ +@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC) public class DataUsageSummary extends DataUsageBaseFragment implements Indexable, DataUsageEditController { diff --git a/src/com/android/settings/datausage/DataUsageSummaryLegacy.java b/src/com/android/settings/datausage/DataUsageSummaryLegacy.java index 090e8e4537..7e8ee885a0 100644 --- a/src/com/android/settings/datausage/DataUsageSummaryLegacy.java +++ b/src/com/android/settings/datausage/DataUsageSummaryLegacy.java @@ -48,6 +48,7 @@ import com.android.settings.search.Indexable; import com.android.settingslib.NetworkPolicyEditor; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.net.DataUsageController; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.List; @@ -55,6 +56,7 @@ import java.util.List; /** * Legacy {@link DataUsageSummary} fragment. */ +@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC) public class DataUsageSummaryLegacy extends DataUsageBaseFragment implements Indexable, DataUsageEditController { diff --git a/src/com/android/settings/datausage/DataUsageSummaryPreference.java b/src/com/android/settings/datausage/DataUsageSummaryPreference.java index e5e83eba54..79be5ab8b3 100644 --- a/src/com/android/settings/datausage/DataUsageSummaryPreference.java +++ b/src/com/android/settings/datausage/DataUsageSummaryPreference.java @@ -72,7 +72,7 @@ public class DataUsageSummaryPreference extends Preference { private long mSnapshotTimeMs; /** Name of carrier, or null if not available */ private CharSequence mCarrierName; - private String mLimitInfoText; + private CharSequence mLimitInfoText; private Intent mLaunchIntent; /** Progress to display on ProgressBar */ @@ -97,7 +97,7 @@ public class DataUsageSummaryPreference extends Preference { setLayoutResource(R.layout.data_usage_summary_preference); } - public void setLimitInfo(String text) { + public void setLimitInfo(CharSequence text) { if (!Objects.equals(text, mLimitInfoText)) { mLimitInfoText = text; notifyChanged(); diff --git a/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java b/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java index 58faac2236..14b97170df 100644 --- a/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java +++ b/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java @@ -216,18 +216,18 @@ public class DataUsageSummaryPreferenceController extends BasePreferenceControll } if (info.warningLevel > 0 && info.limitLevel > 0) { - summaryPreference.setLimitInfo(TextUtils.expandTemplate( - mContext.getText(R.string.cell_data_warning_and_limit), - DataUsageUtils.formatDataUsage(mContext, info.warningLevel), - DataUsageUtils.formatDataUsage(mContext, info.limitLevel)).toString()); + summaryPreference.setLimitInfo(TextUtils.expandTemplate( + mContext.getText(R.string.cell_data_warning_and_limit), + DataUsageUtils.formatDataUsage(mContext, info.warningLevel), + DataUsageUtils.formatDataUsage(mContext, info.limitLevel))); } else if (info.warningLevel > 0) { - summaryPreference.setLimitInfo(TextUtils.expandTemplate( - mContext.getText(R.string.cell_data_warning), - DataUsageUtils.formatDataUsage(mContext, info.warningLevel)).toString()); + summaryPreference.setLimitInfo(TextUtils.expandTemplate( + mContext.getText(R.string.cell_data_warning), + DataUsageUtils.formatDataUsage(mContext, info.warningLevel))); } else if (info.limitLevel > 0) { summaryPreference.setLimitInfo(TextUtils.expandTemplate( mContext.getText(R.string.cell_data_limit), - DataUsageUtils.formatDataUsage(mContext, info.limitLevel)).toString()); + DataUsageUtils.formatDataUsage(mContext, info.limitLevel))); } else { summaryPreference.setLimitInfo(null); } @@ -238,7 +238,7 @@ public class DataUsageSummaryPreferenceController extends BasePreferenceControll summaryPreference.setChartEnabled(false); } else { summaryPreference.setChartEnabled(true); - summaryPreference.setLabels(DataUsageUtils.formatDataUsage(mContext, 0 /* sizeBytes */), + summaryPreference.setLabels(Formatter.formatFileSize(mContext, 0 /* sizeBytes */), DataUsageUtils.formatDataUsage(mContext, mDataBarSize)); summaryPreference.setProgress(mDataplanUse / (float) mDataBarSize); } diff --git a/src/com/android/settings/datetime/TimeZonePreferenceController.java b/src/com/android/settings/datetime/TimeZonePreferenceController.java index aff204d76f..435b1fe77a 100644 --- a/src/com/android/settings/datetime/TimeZonePreferenceController.java +++ b/src/com/android/settings/datetime/TimeZonePreferenceController.java @@ -19,11 +19,8 @@ package com.android.settings.datetime; import android.content.Context; import android.support.annotation.VisibleForTesting; import android.support.v7.preference.Preference; -import android.util.FeatureFlagUtils; -import com.android.settings.core.FeatureFlags; import com.android.settings.core.PreferenceControllerMixin; -import com.android.settings.datetime.timezone.TimeZoneSettings; import com.android.settingslib.RestrictedPreference; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.datetime.ZoneGetter; @@ -36,13 +33,11 @@ public class TimeZonePreferenceController extends AbstractPreferenceController private static final String KEY_TIMEZONE = "timezone"; private final AutoTimeZonePreferenceController mAutoTimeZonePreferenceController; - private final boolean mZonePickerV2; public TimeZonePreferenceController(Context context, AutoTimeZonePreferenceController autoTimeZonePreferenceController) { super(context); mAutoTimeZonePreferenceController = autoTimeZonePreferenceController; - mZonePickerV2 = FeatureFlagUtils.isEnabled(mContext, FeatureFlags.ZONE_PICKER_V2); } @Override @@ -50,9 +45,6 @@ public class TimeZonePreferenceController extends AbstractPreferenceController if (!(preference instanceof RestrictedPreference)) { return; } - if (mZonePickerV2) { - preference.setFragment(TimeZoneSettings.class.getName()); - } preference.setSummary(getTimeZoneOffsetAndName()); if( !((RestrictedPreference) preference).isDisabledByAdmin()) { preference.setEnabled(!mAutoTimeZonePreferenceController.isEnabled()); diff --git a/src/com/android/settings/datetime/ZonePicker.java b/src/com/android/settings/datetime/ZonePicker.java deleted file mode 100644 index dc691275e3..0000000000 --- a/src/com/android/settings/datetime/ZonePicker.java +++ /dev/null @@ -1,306 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.settings.datetime; - -import android.annotation.NonNull; -import android.app.Activity; -import android.app.AlarmManager; -import android.app.ListFragment; -import android.content.Context; -import android.os.Bundle; -import android.support.annotation.VisibleForTesting; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ListView; -import android.widget.SimpleAdapter; -import android.widget.TextView; - -import com.android.internal.logging.nano.MetricsProto; -import com.android.settings.R; -import com.android.settings.overlay.FeatureFactory; -import com.android.settingslib.core.instrumentation.Instrumentable; -import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin; -import com.android.settingslib.datetime.ZoneGetter; - -import java.text.Collator; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.TimeZone; - -/** - * The class displaying a list of time zones that match a filter string - * such as "Africa", "Europe", etc. Choosing an item from the list will set - * the time zone. Pressing Back without choosing from the list will not - * result in a change in the time zone setting. - */ -public class ZonePicker extends ListFragment implements Instrumentable { - - private static final int MENU_TIMEZONE = Menu.FIRST+1; - private static final int MENU_ALPHABETICAL = Menu.FIRST; - private VisibilityLoggerMixin mVisibilityLoggerMixin; - - private boolean mSortedByTimezone; - - private SimpleAdapter mTimezoneSortedAdapter; - private SimpleAdapter mAlphabeticalAdapter; - - /** - * Constructs an adapter with TimeZone list. Sorted by TimeZone in default. - * - * @param sortedByName use Name for sorting the list. - */ - public static SimpleAdapter constructTimezoneAdapter(Context context, - boolean sortedByName) { - return constructTimezoneAdapter(context, sortedByName, - R.layout.date_time_custom_list_item_2); - } - - /** - * Constructs an adapter with TimeZone list. Sorted by TimeZone in default. - * - * @param sortedByName use Name for sorting the list. - */ - public static SimpleAdapter constructTimezoneAdapter(Context context, - boolean sortedByName, int layoutId) { - final String[] from = new String[] { - ZoneGetter.KEY_DISPLAY_LABEL, - ZoneGetter.KEY_OFFSET_LABEL - }; - final int[] to = new int[] {android.R.id.text1, android.R.id.text2}; - - final String sortKey = (sortedByName - ? ZoneGetter.KEY_DISPLAY_LABEL - : ZoneGetter.KEY_OFFSET); - final MyComparator comparator = new MyComparator(sortKey); - final List<Map<String, Object>> sortedList = ZoneGetter.getZonesList(context); - Collections.sort(sortedList, comparator); - final SimpleAdapter adapter = new SimpleAdapter(context, - sortedList, - layoutId, - from, - to); - adapter.setViewBinder(new TimeZoneViewBinder()); - return adapter; - } - - private static class TimeZoneViewBinder implements SimpleAdapter.ViewBinder { - - /** - * Set the text to the given {@link CharSequence} as is, instead of calling toString, so - * that additional information stored in the CharSequence is, like spans added to a - * {@link android.text.SpannableString} are preserved. - */ - @Override - public boolean setViewValue(View view, Object data, String textRepresentation) { - TextView textView = (TextView) view; - textView.setText((CharSequence) data); - return true; - } - } - - /** - * Searches {@link TimeZone} from the given {@link SimpleAdapter} object, and returns - * the index for the TimeZone. - * - * @param adapter SimpleAdapter constructed by - * {@link #constructTimezoneAdapter(Context, boolean)}. - * @param tz TimeZone to be searched. - * @return Index for the given TimeZone. -1 when there's no corresponding list item. - * returned. - */ - public static int getTimeZoneIndex(SimpleAdapter adapter, TimeZone tz) { - final String defaultId = tz.getID(); - final int listSize = adapter.getCount(); - for (int i = 0; i < listSize; i++) { - // Using HashMap<String, Object> induces unnecessary warning. - final HashMap<?,?> map = (HashMap<?,?>)adapter.getItem(i); - final String id = (String)map.get(ZoneGetter.KEY_ID); - if (defaultId.equals(id)) { - // If current timezone is in this list, move focus to it - return i; - } - } - return -1; - } - - @Override - public int getMetricsCategory() { - return MetricsProto.MetricsEvent.ZONE_PICKER; - } - - @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - - final Activity activity = getActivity(); - mTimezoneSortedAdapter = constructTimezoneAdapter(activity, false); - mAlphabeticalAdapter = constructTimezoneAdapter(activity, true); - - // Sets the adapter - setSorting(true); - setHasOptionsMenu(true); - activity.setTitle(R.string.date_time_set_timezone); - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - mVisibilityLoggerMixin = new VisibilityLoggerMixin(getMetricsCategory(), - FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider()); - } - - @Override - public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - final View view = super.onCreateView(inflater, container, savedInstanceState); - final ListView list = view.findViewById(android.R.id.list); - prepareCustomPreferencesList(list); - return view; - } - - @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - menu.add(0, MENU_ALPHABETICAL, 0, R.string.zone_list_menu_sort_alphabetically) - .setIcon(android.R.drawable.ic_menu_sort_alphabetically); - menu.add(0, MENU_TIMEZONE, 0, R.string.zone_list_menu_sort_by_timezone) - .setIcon(R.drawable.ic_menu_3d_globe); - super.onCreateOptionsMenu(menu, inflater); - } - - @Override - public void onPrepareOptionsMenu(Menu menu) { - if (mSortedByTimezone) { - menu.findItem(MENU_TIMEZONE).setVisible(false); - menu.findItem(MENU_ALPHABETICAL).setVisible(true); - } else { - menu.findItem(MENU_TIMEZONE).setVisible(true); - menu.findItem(MENU_ALPHABETICAL).setVisible(false); - } - } - - @Override - public void onResume() { - super.onResume(); - mVisibilityLoggerMixin.onResume(); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - - case MENU_TIMEZONE: - setSorting(true); - return true; - - case MENU_ALPHABETICAL: - setSorting(false); - return true; - - default: - return false; - } - } - - static void prepareCustomPreferencesList(ListView list) { - list.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY); - list.setClipToPadding(false); - list.setDivider(null); - } - - private void setSorting(boolean sortByTimezone) { - final SimpleAdapter adapter = - sortByTimezone ? mTimezoneSortedAdapter : mAlphabeticalAdapter; - setListAdapter(adapter); - mSortedByTimezone = sortByTimezone; - final int defaultIndex = getTimeZoneIndex(adapter, TimeZone.getDefault()); - if (defaultIndex >= 0) { - setSelection(defaultIndex); - } - } - - @Override - public void onListItemClick(ListView listView, View v, int position, long id) { - // Ignore extra clicks - if (!isResumed()) return; - final Map<?, ?> map = (Map<?, ?>)listView.getItemAtPosition(position); - final String tzId = (String) map.get(ZoneGetter.KEY_ID); - - // Update the system timezone value - final Activity activity = getActivity(); - final AlarmManager alarm = (AlarmManager) activity.getSystemService(Context.ALARM_SERVICE); - alarm.setTimeZone(tzId); - - getActivity().onBackPressed(); - - } - - @Override - public void onPause() { - super.onPause(); - mVisibilityLoggerMixin.onPause(); - } - - @VisibleForTesting - static class MyComparator implements Comparator<Map<?, ?>> { - private final Collator mCollator; - private String mSortingKey; - private boolean mSortedByName; - - public MyComparator(String sortingKey) { - mCollator = Collator.getInstance(); - mSortingKey = sortingKey; - mSortedByName = ZoneGetter.KEY_DISPLAY_LABEL.equals(sortingKey); - } - - public void setSortingKey(String sortingKey) { - mSortingKey = sortingKey; - mSortedByName = ZoneGetter.KEY_DISPLAY_LABEL.equals(sortingKey); - } - - public int compare(Map<?, ?> map1, Map<?, ?> map2) { - Object value1 = map1.get(mSortingKey); - Object value2 = map2.get(mSortingKey); - - /* - * This should never happen, but just in-case, put non-comparable - * items at the end. - */ - if (!isComparable(value1)) { - return isComparable(value2) ? 1 : 0; - } else if (!isComparable(value2)) { - return -1; - } - - if (mSortedByName) { - return mCollator.compare(value1, value2); - } else { - return ((Comparable) value1).compareTo(value2); - } - } - - private boolean isComparable(Object value) { - return (value != null) && (value instanceof Comparable); - } - } -} diff --git a/src/com/android/settings/deletionhelper/AutomaticStorageManagerSettings.java b/src/com/android/settings/deletionhelper/AutomaticStorageManagerSettings.java index 590254538a..d37dbe0a35 100644 --- a/src/com/android/settings/deletionhelper/AutomaticStorageManagerSettings.java +++ b/src/com/android/settings/deletionhelper/AutomaticStorageManagerSettings.java @@ -36,6 +36,7 @@ import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settings.widget.SwitchBar; import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.List; @@ -44,6 +45,7 @@ import java.util.List; * AutomaticStorageManagerSettings is the Settings screen for configuration and management of the * automatic storage manager. */ +@SearchIndexable public class AutomaticStorageManagerSettings extends DashboardFragment implements OnPreferenceChangeListener { private static final String KEY_DAYS = "days"; diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java index 3ee5db1df7..d69109c06c 100644 --- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java +++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java @@ -49,11 +49,13 @@ import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.development.DeveloperOptionsPreferenceController; import com.android.settingslib.development.DevelopmentSettingsEnabler; import com.android.settingslib.development.SystemPropPoker; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC) public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFragment implements SwitchBar.OnSwitchChangeListener, OemUnlockDialogHost, AdbDialogHost, AdbClearKeysDialogHost, LogPersistDialogHost { @@ -428,7 +430,6 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra controllers.add(new TransitionAnimationScalePreferenceController(context)); controllers.add(new AnimatorDurationScalePreferenceController(context)); controllers.add(new SecondaryDisplayPreferenceController(context)); - controllers.add(new ForceGpuRenderingPreferenceController(context)); controllers.add(new GpuViewUpdatesPreferenceController(context)); controllers.add(new HardwareLayersUpdatesPreferenceController(context)); controllers.add(new DebugGpuOverdrawPreferenceController(context)); diff --git a/src/com/android/settings/development/ForceGpuRenderingPreferenceController.java b/src/com/android/settings/development/ForceGpuRenderingPreferenceController.java deleted file mode 100644 index 72074cb5ac..0000000000 --- a/src/com/android/settings/development/ForceGpuRenderingPreferenceController.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.settings.development; - -import android.content.Context; -import android.os.SystemProperties; -import android.support.annotation.VisibleForTesting; -import android.support.v14.preference.SwitchPreference; -import android.support.v7.preference.Preference; - -import com.android.settings.core.PreferenceControllerMixin; -import com.android.settingslib.development.DeveloperOptionsPreferenceController; -import com.android.settingslib.development.SystemPropPoker; - -public class ForceGpuRenderingPreferenceController extends DeveloperOptionsPreferenceController - implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin { - - private static final String FORCE_HARDWARE_UI_KEY = "force_hw_ui"; - - @VisibleForTesting - static final String HARDWARE_UI_PROPERTY = "persist.sys.ui.hw"; - - public ForceGpuRenderingPreferenceController(Context context) { - super(context); - } - - @Override - public String getPreferenceKey() { - return FORCE_HARDWARE_UI_KEY; - } - - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - final boolean isEnabled = (Boolean) newValue; - SystemProperties.set(HARDWARE_UI_PROPERTY, - isEnabled ? Boolean.toString(true) : Boolean.toString(false)); - SystemPropPoker.getInstance().poke(); - return true; - } - - @Override - public void updateState(Preference preference) { - final boolean isEnabled = SystemProperties.getBoolean(HARDWARE_UI_PROPERTY, - false /* default */); - ((SwitchPreference) mPreference).setChecked(isEnabled); - } - - @Override - protected void onDeveloperOptionsSwitchDisabled() { - super.onDeveloperOptionsSwitchDisabled(); - SystemProperties.set(HARDWARE_UI_PROPERTY, Boolean.toString(false)); - ((SwitchPreference) mPreference).setChecked(false); - } -} diff --git a/src/com/android/settings/deviceinfo/DeviceInfoSettings.java b/src/com/android/settings/deviceinfo/DeviceInfoSettings.java index 3f70d8b3ef..5e78362b0d 100644 --- a/src/com/android/settings/deviceinfo/DeviceInfoSettings.java +++ b/src/com/android/settings/deviceinfo/DeviceInfoSettings.java @@ -35,11 +35,13 @@ import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +@SearchIndexable public class DeviceInfoSettings extends DashboardFragment implements Indexable { private static final String LOG_TAG = "DeviceInfoSettings"; diff --git a/src/com/android/settings/deviceinfo/PrivateVolumeForget.java b/src/com/android/settings/deviceinfo/PrivateVolumeForget.java index b6d50cef75..af485db0a3 100644 --- a/src/com/android/settings/deviceinfo/PrivateVolumeForget.java +++ b/src/com/android/settings/deviceinfo/PrivateVolumeForget.java @@ -18,13 +18,13 @@ package com.android.settings.deviceinfo; import android.app.AlertDialog; import android.app.Dialog; -import android.app.DialogFragment; import android.app.Fragment; import android.content.Context; import android.content.DialogInterface; import android.os.Bundle; import android.os.storage.StorageManager; import android.os.storage.VolumeRecord; +import android.support.annotation.VisibleForTesting; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; @@ -35,11 +35,13 @@ import android.widget.TextView; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; -import com.android.settings.SettingsPreferenceFragment; +import com.android.settings.core.InstrumentedFragment; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; +import com.android.settings.search.actionbar.SearchMenuController; -public class PrivateVolumeForget extends SettingsPreferenceFragment { - private static final String TAG_FORGET_CONFIRM = "forget_confirm"; +public class PrivateVolumeForget extends InstrumentedFragment { + @VisibleForTesting + static final String TAG_FORGET_CONFIRM = "forget_confirm"; private VolumeRecord mRecord; @@ -49,6 +51,13 @@ public class PrivateVolumeForget extends SettingsPreferenceFragment { } @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + setHasOptionsMenu(true); + SearchMenuController.init(this /* host */); + } + + @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final StorageManager storage = getActivity().getSystemService(StorageManager.class); @@ -116,12 +125,12 @@ public class PrivateVolumeForget extends SettingsPreferenceFragment { builder.setPositiveButton(R.string.storage_menu_forget, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - storage.forgetVolume(fsUuid); - getActivity().finish(); - } - }); + @Override + public void onClick(DialogInterface dialog, int which) { + storage.forgetVolume(fsUuid); + getActivity().finish(); + } + }); builder.setNegativeButton(R.string.cancel, null); return builder.create(); diff --git a/src/com/android/settings/deviceinfo/PrivateVolumeFormat.java b/src/com/android/settings/deviceinfo/PrivateVolumeFormat.java index 4a63e64a44..0bac2964c0 100644 --- a/src/com/android/settings/deviceinfo/PrivateVolumeFormat.java +++ b/src/com/android/settings/deviceinfo/PrivateVolumeFormat.java @@ -17,7 +17,6 @@ package com.android.settings.deviceinfo; import static android.os.storage.DiskInfo.EXTRA_DISK_ID; - import static com.android.settings.deviceinfo.StorageWizardBase.EXTRA_FORMAT_FORGET_UUID; import static com.android.settings.deviceinfo.StorageWizardBase.EXTRA_FORMAT_PRIVATE; @@ -36,9 +35,9 @@ import android.widget.TextView; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; -import com.android.settings.core.InstrumentedPreferenceFragment; +import com.android.settings.core.InstrumentedFragment; -public class PrivateVolumeFormat extends InstrumentedPreferenceFragment { +public class PrivateVolumeFormat extends InstrumentedFragment { private VolumeInfo mVolume; private DiskInfo mDisk; diff --git a/src/com/android/settings/deviceinfo/PrivateVolumeUnmount.java b/src/com/android/settings/deviceinfo/PrivateVolumeUnmount.java index 0aa5b920f5..e74abc9295 100644 --- a/src/com/android/settings/deviceinfo/PrivateVolumeUnmount.java +++ b/src/com/android/settings/deviceinfo/PrivateVolumeUnmount.java @@ -30,10 +30,11 @@ import android.widget.TextView; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; -import com.android.settings.SettingsPreferenceFragment; +import com.android.settings.core.InstrumentedFragment; import com.android.settings.deviceinfo.StorageSettings.UnmountTask; +import com.android.settings.search.actionbar.SearchMenuController; -public class PrivateVolumeUnmount extends SettingsPreferenceFragment { +public class PrivateVolumeUnmount extends InstrumentedFragment { private VolumeInfo mVolume; private DiskInfo mDisk; @@ -43,6 +44,13 @@ public class PrivateVolumeUnmount extends SettingsPreferenceFragment { } @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + setHasOptionsMenu(true); + SearchMenuController.init(this /* host */); + } + + @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final StorageManager storage = getActivity().getSystemService(StorageManager.class); diff --git a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java index 8e56b12ec8..06515249a1 100644 --- a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java +++ b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java @@ -51,12 +51,14 @@ import com.android.settingslib.applications.StorageStatsSource; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.deviceinfo.PrivateStorageInfo; import com.android.settingslib.deviceinfo.StorageManagerVolumeProvider; +import com.android.settingslib.search.SearchIndexable; import com.android.settingslib.wrapper.PackageManagerWrapper; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +@SearchIndexable public class StorageDashboardFragment extends DashboardFragment implements LoaderManager.LoaderCallbacks<SparseArray<StorageAsyncLoader.AppsStorageResult>> { diff --git a/src/com/android/settings/deviceinfo/StorageSettings.java b/src/com/android/settings/deviceinfo/StorageSettings.java index cf9d34b3bc..720cebd83a 100644 --- a/src/com/android/settings/deviceinfo/StorageSettings.java +++ b/src/com/android/settings/deviceinfo/StorageSettings.java @@ -57,6 +57,7 @@ import com.android.settings.search.SearchIndexableRaw; import com.android.settingslib.RestrictedLockUtils; import com.android.settingslib.deviceinfo.PrivateStorageInfo; import com.android.settingslib.deviceinfo.StorageManagerVolumeProvider; +import com.android.settingslib.search.SearchIndexable; import java.text.NumberFormat; import java.util.ArrayList; @@ -67,6 +68,7 @@ import java.util.List; * Panel showing both internal storage (both built-in storage and private * volumes) and removable storage (public volumes). */ +@SearchIndexable public class StorageSettings extends SettingsPreferenceFragment implements Indexable { static final String TAG = "StorageSettings"; diff --git a/src/com/android/settings/deviceinfo/StorageVolumePreference.java b/src/com/android/settings/deviceinfo/StorageVolumePreference.java index 023b2a1b20..6135acd218 100644 --- a/src/com/android/settings/deviceinfo/StorageVolumePreference.java +++ b/src/com/android/settings/deviceinfo/StorageVolumePreference.java @@ -106,7 +106,7 @@ public class StorageVolumePreference extends Preference { } if (freeBytes < mStorageManager.getStorageLowBytes(path)) { - mColor = Utils.getColorAttr(context, android.R.attr.colorError); + mColor = Utils.getColorAttrDefaultColor(context, android.R.attr.colorError); icon = context.getDrawable(R.drawable.ic_warning_24dp); } diff --git a/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java b/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java index 09262a0647..bc5184439c 100644 --- a/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java +++ b/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java @@ -54,11 +54,13 @@ import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.widget.EntityHeaderController; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +@SearchIndexable public class MyDeviceInfoFragment extends DashboardFragment implements DeviceNamePreferenceController.DeviceNamePreferenceHost { private static final String LOG_TAG = "MyDeviceInfoFragment"; diff --git a/src/com/android/settings/deviceinfo/legal/CopyrightPreferenceController.java b/src/com/android/settings/deviceinfo/legal/CopyrightPreferenceController.java new file mode 100644 index 0000000000..68e51f40df --- /dev/null +++ b/src/com/android/settings/deviceinfo/legal/CopyrightPreferenceController.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package com.android.settings.deviceinfo.legal; + +import android.content.Context; +import android.content.Intent; + +public class CopyrightPreferenceController extends LegalPreferenceController { + + private static final Intent INTENT = new Intent("android.settings.COPYRIGHT"); + + public CopyrightPreferenceController(Context context, String key) { + super(context, key); + } + + @Override + protected Intent getIntent() { + return INTENT; + } +} diff --git a/src/com/android/settings/deviceinfo/legal/LegalPreferenceController.java b/src/com/android/settings/deviceinfo/legal/LegalPreferenceController.java new file mode 100644 index 0000000000..f64eb4b59f --- /dev/null +++ b/src/com/android/settings/deviceinfo/legal/LegalPreferenceController.java @@ -0,0 +1,96 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package com.android.settings.deviceinfo.legal; + +import android.content.Context; +import android.content.Intent; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.support.v7.preference.Preference; +import android.support.v7.preference.PreferenceScreen; + +import com.android.settings.core.BasePreferenceController; + +import java.util.List; + + +public abstract class LegalPreferenceController extends BasePreferenceController { + private final PackageManager mPackageManager; + private Preference mPreference; + + public LegalPreferenceController(Context context, String key) { + super(context, key); + mPackageManager = mContext.getPackageManager(); + } + + @Override + public int getAvailabilityStatus() { + if (findMatchingSpecificActivity() != null) { + return AVAILABLE; + } else { + return DISABLED_UNSUPPORTED; + } + } + + @Override + public void displayPreference(PreferenceScreen screen) { + mPreference = screen.findPreference(getPreferenceKey()); + super.displayPreference(screen); + + if (getAvailabilityStatus() == AVAILABLE) { + replacePreferenceIntent(); + } + } + + protected abstract Intent getIntent(); + + private ResolveInfo findMatchingSpecificActivity() { + final Intent intent = getIntent(); + if (intent == null) { + return null; + } + + // Find the activity that is in the system image + final List<ResolveInfo> list = mPackageManager.queryIntentActivities(intent, 0); + if (list == null) { + return null; + } + + for (ResolveInfo resolveInfo : list) { + if ((resolveInfo.activityInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) + != 0) { + return resolveInfo; + } + } + + // Did not find a matching activity + return null; + } + + private void replacePreferenceIntent() { + final ResolveInfo resolveInfo = findMatchingSpecificActivity(); + if (resolveInfo == null) { + return; + } + + // Replace the intent with this specific activity + mPreference.setIntent(new Intent().setClassName( + resolveInfo.activityInfo.packageName, + resolveInfo.activityInfo.name)); + + mPreference.setTitle(resolveInfo.loadLabel(mPackageManager)); + } +} diff --git a/src/com/android/settings/deviceinfo/legal/LicensePreferenceController.java b/src/com/android/settings/deviceinfo/legal/LicensePreferenceController.java new file mode 100644 index 0000000000..67af15b4fc --- /dev/null +++ b/src/com/android/settings/deviceinfo/legal/LicensePreferenceController.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package com.android.settings.deviceinfo.legal; + +import android.content.Context; +import android.content.Intent; + +public class LicensePreferenceController extends LegalPreferenceController { + + private static final Intent INTENT = new Intent("android.settings.LICENSE"); + + public LicensePreferenceController(Context context, String key) { + super(context, key); + } + + @Override + protected Intent getIntent() { + return INTENT; + } +} diff --git a/src/com/android/settings/deviceinfo/legal/TermsPreferenceController.java b/src/com/android/settings/deviceinfo/legal/TermsPreferenceController.java new file mode 100644 index 0000000000..bccc44579b --- /dev/null +++ b/src/com/android/settings/deviceinfo/legal/TermsPreferenceController.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package com.android.settings.deviceinfo.legal; + +import android.content.Context; +import android.content.Intent; + +public class TermsPreferenceController extends LegalPreferenceController { + + private static final Intent INTENT = new Intent("android.settings.TERMS"); + + public TermsPreferenceController(Context context, String key) { + super(context, key); + } + + @Override + protected Intent getIntent() { + return INTENT; + } +} diff --git a/src/com/android/settings/search/SearchIndexableResources.java b/src/com/android/settings/deviceinfo/legal/WallpaperAttributionsPreferenceController.java index 5a0a131af6..418b149df9 100644 --- a/src/com/android/settings/search/SearchIndexableResources.java +++ b/src/com/android/settings/deviceinfo/legal/WallpaperAttributionsPreferenceController.java @@ -13,17 +13,23 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +package com.android.settings.deviceinfo.legal; -package com.android.settings.search; +import android.content.Context; -import java.util.Collection; +import com.android.settings.R; +import com.android.settings.core.BasePreferenceController; -public interface SearchIndexableResources { +public class WallpaperAttributionsPreferenceController extends BasePreferenceController { - /** - * Returns a collection of classes that should be indexed for search. - * - * Each class should have the SEARCH_INDEX_DATA_PROVIDER public static member. - */ - Collection<Class> getProviderValues(); + public WallpaperAttributionsPreferenceController(Context context, String key) { + super(context, key); + } + + @Override + public int getAvailabilityStatus() { + return mContext.getResources().getBoolean(R.bool.config_show_wallpaper_attribution) + ? AVAILABLE + : DISABLED_UNSUPPORTED; + } } diff --git a/src/com/android/settings/deviceinfo/legal/WebViewLicensePreferenceController.java b/src/com/android/settings/deviceinfo/legal/WebViewLicensePreferenceController.java new file mode 100644 index 0000000000..9d8b3f9502 --- /dev/null +++ b/src/com/android/settings/deviceinfo/legal/WebViewLicensePreferenceController.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package com.android.settings.deviceinfo.legal; + +import android.content.Context; +import android.content.Intent; + +public class WebViewLicensePreferenceController extends LegalPreferenceController { + + private static final Intent INTENT = new Intent("android.settings.WEBVIEW_LICENSE"); + + public WebViewLicensePreferenceController(Context context, String key) { + super(context, key); + } + + @Override + protected Intent getIntent() { + return INTENT; + } +} diff --git a/src/com/android/settings/deviceinfo/storage/UserProfileController.java b/src/com/android/settings/deviceinfo/storage/UserProfileController.java index 510b0c0390..05856cbb25 100644 --- a/src/com/android/settings/deviceinfo/storage/UserProfileController.java +++ b/src/com/android/settings/deviceinfo/storage/UserProfileController.java @@ -130,7 +130,7 @@ public class UserProfileController extends AbstractPreferenceController implemen private static Drawable applyTint(Context context, Drawable icon) { icon = icon.mutate(); - icon.setTint(Utils.getColorAttr(context, android.R.attr.colorControlNormal)); + icon.setTintList(Utils.getColorAttr(context, android.R.attr.colorControlNormal)); return icon; } diff --git a/src/com/android/settings/display/AmbientDisplaySettings.java b/src/com/android/settings/display/AmbientDisplaySettings.java index 8745e3ff18..ba3e1ee46e 100644 --- a/src/com/android/settings/display/AmbientDisplaySettings.java +++ b/src/com/android/settings/display/AmbientDisplaySettings.java @@ -32,6 +32,7 @@ import com.android.settings.search.Indexable; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.List; @@ -39,6 +40,7 @@ import java.util.List; /** * Settings screen for Ambient display. */ +@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC) public class AmbientDisplaySettings extends DashboardFragment { public static final String KEY_AMBIENT_DISPLAY_ALWAYS_ON = "ambient_display_always_on"; diff --git a/src/com/android/settings/display/AutoBrightnessSettings.java b/src/com/android/settings/display/AutoBrightnessSettings.java index 778acf6880..39877ec5dd 100644 --- a/src/com/android/settings/display/AutoBrightnessSettings.java +++ b/src/com/android/settings/display/AutoBrightnessSettings.java @@ -24,10 +24,12 @@ import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settingslib.search.SearchIndexable; import java.util.Arrays; import java.util.List; +@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC) public class AutoBrightnessSettings extends DashboardFragment { private static final String TAG = "AutoBrightnessSettings"; diff --git a/src/com/android/settings/display/NightDisplaySettings.java b/src/com/android/settings/display/NightDisplaySettings.java index 4e0ebcd0f6..add4443f98 100644 --- a/src/com/android/settings/display/NightDisplaySettings.java +++ b/src/com/android/settings/display/NightDisplaySettings.java @@ -33,6 +33,7 @@ import com.android.settings.search.Indexable; import com.android.settings.widget.SeekBarPreference; import com.android.settings.SettingsPreferenceFragment; import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.search.SearchIndexable; import java.text.DateFormat; import java.time.LocalTime; @@ -45,6 +46,7 @@ import java.util.TimeZone; * Settings screen for Night display. * TODO (b/69912911) Upgrade to Dashboard fragment */ +@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC) public class NightDisplaySettings extends SettingsPreferenceFragment implements ColorDisplayController.Callback, Preference.OnPreferenceChangeListener, Indexable { diff --git a/src/com/android/settings/display/ScreenZoomSettings.java b/src/com/android/settings/display/ScreenZoomSettings.java index 6b5216e7ab..fed8aa67f5 100644 --- a/src/com/android/settings/display/ScreenZoomSettings.java +++ b/src/com/android/settings/display/ScreenZoomSettings.java @@ -30,6 +30,7 @@ import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settings.search.SearchIndexableRaw; import com.android.settingslib.display.DisplayDensityUtils; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.List; @@ -37,6 +38,7 @@ import java.util.List; /** * Preference fragment used to control screen zoom. */ +@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC) public class ScreenZoomSettings extends PreviewSeekBarPreferenceFragment implements Indexable { private int mDefaultDensity; diff --git a/src/com/android/settings/dream/DreamSettings.java b/src/com/android/settings/dream/DreamSettings.java index c0d4c400cc..97f2c89cb5 100644 --- a/src/com/android/settings/dream/DreamSettings.java +++ b/src/com/android/settings/dream/DreamSettings.java @@ -32,11 +32,13 @@ import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.dream.DreamBackend; import com.android.settingslib.dream.DreamBackend.WhenToDream; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +@SearchIndexable public class DreamSettings extends DashboardFragment { private static final String TAG = "DreamSettings"; diff --git a/src/com/android/settings/enterprise/EnterprisePrivacySettings.java b/src/com/android/settings/enterprise/EnterprisePrivacySettings.java index 92ae38df94..f04c421429 100644 --- a/src/com/android/settings/enterprise/EnterprisePrivacySettings.java +++ b/src/com/android/settings/enterprise/EnterprisePrivacySettings.java @@ -26,11 +26,13 @@ import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.widget.PreferenceCategoryController; import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +@SearchIndexable public class EnterprisePrivacySettings extends DashboardFragment { static final String TAG = "EnterprisePrivacySettings"; diff --git a/src/com/android/settings/fuelgauge/BatteryMeterView.java b/src/com/android/settings/fuelgauge/BatteryMeterView.java index 353b3d7ab6..9f1e115a87 100644 --- a/src/com/android/settings/fuelgauge/BatteryMeterView.java +++ b/src/com/android/settings/fuelgauge/BatteryMeterView.java @@ -51,7 +51,8 @@ public class BatteryMeterView extends ImageView { final int frameColor = context.getColor(R.color.meter_background_color); mAccentColorFilter = new PorterDuffColorFilter( - Utils.getColorAttr(context, android.R.attr.colorAccent), PorterDuff.Mode.SRC_IN); + Utils.getColorAttrDefaultColor(context, android.R.attr.colorAccent), + PorterDuff.Mode.SRC_IN); mErrorColorFilter = new PorterDuffColorFilter( context.getColor(R.color.battery_icon_color_error), PorterDuff.Mode.SRC_IN); diff --git a/src/com/android/settings/fuelgauge/BatterySaverDrawable.java b/src/com/android/settings/fuelgauge/BatterySaverDrawable.java index 0d3008a0e3..ce2936177a 100644 --- a/src/com/android/settings/fuelgauge/BatterySaverDrawable.java +++ b/src/com/android/settings/fuelgauge/BatterySaverDrawable.java @@ -37,7 +37,7 @@ public class BatterySaverDrawable extends BatteryMeterDrawableBase { setPowerSave(true); setCharging(false); setPowerSaveAsColorError(false); - final int tintColor = Utils.getColorAttr(context, android.R.attr.colorAccent); + final int tintColor = Utils.getColorAttrDefaultColor(context, android.R.attr.colorAccent); setColorFilter(new PorterDuffColorFilter(tintColor, PorterDuff.Mode.SRC_IN)); } -}
\ No newline at end of file +} diff --git a/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java b/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java index 327a6c58bf..cf80196eca 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java +++ b/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java @@ -30,12 +30,14 @@ import com.android.settings.SettingsActivity; import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.search.SearchIndexable; import com.android.settingslib.utils.StringUtil; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC) public class PowerUsageAdvanced extends PowerUsageBase { private static final String TAG = "AdvancedBatteryUsage"; private static final String KEY_BATTERY_GRAPH = "battery_graph"; diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java index 4c4b6e926c..e314dde657 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java +++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java @@ -51,6 +51,7 @@ import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settingslib.search.SearchIndexable; import com.android.settingslib.utils.PowerUtil; import com.android.settingslib.utils.StringUtil; @@ -62,6 +63,7 @@ import java.util.List; * Displays a list of apps and subsystems that consume power, ordered by how much power was * consumed since the last time it was unplugged. */ +@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC) public class PowerUsageSummary extends PowerUsageBase implements OnLongClickListener, BatteryTipPreferenceController.BatteryTipListener { diff --git a/src/com/android/settings/fuelgauge/SmartBatterySettings.java b/src/com/android/settings/fuelgauge/SmartBatterySettings.java index bcbac3f1c8..ba2b47671f 100644 --- a/src/com/android/settings/fuelgauge/SmartBatterySettings.java +++ b/src/com/android/settings/fuelgauge/SmartBatterySettings.java @@ -27,6 +27,7 @@ import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.Arrays; @@ -35,6 +36,7 @@ import java.util.List; /** * Fragment to show smart battery and restricted app controls */ +@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC) public class SmartBatterySettings extends DashboardFragment { public static final String TAG = "SmartBatterySettings"; diff --git a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverSettings.java b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverSettings.java index 8009e954e3..aa16fc9fe1 100644 --- a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverSettings.java +++ b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverSettings.java @@ -27,6 +27,7 @@ import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.Arrays; @@ -35,6 +36,7 @@ import java.util.List; /** * Battery saver settings page */ +@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC) public class BatterySaverSettings extends DashboardFragment { private static final String TAG = "BatterySaverSettings"; diff --git a/src/com/android/settings/gestures/AssistGestureSettings.java b/src/com/android/settings/gestures/AssistGestureSettings.java index df2dd93a54..ffe223443e 100644 --- a/src/com/android/settings/gestures/AssistGestureSettings.java +++ b/src/com/android/settings/gestures/AssistGestureSettings.java @@ -26,11 +26,13 @@ import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +@SearchIndexable public class AssistGestureSettings extends DashboardFragment { private static final String TAG = "AssistGesture"; diff --git a/src/com/android/settings/gestures/DoubleTapPowerSettings.java b/src/com/android/settings/gestures/DoubleTapPowerSettings.java index 6eec6cd31c..8afd2c1f64 100644 --- a/src/com/android/settings/gestures/DoubleTapPowerSettings.java +++ b/src/com/android/settings/gestures/DoubleTapPowerSettings.java @@ -26,10 +26,12 @@ import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider; import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settingslib.search.SearchIndexable; import java.util.Arrays; import java.util.List; +@SearchIndexable public class DoubleTapPowerSettings extends DashboardFragment { private static final String TAG = "DoubleTapPower"; diff --git a/src/com/android/settings/gestures/DoubleTapScreenSettings.java b/src/com/android/settings/gestures/DoubleTapScreenSettings.java index 29e0a1a4b7..fcea8e4062 100644 --- a/src/com/android/settings/gestures/DoubleTapScreenSettings.java +++ b/src/com/android/settings/gestures/DoubleTapScreenSettings.java @@ -28,11 +28,13 @@ import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider; import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +@SearchIndexable public class DoubleTapScreenSettings extends DashboardFragment { private static final String TAG = "DoubleTapScreen"; diff --git a/src/com/android/settings/gestures/DoubleTwistGestureSettings.java b/src/com/android/settings/gestures/DoubleTwistGestureSettings.java index a3f37f0821..145a06c55f 100644 --- a/src/com/android/settings/gestures/DoubleTwistGestureSettings.java +++ b/src/com/android/settings/gestures/DoubleTwistGestureSettings.java @@ -26,10 +26,12 @@ import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider; import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settingslib.search.SearchIndexable; import java.util.Arrays; import java.util.List; +@SearchIndexable public class DoubleTwistGestureSettings extends DashboardFragment { private static final String TAG = "DoubleTwistGesture"; diff --git a/src/com/android/settings/gestures/GestureSettings.java b/src/com/android/settings/gestures/GestureSettings.java index ec0577bd66..2c9574976e 100644 --- a/src/com/android/settings/gestures/GestureSettings.java +++ b/src/com/android/settings/gestures/GestureSettings.java @@ -29,11 +29,13 @@ import com.android.settings.dashboard.DashboardFragment; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +@SearchIndexable public class GestureSettings extends DashboardFragment { private static final String TAG = "GestureSettings"; diff --git a/src/com/android/settings/gestures/PickupGestureSettings.java b/src/com/android/settings/gestures/PickupGestureSettings.java index 8f4e7b3f1f..05aba4e99e 100644 --- a/src/com/android/settings/gestures/PickupGestureSettings.java +++ b/src/com/android/settings/gestures/PickupGestureSettings.java @@ -27,10 +27,12 @@ import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider; import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settingslib.search.SearchIndexable; import java.util.Arrays; import java.util.List; +@SearchIndexable public class PickupGestureSettings extends DashboardFragment { private static final String TAG = "PickupGestureSettings"; diff --git a/src/com/android/settings/gestures/PreventRingingGestureSettings.java b/src/com/android/settings/gestures/PreventRingingGestureSettings.java index 09570dfb4f..58ff5fa660 100644 --- a/src/com/android/settings/gestures/PreventRingingGestureSettings.java +++ b/src/com/android/settings/gestures/PreventRingingGestureSettings.java @@ -26,11 +26,13 @@ import com.android.settings.dashboard.DashboardFragment; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +@SearchIndexable public class PreventRingingGestureSettings extends DashboardFragment { private static final String TAG = "RingingGestureSettings"; diff --git a/src/com/android/settings/gestures/SwipeToNotificationSettings.java b/src/com/android/settings/gestures/SwipeToNotificationSettings.java index c18289c1a9..7ae8644b22 100644 --- a/src/com/android/settings/gestures/SwipeToNotificationSettings.java +++ b/src/com/android/settings/gestures/SwipeToNotificationSettings.java @@ -26,10 +26,12 @@ import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider; import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settingslib.search.SearchIndexable; import java.util.Arrays; import java.util.List; +@SearchIndexable public class SwipeToNotificationSettings extends DashboardFragment { private static final String TAG = "SwipeToNotifSettings"; diff --git a/src/com/android/settings/gestures/SwipeUpGestureSettings.java b/src/com/android/settings/gestures/SwipeUpGestureSettings.java index 1fe74c6c72..41a1aa4427 100644 --- a/src/com/android/settings/gestures/SwipeUpGestureSettings.java +++ b/src/com/android/settings/gestures/SwipeUpGestureSettings.java @@ -26,10 +26,12 @@ import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider; import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settingslib.search.SearchIndexable; import java.util.Arrays; import java.util.List; +@SearchIndexable public class SwipeUpGestureSettings extends DashboardFragment { private static final String TAG = "SwipeUpGesture"; diff --git a/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragment.java b/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragment.java index 48b0b4ada4..96185e2ad1 100644 --- a/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragment.java +++ b/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragment.java @@ -42,11 +42,13 @@ import com.android.settings.search.Indexable; import com.android.settingslib.inputmethod.InputMethodAndSubtypeUtil; import com.android.settingslib.inputmethod.InputMethodPreference; import com.android.settingslib.inputmethod.InputMethodSettingValuesWrapper; +import com.android.settingslib.search.SearchIndexable; import java.text.Collator; import java.util.ArrayList; import java.util.List; +@SearchIndexable public final class AvailableVirtualKeyboardFragment extends SettingsPreferenceFragment implements InputMethodPreference.OnSavePreferenceListener, Indexable { diff --git a/src/com/android/settings/inputmethod/KeyboardLayoutPickerController.java b/src/com/android/settings/inputmethod/KeyboardLayoutPickerController.java new file mode 100644 index 0000000000..d3f7f17ccb --- /dev/null +++ b/src/com/android/settings/inputmethod/KeyboardLayoutPickerController.java @@ -0,0 +1,162 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.inputmethod; + + +import android.app.Fragment; +import android.content.Context; +import android.hardware.input.InputDeviceIdentifier; +import android.hardware.input.InputManager; +import android.hardware.input.KeyboardLayout; +import android.support.v14.preference.SwitchPreference; +import android.support.v7.preference.Preference; +import android.support.v7.preference.PreferenceScreen; +import android.view.InputDevice; + +import com.android.settings.core.BasePreferenceController; +import com.android.settingslib.core.lifecycle.LifecycleObserver; +import com.android.settingslib.core.lifecycle.events.OnStart; +import com.android.settingslib.core.lifecycle.events.OnStop; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + + +public class KeyboardLayoutPickerController extends BasePreferenceController implements + InputManager.InputDeviceListener, LifecycleObserver, OnStart, OnStop { + + private final InputManager mIm; + private final Map<SwitchPreference, KeyboardLayout> mPreferenceMap; + + private Fragment mParent; + private int mInputDeviceId; + private InputDeviceIdentifier mInputDeviceIdentifier; + private KeyboardLayout[] mKeyboardLayouts; + private PreferenceScreen mScreen; + + + public KeyboardLayoutPickerController(Context context, String key) { + super(context, key); + mIm = (InputManager) context.getSystemService(Context.INPUT_SERVICE); + mInputDeviceId = -1; + mPreferenceMap = new HashMap<>(); + } + + public void initialize(Fragment parent, InputDeviceIdentifier inputDeviceIdentifier) { + mParent = parent; + mInputDeviceIdentifier = inputDeviceIdentifier; + mKeyboardLayouts = mIm.getKeyboardLayoutsForInputDevice(mInputDeviceIdentifier); + Arrays.sort(mKeyboardLayouts); + } + + @Override + public void onStart() { + mIm.registerInputDeviceListener(this, null); + + final InputDevice inputDevice = + mIm.getInputDeviceByDescriptor(mInputDeviceIdentifier.getDescriptor()); + if (inputDevice == null) { + mParent.getActivity().finish(); + return; + } + mInputDeviceId = inputDevice.getId(); + + updateCheckedState(); + } + + @Override + public void onStop() { + mIm.unregisterInputDeviceListener(this); + mInputDeviceId = -1; + } + + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + mScreen = screen; + createPreferenceHierarchy(); + } + + @Override + public int getAvailabilityStatus() { + return AVAILABLE; + } + + @Override + public boolean handlePreferenceTreeClick(Preference preference) { + if (!(preference instanceof SwitchPreference)) { + return false; + } + + final SwitchPreference switchPref = (SwitchPreference) preference; + final KeyboardLayout layout = mPreferenceMap.get(switchPref); + if (layout != null) { + final boolean checked = switchPref.isChecked(); + if (checked) { + mIm.addKeyboardLayoutForInputDevice(mInputDeviceIdentifier, + layout.getDescriptor()); + } else { + mIm.removeKeyboardLayoutForInputDevice(mInputDeviceIdentifier, + layout.getDescriptor()); + } + } + return true; + } + + @Override + public void onInputDeviceAdded(int deviceId) { + + } + + @Override + public void onInputDeviceRemoved(int deviceId) { + if (mInputDeviceId >= 0 && deviceId == mInputDeviceId) { + mParent.getActivity().finish(); + } + } + + @Override + public void onInputDeviceChanged(int deviceId) { + if (mInputDeviceId >= 0 && deviceId == mInputDeviceId) { + updateCheckedState(); + } + } + + private void updateCheckedState() { + final String[] enabledKeyboardLayouts = mIm.getEnabledKeyboardLayoutsForInputDevice( + mInputDeviceIdentifier); + Arrays.sort(enabledKeyboardLayouts); + + for (Map.Entry<SwitchPreference, KeyboardLayout> entry : mPreferenceMap.entrySet()) { + entry.getKey().setChecked(Arrays.binarySearch(enabledKeyboardLayouts, + entry.getValue().getDescriptor()) >= 0); + } + } + + private void createPreferenceHierarchy() { + for (KeyboardLayout layout : mKeyboardLayouts) { + final SwitchPreference pref = new SwitchPreference(mScreen.getContext()); + pref.setTitle(layout.getLabel()); + pref.setSummary(layout.getCollection()); + pref.setKey(layout.getDescriptor()); + mScreen.addPreference(pref); + mPreferenceMap.put(pref, layout); + } + } +} + diff --git a/src/com/android/settings/inputmethod/KeyboardLayoutPickerFragment.java b/src/com/android/settings/inputmethod/KeyboardLayoutPickerFragment.java index 4c9715ca46..2c3f89ba63 100644 --- a/src/com/android/settings/inputmethod/KeyboardLayoutPickerFragment.java +++ b/src/com/android/settings/inputmethod/KeyboardLayoutPickerFragment.java @@ -18,29 +18,15 @@ package com.android.settings.inputmethod; import android.content.Context; import android.hardware.input.InputDeviceIdentifier; -import android.hardware.input.InputManager; -import android.hardware.input.InputManager.InputDeviceListener; -import android.hardware.input.KeyboardLayout; -import android.os.Bundle; -import android.support.v7.preference.CheckBoxPreference; -import android.support.v7.preference.Preference; -import android.support.v7.preference.PreferenceScreen; -import android.view.InputDevice; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; -import com.android.settings.SettingsPreferenceFragment; +import com.android.settings.R; +import com.android.settings.dashboard.DashboardFragment; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; -public class KeyboardLayoutPickerFragment extends SettingsPreferenceFragment - implements InputDeviceListener { - private InputDeviceIdentifier mInputDeviceIdentifier; - private int mInputDeviceId = -1; - private InputManager mIm; - private KeyboardLayout[] mKeyboardLayouts; - private HashMap<CheckBoxPreference, KeyboardLayout> mPreferenceMap = new HashMap<>(); +public class KeyboardLayoutPickerFragment extends DashboardFragment { + + private static final String TAG = "KeyboardLayoutPicker"; /** * Intent extra: The input device descriptor of the keyboard whose keyboard @@ -54,105 +40,25 @@ public class KeyboardLayoutPickerFragment extends SettingsPreferenceFragment } @Override - public void onCreate(Bundle icicle) { - super.onCreate(icicle); - - mInputDeviceIdentifier = getActivity().getIntent().getParcelableExtra( - EXTRA_INPUT_DEVICE_IDENTIFIER); - if (mInputDeviceIdentifier == null) { - getActivity().finish(); - } - - mIm = (InputManager) getSystemService(Context.INPUT_SERVICE); - mKeyboardLayouts = mIm.getKeyboardLayoutsForInputDevice(mInputDeviceIdentifier); - Arrays.sort(mKeyboardLayouts); - setPreferenceScreen(createPreferenceHierarchy()); - } - - @Override - public void onResume() { - super.onResume(); + public void onAttach(Context context) { + super.onAttach(context); - mIm.registerInputDeviceListener(this, null); - - InputDevice inputDevice = - mIm.getInputDeviceByDescriptor(mInputDeviceIdentifier.getDescriptor()); - if (inputDevice == null) { + final InputDeviceIdentifier inputDeviceIdentifier = getActivity().getIntent(). + getParcelableExtra(EXTRA_INPUT_DEVICE_IDENTIFIER); + if (inputDeviceIdentifier == null) { getActivity().finish(); - return; - } - mInputDeviceId = inputDevice.getId(); - - updateCheckedState(); - } - - @Override - public void onPause() { - mIm.unregisterInputDeviceListener(this); - mInputDeviceId = -1; - - super.onPause(); - } - - @Override - public boolean onPreferenceTreeClick(Preference preference) { - if (preference instanceof CheckBoxPreference) { - CheckBoxPreference checkboxPref = (CheckBoxPreference)preference; - KeyboardLayout layout = mPreferenceMap.get(checkboxPref); - if (layout != null) { - boolean checked = checkboxPref.isChecked(); - if (checked) { - mIm.addKeyboardLayoutForInputDevice(mInputDeviceIdentifier, - layout.getDescriptor()); - } else { - mIm.removeKeyboardLayoutForInputDevice(mInputDeviceIdentifier, - layout.getDescriptor()); - } - return true; - } } - return super.onPreferenceTreeClick(preference); - } - - @Override - public void onInputDeviceAdded(int deviceId) { - } - @Override - public void onInputDeviceChanged(int deviceId) { - if (mInputDeviceId >= 0 && deviceId == mInputDeviceId) { - updateCheckedState(); - } + use(KeyboardLayoutPickerController.class).initialize(this /*parent*/, + inputDeviceIdentifier); } @Override - public void onInputDeviceRemoved(int deviceId) { - if (mInputDeviceId >= 0 && deviceId == mInputDeviceId) { - getActivity().finish(); - } - } - - private PreferenceScreen createPreferenceHierarchy() { - PreferenceScreen root = getPreferenceManager().createPreferenceScreen(getActivity()); - - for (KeyboardLayout layout : mKeyboardLayouts) { - CheckBoxPreference pref = new CheckBoxPreference(getPrefContext()); - pref.setTitle(layout.getLabel()); - pref.setSummary(layout.getCollection()); - root.addPreference(pref); - mPreferenceMap.put(pref, layout); - } - return root; + protected String getLogTag() { + return TAG; } - private void updateCheckedState() { - String[] enabledKeyboardLayouts = mIm.getEnabledKeyboardLayoutsForInputDevice( - mInputDeviceIdentifier); - Arrays.sort(enabledKeyboardLayouts); - - for (Map.Entry<CheckBoxPreference, KeyboardLayout> entry : mPreferenceMap.entrySet()) { - entry.getKey().setChecked(Arrays.binarySearch(enabledKeyboardLayouts, - entry.getValue().getDescriptor()) >= 0); - } + protected int getPreferenceScreenResId() { + return R.xml.keyboard_layout_picker_fragment; } } diff --git a/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java b/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java index 36f4e92f23..5729ab253e 100644 --- a/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java +++ b/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java @@ -38,7 +38,6 @@ import android.support.v7.preference.PreferenceScreen; import android.text.TextUtils; import android.view.InputDevice; -import com.android.internal.inputmethod.InputMethodUtils; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.util.Preconditions; import com.android.settings.R; @@ -46,15 +45,16 @@ import com.android.settings.Settings; import com.android.settings.SettingsPreferenceFragment; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; +import com.android.settingslib.search.SearchIndexable; import com.android.settingslib.utils.ThreadUtils; import java.text.Collator; import java.util.ArrayList; import java.util.Arrays; -import java.util.HashMap; import java.util.List; import java.util.Objects; +@SearchIndexable public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment implements InputManager.InputDeviceListener, KeyboardLayoutDialogFragment.OnSetupKeyboardLayoutsListener, Indexable { @@ -71,8 +71,6 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment private PreferenceCategory mKeyboardAssistanceCategory; @NonNull private SwitchPreference mShowVirtualKeyboardSwitch; - @NonNull - private InputMethodUtils.InputMethodSettings mSettings; private Intent mIntentWaitingForResult; @@ -81,13 +79,6 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment Activity activity = Preconditions.checkNotNull(getActivity()); addPreferencesFromResource(R.xml.physical_keyboard_settings); mIm = Preconditions.checkNotNull(activity.getSystemService(InputManager.class)); - mSettings = new InputMethodUtils.InputMethodSettings( - activity.getResources(), - getContentResolver(), - new HashMap<>(), - new ArrayList<>(), - UserHandle.myUserId(), - false /* copyOnWrite */); mKeyboardAssistanceCategory = Preconditions.checkNotNull( (PreferenceCategory) findPreference(KEYBOARD_ASSISTANCE_CATEGORY)); mShowVirtualKeyboardSwitch = Preconditions.checkNotNull( @@ -208,7 +199,8 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment } private void updateShowVirtualKeyboardSwitch() { - mShowVirtualKeyboardSwitch.setChecked(mSettings.isShowImeWithHardKeyboardEnabled()); + mShowVirtualKeyboardSwitch.setChecked( + Secure.getInt(getContentResolver(), Secure.SHOW_IME_WITH_HARD_KEYBOARD, 0) != 0); } private void toggleKeyboardShortcutsMenu() { @@ -216,12 +208,10 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment } private final OnPreferenceChangeListener mShowVirtualKeyboardSwitchPreferenceChangeListener = - new OnPreferenceChangeListener() { - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - mSettings.setShowImeWithHardKeyboard((Boolean) newValue); - return true; - } + (preference, newValue) -> { + Secure.putInt(getContentResolver(), Secure.SHOW_IME_WITH_HARD_KEYBOARD, + ((Boolean) newValue) ? 1 : 0); + return true; }; private final ContentObserver mContentObserver = new ContentObserver(new Handler(true)) { diff --git a/src/com/android/settings/inputmethod/UserDictionaryAddWordContents.java b/src/com/android/settings/inputmethod/UserDictionaryAddWordContents.java index 620bc65281..716226db4c 100644 --- a/src/com/android/settings/inputmethod/UserDictionaryAddWordContents.java +++ b/src/com/android/settings/inputmethod/UserDictionaryAddWordContents.java @@ -60,8 +60,8 @@ public class UserDictionaryAddWordContents { private String mSavedShortcut; /* package */ UserDictionaryAddWordContents(final View view, final Bundle args) { - mWordEditText = (EditText)view.findViewById(R.id.user_dictionary_add_word_text); - mShortcutEditText = (EditText)view.findViewById(R.id.user_dictionary_add_shortcut); + mWordEditText = (EditText) view.findViewById(R.id.user_dictionary_add_word_text); + mShortcutEditText = (EditText) view.findViewById(R.id.user_dictionary_add_shortcut); final String word = args.getString(EXTRA_WORD); if (null != word) { mWordEditText.setText(word); @@ -81,8 +81,8 @@ public class UserDictionaryAddWordContents { /* package */ UserDictionaryAddWordContents(final View view, final UserDictionaryAddWordContents oldInstanceToBeEdited) { - mWordEditText = (EditText)view.findViewById(R.id.user_dictionary_add_word_text); - mShortcutEditText = (EditText)view.findViewById(R.id.user_dictionary_add_shortcut); + mWordEditText = (EditText) view.findViewById(R.id.user_dictionary_add_word_text); + mShortcutEditText = (EditText) view.findViewById(R.id.user_dictionary_add_shortcut); mMode = MODE_EDIT; mOldWord = oldInstanceToBeEdited.mSavedWord; mOldShortcut = oldInstanceToBeEdited.mSavedShortcut; @@ -167,23 +167,24 @@ public class UserDictionaryAddWordContents { return UserDictionaryAddWordActivity.CODE_WORD_ADDED; } - private static final String[] HAS_WORD_PROJECTION = { UserDictionary.Words.WORD }; + private static final String[] HAS_WORD_PROJECTION = {UserDictionary.Words.WORD}; private static final String HAS_WORD_SELECTION_ONE_LOCALE = UserDictionary.Words.WORD + "=? AND " + UserDictionary.Words.LOCALE + "=?"; private static final String HAS_WORD_SELECTION_ALL_LOCALES = UserDictionary.Words.WORD + "=? AND " + UserDictionary.Words.LOCALE + " is null"; + private boolean hasWord(final String word, final Context context) { final Cursor cursor; // mLocale == "" indicates this is an entry for all languages. Here, mLocale can't // be null at all (it's ensured by the updateLocale method). if ("".equals(mLocale)) { cursor = context.getContentResolver().query(UserDictionary.Words.CONTENT_URI, - HAS_WORD_PROJECTION, HAS_WORD_SELECTION_ALL_LOCALES, - new String[] { word }, null /* sort order */); + HAS_WORD_PROJECTION, HAS_WORD_SELECTION_ALL_LOCALES, + new String[] {word}, null /* sort order */); } else { cursor = context.getContentResolver().query(UserDictionary.Words.CONTENT_URI, - HAS_WORD_PROJECTION, HAS_WORD_SELECTION_ONE_LOCALE, - new String[] { word, mLocale }, null /* sort order */); + HAS_WORD_PROJECTION, HAS_WORD_SELECTION_ONE_LOCALE, + new String[] {word, mLocale}, null /* sort order */); } try { if (null == cursor) return false; @@ -196,6 +197,7 @@ public class UserDictionaryAddWordContents { public static class LocaleRenderer { private final String mLocaleString; private final String mDescription; + // LocaleString may NOT be null. public LocaleRenderer(final Context context, final String localeString) { mLocaleString = localeString; @@ -207,13 +209,16 @@ public class UserDictionaryAddWordContents { mDescription = Utils.createLocaleFromString(localeString).getDisplayName(); } } + @Override public String toString() { return mDescription; } + public String getLocaleString() { return mLocaleString; } + // "More languages..." is null ; "All languages" is the empty string. public boolean isMoreLanguages() { return null == mLocaleString; @@ -229,7 +234,8 @@ public class UserDictionaryAddWordContents { // Helper method to get the list of locales to display for this word public ArrayList<LocaleRenderer> getLocalesList(final Activity activity) { - final TreeSet<String> locales = UserDictionaryList.getUserDictionaryLocalesSet(activity); + final TreeSet<String> locales = + UserDictionaryListPreferenceController.getUserDictionaryLocalesSet(activity); // Remove our locale if it's in, because we're always gonna put it at the top locales.remove(mLocale); // mLocale may not be null final String systemLocale = Locale.getDefault().toString(); diff --git a/src/com/android/settings/inputmethod/UserDictionaryList.java b/src/com/android/settings/inputmethod/UserDictionaryList.java index 2f59dc90da..46723bc461 100644 --- a/src/com/android/settings/inputmethod/UserDictionaryList.java +++ b/src/com/android/settings/inputmethod/UserDictionaryList.java @@ -16,33 +16,17 @@ package com.android.settings.inputmethod; -import android.app.Activity; import android.content.Context; import android.content.Intent; -import android.database.Cursor; import android.os.Bundle; -import android.provider.UserDictionary; -import android.support.annotation.NonNull; -import android.support.v7.preference.Preference; -import android.support.v7.preference.PreferenceGroup; -import android.text.TextUtils; -import android.view.inputmethod.InputMethodInfo; -import android.view.inputmethod.InputMethodManager; -import android.view.inputmethod.InputMethodSubtype; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; -import com.android.settings.SettingsPreferenceFragment; -import com.android.settings.Utils; +import com.android.settings.dashboard.DashboardFragment; -import java.util.List; -import java.util.Locale; -import java.util.TreeSet; +public class UserDictionaryList extends DashboardFragment { -public class UserDictionaryList extends SettingsPreferenceFragment { - public static final String USER_DICTIONARY_SETTINGS_INTENT_ACTION = - "android.settings.USER_DICTIONARY_SETTINGS"; - private String mLocale; + private static final String TAG = "UserDictionaryList"; @Override public int getMetricsCategory() { @@ -50,15 +34,8 @@ public class UserDictionaryList extends SettingsPreferenceFragment { } @Override - public void onCreate(Bundle icicle) { - super.onCreate(icicle); - setPreferenceScreen(getPreferenceManager().createPreferenceScreen(getActivity())); - } - - @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - getActivity().getActionBar().setTitle(R.string.user_dict_settings_title); + public void onAttach(Context context) { + super.onAttach(context); final Intent intent = getActivity().getIntent(); final String localeFromIntent = @@ -76,122 +53,17 @@ public class UserDictionaryList extends SettingsPreferenceFragment { } else { locale = null; } - mLocale = locale; - } - - @NonNull - public static TreeSet<String> getUserDictionaryLocalesSet(Context context) { - final Cursor cursor = context.getContentResolver().query( - UserDictionary.Words.CONTENT_URI, new String[]{UserDictionary.Words.LOCALE}, - null, null, null); - final TreeSet<String> localeSet = new TreeSet<>(); - if (cursor == null) { - // The user dictionary service is not present or disabled. Return empty set. - return localeSet; - } - try { - if (cursor.moveToFirst()) { - final int columnIndex = cursor.getColumnIndex(UserDictionary.Words.LOCALE); - do { - final String locale = cursor.getString(columnIndex); - localeSet.add(null != locale ? locale : ""); - } while (cursor.moveToNext()); - } - } finally { - cursor.close(); - } - - // CAVEAT: Keep this for consistency of the implementation between Keyboard and Settings - // if (!UserDictionarySettings.IS_SHORTCUT_API_SUPPORTED) { - // // For ICS, we need to show "For all languages" in case that the keyboard locale - // // is different from the system locale - // localeSet.add(""); - // } - - final InputMethodManager imm = - (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); - final List<InputMethodInfo> imis = imm.getEnabledInputMethodList(); - for (final InputMethodInfo imi : imis) { - final List<InputMethodSubtype> subtypes = - imm.getEnabledInputMethodSubtypeList( - imi, true /* allowsImplicitlySelectedSubtypes */); - for (InputMethodSubtype subtype : subtypes) { - final String locale = subtype.getLocale(); - if (!TextUtils.isEmpty(locale)) { - localeSet.add(locale); - } - } - } - - // We come here after we have collected locales from existing user dictionary entries and - // enabled subtypes. If we already have the locale-without-country version of the system - // locale, we don't add the system locale to avoid confusion even though it's technically - // correct to add it. - if (!localeSet.contains(Locale.getDefault().getLanguage().toString())) { - localeSet.add(Locale.getDefault().toString()); - } - return localeSet; + use(UserDictionaryListPreferenceController.class).setLocale(locale); } - /** - * Creates the entries that allow the user to go into the user dictionary for each locale. - * - * @param userDictGroup The group to put the settings in. - */ - protected void createUserDictSettings(PreferenceGroup userDictGroup) { - final Activity activity = getActivity(); - userDictGroup.removeAll(); - final TreeSet<String> localeSet = - UserDictionaryList.getUserDictionaryLocalesSet(activity); - if (mLocale != null) { - // If the caller explicitly specify empty string as a locale, we'll show "all languages" - // in the list. - localeSet.add(mLocale); - } - if (localeSet.size() > 1) { - // Have an "All languages" entry in the languages list if there are two or more active - // languages - localeSet.add(""); - } - - if (localeSet.isEmpty()) { - userDictGroup.addPreference(createUserDictionaryPreference(null, activity)); - } else { - for (String locale : localeSet) { - userDictGroup.addPreference(createUserDictionaryPreference(locale, activity)); - } - } - } - - /** - * Create a single User Dictionary Preference object, with its parameters set. - * - * @param locale The locale for which this user dictionary is for. - * @return The corresponding preference. - */ - protected Preference createUserDictionaryPreference(String locale, Activity activity) { - final Preference newPref = new Preference(getPrefContext()); - final Intent intent = new Intent(USER_DICTIONARY_SETTINGS_INTENT_ACTION); - if (null == locale) { - newPref.setTitle(Locale.getDefault().getDisplayName()); - } else { - if ("".equals(locale)) { - newPref.setTitle(getString(R.string.user_dict_settings_all_languages)); - } else { - newPref.setTitle(Utils.createLocaleFromString(locale).getDisplayName()); - } - intent.putExtra("locale", locale); - newPref.getExtras().putString("locale", locale); - } - newPref.setIntent(intent); - newPref.setFragment(UserDictionarySettings.class.getName()); - return newPref; + @Override + protected int getPreferenceScreenResId() { + return R.xml.user_dictionary_list_fragment; } @Override - public void onResume() { - super.onResume(); - createUserDictSettings(getPreferenceScreen()); + protected String getLogTag() { + return TAG; } } diff --git a/src/com/android/settings/inputmethod/UserDictionaryListPreferenceController.java b/src/com/android/settings/inputmethod/UserDictionaryListPreferenceController.java new file mode 100644 index 0000000000..715246aa17 --- /dev/null +++ b/src/com/android/settings/inputmethod/UserDictionaryListPreferenceController.java @@ -0,0 +1,211 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.inputmethod; + +import android.content.Context; +import android.content.Intent; +import android.database.Cursor; +import android.provider.UserDictionary; +import android.support.annotation.NonNull; +import android.support.annotation.VisibleForTesting; +import android.support.v7.preference.Preference; +import android.support.v7.preference.PreferenceScreen; +import android.text.TextUtils; +import android.view.inputmethod.InputMethodInfo; +import android.view.inputmethod.InputMethodManager; +import android.view.inputmethod.InputMethodSubtype; + +import com.android.settings.R; +import com.android.settings.Utils; +import com.android.settings.core.BasePreferenceController; +import com.android.settingslib.core.lifecycle.LifecycleObserver; +import com.android.settingslib.core.lifecycle.events.OnStart; + +import java.util.List; +import java.util.Locale; +import java.util.TreeSet; + +public class UserDictionaryListPreferenceController extends BasePreferenceController implements + LifecycleObserver, OnStart { + + public static final String USER_DICTIONARY_SETTINGS_INTENT_ACTION = + "android.settings.USER_DICTIONARY_SETTINGS"; + private final String KEY_ALL_LANGUAGE = "all_languages"; + private String mLocale; + private PreferenceScreen mScreen; + + public UserDictionaryListPreferenceController(Context context, String key) { + super(context, key); + } + + public void setLocale(String locale) { + mLocale = locale; + } + + @Override + public int getAvailabilityStatus() { + return AVAILABLE; + } + + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + // This is to make newly inserted languages being sorted alphabetically when updating + // the existing preferenceScreen, and for "For all languages" to be always on the top. + screen.setOrderingAsAdded(false); + mScreen = screen; + } + + @Override + public void onStart() { + createUserDictSettings(); + } + + @NonNull + public static TreeSet<String> getUserDictionaryLocalesSet(Context context) { + final Cursor cursor = context.getContentResolver().query( + UserDictionary.Words.CONTENT_URI, new String[] {UserDictionary.Words.LOCALE}, + null, null, null); + final TreeSet<String> localeSet = new TreeSet<>(); + if (cursor == null) { + // The user dictionary service is not present or disabled. Return empty set. + return localeSet; + } + try { + if (cursor.moveToFirst()) { + final int columnIndex = cursor.getColumnIndex(UserDictionary.Words.LOCALE); + do { + final String locale = cursor.getString(columnIndex); + localeSet.add(null != locale ? locale : ""); + } while (cursor.moveToNext()); + } + } finally { + cursor.close(); + } + + // CAVEAT: Keep this for consistency of the implementation between Keyboard and Settings + // if (!UserDictionarySettings.IS_SHORTCUT_API_SUPPORTED) { + // // For ICS, we need to show "For all languages" in case that the keyboard locale + // // is different from the system locale + // localeSet.add(""); + // } + + final InputMethodManager imm = + (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); + final List<InputMethodInfo> imis = imm.getEnabledInputMethodList(); + for (final InputMethodInfo imi : imis) { + final List<InputMethodSubtype> subtypes = + imm.getEnabledInputMethodSubtypeList( + imi, true /* allowsImplicitlySelectedSubtypes */); + for (InputMethodSubtype subtype : subtypes) { + final String locale = subtype.getLocale(); + if (!TextUtils.isEmpty(locale)) { + localeSet.add(locale); + } + } + } + + // We come here after we have collected locales from existing user dictionary entries and + // enabled subtypes. If we already have the locale-without-country version of the system + // locale, we don't add the system locale to avoid confusion even though it's technically + // correct to add it. + if (!localeSet.contains(Locale.getDefault().getLanguage().toString())) { + localeSet.add(Locale.getDefault().toString()); + } + + return localeSet; + } + + @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) + TreeSet<String> getUserDictLocalesSet(Context context) { + return getUserDictionaryLocalesSet(context); + } + + /** + * Creates the entries that allow the user to go into the user dictionary for each locale. + */ + private void createUserDictSettings() { + + final TreeSet<String> localeSet = getUserDictLocalesSet(mContext); + final int prefCount = mScreen.getPreferenceCount(); + String prefKey; + + if (mLocale != null) { + // If the caller explicitly specify empty string as a locale, we'll show "all languages" + // in the list. + localeSet.add(mLocale); + } + if (localeSet.size() > 1) { + // Have an "All languages" entry in the languages list if there are two or more active + // languages + localeSet.add(""); + } + + // Update the existing preferenceScreen according to the corresponding data set. + if (prefCount > 0) { + for (int i = prefCount - 1; i >= 0; i--) { + prefKey = mScreen.getPreference(i).getKey(); + if (KEY_ALL_LANGUAGE.equals(prefKey)) { + prefKey = ""; + } + if (!localeSet.isEmpty() && localeSet.contains(prefKey)) { + localeSet.remove(prefKey); + continue; + } + mScreen.removePreference(mScreen.findPreference(prefKey)); + } + } + + if (localeSet.isEmpty() && prefCount == 0) { + mScreen.addPreference(createUserDictionaryPreference(null)); + } else { + for (String locale : localeSet) { + mScreen.addPreference(createUserDictionaryPreference(locale)); + } + } + } + + /** + * Create a single User Dictionary Preference object, with its parameters set. + * + * @param locale The locale for which this user dictionary is for. + * @return The corresponding preference. + */ + private Preference createUserDictionaryPreference(String locale) { + final String KEY_LOCALE = "locale"; + final Preference newPref = new Preference(mScreen.getContext()); + final Intent intent = new Intent(USER_DICTIONARY_SETTINGS_INTENT_ACTION); + if (locale == null) { + newPref.setTitle(Locale.getDefault().getDisplayName()); + newPref.setKey(Locale.getDefault().toString()); + } else { + if (TextUtils.isEmpty(locale)) { + newPref.setTitle(mContext.getString(R.string.user_dict_settings_all_languages)); + newPref.setKey(KEY_ALL_LANGUAGE); + newPref.setOrder(0); + } else { + newPref.setTitle(Utils.createLocaleFromString(locale).getDisplayName()); + newPref.setKey(locale); + } + intent.putExtra(KEY_LOCALE, locale); + newPref.getExtras().putString(KEY_LOCALE, locale); + } + newPref.setIntent(intent); + newPref.setFragment(UserDictionarySettings.class.getName()); + return newPref; + } +} diff --git a/src/com/android/settings/inputmethod/VirtualKeyboardFragment.java b/src/com/android/settings/inputmethod/VirtualKeyboardFragment.java index fbe9690bb6..b7c6c46a5f 100644 --- a/src/com/android/settings/inputmethod/VirtualKeyboardFragment.java +++ b/src/com/android/settings/inputmethod/VirtualKeyboardFragment.java @@ -36,12 +36,14 @@ import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settingslib.inputmethod.InputMethodAndSubtypeUtil; import com.android.settingslib.inputmethod.InputMethodPreference; +import com.android.settingslib.search.SearchIndexable; import java.text.Collator; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +@SearchIndexable public final class VirtualKeyboardFragment extends SettingsPreferenceFragment implements Indexable { private static final String ADD_VIRTUAL_KEYBOARD_SCREEN = "add_virtual_keyboard_screen"; diff --git a/src/com/android/settings/language/LanguageAndInputSettings.java b/src/com/android/settings/language/LanguageAndInputSettings.java index 126f3c848d..c92349e11e 100644 --- a/src/com/android/settings/language/LanguageAndInputSettings.java +++ b/src/com/android/settings/language/LanguageAndInputSettings.java @@ -43,11 +43,13 @@ import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.widget.PreferenceCategoryController; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +@SearchIndexable public class LanguageAndInputSettings extends DashboardFragment { private static final String TAG = "LangAndInputSettings"; diff --git a/src/com/android/settings/language/UserDictionaryPreferenceController.java b/src/com/android/settings/language/UserDictionaryPreferenceController.java index 3a1d6e0ff4..fa6dce6c92 100644 --- a/src/com/android/settings/language/UserDictionaryPreferenceController.java +++ b/src/com/android/settings/language/UserDictionaryPreferenceController.java @@ -23,6 +23,7 @@ import android.support.v7.preference.Preference; import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.inputmethod.UserDictionaryList; +import com.android.settings.inputmethod.UserDictionaryListPreferenceController; import com.android.settings.inputmethod.UserDictionarySettings; import com.android.settingslib.core.AbstractPreferenceController; @@ -61,10 +62,10 @@ public class UserDictionaryPreferenceController extends AbstractPreferenceContro // parameter in the extras. This will be interpreted by the // UserDictionarySettings class as meaning // "the current locale". Note that with the current code for - // UserDictionaryList#getUserDictionaryLocalesSet() + // UserDictionaryListPreferenceController#getUserDictionaryLocalesSet() // the locale list always has at least one element, since it // always includes the current locale explicitly. - // @see UserDictionaryList.getUserDictionaryLocalesSet(). + // @see UserDictionaryListPreferenceController.getUserDictionaryLocalesSet(). extras.putString("locale", localeSet.first()); } targetFragment = UserDictionarySettings.class; @@ -75,6 +76,6 @@ public class UserDictionaryPreferenceController extends AbstractPreferenceContro } protected TreeSet<String> getDictionaryLocales() { - return UserDictionaryList.getUserDictionaryLocalesSet(mContext); + return UserDictionaryListPreferenceController.getUserDictionaryLocalesSet(mContext); } } diff --git a/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java b/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java index 0d8cbaf116..a6cb6f5e69 100644 --- a/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java +++ b/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java @@ -29,6 +29,7 @@ import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; +import android.widget.CheckBox; import android.widget.CompoundButton; import com.android.internal.app.LocalePicker; @@ -159,10 +160,13 @@ class LocaleDragAndDropAdapter dragCell.setShowCheckbox(mRemoveMode); dragCell.setShowMiniLabel(!mRemoveMode); dragCell.setShowHandle(!mRemoveMode && mDragEnabled); - dragCell.setChecked(mRemoveMode ? feedItem.getChecked() : false); dragCell.setTag(feedItem); - dragCell.getCheckbox() - .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + CheckBox checkbox = dragCell.getCheckbox(); + // clear listener before setChecked() in case another item already bind to + // current ViewHolder and checked event is triggered on stale listener mistakenly. + checkbox.setOnCheckedChangeListener(null); + checkbox.setChecked(mRemoveMode ? feedItem.getChecked() : false); + checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { LocaleStore.LocaleInfo feedItem = diff --git a/src/com/android/settings/location/LocationSettings.java b/src/com/android/settings/location/LocationSettings.java index 13ba8f5eb0..90547e91ae 100644 --- a/src/com/android/settings/location/LocationSettings.java +++ b/src/com/android/settings/location/LocationSettings.java @@ -34,6 +34,8 @@ import com.android.settings.widget.SwitchBar; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.location.RecentLocationApps; +import com.android.settingslib.search.SearchIndexable; + import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -58,6 +60,7 @@ import java.util.List; * other things, this simplifies integration with future changes to the default (AOSP) * implementation. */ +@SearchIndexable public class LocationSettings extends DashboardFragment { private static final String TAG = "LocationSettings"; diff --git a/src/com/android/settings/location/RecentLocationRequestSeeAllFragment.java b/src/com/android/settings/location/RecentLocationRequestSeeAllFragment.java index 0b7614c22b..7bc7778828 100644 --- a/src/com/android/settings/location/RecentLocationRequestSeeAllFragment.java +++ b/src/com/android/settings/location/RecentLocationRequestSeeAllFragment.java @@ -26,11 +26,14 @@ import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settingslib.search.SearchIndexable; + import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** Dashboard Fragment to display all recent location requests, sorted by recency. */ +@SearchIndexable public class RecentLocationRequestSeeAllFragment extends DashboardFragment { private static final String TAG = "RecentLocationReqAll"; diff --git a/src/com/android/settings/location/ScanningSettings.java b/src/com/android/settings/location/ScanningSettings.java index 91359520ea..b2ce5fbf7d 100644 --- a/src/com/android/settings/location/ScanningSettings.java +++ b/src/com/android/settings/location/ScanningSettings.java @@ -25,6 +25,7 @@ import com.android.settings.dashboard.DashboardFragment; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.Arrays; @@ -33,6 +34,7 @@ import java.util.List; /** * A page that configures the background scanning settings for Wi-Fi and Bluetooth. */ +@SearchIndexable public class ScanningSettings extends DashboardFragment { private static final String TAG = "ScanningSettings"; diff --git a/src/com/android/settings/network/NetworkDashboardFragment.java b/src/com/android/settings/network/NetworkDashboardFragment.java index 89bf5f4dec..f6a739135b 100644 --- a/src/com/android/settings/network/NetworkDashboardFragment.java +++ b/src/com/android/settings/network/NetworkDashboardFragment.java @@ -23,6 +23,7 @@ import android.app.AlertDialog; import android.app.Dialog; import android.app.Fragment; import android.content.Context; +import android.icu.text.ListFormatter; import android.provider.SearchIndexableResource; import android.support.annotation.VisibleForTesting; import android.text.BidiFormatter; @@ -38,11 +39,13 @@ import com.android.settings.wifi.WifiMasterSwitchPreferenceController; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +@SearchIndexable public class NetworkDashboardFragment extends DashboardFragment implements MobilePlanPreferenceHost { @@ -173,25 +176,22 @@ public class NetworkDashboardFragment extends DashboardFragment implements @Override public void setListening(boolean listening) { if (listening) { - String summary = BidiFormatter.getInstance() - .unicodeWrap(mContext.getString(R.string.wifi_settings_title)); + final List<String> summaries = new ArrayList<>(); + + summaries.add(BidiFormatter.getInstance() + .unicodeWrap(mContext.getString(R.string.wifi_settings_title))); if (mMobileNetworkPreferenceController.isAvailable()) { - final String mobileSettingSummary = mContext.getString( - R.string.network_dashboard_summary_mobile); - summary = mContext.getString(R.string.join_many_items_middle, summary, - mobileSettingSummary); + summaries.add(mContext.getString( + R.string.network_dashboard_summary_mobile)); } final String dataUsageSettingSummary = mContext.getString( R.string.network_dashboard_summary_data_usage); - summary = mContext.getString(R.string.join_many_items_middle, summary, - dataUsageSettingSummary); + summaries.add(dataUsageSettingSummary); if (mTetherPreferenceController.isAvailable()) { - final String hotspotSettingSummary = mContext.getString( - R.string.network_dashboard_summary_hotspot); - summary = mContext.getString(R.string.join_many_items_middle, summary, - hotspotSettingSummary); + summaries.add(mContext.getString( + R.string.network_dashboard_summary_hotspot)); } - mSummaryLoader.setSummary(this, summary); + mSummaryLoader.setSummary(this, ListFormatter.getInstance().format(summaries)); } } } diff --git a/src/com/android/settings/nfc/PaymentSettings.java b/src/com/android/settings/nfc/PaymentSettings.java index c832dfc8ec..9532dac840 100644 --- a/src/com/android/settings/nfc/PaymentSettings.java +++ b/src/com/android/settings/nfc/PaymentSettings.java @@ -35,10 +35,12 @@ import com.android.settings.SettingsPreferenceFragment; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settings.search.SearchIndexableRaw; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.List; +@SearchIndexable public class PaymentSettings extends SettingsPreferenceFragment implements Indexable { public static final String TAG = "PaymentSettings"; diff --git a/src/com/android/settings/notification/ConfigureNotificationSettings.java b/src/com/android/settings/notification/ConfigureNotificationSettings.java index 1ca4a4d6a2..2763776761 100644 --- a/src/com/android/settings/notification/ConfigureNotificationSettings.java +++ b/src/com/android/settings/notification/ConfigureNotificationSettings.java @@ -26,23 +26,23 @@ import android.os.UserHandle; import android.provider.SearchIndexableResource; import android.support.annotation.VisibleForTesting; import android.support.v7.preference.Preference; -import android.text.TextUtils; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; import com.android.settings.RingtonePreference; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.SummaryLoader; -import com.android.settings.gestures.SwipeToNotificationPreferenceController; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +@SearchIndexable public class ConfigureNotificationSettings extends DashboardFragment { private static final String TAG = "ConfigNotiSettings"; @@ -95,21 +95,17 @@ public class ConfigureNotificationSettings extends DashboardFragment { final List<AbstractPreferenceController> controllers = new ArrayList<>(); final BadgingNotificationPreferenceController badgeController = new BadgingNotificationPreferenceController(context); - final PulseNotificationPreferenceController pulseController = - new PulseNotificationPreferenceController(context); final LockScreenNotificationPreferenceController lockScreenNotificationController = new LockScreenNotificationPreferenceController(context, KEY_LOCKSCREEN, KEY_LOCKSCREEN_WORK_PROFILE_HEADER, KEY_LOCKSCREEN_WORK_PROFILE); if (lifecycle != null) { - lifecycle.addObserver(pulseController); lifecycle.addObserver(lockScreenNotificationController); } controllers.add(new RecentNotifyingAppsPreferenceController( context, new NotificationBackend(), app, host)); controllers.add(badgeController); - controllers.add(pulseController); controllers.add(lockScreenNotificationController); controllers.add(new NotificationRingtonePreferenceController(context) { @Override diff --git a/src/com/android/settings/notification/PulseNotificationPreferenceController.java b/src/com/android/settings/notification/PulseNotificationPreferenceController.java index 4a8b8204f4..c39f482fd2 100644 --- a/src/com/android/settings/notification/PulseNotificationPreferenceController.java +++ b/src/com/android/settings/notification/PulseNotificationPreferenceController.java @@ -24,33 +24,28 @@ import android.os.Handler; import android.provider.Settings; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceScreen; -import android.support.v7.preference.TwoStatePreference; -import android.util.Log; -import com.android.settings.core.PreferenceControllerMixin; -import com.android.settingslib.core.AbstractPreferenceController; -import com.android.settingslib.core.lifecycle.LifecycleObserver; +import com.android.settings.core.TogglePreferenceController; import com.android.settingslib.core.lifecycle.events.OnPause; import com.android.settingslib.core.lifecycle.events.OnResume; import static android.provider.Settings.System.NOTIFICATION_LIGHT_PULSE; -public class PulseNotificationPreferenceController extends AbstractPreferenceController - implements PreferenceControllerMixin, Preference.OnPreferenceChangeListener, - LifecycleObserver, OnResume, OnPause { +public class PulseNotificationPreferenceController extends TogglePreferenceController + implements OnResume, OnPause { - private static final String TAG = "PulseNotifPrefContr"; - private static final String KEY_NOTIFICATION_PULSE = "notification_pulse"; + private static final int ON = 1; + private static final int OFF = 0; private SettingObserver mSettingObserver; - public PulseNotificationPreferenceController(Context context) { - super(context); + public PulseNotificationPreferenceController(Context context, String key) { + super(context, key); } @Override public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); - Preference preference = screen.findPreference(KEY_NOTIFICATION_PULSE); + Preference preference = screen.findPreference(getPreferenceKey()); if (preference != null) { mSettingObserver = new SettingObserver(preference); } @@ -71,32 +66,22 @@ public class PulseNotificationPreferenceController extends AbstractPreferenceCon } @Override - public String getPreferenceKey() { - return KEY_NOTIFICATION_PULSE; + public int getAvailabilityStatus() { + return mContext.getResources().getBoolean( + com.android.internal.R.bool.config_intrusiveNotificationLed) ? AVAILABLE + : DISABLED_UNSUPPORTED; } @Override - public boolean isAvailable() { - return mContext.getResources() - .getBoolean(com.android.internal.R.bool.config_intrusiveNotificationLed); + public boolean isChecked() { + return Settings.System.getInt(mContext.getContentResolver(), NOTIFICATION_LIGHT_PULSE, OFF) + == ON; } @Override - public void updateState(Preference preference) { - try { - final boolean checked = Settings.System.getInt(mContext.getContentResolver(), - NOTIFICATION_LIGHT_PULSE) == 1; - ((TwoStatePreference) preference).setChecked(checked); - } catch (Settings.SettingNotFoundException snfe) { - Log.e(TAG, NOTIFICATION_LIGHT_PULSE + " not found"); - } - } - - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - final boolean val = (Boolean) newValue; - return Settings.System.putInt(mContext.getContentResolver(), - NOTIFICATION_LIGHT_PULSE, val ? 1 : 0); + public boolean setChecked(boolean isChecked) { + return Settings.System.putInt(mContext.getContentResolver(), NOTIFICATION_LIGHT_PULSE, + isChecked ? ON : OFF); } class SettingObserver extends ContentObserver { diff --git a/src/com/android/settings/notification/SoundSettings.java b/src/com/android/settings/notification/SoundSettings.java index 653581221a..287c57f375 100644 --- a/src/com/android/settings/notification/SoundSettings.java +++ b/src/com/android/settings/notification/SoundSettings.java @@ -37,11 +37,13 @@ import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.widget.PreferenceCategoryController; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +@SearchIndexable public class SoundSettings extends DashboardFragment { private static final String TAG = "SoundSettings"; diff --git a/src/com/android/settings/notification/ZenAutomaticRuleHeaderPreferenceController.java b/src/com/android/settings/notification/ZenAutomaticRuleHeaderPreferenceController.java index 9eab8bb182..b4ca87e12a 100644 --- a/src/com/android/settings/notification/ZenAutomaticRuleHeaderPreferenceController.java +++ b/src/com/android/settings/notification/ZenAutomaticRuleHeaderPreferenceController.java @@ -75,7 +75,7 @@ public class ZenAutomaticRuleHeaderPreferenceController extends AbstractZenModeP .newInstance(mFragment.getActivity(), mFragment, pref.findViewById(R.id.entity_header)); - mController.setEditZenRuleNameListener(new View.OnClickListener() { + mController.setEditListener(new View.OnClickListener() { @Override public void onClick(View v) { ZenRuleNameDialog.show(mFragment, mRule.getName(), null, @@ -89,7 +89,7 @@ public class ZenAutomaticRuleHeaderPreferenceController extends AbstractZenModeP .setPackageName(mRule.getOwner().getPackageName()) .setUid(mContext.getUserId()) .setHasAppInfoLink(false) - .setButtonActions(EntityHeaderController.ActionType.ACTION_DND_RULE_PREFERENCE, + .setButtonActions(EntityHeaderController.ActionType.ACTION_EDIT_PREFERENCE, EntityHeaderController.ActionType.ACTION_NONE) .done(mFragment.getActivity(), mContext); diff --git a/src/com/android/settings/notification/ZenModeAutomationSettings.java b/src/com/android/settings/notification/ZenModeAutomationSettings.java index 1bb6fc678c..74bc93de07 100644 --- a/src/com/android/settings/notification/ZenModeAutomationSettings.java +++ b/src/com/android/settings/notification/ZenModeAutomationSettings.java @@ -29,10 +29,12 @@ import com.android.settings.utils.ManagedServiceSettings; import com.android.settings.utils.ZenServiceListing; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.List; +@SearchIndexable public class ZenModeAutomationSettings extends ZenModeSettingsBase { protected final ManagedServiceSettings.Config CONFIG = getConditionProviderConfig(); diff --git a/src/com/android/settings/notification/ZenModeBehaviorSettings.java b/src/com/android/settings/notification/ZenModeBehaviorSettings.java index 31542c35ed..5a084e88e2 100644 --- a/src/com/android/settings/notification/ZenModeBehaviorSettings.java +++ b/src/com/android/settings/notification/ZenModeBehaviorSettings.java @@ -25,10 +25,12 @@ import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.List; +@SearchIndexable public class ZenModeBehaviorSettings extends ZenModeSettingsBase implements Indexable { @Override diff --git a/src/com/android/settings/notification/ZenModeBlockedEffectsSettings.java b/src/com/android/settings/notification/ZenModeBlockedEffectsSettings.java index 8b0cf5f072..bda98ea2c1 100644 --- a/src/com/android/settings/notification/ZenModeBlockedEffectsSettings.java +++ b/src/com/android/settings/notification/ZenModeBlockedEffectsSettings.java @@ -35,10 +35,12 @@ import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.List; +@SearchIndexable public class ZenModeBlockedEffectsSettings extends ZenModeSettingsBase implements Indexable { @Override diff --git a/src/com/android/settings/notification/ZenModeSettings.java b/src/com/android/settings/notification/ZenModeSettings.java index 1f0dcc2836..b3c93ebf54 100644 --- a/src/com/android/settings/notification/ZenModeSettings.java +++ b/src/com/android/settings/notification/ZenModeSettings.java @@ -33,6 +33,7 @@ import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.Arrays; @@ -40,6 +41,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; +@SearchIndexable public class ZenModeSettings extends ZenModeSettingsBase { private static final String KEY_SOUND = "zen_effect_sound"; @Override diff --git a/src/com/android/settings/print/PrintSettingsFragment.java b/src/com/android/settings/print/PrintSettingsFragment.java index 21ee360e98..c2cf87f58a 100644 --- a/src/com/android/settings/print/PrintSettingsFragment.java +++ b/src/com/android/settings/print/PrintSettingsFragment.java @@ -56,6 +56,7 @@ import com.android.settings.R; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settings.utils.ProfileSettingsPreferenceFragment; +import com.android.settingslib.search.SearchIndexable; import java.text.DateFormat; import java.util.ArrayList; @@ -64,6 +65,7 @@ import java.util.List; /** * Fragment with the top level print settings. */ +@SearchIndexable public class PrintSettingsFragment extends ProfileSettingsPreferenceFragment implements Indexable, OnClickListener { public static final String TAG = "PrintSettingsFragment"; diff --git a/src/com/android/settings/search/SearchFeatureProvider.java b/src/com/android/settings/search/SearchFeatureProvider.java index cbe49f8c79..a7ad92b8d0 100644 --- a/src/com/android/settings/search/SearchFeatureProvider.java +++ b/src/com/android/settings/search/SearchFeatureProvider.java @@ -24,6 +24,7 @@ import android.content.Intent; import android.widget.Toolbar; import com.android.settings.overlay.FeatureFactory; +import com.android.settingslib.search.SearchIndexableResources; /** * FeatureProvider for Settings Search diff --git a/src/com/android/settings/search/SearchFeatureProviderImpl.java b/src/com/android/settings/search/SearchFeatureProviderImpl.java index 78c47edf04..2e68f90900 100644 --- a/src/com/android/settings/search/SearchFeatureProviderImpl.java +++ b/src/com/android/settings/search/SearchFeatureProviderImpl.java @@ -24,6 +24,8 @@ import android.text.TextUtils; import com.android.internal.annotations.VisibleForTesting; import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.indexing.IndexData; +import com.android.settingslib.search.SearchIndexableResources; +import com.android.settingslib.search.SearchIndexableResourcesMobile; import java.util.Locale; @@ -76,7 +78,7 @@ public class SearchFeatureProviderImpl implements SearchFeatureProvider { @Override public SearchIndexableResources getSearchIndexableResources() { if (mSearchIndexableResources == null) { - mSearchIndexableResources = new SearchIndexableResourcesImpl(); + mSearchIndexableResources = new SearchIndexableResourcesMobile(); } return mSearchIndexableResources; } diff --git a/src/com/android/settings/search/SearchIndexableResourcesImpl.java b/src/com/android/settings/search/SearchIndexableResourcesImpl.java deleted file mode 100644 index 3b58c64ed3..0000000000 --- a/src/com/android/settings/search/SearchIndexableResourcesImpl.java +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Copyright (C) 2014 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.settings.search; - -import android.support.annotation.VisibleForTesting; - -import com.android.settings.DateTimeSettings; -import com.android.settings.DisplaySettings; -import com.android.settings.LegalSettings; -import com.android.settings.connecteddevice.AdvancedConnectedDeviceDashboardFragment; -import com.android.settings.connecteddevice.PreviouslyConnectedDeviceDashboardFragment; -import com.android.settings.connecteddevice.BluetoothDashboardFragment; -import com.android.settings.datausage.DataUsageSummaryLegacy; -import com.android.settings.deviceinfo.aboutphone.MyDeviceInfoFragment; -import com.android.settings.accessibility.AccessibilitySettings; -import com.android.settings.accessibility.AccessibilityShortcutPreferenceFragment; -import com.android.settings.accessibility.MagnificationPreferenceFragment; -import com.android.settings.accessibility.VibrationSettings; -import com.android.settings.accounts.AccountDashboardFragment; -import com.android.settings.applications.AppAndNotificationDashboardFragment; -import com.android.settings.applications.DefaultAppSettings; -import com.android.settings.applications.SpecialAccessSettings; -import com.android.settings.applications.assist.ManageAssist; -import com.android.settings.backup.BackupSettingsActivity; -import com.android.settings.backup.BackupSettingsFragment; -import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment; -import com.android.settings.connecteddevice.usb.UsbDetailsFragment; -import com.android.settings.datausage.DataUsageSummary; -import com.android.settings.deletionhelper.AutomaticStorageManagerSettings; -import com.android.settings.development.DevelopmentSettingsDashboardFragment; -import com.android.settings.deviceinfo.DeviceInfoSettings; -import com.android.settings.deviceinfo.StorageDashboardFragment; -import com.android.settings.deviceinfo.StorageSettings; -import com.android.settings.display.AmbientDisplaySettings; -import com.android.settings.display.AutoBrightnessSettings; -import com.android.settings.display.NightDisplaySettings; -import com.android.settings.display.ScreenZoomSettings; -import com.android.settings.dream.DreamSettings; -import com.android.settings.enterprise.EnterprisePrivacySettings; -import com.android.settings.fuelgauge.PowerUsageAdvanced; -import com.android.settings.fuelgauge.batterysaver.BatterySaverSettings; -import com.android.settings.fuelgauge.PowerUsageSummary; -import com.android.settings.fuelgauge.SmartBatterySettings; -import com.android.settings.gestures.AssistGestureSettings; -import com.android.settings.gestures.DoubleTapPowerSettings; -import com.android.settings.gestures.DoubleTapScreenSettings; -import com.android.settings.gestures.DoubleTwistGestureSettings; -import com.android.settings.gestures.SwipeUpGestureSettings; -import com.android.settings.gestures.GestureSettings; -import com.android.settings.gestures.PickupGestureSettings; -import com.android.settings.gestures.SwipeToNotificationSettings; -import com.android.settings.inputmethod.AvailableVirtualKeyboardFragment; -import com.android.settings.inputmethod.PhysicalKeyboardFragment; -import com.android.settings.inputmethod.VirtualKeyboardFragment; -import com.android.settings.language.LanguageAndInputSettings; -import com.android.settings.location.LocationSettings; -import com.android.settings.location.RecentLocationRequestSeeAllFragment; -import com.android.settings.location.ScanningSettings; -import com.android.settings.network.NetworkDashboardFragment; -import com.android.settings.nfc.PaymentSettings; -import com.android.settings.notification.ConfigureNotificationSettings; -import com.android.settings.notification.SoundSettings; -import com.android.settings.notification.ZenModeAutomationSettings; -import com.android.settings.notification.ZenModeBehaviorSettings; -import com.android.settings.notification.ZenModeBlockedEffectsSettings; -import com.android.settings.notification.ZenModeSettings; -import com.android.settings.print.PrintSettingsFragment; -import com.android.settings.security.EncryptionAndCredential; -import com.android.settings.security.LockscreenDashboardFragment; -import com.android.settings.security.ScreenPinningSettings; -import com.android.settings.security.SecuritySettings; -import com.android.settings.security.screenlock.ScreenLockSettings; -import com.android.settings.sim.SimSettings; -import com.android.settings.support.SupportDashboardActivity; -import com.android.settings.system.ResetDashboardFragment; -import com.android.settings.system.SystemDashboardFragment; -import com.android.settings.tts.TextToSpeechSettings; -import com.android.settings.tts.TtsEnginePreferenceFragment; -import com.android.settings.users.UserSettings; -import com.android.settings.wallpaper.WallpaperTypeSettings; -import com.android.settings.wfd.WifiDisplaySettings; -import com.android.settings.wifi.ConfigureWifiSettings; -import com.android.settings.wifi.WifiSettings; - -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -public class SearchIndexableResourcesImpl implements SearchIndexableResources { - - private final Set<Class> sProviders = new HashSet<>(); - - @VisibleForTesting - void addIndex(Class indexClass) { - sProviders.add(indexClass); - } - - public SearchIndexableResourcesImpl() { - addIndex(WifiSettings.class); - addIndex(NetworkDashboardFragment.class); - addIndex(ConfigureWifiSettings.class); - addIndex(SimSettings.class); - addIndex(DataUsageSummary.class); - addIndex(DataUsageSummaryLegacy.class); - addIndex(ScreenZoomSettings.class); - addIndex(DisplaySettings.class); - addIndex(AutoBrightnessSettings.class); - addIndex(AmbientDisplaySettings.class); - addIndex(WallpaperTypeSettings.class); - addIndex(AppAndNotificationDashboardFragment.class); - addIndex(SoundSettings.class); - addIndex(ZenModeSettings.class); - addIndex(StorageSettings.class); - addIndex(PowerUsageAdvanced.class); - addIndex(DefaultAppSettings.class); - addIndex(ManageAssist.class); - addIndex(SpecialAccessSettings.class); - addIndex(UserSettings.class); - addIndex(AssistGestureSettings.class); - addIndex(PickupGestureSettings.class); - addIndex(DoubleTapScreenSettings.class); - addIndex(DoubleTapPowerSettings.class); - addIndex(DoubleTwistGestureSettings.class); - addIndex(SwipeUpGestureSettings.class); - addIndex(SwipeToNotificationSettings.class); - addIndex(GestureSettings.class); - addIndex(LanguageAndInputSettings.class); - addIndex(LocationSettings.class); - addIndex(ScanningSettings.class); - addIndex(SecuritySettings.class); - addIndex(ScreenLockSettings.class); - addIndex(EncryptionAndCredential.class); - addIndex(ScreenPinningSettings.class); - addIndex(AccountDashboardFragment.class); - addIndex(VirtualKeyboardFragment.class); - addIndex(AvailableVirtualKeyboardFragment.class); - addIndex(PhysicalKeyboardFragment.class); - addIndex(BackupSettingsActivity.class); - addIndex(BackupSettingsFragment.class); - addIndex(DateTimeSettings.class); - addIndex(AccessibilitySettings.class); - addIndex(PrintSettingsFragment.class); - addIndex(DevelopmentSettingsDashboardFragment.class); - addIndex(DeviceInfoSettings.class); - addIndex(LegalSettings.class); - addIndex(SystemDashboardFragment.class); - addIndex(ResetDashboardFragment.class); - addIndex(StorageDashboardFragment.class); - addIndex(ConnectedDeviceDashboardFragment.class); - addIndex(AdvancedConnectedDeviceDashboardFragment.class); - addIndex(EnterprisePrivacySettings.class); - addIndex(PaymentSettings.class); - addIndex(TextToSpeechSettings.class); - addIndex(TtsEnginePreferenceFragment.class); - addIndex(MagnificationPreferenceFragment.class); - addIndex(AccessibilityShortcutPreferenceFragment.class); - addIndex(DreamSettings.class); - addIndex(SupportDashboardActivity.class); - addIndex(AutomaticStorageManagerSettings.class); - addIndex(ConfigureNotificationSettings.class); - addIndex(PowerUsageSummary.class); - addIndex(BatterySaverSettings.class); - addIndex(LockscreenDashboardFragment.class); - addIndex(UsbDetailsFragment.class); - addIndex(WifiDisplaySettings.class); - addIndex(ZenModeBehaviorSettings.class); - addIndex(ZenModeBlockedEffectsSettings.class); - addIndex(ZenModeAutomationSettings.class); - addIndex(NightDisplaySettings.class); - addIndex(SmartBatterySettings.class); - addIndex(MyDeviceInfoFragment.class); - addIndex(VibrationSettings.class); - addIndex(RecentLocationRequestSeeAllFragment.class); - addIndex(PreviouslyConnectedDeviceDashboardFragment.class); - addIndex(BluetoothDashboardFragment.class); - } - - @Override - public Collection<Class> getProviderValues() { - return sProviders; - } -} diff --git a/src/com/android/settings/security/EncryptionAndCredential.java b/src/com/android/settings/security/EncryptionAndCredential.java index 66ae20b08c..9096486466 100644 --- a/src/com/android/settings/security/EncryptionAndCredential.java +++ b/src/com/android/settings/security/EncryptionAndCredential.java @@ -30,6 +30,7 @@ import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.widget.PreferenceCategoryController; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.Arrays; @@ -38,6 +39,7 @@ import java.util.List; /** * Encryption and Credential settings. */ +@SearchIndexable public class EncryptionAndCredential extends DashboardFragment { private static final String TAG = "EncryptionAndCredential"; diff --git a/src/com/android/settings/security/LockdownButtonPreferenceController.java b/src/com/android/settings/security/LockdownButtonPreferenceController.java index 89605020b3..dd6e0d0f7c 100644 --- a/src/com/android/settings/security/LockdownButtonPreferenceController.java +++ b/src/com/android/settings/security/LockdownButtonPreferenceController.java @@ -19,8 +19,6 @@ package com.android.settings.security; import android.content.Context; import android.os.UserHandle; import android.provider.Settings; -import android.support.v7.preference.Preference; -import android.support.v7.preference.TwoStatePreference; import com.android.internal.widget.LockPatternUtils; import com.android.settings.core.BasePreferenceController; @@ -28,12 +26,10 @@ import com.android.settings.core.TogglePreferenceController; public class LockdownButtonPreferenceController extends TogglePreferenceController { - private static final String KEY_LOCKDOWN_ENALBED = "security_setting_lockdown_enabled"; - private final LockPatternUtils mLockPatternUtils; - public LockdownButtonPreferenceController(Context context) { - super(context, KEY_LOCKDOWN_ENALBED); + public LockdownButtonPreferenceController(Context context, String key) { + super(context, key); mLockPatternUtils = new LockPatternUtils(context); } diff --git a/src/com/android/settings/security/LockscreenDashboardFragment.java b/src/com/android/settings/security/LockscreenDashboardFragment.java index 21b4c921fc..209eb0179b 100644 --- a/src/com/android/settings/security/LockscreenDashboardFragment.java +++ b/src/com/android/settings/security/LockscreenDashboardFragment.java @@ -28,6 +28,7 @@ import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.users.AddUserWhenLockedPreferenceController; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.Arrays; @@ -36,6 +37,7 @@ import java.util.List; /** * Settings screen for lock screen preference */ +@SearchIndexable public class LockscreenDashboardFragment extends DashboardFragment implements OwnerInfoPreferenceController.OwnerInfoCallback { @@ -91,7 +93,6 @@ public class LockscreenDashboardFragment extends DashboardFragment mOwnerInfoPreferenceController = new OwnerInfoPreferenceController(context, this, lifecycle); controllers.add(mOwnerInfoPreferenceController); - controllers.add(new LockdownButtonPreferenceController(context)); return controllers; } @@ -122,7 +123,6 @@ public class LockscreenDashboardFragment extends DashboardFragment KEY_ADD_USER_FROM_LOCK_SCREEN, null /* lifecycle */)); controllers.add(new OwnerInfoPreferenceController( context, null /* fragment */, null /* lifecycle */)); - controllers.add(new LockdownButtonPreferenceController(context)); return controllers; } diff --git a/src/com/android/settings/security/ScreenPinningSettings.java b/src/com/android/settings/security/ScreenPinningSettings.java index 6e4856ee42..f7efa01777 100644 --- a/src/com/android/settings/security/ScreenPinningSettings.java +++ b/src/com/android/settings/security/ScreenPinningSettings.java @@ -40,6 +40,7 @@ import com.android.settings.password.ChooseLockGeneric; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settings.widget.SwitchBar; +import com.android.settingslib.search.SearchIndexable; import java.util.Arrays; import java.util.List; @@ -47,6 +48,7 @@ import java.util.List; /** * Screen pinning settings. */ +@SearchIndexable public class ScreenPinningSettings extends SettingsPreferenceFragment implements SwitchBar.OnSwitchChangeListener, Indexable { diff --git a/src/com/android/settings/security/SecuritySettings.java b/src/com/android/settings/security/SecuritySettings.java index 0839450a93..652b66da29 100644 --- a/src/com/android/settings/security/SecuritySettings.java +++ b/src/com/android/settings/security/SecuritySettings.java @@ -41,10 +41,12 @@ import com.android.settings.security.trustagent.TrustAgentListPreferenceControll import com.android.settings.widget.PreferenceCategoryController; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.List; +@SearchIndexable public class SecuritySettings extends DashboardFragment { private static final String TAG = "SecuritySettings"; diff --git a/src/com/android/settings/security/screenlock/ScreenLockSettings.java b/src/com/android/settings/security/screenlock/ScreenLockSettings.java index 2fa4124f95..6c6e862f63 100644 --- a/src/com/android/settings/security/screenlock/ScreenLockSettings.java +++ b/src/com/android/settings/security/screenlock/ScreenLockSettings.java @@ -30,10 +30,12 @@ import com.android.settings.search.Indexable; import com.android.settings.security.OwnerInfoPreferenceController; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.List; +@SearchIndexable public class ScreenLockSettings extends DashboardFragment implements OwnerInfoPreferenceController.OwnerInfoCallback { diff --git a/src/com/android/settings/sim/SimSettings.java b/src/com/android/settings/sim/SimSettings.java index 3d6bfb162a..2211d47947 100644 --- a/src/com/android/settings/sim/SimSettings.java +++ b/src/com/android/settings/sim/SimSettings.java @@ -42,10 +42,12 @@ import com.android.settings.RestrictedSettingsFragment; import com.android.settings.Utils; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.List; +@SearchIndexable public class SimSettings extends RestrictedSettingsFragment implements Indexable { private static final String TAG = "SimSettings"; private static final boolean DBG = false; diff --git a/src/com/android/settings/support/SupportDashboardActivity.java b/src/com/android/settings/support/SupportDashboardActivity.java index e829577cc3..ed7e76ce9b 100644 --- a/src/com/android/settings/support/SupportDashboardActivity.java +++ b/src/com/android/settings/support/SupportDashboardActivity.java @@ -26,6 +26,7 @@ import com.android.settings.overlay.SupportFeatureProvider; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settings.search.SearchIndexableRaw; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.List; @@ -33,6 +34,7 @@ import java.util.List; /** * Trampoline activity that decides which version of support should be shown to the user. */ +@SearchIndexable public class SupportDashboardActivity extends Activity implements Indexable { @Override diff --git a/src/com/android/settings/system/ResetDashboardFragment.java b/src/com/android/settings/system/ResetDashboardFragment.java index 03543cc498..153177a4ac 100644 --- a/src/com/android/settings/system/ResetDashboardFragment.java +++ b/src/com/android/settings/system/ResetDashboardFragment.java @@ -28,10 +28,12 @@ import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.List; +@SearchIndexable public class ResetDashboardFragment extends DashboardFragment { private static final String TAG = "ResetDashboardFragment"; diff --git a/src/com/android/settings/system/SystemDashboardFragment.java b/src/com/android/settings/system/SystemDashboardFragment.java index 1556659fa8..8258f20e7a 100644 --- a/src/com/android/settings/system/SystemDashboardFragment.java +++ b/src/com/android/settings/system/SystemDashboardFragment.java @@ -28,10 +28,12 @@ import com.android.settings.backup.BackupSettingsActivityPreferenceController; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; +import com.android.settingslib.search.SearchIndexable; import java.util.Arrays; import java.util.List; +@SearchIndexable public class SystemDashboardFragment extends DashboardFragment { private static final String TAG = "SystemDashboardFrag"; diff --git a/src/com/android/settings/tts/TextToSpeechSettings.java b/src/com/android/settings/tts/TextToSpeechSettings.java index 9bb7958e23..c6b20b0ee8 100644 --- a/src/com/android/settings/tts/TextToSpeechSettings.java +++ b/src/com/android/settings/tts/TextToSpeechSettings.java @@ -46,6 +46,7 @@ import com.android.settings.search.Indexable; import com.android.settings.widget.ActionButtonPreference; import com.android.settings.widget.GearPreference; import com.android.settings.widget.SeekBarPreference; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.Arrays; @@ -58,6 +59,7 @@ import java.util.MissingResourceException; import java.util.Objects; import java.util.Set; +@SearchIndexable public class TextToSpeechSettings extends SettingsPreferenceFragment implements Preference.OnPreferenceChangeListener, GearPreference.OnGearClickListener, Indexable { diff --git a/src/com/android/settings/tts/TtsEnginePreferenceFragment.java b/src/com/android/settings/tts/TtsEnginePreferenceFragment.java index 8e6cfecb8f..81afe8d833 100644 --- a/src/com/android/settings/tts/TtsEnginePreferenceFragment.java +++ b/src/com/android/settings/tts/TtsEnginePreferenceFragment.java @@ -15,12 +15,15 @@ import android.util.Log; import static android.provider.Settings.Secure.TTS_DEFAULT_SYNTH; import com.android.settings.search.Indexable; import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settingslib.search.SearchIndexable; + import android.content.Context; import android.provider.SearchIndexableResource; import java.util.List; import java.util.Arrays; +@SearchIndexable public class TtsEnginePreferenceFragment extends SettingsPreferenceFragment //implements implements RadioButtonGroupState, Indexable { private static final String TAG = "TtsEnginePrefFragment"; diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java index bc02b3003f..3b1a4de1c2 100644 --- a/src/com/android/settings/users/UserSettings.java +++ b/src/com/android/settings/users/UserSettings.java @@ -73,6 +73,7 @@ import com.android.settingslib.RestrictedLockUtils; import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import com.android.settingslib.RestrictedPreference; import com.android.settingslib.drawable.CircleFramedDrawable; +import com.android.settingslib.search.SearchIndexable; import java.io.IOException; import java.io.InputStream; @@ -89,6 +90,7 @@ import java.util.List; * The first one is always the current user. * Owner is the primary user. */ +@SearchIndexable public class UserSettings extends SettingsPreferenceFragment implements OnPreferenceClickListener, OnClickListener, DialogInterface.OnDismissListener, EditUserInfoController.OnContentChangedCallback, Indexable { diff --git a/src/com/android/settings/wallpaper/WallpaperTypePreferenceController.java b/src/com/android/settings/wallpaper/WallpaperTypePreferenceController.java new file mode 100644 index 0000000000..5b8d723987 --- /dev/null +++ b/src/com/android/settings/wallpaper/WallpaperTypePreferenceController.java @@ -0,0 +1,122 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.wallpaper; + +import android.app.Fragment; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.support.v7.preference.Preference; +import android.support.v7.preference.PreferenceScreen; +import android.text.TextUtils; + +import com.android.settings.core.BasePreferenceController; +import com.android.settingslib.core.lifecycle.LifecycleObserver; +import com.android.settingslib.core.lifecycle.events.OnStart; + +import java.util.List; +import java.util.stream.Collectors; + +public class WallpaperTypePreferenceController extends BasePreferenceController + implements LifecycleObserver, OnStart { + private Fragment mParentFragment; + private PreferenceScreen mScreen; + + public WallpaperTypePreferenceController(Context context, String key) { + super(context, key); + } + + public void setParentFragment(Fragment parentFragment) { + mParentFragment = parentFragment; + } + + + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + mScreen = screen; + } + + @Override + public int getAvailabilityStatus() { + return AVAILABLE; + } + + @Override + public boolean handlePreferenceTreeClick(Preference preference) { + if (preference.getIntent() == null) { + return super.handlePreferenceTreeClick(preference); + } + mParentFragment.startActivity(preference.getIntent()); + mParentFragment.getActivity().finish(); + return true; + } + + @Override + public void onStart() { + populateWallpaperTypes(); + } + + private void populateWallpaperTypes() { + // Search for activities that satisfy the ACTION_SET_WALLPAPER action + final Intent intent = new Intent(Intent.ACTION_SET_WALLPAPER); + final PackageManager pm = mContext.getPackageManager(); + final List<ResolveInfo> rList = pm.queryIntentActivities(intent, + PackageManager.MATCH_DEFAULT_ONLY); + + removeUselessExistingPreference(rList); + mScreen.setOrderingAsAdded(false); + // Add Preference items for each of the matching activities + for (ResolveInfo info : rList) { + final String packageName = info.activityInfo.packageName; + Preference pref = mScreen.findPreference(packageName); + if (pref == null) { + pref = new Preference(mScreen.getContext()); + } + final Intent prefIntent = new Intent(intent).addFlags( + Intent.FLAG_ACTIVITY_FORWARD_RESULT); + prefIntent.setComponent(new ComponentName(packageName, info.activityInfo.name)); + pref.setIntent(prefIntent); + pref.setKey(packageName); + CharSequence label = info.loadLabel(pm); + if (label == null) { + label = packageName; + } + pref.setTitle(label); + pref.setIcon(info.loadIcon(pm)); + mScreen.addPreference(pref); + } + } + + private void removeUselessExistingPreference(List<ResolveInfo> rList) { + final int count = mScreen.getPreferenceCount(); + if (count <= 0) { + return; + } + for (int i = count - 1; i >= 0; i--) { + final Preference pref = mScreen.getPreference(i); + final List<ResolveInfo> result = rList.stream().filter( + rInfo -> TextUtils.equals(pref.getKey(), + rInfo.activityInfo.packageName)).collect(Collectors.toList()); + if (result.isEmpty()) { + mScreen.removePreference(pref); + } + } + } +}
\ No newline at end of file diff --git a/src/com/android/settings/wallpaper/WallpaperTypeSettings.java b/src/com/android/settings/wallpaper/WallpaperTypeSettings.java index 1a1e1214fa..ca42ddaef4 100644 --- a/src/com/android/settings/wallpaper/WallpaperTypeSettings.java +++ b/src/com/android/settings/wallpaper/WallpaperTypeSettings.java @@ -16,26 +16,24 @@ package com.android.settings.wallpaper; -import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; -import android.os.Bundle; -import android.support.v7.preference.Preference; -import android.support.v7.preference.PreferenceScreen; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; -import com.android.settings.SettingsPreferenceFragment; +import com.android.settings.dashboard.DashboardFragment; import com.android.settings.search.BaseSearchIndexProvider; -import com.android.settings.search.Indexable; import com.android.settings.search.SearchIndexableRaw; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.List; -public class WallpaperTypeSettings extends SettingsPreferenceFragment implements Indexable { +@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC) +public class WallpaperTypeSettings extends DashboardFragment { + private static final String TAG = "WallpaperTypeSettings"; @Override public int getMetricsCategory() { @@ -48,52 +46,26 @@ public class WallpaperTypeSettings extends SettingsPreferenceFragment implements } @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - addPreferencesFromResource(R.xml.wallpaper_settings); - populateWallpaperTypes(); + protected String getLogTag() { + return TAG; } - private void populateWallpaperTypes() { - // Search for activities that satisfy the ACTION_SET_WALLPAPER action - final Intent intent = new Intent(Intent.ACTION_SET_WALLPAPER); - final PackageManager pm = getPackageManager(); - final List<ResolveInfo> rList = pm.queryIntentActivities(intent, - PackageManager.MATCH_DEFAULT_ONLY); - - final PreferenceScreen parent = getPreferenceScreen(); - parent.setOrderingAsAdded(false); - // Add Preference items for each of the matching activities - for (ResolveInfo info : rList) { - Preference pref = new Preference(getPrefContext()); - Intent prefIntent = new Intent(intent).addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); - prefIntent.setComponent(new ComponentName( - info.activityInfo.packageName, info.activityInfo.name)); - pref.setIntent(prefIntent); - CharSequence label = info.loadLabel(pm); - if (label == null) label = info.activityInfo.packageName; - pref.setTitle(label); - pref.setIcon(info.loadIcon(pm)); - parent.addPreference(pref); - } + @Override + protected int getPreferenceScreenResId() { + return R.xml.wallpaper_settings; } @Override - public boolean onPreferenceTreeClick(Preference preference) { - if (preference.getIntent() == null) { - return super.onPreferenceTreeClick(preference); - } - startActivity(preference.getIntent()); - finish(); - return true; + public void onAttach(Context context) { + super.onAttach(context); + use(WallpaperTypePreferenceController.class).setParentFragment(this); } public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = new BaseSearchIndexProvider() { @Override public List<SearchIndexableRaw> getRawDataToIndex(Context context, boolean enabled) { - final List<SearchIndexableRaw> result = new ArrayList<SearchIndexableRaw>(); + final List<SearchIndexableRaw> result = new ArrayList<>(); final Intent intent = new Intent(Intent.ACTION_SET_WALLPAPER); final PackageManager pm = context.getPackageManager(); @@ -108,9 +80,10 @@ public class WallpaperTypeSettings extends SettingsPreferenceFragment implements continue; } CharSequence label = info.loadLabel(pm); - if (label == null) label = info.activityInfo.packageName; - - SearchIndexableRaw data = new SearchIndexableRaw(context); + if (label == null) { + label = info.activityInfo.packageName; + } + final SearchIndexableRaw data = new SearchIndexableRaw(context); data.title = label.toString(); data.key = "wallpaper_type_settings"; data.screenTitle = context.getResources().getString( diff --git a/src/com/android/settings/wfd/WifiDisplaySettings.java b/src/com/android/settings/wfd/WifiDisplaySettings.java index 8f42389a8c..9a8ac70c4a 100755 --- a/src/com/android/settings/wfd/WifiDisplaySettings.java +++ b/src/com/android/settings/wfd/WifiDisplaySettings.java @@ -66,6 +66,7 @@ import com.android.settings.SettingsPreferenceFragment; import com.android.settings.dashboard.SummaryLoader; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.List; @@ -78,6 +79,7 @@ import java.util.List; * on the system. In that case, the enable option will not be shown but other * remote display routes will continue to be made available. */ +@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC) public final class WifiDisplaySettings extends SettingsPreferenceFragment implements Indexable { private static final String TAG = "WifiDisplaySettings"; private static final boolean DEBUG = false; diff --git a/src/com/android/settings/widget/DonutView.java b/src/com/android/settings/widget/DonutView.java index c5ac40bde7..86024bf3cc 100644 --- a/src/com/android/settings/widget/DonutView.java +++ b/src/com/android/settings/widget/DonutView.java @@ -70,7 +70,8 @@ public class DonutView extends View { public DonutView(Context context, AttributeSet attrs) { super(context, attrs); mMeterBackgroundColor = context.getColor(R.color.meter_background_color); - mMeterConsumedColor = Utils.getDefaultColor(mContext, R.color.meter_consumed_color); + mMeterConsumedColor = Utils.getColorStateListDefaultColor(mContext, + R.color.meter_consumed_color); boolean applyColorAccent = true; Resources resources = context.getResources(); mStrokeWidth = resources.getDimension(R.dimen.storage_donut_thickness); @@ -107,7 +108,7 @@ public class DonutView extends View { if (applyColorAccent) { final ColorFilter mAccentColorFilter = new PorterDuffColorFilter( - Utils.getColorAttr(context, android.R.attr.colorAccent), + Utils.getColorAttrDefaultColor(context, android.R.attr.colorAccent), PorterDuff.Mode.SRC_IN); mBackgroundCircle.setColorFilter(mAccentColorFilter); mFilledArc.setColorFilter(mAccentColorFilter); diff --git a/src/com/android/settings/widget/EntityHeaderController.java b/src/com/android/settings/widget/EntityHeaderController.java index 5131159f14..f9d16cde10 100644 --- a/src/com/android/settings/widget/EntityHeaderController.java +++ b/src/com/android/settings/widget/EntityHeaderController.java @@ -61,13 +61,13 @@ public class EntityHeaderController { @IntDef({ActionType.ACTION_NONE, ActionType.ACTION_APP_PREFERENCE, ActionType.ACTION_NOTIF_PREFERENCE, - ActionType.ACTION_DND_RULE_PREFERENCE,}) + ActionType.ACTION_EDIT_PREFERENCE,}) @Retention(RetentionPolicy.SOURCE) public @interface ActionType { int ACTION_NONE = 0; int ACTION_APP_PREFERENCE = 1; int ACTION_NOTIF_PREFERENCE = 2; - int ACTION_DND_RULE_PREFERENCE = 3; + int ACTION_EDIT_PREFERENCE = 3; } public static final String PREF_KEY_APP_HEADER = "pref_app_header"; @@ -100,7 +100,7 @@ public class EntityHeaderController { private boolean mIsInstantApp; - private View.OnClickListener mEditRuleNameOnClickListener; + private View.OnClickListener mEditOnClickListener; /** * Creates a new instance of the controller. @@ -227,8 +227,8 @@ public class EntityHeaderController { return this; } - public EntityHeaderController setEditZenRuleNameListener(View.OnClickListener listener) { - this.mEditRuleNameOnClickListener = listener; + public EntityHeaderController setEditListener(View.OnClickListener listener) { + this.mEditOnClickListener = listener; return this; } @@ -322,7 +322,8 @@ public class EntityHeaderController { return this; } actionBar.setBackgroundDrawable( - new ColorDrawable(Utils.getColorAttr(activity, android.R.attr.colorSecondary))); + new ColorDrawable( + Utils.getColorAttrDefaultColor(activity, android.R.attr.colorPrimary))); actionBar.setElevation(0); if (mRecyclerView != null && mLifecycle != null) { ActionBarShadowController.attachToRecyclerView(mActivity, mLifecycle, mRecyclerView); @@ -344,13 +345,13 @@ public class EntityHeaderController { return; } switch (action) { - case ActionType.ACTION_DND_RULE_PREFERENCE: { - if (mEditRuleNameOnClickListener == null) { + case ActionType.ACTION_EDIT_PREFERENCE: { + if (mEditOnClickListener == null) { button.setVisibility(View.GONE); } else { button.setImageResource(R.drawable.ic_mode_edit); button.setVisibility(View.VISIBLE); - button.setOnClickListener(mEditRuleNameOnClickListener); + button.setOnClickListener(mEditOnClickListener); } return; } diff --git a/src/com/android/settings/wifi/ConfigureWifiSettings.java b/src/com/android/settings/wifi/ConfigureWifiSettings.java index 818b295e0b..e0e63cc3c8 100644 --- a/src/com/android/settings/wifi/ConfigureWifiSettings.java +++ b/src/com/android/settings/wifi/ConfigureWifiSettings.java @@ -31,11 +31,13 @@ import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settings.wifi.p2p.WifiP2pPreferenceController; import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +@SearchIndexable public class ConfigureWifiSettings extends DashboardFragment { private static final String TAG = "ConfigureWifiSettings"; diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java index 7a7caf47ef..e2a7f25f1b 100644 --- a/src/com/android/settings/wifi/WifiSettings.java +++ b/src/com/android/settings/wifi/WifiSettings.java @@ -65,6 +65,7 @@ import com.android.settings.widget.SummaryUpdater.OnSummaryChangeListener; import com.android.settings.widget.SwitchBarController; import com.android.settings.wifi.details.WifiNetworkDetailsFragment; import com.android.settingslib.RestrictedLockUtils; +import com.android.settingslib.search.SearchIndexable; import com.android.settingslib.wifi.AccessPoint; import com.android.settingslib.wifi.AccessPoint.AccessPointListener; import com.android.settingslib.wifi.AccessPointPreference; @@ -82,6 +83,7 @@ import java.util.List; * The second is for Setup Wizard, with a simplified interface that hides the action bar * and menus. */ +@SearchIndexable public class WifiSettings extends RestrictedSettingsFragment implements Indexable, WifiTracker.WifiListener, AccessPointListener, WifiDialog.WifiDialogListener { |