Add Home / Launcher apps indexing
- add a BaseSearchIndexProvider to HomeSettings
- use a BroadcastReceiver for tracking add or remove of
Home / Launcher apps
- add "launcher" synonym for "home" too
- also code cleaning for DynamicIndexableContentMonitor
See bug: #16484927 Add "launcher" as a synonym for "home" in settings search
Change-Id: I819f4e5f7bd5e9a7882609206b2733ea1912fc69
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index fac2d34..277a56e 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1832,5 +1832,19 @@
</intent-filter>
</provider>
+ <receiver android:name=".search.HomePackageReceiver"
+ android:exported="false">
+ <intent-filter>
+ <action android:name="android.intent.action.PACKAGE_ADDED" />
+ <action android:name="android.intent.action.PACKAGE_CHANGED" />
+ <action android:name="android.intent.action.PACKAGE_REMOVED" />
+
+ <category android:name="android.intent.category.HOME" />
+ <category android:name="android.intent.category.LAUNCHER" />
+
+ <data android:scheme="package"/>
+ </intent-filter>
+ </receiver>
+
</application>
</manifest>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 8526523..c368361 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -5434,6 +5434,7 @@
<string name="keywords_wifi">wifi wi-fi network connection</string>
<string name="keywords_more_default_sms_app">text message</string>
<string name="keywords_more_mobile_networks">cellular cell carrier wireless</string>
+ <string name="keywords_home">launcher</string>
<string name="keywords_display">screen touchscreen</string>
<string name="keywords_display_brightness_level">dim screen touchscreen</string>
<string name="keywords_display_auto_brightness">dim screen touchscreen</string>
diff --git a/src/com/android/settings/HomeSettings.java b/src/com/android/settings/HomeSettings.java
index 8697062..6d5883c 100644
--- a/src/com/android/settings/HomeSettings.java
+++ b/src/com/android/settings/HomeSettings.java
@@ -17,17 +17,21 @@
package com.android.settings;
import java.util.ArrayList;
+import java.util.List;
import android.app.ActivityManager;
+import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.SharedPreferences;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
+import android.content.res.Resources;
import android.graphics.ColorFilter;
import android.graphics.ColorMatrix;
import android.graphics.ColorMatrixColorFilter;
@@ -37,13 +41,17 @@
import android.os.Handler;
import android.preference.Preference;
import android.preference.PreferenceGroup;
+import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.RadioButton;
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settings.search.Indexable;
+import com.android.settings.search.SearchIndexableRaw;
-public class HomeSettings extends SettingsPreferenceFragment {
+public class HomeSettings extends SettingsPreferenceFragment implements Indexable {
static final String TAG = "HomeSettings";
static final int REQUESTING_UNINSTALL = 10;
@@ -289,4 +297,59 @@
}
}
}
+
+ /**
+ * For search
+ */
+ 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 PackageManager pm = context.getPackageManager();
+ final ArrayList<ResolveInfo> homeActivities = new ArrayList<ResolveInfo>();
+ pm.getHomeActivities(homeActivities);
+
+ final SharedPreferences sp = context.getSharedPreferences(
+ HomeSettings.HOME_PREFS, Context.MODE_PRIVATE);
+ final boolean doShowHome = sp.getBoolean(HomeSettings.HOME_PREFS_DO_SHOW, false);
+
+ // We index Home Launchers only if there are more than one or if we are showing the
+ // Home tile into the Dashboard
+ if (homeActivities.size() > 1 || doShowHome) {
+ final Resources res = context.getResources();
+
+ // Add fragment title
+ SearchIndexableRaw data = new SearchIndexableRaw(context);
+ data.title = res.getString(R.string.home_settings);
+ data.screenTitle = res.getString(R.string.home_settings);
+ data.keywords = res.getString(R.string.keywords_home);
+ result.add(data);
+
+ for (int i = 0; i < homeActivities.size(); i++) {
+ final ResolveInfo resolveInfo = homeActivities.get(i);
+ final ActivityInfo activityInfo = resolveInfo.activityInfo;
+
+ CharSequence name;
+ try {
+ name = activityInfo.loadLabel(pm);
+ if (TextUtils.isEmpty(name)) {
+ continue;
+ }
+ } catch (Exception e) {
+ Log.v(TAG, "Problem dealing with Home " + activityInfo.name, e);
+ continue;
+ }
+
+ data = new SearchIndexableRaw(context);
+ data.title = name.toString();
+ data.screenTitle = res.getString(R.string.home_settings);
+ result.add(data);
+ }
+ }
+
+ return result;
+ }
+ };
}
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index b227c6b..be3662f 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -294,7 +294,6 @@
private boolean mBatteryPresent = true;
private BroadcastReceiver mBatteryInfoReceiver = new BroadcastReceiver() {
-
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
diff --git a/src/com/android/settings/search/DynamicIndexableContentMonitor.java b/src/com/android/settings/search/DynamicIndexableContentMonitor.java
index c0b462f..12bb6ef 100644
--- a/src/com/android/settings/search/DynamicIndexableContentMonitor.java
+++ b/src/com/android/settings/search/DynamicIndexableContentMonitor.java
@@ -78,10 +78,8 @@
new UserDictionaryContentObserver(mHandler);
private Context mContext;
-
- private boolean mHasFeturePrinting;
-
- private boolean mHasFetureIme;
+ private boolean mHasFeaturePrinting;
+ private boolean mHasFeatureIme;
private static Intent getAccessibilityServiceIntent(String packageName) {
final Intent intent = new Intent(AccessibilityService.SERVICE_INTERFACE);
@@ -104,9 +102,9 @@
public void register(Context context) {
mContext = context;
- mHasFeturePrinting = mContext.getPackageManager().hasSystemFeature(
+ mHasFeaturePrinting = mContext.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_PRINTING);
- mHasFetureIme = mContext.getPackageManager().hasSystemFeature(
+ mHasFeatureIme = mContext.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_INPUT_METHODS);
// Cache accessibility service packages to know when they go away.
@@ -124,7 +122,7 @@
mAccessibilityServices.add(resolveInfo.serviceInfo.packageName);
}
- if (mHasFeturePrinting) {
+ if (mHasFeaturePrinting) {
// Cache print service packages to know when they go away.
PrintManager printManager = (PrintManager)
mContext.getSystemService(Context.PRINT_SERVICE);
@@ -141,7 +139,7 @@
}
// Cache IME service packages to know when they go away.
- if (mHasFetureIme) {
+ if (mHasFeatureIme) {
InputMethodManager imeManager = (InputMethodManager)
mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
List<InputMethodInfo> inputMethods = imeManager.getInputMethodList();
@@ -174,7 +172,7 @@
Context.INPUT_SERVICE);
inputManager.unregisterInputDeviceListener(this);
- if (mHasFetureIme) {
+ if (mHasFeatureIme) {
mContext.getContentResolver().unregisterContentObserver(
mUserDictionaryContentObserver);
}
@@ -242,7 +240,7 @@
}
}
- if (mHasFeturePrinting) {
+ if (mHasFeaturePrinting) {
if (!mPrintServices.contains(packageName)) {
final Intent intent = getPrintServiceIntent(packageName);
if (!mContext.getPackageManager().queryIntentServices(intent, 0).isEmpty()) {
@@ -253,7 +251,7 @@
}
}
- if (mHasFetureIme) {
+ if (mHasFeatureIme) {
if (!mImeServices.contains(packageName)) {
Intent intent = getIMEServiceIntent(packageName);
if (!mContext.getPackageManager().queryIntentServices(intent, 0).isEmpty()) {
@@ -273,7 +271,7 @@
AccessibilitySettings.class.getName(), true, true);
}
- if (mHasFeturePrinting) {
+ if (mHasFeaturePrinting) {
final int printIndex = mPrintServices.indexOf(packageName);
if (printIndex >= 0) {
mPrintServices.remove(printIndex);
@@ -282,7 +280,7 @@
}
}
- if (mHasFetureIme) {
+ if (mHasFeatureIme) {
final int imeIndex = mImeServices.indexOf(packageName);
if (imeIndex >= 0) {
mImeServices.remove(imeIndex);
diff --git a/src/com/android/settings/search/HomePackageReceiver.java b/src/com/android/settings/search/HomePackageReceiver.java
new file mode 100644
index 0000000..a245252
--- /dev/null
+++ b/src/com/android/settings/search/HomePackageReceiver.java
@@ -0,0 +1,36 @@
+/*
+ * 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.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import com.android.settings.HomeSettings;
+
+import java.util.Set;
+
+/**
+ * A BroadcastReceiver for detecting Home Launchers
+ */
+public class HomePackageReceiver extends BroadcastReceiver {
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ Index.getInstance(context).updateFromClassNameResource(
+ HomeSettings.class.getName(), true, true);
+ }
+}
diff --git a/src/com/android/settings/search/SearchIndexableResources.java b/src/com/android/settings/search/SearchIndexableResources.java
index e2b1d48..ae5f202 100644
--- a/src/com/android/settings/search/SearchIndexableResources.java
+++ b/src/com/android/settings/search/SearchIndexableResources.java
@@ -118,7 +118,7 @@
sResMap.put(HomeSettings.class.getName(),
new SearchIndexableResource(
Ranking.getRankForClassName(HomeSettings.class.getName()),
- R.xml.home_selection,
+ NO_DATA_RES_ID,
HomeSettings.class.getName(),
R.drawable.ic_settings_home));