Loading src/com/android/settings/nfc/NfcPreferenceController.java +1 −2 Original line number Diff line number Diff line Loading @@ -44,7 +44,6 @@ public class NfcPreferenceController extends PreferenceController private NfcEnabler mNfcEnabler; private NfcAdapter mNfcAdapter; private final Handler mHandler = new Handler(); private int mAirplaneMode; private AirplaneModeObserver mAirplaneModeObserver; private SwitchPreference mNfcPreference; Loading Loading @@ -146,7 +145,7 @@ public class NfcPreferenceController extends PreferenceController Settings.Global.getUriFor(Settings.Global.AIRPLANE_MODE_ON); private AirplaneModeObserver() { super(mHandler); super(new Handler()); } public void register() { Loading src/com/android/settings/search/SearchIndexableResources.java +2 −1 Original line number Diff line number Diff line Loading @@ -88,7 +88,8 @@ public final class SearchIndexableResources { @XmlRes public static final int NO_DATA_RES_ID = 0; private static final HashMap<String, SearchIndexableResource> sResMap = new HashMap<>(); @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) static final HashMap<String, SearchIndexableResource> sResMap = new HashMap<>(); @VisibleForTesting static void addIndex(Class<?> indexClass, @XmlRes int xmlResId, Loading src/com/android/settings/search/SettingsSearchIndexablesProvider.java +45 −2 Original line number Diff line number Diff line Loading @@ -16,13 +16,20 @@ package com.android.settings.search; import android.content.Context; import android.database.Cursor; import android.database.MatrixCursor; import android.provider.SearchIndexableResource; import android.provider.SearchIndexablesProvider; import android.util.Log; import com.android.settings.search2.DatabaseIndexingUtils; import java.util.Collection; import java.util.HashSet; import java.util.List; import static android.provider.SearchIndexablesContract.COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE; import static android.provider.SearchIndexablesContract.COLUMN_INDEX_XML_RES_CLASS_NAME; import static android.provider.SearchIndexablesContract.COLUMN_INDEX_XML_RES_ICON_RESID; import static android.provider.SearchIndexablesContract.COLUMN_INDEX_XML_RES_INTENT_ACTION; Loading @@ -35,7 +42,7 @@ import static android.provider.SearchIndexablesContract.INDEXABLES_XML_RES_COLUM import static android.provider.SearchIndexablesContract.NON_INDEXABLES_KEYS_COLUMNS; public class SettingsSearchIndexablesProvider extends SearchIndexablesProvider { private static final String TAG = "SettingsSearchIndexablesProvider"; private static final String TAG = "SettingsSearchProvider"; @Override public boolean onCreate() { Loading @@ -47,7 +54,7 @@ public class SettingsSearchIndexablesProvider extends SearchIndexablesProvider { MatrixCursor cursor = new MatrixCursor(INDEXABLES_XML_RES_COLUMNS); Collection<SearchIndexableResource> values = SearchIndexableResources.values(); for (SearchIndexableResource val : values) { Object[] ref = new Object[7]; Object[] ref = new Object[INDEXABLES_XML_RES_COLUMNS.length]; ref[COLUMN_INDEX_XML_RES_RANK] = val.rank; ref[COLUMN_INDEX_XML_RES_RESID] = val.xmlResId; ref[COLUMN_INDEX_XML_RES_CLASS_NAME] = val.className; Loading @@ -66,9 +73,45 @@ public class SettingsSearchIndexablesProvider extends SearchIndexablesProvider { return result; } /** * Gets a combined list non-indexable keys that come from providers inside of settings. * The non-indexable keys are used in Settings search at both index and update time to verify * the validity of results in the database. */ @Override public Cursor queryNonIndexableKeys(String[] projection) { MatrixCursor cursor = new MatrixCursor(NON_INDEXABLES_KEYS_COLUMNS); final Collection<String> values = new HashSet<>(); final Context context = getContext(); for (SearchIndexableResource sir : SearchIndexableResources.values()) { final Class<?> clazz = DatabaseIndexingUtils.getIndexableClass(sir.className); if (clazz == null) { Log.d(TAG, "SearchIndexableResource '" + sir.className + "' should implement the " + Indexable.class.getName() + " interface!"); continue; } final Indexable.SearchIndexProvider provider = DatabaseIndexingUtils.getSearchIndexProvider(clazz); if (provider == null) { Log.d(TAG, "Unable to get SearchIndexableProvider from " + Indexable.class.getName()); continue; } List<String> providerNonIndexableKeys = provider.getNonIndexableKeys(context); if (providerNonIndexableKeys != null && providerNonIndexableKeys.size() > 0) { values.addAll(providerNonIndexableKeys); } } for (String nik : values) { final Object[] ref = new Object[NON_INDEXABLES_KEYS_COLUMNS.length]; ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] = nik; cursor.addRow(ref); } return cursor; } } tests/robotests/src/com/android/settings/search/FakeIndexProvider.java 0 → 100644 +52 −0 Original line number Diff line number Diff line /* * 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.search; import android.content.Context; import android.provider.SearchIndexableResource; import com.android.settings.core.PreferenceController; import java.util.ArrayList; import java.util.List; public class FakeIndexProvider implements Indexable { public static final String KEY = "TestKey"; public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = new BaseSearchIndexProvider() { @Override public List<SearchIndexableResource> getXmlResourcesToIndex(Context context, boolean enabled) { return null; } @Override public List<String> getNonIndexableKeys(Context context) { ArrayList<String> result = new ArrayList<>(); result.add(KEY); return result; } @Override public List<PreferenceController> getPreferenceControllers(Context context) { return null; } }; } tests/robotests/src/com/android/settings/search/SearchIndexableResourcesTest.java +29 −0 Original line number Diff line number Diff line Loading @@ -16,14 +16,20 @@ package com.android.settings.search; import static android.provider.SearchIndexablesContract.COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE; import static com.android.settings.search.SearchIndexableResources.NO_DATA_RES_ID; import static com.android.settings.search.SearchIndexableResources.sResMap; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import android.annotation.DrawableRes; import android.annotation.XmlRes; import android.database.Cursor; import android.provider.SearchIndexableResource; import android.text.TextUtils; import com.android.settings.R; import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; Loading @@ -31,8 +37,11 @@ import com.android.settings.wifi.WifiSettings; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import java.util.HashMap; @RunWith(SettingsRobolectricTestRunner.class) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) public class SearchIndexableResourcesTest { Loading Loading @@ -72,4 +81,24 @@ public class SearchIndexableResourcesTest { assertThat(index.xmlResId).isEqualTo(NO_DATA_RES_ID); assertThat(index.iconResId).isEqualTo(R.drawable.ic_settings_wireless); } @Test public void testNonIndexableKeys_GetsKeyFromProvider() { SearchIndexableResources.sResMap.clear(); SearchIndexableResources.addIndex(FakeIndexProvider.class, 0, 0); SettingsSearchIndexablesProvider provider = spy(new SettingsSearchIndexablesProvider()); Cursor cursor = provider.queryNonIndexableKeys(null); boolean hasTestKey = false; while(cursor.moveToNext()) { String key = cursor.getString(COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE); if (TextUtils.equals(key, FakeIndexProvider.KEY)) { hasTestKey = true; break; } } assertThat(hasTestKey).isTrue(); } } Loading
src/com/android/settings/nfc/NfcPreferenceController.java +1 −2 Original line number Diff line number Diff line Loading @@ -44,7 +44,6 @@ public class NfcPreferenceController extends PreferenceController private NfcEnabler mNfcEnabler; private NfcAdapter mNfcAdapter; private final Handler mHandler = new Handler(); private int mAirplaneMode; private AirplaneModeObserver mAirplaneModeObserver; private SwitchPreference mNfcPreference; Loading Loading @@ -146,7 +145,7 @@ public class NfcPreferenceController extends PreferenceController Settings.Global.getUriFor(Settings.Global.AIRPLANE_MODE_ON); private AirplaneModeObserver() { super(mHandler); super(new Handler()); } public void register() { Loading
src/com/android/settings/search/SearchIndexableResources.java +2 −1 Original line number Diff line number Diff line Loading @@ -88,7 +88,8 @@ public final class SearchIndexableResources { @XmlRes public static final int NO_DATA_RES_ID = 0; private static final HashMap<String, SearchIndexableResource> sResMap = new HashMap<>(); @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) static final HashMap<String, SearchIndexableResource> sResMap = new HashMap<>(); @VisibleForTesting static void addIndex(Class<?> indexClass, @XmlRes int xmlResId, Loading
src/com/android/settings/search/SettingsSearchIndexablesProvider.java +45 −2 Original line number Diff line number Diff line Loading @@ -16,13 +16,20 @@ package com.android.settings.search; import android.content.Context; import android.database.Cursor; import android.database.MatrixCursor; import android.provider.SearchIndexableResource; import android.provider.SearchIndexablesProvider; import android.util.Log; import com.android.settings.search2.DatabaseIndexingUtils; import java.util.Collection; import java.util.HashSet; import java.util.List; import static android.provider.SearchIndexablesContract.COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE; import static android.provider.SearchIndexablesContract.COLUMN_INDEX_XML_RES_CLASS_NAME; import static android.provider.SearchIndexablesContract.COLUMN_INDEX_XML_RES_ICON_RESID; import static android.provider.SearchIndexablesContract.COLUMN_INDEX_XML_RES_INTENT_ACTION; Loading @@ -35,7 +42,7 @@ import static android.provider.SearchIndexablesContract.INDEXABLES_XML_RES_COLUM import static android.provider.SearchIndexablesContract.NON_INDEXABLES_KEYS_COLUMNS; public class SettingsSearchIndexablesProvider extends SearchIndexablesProvider { private static final String TAG = "SettingsSearchIndexablesProvider"; private static final String TAG = "SettingsSearchProvider"; @Override public boolean onCreate() { Loading @@ -47,7 +54,7 @@ public class SettingsSearchIndexablesProvider extends SearchIndexablesProvider { MatrixCursor cursor = new MatrixCursor(INDEXABLES_XML_RES_COLUMNS); Collection<SearchIndexableResource> values = SearchIndexableResources.values(); for (SearchIndexableResource val : values) { Object[] ref = new Object[7]; Object[] ref = new Object[INDEXABLES_XML_RES_COLUMNS.length]; ref[COLUMN_INDEX_XML_RES_RANK] = val.rank; ref[COLUMN_INDEX_XML_RES_RESID] = val.xmlResId; ref[COLUMN_INDEX_XML_RES_CLASS_NAME] = val.className; Loading @@ -66,9 +73,45 @@ public class SettingsSearchIndexablesProvider extends SearchIndexablesProvider { return result; } /** * Gets a combined list non-indexable keys that come from providers inside of settings. * The non-indexable keys are used in Settings search at both index and update time to verify * the validity of results in the database. */ @Override public Cursor queryNonIndexableKeys(String[] projection) { MatrixCursor cursor = new MatrixCursor(NON_INDEXABLES_KEYS_COLUMNS); final Collection<String> values = new HashSet<>(); final Context context = getContext(); for (SearchIndexableResource sir : SearchIndexableResources.values()) { final Class<?> clazz = DatabaseIndexingUtils.getIndexableClass(sir.className); if (clazz == null) { Log.d(TAG, "SearchIndexableResource '" + sir.className + "' should implement the " + Indexable.class.getName() + " interface!"); continue; } final Indexable.SearchIndexProvider provider = DatabaseIndexingUtils.getSearchIndexProvider(clazz); if (provider == null) { Log.d(TAG, "Unable to get SearchIndexableProvider from " + Indexable.class.getName()); continue; } List<String> providerNonIndexableKeys = provider.getNonIndexableKeys(context); if (providerNonIndexableKeys != null && providerNonIndexableKeys.size() > 0) { values.addAll(providerNonIndexableKeys); } } for (String nik : values) { final Object[] ref = new Object[NON_INDEXABLES_KEYS_COLUMNS.length]; ref[COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE] = nik; cursor.addRow(ref); } return cursor; } }
tests/robotests/src/com/android/settings/search/FakeIndexProvider.java 0 → 100644 +52 −0 Original line number Diff line number Diff line /* * 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.search; import android.content.Context; import android.provider.SearchIndexableResource; import com.android.settings.core.PreferenceController; import java.util.ArrayList; import java.util.List; public class FakeIndexProvider implements Indexable { public static final String KEY = "TestKey"; public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = new BaseSearchIndexProvider() { @Override public List<SearchIndexableResource> getXmlResourcesToIndex(Context context, boolean enabled) { return null; } @Override public List<String> getNonIndexableKeys(Context context) { ArrayList<String> result = new ArrayList<>(); result.add(KEY); return result; } @Override public List<PreferenceController> getPreferenceControllers(Context context) { return null; } }; }
tests/robotests/src/com/android/settings/search/SearchIndexableResourcesTest.java +29 −0 Original line number Diff line number Diff line Loading @@ -16,14 +16,20 @@ package com.android.settings.search; import static android.provider.SearchIndexablesContract.COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE; import static com.android.settings.search.SearchIndexableResources.NO_DATA_RES_ID; import static com.android.settings.search.SearchIndexableResources.sResMap; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import android.annotation.DrawableRes; import android.annotation.XmlRes; import android.database.Cursor; import android.provider.SearchIndexableResource; import android.text.TextUtils; import com.android.settings.R; import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; Loading @@ -31,8 +37,11 @@ import com.android.settings.wifi.WifiSettings; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import java.util.HashMap; @RunWith(SettingsRobolectricTestRunner.class) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) public class SearchIndexableResourcesTest { Loading Loading @@ -72,4 +81,24 @@ public class SearchIndexableResourcesTest { assertThat(index.xmlResId).isEqualTo(NO_DATA_RES_ID); assertThat(index.iconResId).isEqualTo(R.drawable.ic_settings_wireless); } @Test public void testNonIndexableKeys_GetsKeyFromProvider() { SearchIndexableResources.sResMap.clear(); SearchIndexableResources.addIndex(FakeIndexProvider.class, 0, 0); SettingsSearchIndexablesProvider provider = spy(new SettingsSearchIndexablesProvider()); Cursor cursor = provider.queryNonIndexableKeys(null); boolean hasTestKey = false; while(cursor.moveToNext()) { String key = cursor.getString(COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE); if (TextUtils.equals(key, FakeIndexProvider.KEY)) { hasTestKey = true; break; } } assertThat(hasTestKey).isTrue(); } }