From f77ff76950a2bcecebc4587511051681dc651a79 Mon Sep 17 00:00:00 2001 From: Edgar Wang Date: Wed, 19 Jul 2023 14:09:28 +0800 Subject: [PATCH] Make Quick setttings developer tiles searchable Bug: 286365859 Test: manual verify Change-Id: I2b3578d4aa80d48a4dcc29cfaac2f25089f0d4e8 --- .../qstile/DevelopmentTileConfigFragment.java | 65 ++++++++++++++++++- .../DevelopmentTilePreferenceController.java | 27 ++++++-- 2 files changed, 84 insertions(+), 8 deletions(-) diff --git a/src/com/android/settings/development/qstile/DevelopmentTileConfigFragment.java b/src/com/android/settings/development/qstile/DevelopmentTileConfigFragment.java index 079195c0a12..0ca189d9acd 100644 --- a/src/com/android/settings/development/qstile/DevelopmentTileConfigFragment.java +++ b/src/com/android/settings/development/qstile/DevelopmentTileConfigFragment.java @@ -18,21 +18,26 @@ package com.android.settings.development.qstile; import android.app.settings.SettingsEnums; import android.content.Context; -import android.provider.SearchIndexableResource; +import android.content.SharedPreferences; +import android.content.pm.PackageManager; +import android.content.pm.ServiceInfo; +import android.os.SystemProperties; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.search.BaseSearchIndexProvider; -import com.android.settingslib.search.Indexable; import com.android.settingslib.development.DevelopmentSettingsEnabler; import com.android.settingslib.search.SearchIndexable; +import com.android.settingslib.search.SearchIndexableRaw; import java.util.ArrayList; import java.util.List; +import java.util.Map; @SearchIndexable public class DevelopmentTileConfigFragment extends DashboardFragment { private static final String TAG = "DevelopmentTileConfig"; + private static final String QS_TILE_PERF = "develop_qs_tile"; @Override protected String getLogTag() { @@ -56,5 +61,61 @@ public class DevelopmentTileConfigFragment extends DashboardFragment { protected boolean isPageSearchEnabled(Context context) { return DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(context); } + + @Override + public List getRawDataToIndex(Context context, + boolean enabled) { + List result = new ArrayList<>(); + // Save the query system property for getNonIndexableKeys to avoid + // getTitleServiceList multiple times + SharedPreferences sharedPref = context.getSharedPreferences(QS_TILE_PERF, + Context.MODE_PRIVATE); + + List services = + DevelopmentTilePreferenceController.getTileServiceList(context); + PackageManager pm = context.getPackageManager(); + SharedPreferences.Editor editor = sharedPref.edit(); + for (ServiceInfo sInfo : services) { + SearchIndexableRaw data = new SearchIndexableRaw(context); + data.title = sInfo.loadLabel(pm).toString(); + data.key = sInfo.name; + result.add(data); + + if (sInfo.metaData == null) { + continue; + } + String flag = sInfo.metaData.getString( + DevelopmentTiles.META_DATA_REQUIRES_SYSTEM_PROPERTY); + if (flag == null) { + continue; + } + editor.putString(sInfo.name, flag); + } + editor.apply(); + + return result; + } + + @Override + public List getNonIndexableKeys(Context context) { + List keys = super.getNonIndexableKeys(context); + + SharedPreferences sharedPref = context.getSharedPreferences(QS_TILE_PERF, + Context.MODE_PRIVATE); + Map map = sharedPref.getAll(); + for (Map.Entry entry : map.entrySet()) { + if (entry.getValue() == null) { + continue; + } + String key = entry.getKey(); + String flag = entry.getValue().toString(); + + if (!SystemProperties.getBoolean(flag, false)) { + keys.add(key); + } + } + + return keys; + } }; } diff --git a/src/com/android/settings/development/qstile/DevelopmentTilePreferenceController.java b/src/com/android/settings/development/qstile/DevelopmentTilePreferenceController.java index 4f506b070ca..d713ff3c7aa 100644 --- a/src/com/android/settings/development/qstile/DevelopmentTilePreferenceController.java +++ b/src/com/android/settings/development/qstile/DevelopmentTilePreferenceController.java @@ -36,6 +36,7 @@ import androidx.preference.SwitchPreference; import com.android.internal.statusbar.IStatusBarService; import com.android.settings.core.BasePreferenceController; +import java.util.ArrayList; import java.util.List; public class DevelopmentTilePreferenceController extends BasePreferenceController { @@ -59,13 +60,9 @@ public class DevelopmentTilePreferenceController extends BasePreferenceControlle public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); final Context context = screen.getContext(); - final Intent intent = new Intent(TileService.ACTION_QS_TILE) - .setPackage(context.getPackageName()); - final List resolveInfos = mPackageManager.queryIntentServices(intent, - PackageManager.MATCH_DISABLED_COMPONENTS | PackageManager.GET_META_DATA); - for (ResolveInfo info : resolveInfos) { - ServiceInfo sInfo = info.serviceInfo; + List serviceInfos = getTileServiceList(context); + for (ServiceInfo sInfo : serviceInfos) { // Check if the tile requires a flag. If it does, hide tile if flag is off. if (sInfo.metaData != null) { String flag = sInfo.metaData.getString( @@ -95,6 +92,24 @@ public class DevelopmentTilePreferenceController extends BasePreferenceControlle } } + /** + * Get Quick Settings services from PackageManager + */ + public static List getTileServiceList(Context context) { + Intent intent = new Intent(TileService.ACTION_QS_TILE) + .setPackage(context.getPackageName()); + PackageManager packageManager = context.getPackageManager(); + List resolveInfos = packageManager.queryIntentServices(intent, + PackageManager.MATCH_DISABLED_COMPONENTS | PackageManager.GET_META_DATA); + + List servicesInfos = new ArrayList<>(); + for (ResolveInfo info : resolveInfos) { + ServiceInfo sInfo = info.serviceInfo; + servicesInfos.add(sInfo); + } + return servicesInfos; + } + @VisibleForTesting static class OnChangeHandler implements Preference.OnPreferenceChangeListener {