summaryrefslogtreecommitdiffstats
path: root/src/com
diff options
context:
space:
mode:
authorFabrice Di Meglio <fdimeglio@google.com>2014-03-10 19:24:54 -0700
committerFabrice Di Meglio <fdimeglio@google.com>2014-03-12 11:34:59 -0700
commitb8dfbf140986a9c0781f268ea40914063f026436 (patch)
treed95f2323502ee694ea9ec1d1481bc2b33d887e4d /src/com
parent2f4556e31b5d69e508ab9431eef4fea5f8d89e4f (diff)
downloadpackages_apps_Settings-b8dfbf140986a9c0781f268ea40914063f026436.tar.gz
packages_apps_Settings-b8dfbf140986a9c0781f268ea40914063f026436.tar.bz2
packages_apps_Settings-b8dfbf140986a9c0781f268ea40914063f026436.zip
Add dynamic Preferences indexing
- introduce a new private interface "Indexable". - refactor Wallpaper and Wi-Fi settings to support this new interface. - only index saved/remembered Wi-Fi networks - also add the capability to remove some data from the Index. Fragments that want to publish some dynamic indexable data should implement the "Indexable" interface and provide a static final field named "INDEX_DATA_PROVIDER" with is the Indexable.IndexDataProvider interface for providing the data for indexing. Thru this interface the Index can ask what are the data chuncks to index. Change-Id: I31e7212c87b8218efe1a8f3028147cb19e119be6
Diffstat (limited to 'src/com')
-rw-r--r--src/com/android/settings/SettingsActivity.java51
-rw-r--r--src/com/android/settings/WallpaperTypeSettings.java51
-rw-r--r--src/com/android/settings/indexer/Index.java213
-rw-r--r--src/com/android/settings/indexer/Indexable.java52
-rw-r--r--src/com/android/settings/indexer/IndexableData.java33
-rw-r--r--src/com/android/settings/indexer/IndexableRef.java46
-rw-r--r--src/com/android/settings/wifi/WifiSettings.java59
7 files changed, 410 insertions, 95 deletions
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 8582bc67a..b3ea79ad9 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -95,7 +95,7 @@ import com.android.settings.deviceinfo.Memory;
import com.android.settings.deviceinfo.UsbSettings;
import com.android.settings.fuelgauge.PowerUsageSummary;
import com.android.settings.indexer.Index;
-import com.android.settings.indexer.IndexableData;
+import com.android.settings.indexer.IndexableRef;
import com.android.settings.inputmethod.InputMethodAndLanguageSettings;
import com.android.settings.inputmethod.KeyboardLayoutPickerFragment;
import com.android.settings.inputmethod.SpellCheckersSettings;
@@ -341,67 +341,72 @@ public class SettingsActivity extends Activity
}
};
+ private static int NO_DATA_RES_ID = 0;
+
/**
- * Searchable data description.
+ * Indexable data description.
*
* Known restriction: we are only searching (for now) the first level of Settings.
*/
- private static IndexableData[] INDEXABLE_DATA = new IndexableData[] {
- new IndexableData(1, R.xml.wifi_settings,
+ private static IndexableRef[] INDEXABLE_REFS = new IndexableRef[] {
+ new IndexableRef(1, NO_DATA_RES_ID,
"com.android.settings.wifi.WifiSettings",
R.drawable.ic_settings_wireless),
- new IndexableData(2, R.xml.bluetooth_settings,
+ new IndexableRef(2, R.xml.bluetooth_settings,
"com.android.settings.bluetooth.BluetoothSettings",
R.drawable.ic_settings_bluetooth2),
- new IndexableData(3, R.xml.data_usage_metered_prefs,
+ new IndexableRef(3, R.xml.data_usage_metered_prefs,
"com.android.settings.net.DataUsageMeteredSettings",
R.drawable.ic_settings_data_usage),
- new IndexableData(4, R.xml.wireless_settings,
+ new IndexableRef(4, R.xml.wireless_settings,
"com.android.settings.WirelessSettings",
R.drawable.empty_icon),
- new IndexableData(5, R.xml.home_selection,
+ new IndexableRef(5, R.xml.home_selection,
"com.android.settings.HomeSettings",
R.drawable.ic_settings_home),
- new IndexableData(6, R.xml.sound_settings,
+ new IndexableRef(6, R.xml.sound_settings,
"com.android.settings.SoundSettings",
R.drawable.ic_settings_sound),
- new IndexableData(7, R.xml.display_settings,
+ new IndexableRef(7, R.xml.display_settings,
"com.android.settings.DisplaySettings",
R.drawable.ic_settings_display),
- new IndexableData(8, R.xml.device_info_memory,
+ new IndexableRef(7, NO_DATA_RES_ID,
+ "com.android.settings.WallpaperTypeSettings",
+ R.drawable.ic_settings_display),
+ new IndexableRef(8, R.xml.device_info_memory,
"com.android.settings.deviceinfo.Memory",
R.drawable.ic_settings_storage),
- new IndexableData(9, R.xml.power_usage_summary,
+ new IndexableRef(9, R.xml.power_usage_summary,
"com.android.settings.fuelgauge.PowerUsageSummary",
R.drawable.ic_settings_battery),
- new IndexableData(10, R.xml.user_settings,
+ new IndexableRef(10, R.xml.user_settings,
"com.android.settings.users.UserSettings",
R.drawable.ic_settings_multiuser),
- new IndexableData(11, R.xml.location_settings,
+ new IndexableRef(11, R.xml.location_settings,
"com.android.settings.location.LocationSettings",
R.drawable.ic_settings_location),
- new IndexableData(12, R.xml.security_settings,
+ new IndexableRef(12, R.xml.security_settings,
"com.android.settings.SecuritySettings",
R.drawable.ic_settings_security),
- new IndexableData(13, R.xml.language_settings,
+ new IndexableRef(13, R.xml.language_settings,
"com.android.settings.inputmethod.InputMethodAndLanguageSettings",
R.drawable.ic_settings_language),
- new IndexableData(14, R.xml.privacy_settings,
+ new IndexableRef(14, R.xml.privacy_settings,
"com.android.settings.PrivacySettings",
R.drawable.ic_settings_backup),
- new IndexableData(15, R.xml.date_time_prefs,
+ new IndexableRef(15, R.xml.date_time_prefs,
"com.android.settings.DateTimeSettings",
R.drawable.ic_settings_date_time),
- new IndexableData(16, R.xml.accessibility_settings,
+ new IndexableRef(16, R.xml.accessibility_settings,
"com.android.settings.accessibility.AccessibilitySettings",
R.drawable.ic_settings_accessibility),
- new IndexableData(17, R.xml.print_settings,
+ new IndexableRef(17, R.xml.print_settings,
"com.android.settings.print.PrintSettingsFragment",
com.android.internal.R.drawable.ic_print),
- new IndexableData(18, R.xml.development_prefs,
+ new IndexableRef(18, R.xml.development_prefs,
"com.android.settings.DevelopmentSettings",
R.drawable.ic_settings_development),
- new IndexableData(19, R.xml.device_info_settings,
+ new IndexableRef(19, R.xml.device_info_settings,
"com.android.settings.DeviceInfoSettings",
R.drawable.ic_settings_about),
};
@@ -546,7 +551,7 @@ public class SettingsActivity extends Activity
getWindow().setUiOptions(getIntent().getIntExtra(EXTRA_UI_OPTIONS, 0));
}
- Index.getInstance(this).addIndexableData(INDEXABLE_DATA);
+ Index.getInstance(this).addIndexableData(INDEXABLE_REFS);
Index.getInstance(this).update();
mAuthenticatorHelper = new AuthenticatorHelper();
diff --git a/src/com/android/settings/WallpaperTypeSettings.java b/src/com/android/settings/WallpaperTypeSettings.java
index fa5f0ac73..f46315a1d 100644
--- a/src/com/android/settings/WallpaperTypeSettings.java
+++ b/src/com/android/settings/WallpaperTypeSettings.java
@@ -16,18 +16,23 @@
package com.android.settings;
-import android.app.Activity;
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.preference.Preference;
import android.preference.PreferenceScreen;
+import com.android.settings.indexer.Indexable;
+import com.android.settings.indexer.IndexableData;
+import com.android.settings.indexer.IndexableRef;
+import java.util.ArrayList;
import java.util.List;
-public class WallpaperTypeSettings extends SettingsPreferenceFragment {
+public class WallpaperTypeSettings extends SettingsPreferenceFragment implements Indexable {
+
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -38,9 +43,9 @@ public class WallpaperTypeSettings extends SettingsPreferenceFragment {
private void populateWallpaperTypes() {
// Search for activities that satisfy the ACTION_SET_WALLPAPER action
- Intent intent = new Intent(Intent.ACTION_SET_WALLPAPER);
+ final Intent intent = new Intent(Intent.ACTION_SET_WALLPAPER);
final PackageManager pm = getPackageManager();
- List<ResolveInfo> rList = pm.queryIntentActivities(intent,
+ final List<ResolveInfo> rList = pm.queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
final PreferenceScreen parent = getPreferenceScreen();
@@ -58,4 +63,42 @@ public class WallpaperTypeSettings extends SettingsPreferenceFragment {
parent.addPreference(pref);
}
}
+
+ public static final IndexDataProvider INDEX_DATA_PROVIDER =
+ new IndexDataProvider() {
+ @Override
+ public List<IndexableRef> getRefsToIndex(Context context) {
+ return null;
+ }
+
+ @Override
+ public List<IndexableData> getRawDataToIndex(Context context) {
+ final List<IndexableData> result = new ArrayList<IndexableData>();
+
+ final Intent intent = new Intent(Intent.ACTION_SET_WALLPAPER);
+ final PackageManager pm = context.getPackageManager();
+ final List<ResolveInfo> rList = pm.queryIntentActivities(intent,
+ PackageManager.MATCH_DEFAULT_ONLY);
+
+ // Add indexable data for each of the matching activities
+ for (ResolveInfo info : rList) {
+ Intent prefIntent = new Intent(intent);
+ prefIntent.setComponent(new ComponentName(
+ info.activityInfo.packageName, info.activityInfo.name));
+ CharSequence label = info.loadLabel(pm);
+ if (label == null) label = info.activityInfo.packageName;
+
+ IndexableData data = new IndexableData();
+ data.title = label.toString();
+ data.fragmentTitle = context.getResources().getString(
+ R.string.wallpaper_settings_fragment_title);
+ data.intentAction = intent.getAction();
+ data.intentTargetPackage = info.activityInfo.packageName;
+ data.intentTargetClass = info.activityInfo.name;
+ result.add(data);
+ }
+
+ return result;
+ }
+ };
}
diff --git a/src/com/android/settings/indexer/Index.java b/src/com/android/settings/indexer/Index.java
index df1a58fe2..19b545f9b 100644
--- a/src/com/android/settings/indexer/Index.java
+++ b/src/com/android/settings/indexer/Index.java
@@ -34,6 +34,7 @@ import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
+import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
@@ -45,7 +46,7 @@ import static com.android.settings.indexer.IndexDatabaseHelper.IndexColumns;
public class Index {
- private static final String LOG_TAG = "Indexer";
+ private static final String LOG_TAG = "Index";
// Those indices should match the indices of SELECT_COLUMNS !
public static final int COLUMN_INDEX_TITLE = 1;
@@ -81,7 +82,8 @@ public class Index {
private static Index sInstance;
private final AtomicBoolean mIsAvailable = new AtomicBoolean(false);
- private final List<IndexableData> mDataToIndex = new ArrayList<IndexableData>();
+
+ private final UpdateData mUpdateData = new UpdateData();
private final Context mContext;
@@ -103,6 +105,42 @@ public class Index {
return mIsAvailable.get();
}
+ public void addIndexableData(IndexableRef[] array) {
+ synchronized (mUpdateData) {
+ final int count = array.length;
+ for (int n = 0; n < count; n++) {
+ mUpdateData.dataToAdd.add(array[n]);
+ }
+ }
+ }
+
+ public void deleteIndexableData(String[] array) {
+ synchronized (mUpdateData) {
+ final int count = array.length;
+ for (int n = 0; n < count; n++) {
+ mUpdateData.dataToDelete.add(array[n]);
+ }
+ }
+ }
+
+ public boolean update() {
+ synchronized (mUpdateData) {
+ final UpdateIndexTask task = new UpdateIndexTask();
+ task.execute(mUpdateData);
+ try {
+ final boolean result = task.get();
+ mUpdateData.clear();
+ return result;
+ } catch (InterruptedException e) {
+ Log.e(LOG_TAG, "Cannot update index: " + e.getMessage());
+ return false;
+ } catch (ExecutionException e) {
+ Log.e(LOG_TAG, "Cannot update index: " + e.getMessage());
+ return false;
+ }
+ }
+ }
+
public Cursor search(String query) {
final String sql = buildSQL(query);
Log.d(LOG_TAG, "Query: " + sql);
@@ -160,31 +198,6 @@ public class Index {
return sb.toString();
}
- public void addIndexableData(IndexableData[] array) {
- synchronized (mDataToIndex) {
- final int count = array.length;
- for (int n = 0; n < count; n++) {
- mDataToIndex.add(array[n]);
- }
- }
- }
-
- public boolean update() {
- synchronized (mDataToIndex) {
- final IndexTask task = new IndexTask();
- task.execute(mDataToIndex);
- try {
- return task.get();
- } catch (InterruptedException e) {
- Log.e(LOG_TAG, "Cannot update index: " + e.getMessage());
- return false;
- } catch (ExecutionException e) {
- Log.e(LOG_TAG, "Cannot update index: " + e.getMessage());
- return false;
- }
- }
- }
-
private SQLiteDatabase getReadableDatabase() {
return IndexDatabaseHelper.getInstance(mContext).getReadableDatabase();
}
@@ -194,9 +207,27 @@ public class Index {
}
/**
+ * A private class to describe the update data for the Index database
+ */
+ private class UpdateData {
+ public List<IndexableRef> dataToAdd;
+ public List<String> dataToDelete;
+
+ public UpdateData() {
+ dataToAdd = new ArrayList<IndexableRef>();
+ dataToDelete = new ArrayList<String>();
+ }
+
+ public void clear() {
+ dataToAdd.clear();
+ dataToDelete.clear();
+ }
+ }
+
+ /**
* A private class for updating the Index database
*/
- private class IndexTask extends AsyncTask<List<IndexableData>, Integer, Boolean> {
+ private class UpdateIndexTask extends AsyncTask<UpdateData, Integer, Boolean> {
@Override
protected void onPreExecute() {
@@ -211,45 +242,123 @@ public class Index {
}
@Override
- protected Boolean doInBackground(List<IndexableData>... params) {
+ protected Boolean doInBackground(UpdateData... params) {
boolean result = false;
- final List<IndexableData> dataToIndex = params[0];
- if (null == dataToIndex || dataToIndex.size() == 0) {
- return result;
- }
+
+ final List<IndexableRef> dataToAdd = params[0].dataToAdd;
+ final List<String> dataToDelete = params[0].dataToDelete;
final SQLiteDatabase database = getWritableDatabase();
- final Locale locale = Locale.getDefault();
- final String localeStr = locale.toString();
- if (isLocaleAlreadyIndexed(database, locale)) {
- Log.d(LOG_TAG, "Locale '" + localeStr + "' is already indexed");
- return true;
- }
- final long current = System.currentTimeMillis();
+ final String localeStr = Locale.getDefault().toString();
+
try {
database.beginTransaction();
- final int count = mDataToIndex.size();
- for (int n = 0; n < count; n++) {
- final IndexableData data = mDataToIndex.get(n);
- indexFromResource(database, locale, data.xmlResId, data.fragmentName,
- data.iconResId, data.rank);
+ if (dataToAdd.size() > 0) {
+ processDataToAdd(database, localeStr, dataToAdd);
+ }
+ if (dataToDelete.size() > 0) {
+ processDataToDelete(database, localeStr, dataToDelete);
}
database.setTransactionSuccessful();
result = true;
} finally {
database.endTransaction();
}
+ return result;
+ }
+
+ private boolean processDataToDelete(SQLiteDatabase database, String localeStr,
+ List<String> dataToDelete) {
+
+ boolean result = false;
+ final long current = System.currentTimeMillis();
+
+ final int count = dataToDelete.size();
+ for (int n = 0; n < count; n++) {
+ final String data = dataToDelete.get(n);
+ delete(database, data);
+ }
+
+ final long now = System.currentTimeMillis();
+ Log.d(LOG_TAG, "Deleting data for locale '" + localeStr + "' took " +
+ (now - current) + " millis");
+ return result;
+ }
+
+ private boolean processDataToAdd(SQLiteDatabase database, String localeStr,
+ List<IndexableRef> dataToAdd) {
+ if (isLocaleAlreadyIndexed(database, localeStr)) {
+ Log.d(LOG_TAG, "Locale '" + localeStr + "' is already indexed");
+ return true;
+ }
+
+ boolean result = false;
+ final long current = System.currentTimeMillis();
+
+ final int count = dataToAdd.size();
+ for (int n = 0; n < count; n++) {
+ final IndexableRef ref = dataToAdd.get(n);
+ indexOneRef(database, localeStr, ref);
+ }
+
final long now = System.currentTimeMillis();
Log.d(LOG_TAG, "Indexing locale '" + localeStr + "' took " +
(now - current) + " millis");
return result;
}
- private boolean isLocaleAlreadyIndexed(SQLiteDatabase database, Locale locale) {
+ private void indexOneRef(SQLiteDatabase database, String localeStr, IndexableRef ref) {
+ if (ref.xmlResId > 0) {
+ indexFromResource(database, localeStr, ref.xmlResId, ref.fragmentName,
+ ref.iconResId, ref.rank);
+ } else if (!TextUtils.isEmpty(ref.fragmentName)) {
+ indexRawData(database, localeStr, ref);
+ }
+ }
+
+ private void indexRawData(SQLiteDatabase database, String localeStr, IndexableRef ref) {
+ try {
+ final Class<?> clazz = Class.forName(ref.fragmentName);
+ if (Indexable.class.isAssignableFrom(clazz)) {
+ final Field f = clazz.getField("INDEX_DATA_PROVIDER");
+ final Indexable.IndexDataProvider provider =
+ (Indexable.IndexDataProvider) f.get(null);
+
+ final List<IndexableData> data = provider.getRawDataToIndex(mContext);
+
+ final int size = data.size();
+ for (int i = 0; i < size; i++) {
+ IndexableData raw = data.get(i);
+
+ // Should be the same locale as the one we are processing
+ if (!raw.locale.toString().equalsIgnoreCase(localeStr)) {
+ continue;
+ }
+
+ inserOneRowWithFilteredData(database, localeStr,
+ raw.title,
+ raw.summary,
+ ref.fragmentName,
+ raw.fragmentTitle,
+ ref.iconResId,
+ ref.rank,
+ raw.keywords);
+ }
+ }
+ } catch (ClassNotFoundException e) {
+ Log.e(LOG_TAG, "Cannot find class: " + ref.fragmentName, e);
+ } catch (NoSuchFieldException e) {
+ Log.e(LOG_TAG, "Cannot find field 'INDEX_DATA_PROVIDER'", e);
+ } catch (IllegalAccessException e) {
+ Log.e(LOG_TAG, "Illegal access to field 'INDEX_DATA_PROVIDER'", e);
+ }
+ }
+
+ private boolean isLocaleAlreadyIndexed(SQLiteDatabase database, String locale) {
Cursor cursor = null;
boolean result = false;
final StringBuilder sb = new StringBuilder(IndexColumns.LOCALE);
sb.append(" = ");
- DatabaseUtils.appendEscapedSQLString(sb, locale.toString());
+ DatabaseUtils.appendEscapedSQLString(sb, locale);
try {
// We care only for 1 row
cursor = database.query(Tables.TABLE_PREFS_INDEX, null,
@@ -264,10 +373,9 @@ public class Index {
return result;
}
- private void indexFromResource(SQLiteDatabase database, Locale locale, int xmlResId,
+ private void indexFromResource(SQLiteDatabase database, String localeStr, int xmlResId,
String fragmentName, int iconResId, int rank) {
XmlResourceParser parser = null;
- final String localeStr = locale.toString();
try {
parser = mContext.getResources().getXml(xmlResId);
@@ -373,6 +481,13 @@ public class Index {
database.insertOrThrow(Tables.TABLE_PREFS_INDEX, null, values);
}
+ private int delete(SQLiteDatabase database, String title) {
+ final String whereClause = IndexColumns.DATA_TITLE + "=?";
+ final String[] whereArgs = new String[] { title };
+
+ return database.delete(Tables.TABLE_PREFS_INDEX, whereClause, whereArgs);
+ }
+
private String getDataTitle(AttributeSet attrs) {
return getData(attrs,
com.android.internal.R.styleable.Preference,
diff --git a/src/com/android/settings/indexer/Indexable.java b/src/com/android/settings/indexer/Indexable.java
new file mode 100644
index 000000000..1b29b75e3
--- /dev/null
+++ b/src/com/android/settings/indexer/Indexable.java
@@ -0,0 +1,52 @@
+/*
+ * 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.indexer;
+
+import android.content.Context;
+
+import java.util.List;
+
+/**
+ * Interface for classes whose instances can provide data for indexing.
+ *
+ * Classes implementing the Indexable interface must have a static field called
+ * <code>INDEX_DATA_PROVIDER</code>, which is an object implementing the
+ * {@link Indexable.IndexDataProvider Indexable.IndexDataProvider} interface.
+ *
+ * See {@link IndexableRef} and {@link IndexableData}.
+ *
+ */
+public interface Indexable {
+
+ public interface IndexDataProvider {
+ /**
+ * Return a list of references for indexing. See {@link IndexableRef}
+ *
+ * @param context the context
+ * @return a list of {@link IndexableRef} references. Can be null.
+ */
+ List<IndexableRef> getRefsToIndex(Context context);
+
+ /**
+ * Return a list of raw data for indexing. See {@link IndexableData}
+ *
+ * @param context the context
+ * @return a list of {@link IndexableData} references. Can be null.
+ */
+ List<IndexableData> getRawDataToIndex(Context context);
+ }
+}
diff --git a/src/com/android/settings/indexer/IndexableData.java b/src/com/android/settings/indexer/IndexableData.java
index 61714a28b..ca388dede 100644
--- a/src/com/android/settings/indexer/IndexableData.java
+++ b/src/com/android/settings/indexer/IndexableData.java
@@ -16,17 +16,30 @@
package com.android.settings.indexer;
+import java.util.Locale;
+
+/**
+ * Indexable Data.
+ *
+ * This is the raw data used by the Indexer and should match its data model.
+ *
+ * See {@link Indexable} and {@link IndexableRef}.
+ */
public class IndexableData {
- public int rank;
- public int xmlResId;
- public String fragmentName;
- public int iconResId;
+ public Locale locale;
+
+ public String title;
+ public String summary;
+ public String keywords;
+
+ public String intentAction;
+ public String intentTargetPackage;
+ public String intentTargetClass;
+
+ public String fragmentTitle;
- public IndexableData(int rank, int dataResId, String name, int iconResId) {
- this.rank = rank;
- this.xmlResId = dataResId;
- this.fragmentName = name;
- this.iconResId = iconResId;
+ public IndexableData() {
+ locale = Locale.getDefault();
}
-} \ No newline at end of file
+}
diff --git a/src/com/android/settings/indexer/IndexableRef.java b/src/com/android/settings/indexer/IndexableRef.java
new file mode 100644
index 000000000..c1ebcca63
--- /dev/null
+++ b/src/com/android/settings/indexer/IndexableRef.java
@@ -0,0 +1,46 @@
+/*
+ * 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.indexer;
+
+/**
+ * Indexable Reference.
+ *
+ * This class wraps a set of information representing data that can be indexed for a high
+ * level (see {@link android.preference.PreferenceScreen}).
+ *
+ * rank: is the rank of the data (basically its order in the list of Settings)
+ * xmlResId: is the resource Id of a PreferenceScreen xml file
+ * fragmentName: is the fragment class name associated with the data
+ * iconRedId: is the resource Id of an icon that represents the data
+ *
+ * See {@link Indexable} and {@link IndexableData}.
+ *
+ */
+public class IndexableRef {
+
+ public int rank;
+ public int xmlResId;
+ public String fragmentName;
+ public int iconResId;
+
+ public IndexableRef(int rank, int dataResId, String name, int iconResId) {
+ this.rank = rank;
+ this.xmlResId = dataResId;
+ this.fragmentName = name;
+ this.iconResId = iconResId;
+ }
+} \ No newline at end of file
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 41a4905b3..2ee73b5b0 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -23,6 +23,9 @@ import android.preference.PreferenceActivity;
import com.android.settings.R;
import com.android.settings.RestrictedSettingsFragment;
import com.android.settings.SettingsActivity;
+import com.android.settings.indexer.Indexable;
+import com.android.settings.indexer.IndexableData;
+import com.android.settings.indexer.IndexableRef;
import com.android.settings.wifi.p2p.WifiP2pSettings;
import android.app.ActionBar;
@@ -90,7 +93,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
* and menus.
*/
public class WifiSettings extends RestrictedSettingsFragment
- implements DialogInterface.OnClickListener {
+ implements DialogInterface.OnClickListener, Indexable {
private static final String TAG = "WifiSettings";
private static final int MENU_ID_WPS_PBC = Menu.FIRST;
private static final int MENU_ID_WPS_PIN = Menu.FIRST + 1;
@@ -742,7 +745,8 @@ public class WifiSettings extends RestrictedSettingsFragment
switch (wifiState) {
case WifiManager.WIFI_STATE_ENABLED:
// AccessPoints are automatically sorted with TreeSet.
- final Collection<AccessPoint> accessPoints = constructAccessPoints();
+ final Collection<AccessPoint> accessPoints =
+ constructAccessPoints(getActivity(), mWifiManager, mLastInfo, mLastState);
getPreferenceScreen().removeAll();
if(accessPoints.size() == 0) {
addMessagePreference(R.string.wifi_empty_list_wifi_on);
@@ -792,23 +796,26 @@ public class WifiSettings extends RestrictedSettingsFragment
}
/** Returns sorted list of access points */
- private List<AccessPoint> constructAccessPoints() {
+ private static List<AccessPoint> constructAccessPoints(Context context,
+ WifiManager wifiManager, WifiInfo lastInfo, DetailedState lastState) {
ArrayList<AccessPoint> accessPoints = new ArrayList<AccessPoint>();
/** Lookup table to more quickly update AccessPoints by only considering objects with the
* correct SSID. Maps SSID -> List of AccessPoints with the given SSID. */
Multimap<String, AccessPoint> apMap = new Multimap<String, AccessPoint>();
- final List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks();
+ final List<WifiConfiguration> configs = wifiManager.getConfiguredNetworks();
if (configs != null) {
for (WifiConfiguration config : configs) {
- AccessPoint accessPoint = new AccessPoint(getActivity(), config);
- accessPoint.update(mLastInfo, mLastState);
+ AccessPoint accessPoint = new AccessPoint(context, config);
+ if (lastInfo != null && lastState != null) {
+ accessPoint.update(lastInfo, lastState);
+ }
accessPoints.add(accessPoint);
apMap.put(accessPoint.ssid, accessPoint);
}
}
- final List<ScanResult> results = mWifiManager.getScanResults();
+ final List<ScanResult> results = wifiManager.getScanResults();
if (results != null) {
for (ScanResult result : results) {
// Ignore hidden and ad-hoc networks.
@@ -823,7 +830,7 @@ public class WifiSettings extends RestrictedSettingsFragment
found = true;
}
if (!found) {
- AccessPoint accessPoint = new AccessPoint(getActivity(), result);
+ AccessPoint accessPoint = new AccessPoint(context, result);
accessPoints.add(accessPoint);
apMap.put(accessPoint.ssid, accessPoint);
}
@@ -836,7 +843,7 @@ public class WifiSettings extends RestrictedSettingsFragment
}
/** A restricted multimap for use in constructAccessPoints */
- private class Multimap<K,V> {
+ private static class Multimap<K,V> {
private final HashMap<K,List<V>> store = new HashMap<K,List<V>>();
/** retrieve a non-null list of values with key K */
List<V> getAll(K key) {
@@ -1152,4 +1159,38 @@ public class WifiSettings extends RestrictedSettingsFragment
}
}
+ public static final Indexable.IndexDataProvider INDEX_DATA_PROVIDER =
+ new Indexable.IndexDataProvider() {
+ @Override
+ public List<IndexableRef> getRefsToIndex(Context context) {
+ return null;
+ }
+
+ @Override
+ public List<IndexableData> getRawDataToIndex(Context context) {
+ final List<IndexableData> result = new ArrayList<IndexableData>();
+
+ // Add fragment title
+ IndexableData data = new IndexableData();
+ data.title = context.getResources().getString(R.string.wifi_settings);
+ data.fragmentTitle = context.getResources().getString(R.string.wifi_settings);
+ result.add(data);
+
+ // Add available Wi-Fi access points
+ WifiManager wifiManager =
+ (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
+ final Collection<AccessPoint> accessPoints =
+ constructAccessPoints(context, wifiManager, null, null);
+ for (AccessPoint accessPoint : accessPoints) {
+ // We are indexing only the saved Wi-Fi networks.
+ if (accessPoint.getConfig() == null) continue;
+ data = new IndexableData();
+ data.title = accessPoint.getTitle().toString();
+ data.fragmentTitle = context.getResources().getString(R.string.wifi_settings);
+ result.add(data);
+ }
+
+ return result;
+ }
+ };
}