Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c5e1fc67 authored by Raff Tsai's avatar Raff Tsai
Browse files

Integrated SearchIndexableResources interface in Settings

- New SearchIndexableResources interface returns SearchIndexableBundle,
we don't need reflection to get SearchIndexableProvider

Bug: 135053028
Test: robolectric, check database search_index.db items
Change-Id: I5ed3416ccf72ef3d38db817fcb4aff7502649ed4
parent cdaa5774
Loading
Loading
Loading
Loading
+26 −29
Original line number Diff line number Diff line
@@ -68,6 +68,7 @@ import com.android.settings.slices.SettingsSliceProvider;
import com.android.settingslib.drawer.DashboardCategory;
import com.android.settingslib.drawer.Tile;
import com.android.settingslib.search.Indexable;
import com.android.settingslib.search.SearchIndexableData;
import com.android.settingslib.search.SearchIndexableRaw;

import java.util.ArrayList;
@@ -260,14 +261,14 @@ public class SettingsSearchIndexablesProvider extends SearchIndexablesProvider {
    }

    private List<String> getNonIndexableKeysFromProvider(Context context) {
        final Collection<Class> values = getIndexableProviderValues(context);
        final Collection<SearchIndexableData> bundles = FeatureFactory.getFactory(context)
                .getSearchFeatureProvider().getSearchIndexableResources().getProviderValues();

        final List<String> nonIndexableKeys = new ArrayList<>();

        for (Class<?> clazz : values) {
        for (SearchIndexableData bundle : bundles) {
            final long startTime = System.currentTimeMillis();
            final Indexable.SearchIndexProvider provider =
                    DatabaseIndexingUtils.getSearchIndexProvider(clazz);

            Indexable.SearchIndexProvider provider = bundle.getSearchIndexProvider();
            List<String> providerNonIndexableKeys;
            try {
                providerNonIndexableKeys = provider.getNonIndexableKeys(context);
@@ -281,7 +282,8 @@ public class SettingsSearchIndexablesProvider extends SearchIndexablesProvider {
                if (System.getProperty(SYSPROP_CRASH_ON_ERROR) != null) {
                    throw new RuntimeException(e);
                }
                Log.e(TAG, "Error trying to get non-indexable keys from: " + clazz.getName(), e);
                Log.e(TAG, "Error trying to get non-indexable keys from: "
                        + bundle.getTargetClass().getName(), e);
                continue;
            }

@@ -310,12 +312,12 @@ public class SettingsSearchIndexablesProvider extends SearchIndexablesProvider {
    }

    private List<SearchIndexableResource> getSearchIndexableResourcesFromProvider(Context context) {
        final Collection<Class> values = getIndexableProviderValues(context);
        final List<SearchIndexableResource> resourceList = new ArrayList<>();
        final Collection<SearchIndexableData> bundles = FeatureFactory.getFactory(context)
                .getSearchFeatureProvider().getSearchIndexableResources().getProviderValues();
        List<SearchIndexableResource> resourceList = new ArrayList<>();

        for (Class<?> clazz : values) {
            final Indexable.SearchIndexProvider provider =
                    DatabaseIndexingUtils.getSearchIndexProvider(clazz);
        for (SearchIndexableData bundle : bundles) {
            Indexable.SearchIndexProvider provider = bundle.getSearchIndexProvider();
            final List<SearchIndexableResource> resList =
                    provider.getXmlResourcesToIndex(context, true);

@@ -325,7 +327,7 @@ public class SettingsSearchIndexablesProvider extends SearchIndexablesProvider {

            for (SearchIndexableResource item : resList) {
                item.className = TextUtils.isEmpty(item.className)
                        ? clazz.getName()
                        ? bundle.getTargetClass().getName()
                        : item.className;
            }

@@ -336,14 +338,14 @@ public class SettingsSearchIndexablesProvider extends SearchIndexablesProvider {
    }

    private List<SearchIndexableRaw> getSearchIndexableRawFromProvider(Context context) {
        final Collection<Class> values = getIndexableProviderValues(context);
        final Collection<SearchIndexableData> bundles = FeatureFactory.getFactory(context)
                .getSearchFeatureProvider().getSearchIndexableResources().getProviderValues();
        final List<SearchIndexableRaw> rawList = new ArrayList<>();

        for (Class<?> clazz : values) {
            final Indexable.SearchIndexProvider provider =
                    DatabaseIndexingUtils.getSearchIndexProvider(clazz);
            final List<SearchIndexableRaw> providerRaws =
                    provider.getRawDataToIndex(context, true /* enabled */);
        for (SearchIndexableData bundle : bundles) {
            Indexable.SearchIndexProvider provider = bundle.getSearchIndexProvider();
            final List<SearchIndexableRaw> providerRaws = provider.getRawDataToIndex(context,
                    true /* enabled */);

            if (providerRaws == null) {
                continue;
@@ -352,7 +354,7 @@ public class SettingsSearchIndexablesProvider extends SearchIndexablesProvider {
            for (SearchIndexableRaw raw : providerRaws) {
                // The classname and intent information comes from the PreIndexData
                // This will be more clear when provider conversion is done at PreIndex time.
                raw.className = clazz.getName();
                raw.className = bundle.getTargetClass().getName();

            }
            rawList.addAll(providerRaws);
@@ -362,12 +364,12 @@ public class SettingsSearchIndexablesProvider extends SearchIndexablesProvider {
    }

    private List<SearchIndexableRaw> getDynamicSearchIndexableRawFromProvider(Context context) {
        final Collection<Class> values = getIndexableProviderValues(context);
        final Collection<SearchIndexableData> bundles = FeatureFactory.getFactory(context)
                .getSearchFeatureProvider().getSearchIndexableResources().getProviderValues();
        final List<SearchIndexableRaw> rawList = new ArrayList<>();

        for (Class<?> clazz : values) {
            final Indexable.SearchIndexProvider provider =
                    DatabaseIndexingUtils.getSearchIndexProvider(clazz);
        for (SearchIndexableData bundle : bundles) {
            final Indexable.SearchIndexProvider provider = bundle.getSearchIndexProvider();
            final List<SearchIndexableRaw> providerRaws =
                    provider.getDynamicRawDataToIndex(context, true /* enabled */);

@@ -378,7 +380,7 @@ public class SettingsSearchIndexablesProvider extends SearchIndexablesProvider {
            for (SearchIndexableRaw raw : providerRaws) {
                // The classname and intent information comes from the PreIndexData
                // This will be more clear when provider conversion is done at PreIndex time.
                raw.className = clazz.getName();
                raw.className = bundle.getTargetClass().getName();

            }
            rawList.addAll(providerRaws);
@@ -410,9 +412,4 @@ public class SettingsSearchIndexablesProvider extends SearchIndexablesProvider {

        return rawList;
    }

    private Collection<Class> getIndexableProviderValues(Context context) {
        return FeatureFactory.getFactory(context)
                .getSearchFeatureProvider().getSearchIndexableResources().getProviderValues();
    }
}
+6 −7
Original line number Diff line number Diff line
@@ -53,9 +53,9 @@ import com.android.settings.core.PreferenceXmlParserUtils;
import com.android.settings.core.PreferenceXmlParserUtils.MetadataFlag;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.search.DatabaseIndexingUtils;
import com.android.settingslib.search.Indexable.SearchIndexProvider;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.search.Indexable.SearchIndexProvider;
import com.android.settingslib.search.SearchIndexableData;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
@@ -101,14 +101,13 @@ class SliceDataConverter {
    public List<SliceData> getSliceData() {
        List<SliceData> sliceData = new ArrayList<>();

        final Collection<Class> indexableClasses = FeatureFactory.getFactory(mContext)
        final Collection<SearchIndexableData> bundles = FeatureFactory.getFactory(mContext)
                .getSearchFeatureProvider().getSearchIndexableResources().getProviderValues();

        for (Class clazz : indexableClasses) {
            final String fragmentName = clazz.getName();
        for (SearchIndexableData bundle : bundles) {
            final String fragmentName = bundle.getTargetClass().getName();

            final SearchIndexProvider provider = DatabaseIndexingUtils.getSearchIndexProvider(
                    clazz);
            final SearchIndexProvider provider = bundle.getSearchIndexProvider();

            // CodeInspection test guards against the null check. Keep check in case of bad actors.
            if (provider == null) {
+4 −10
Original line number Diff line number Diff line
@@ -10,12 +10,11 @@ import android.util.AttributeSet;
import android.util.Xml;

import com.android.settings.R;
import com.android.settings.search.DatabaseIndexingUtils;
import com.android.settings.search.SearchFeatureProvider;
import com.android.settings.search.SearchFeatureProviderImpl;
import com.android.settings.security.SecuritySettings;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settingslib.search.Indexable;
import com.android.settingslib.search.SearchIndexableData;

import org.junit.Before;
import org.junit.Test;
@@ -35,9 +34,6 @@ import java.util.Set;
@RunWith(RobolectricTestRunner.class)
public class XmlControllerAttributeTest {

    // List of classes that are too hard to mock in order to retrieve xml information.
    private final List<Class> illegalClasses = Arrays.asList(SecuritySettings.class);

    // List of XML that could be retrieved from the illegalClasses list.
    private final List<Integer> whitelistXml = Arrays.asList(R.xml.security_dashboard_settings);

@@ -112,14 +108,12 @@ public class XmlControllerAttributeTest {
    private Set<Integer> getIndexableXml() {
        Set<Integer> xmlResSet = new HashSet<>();

        Collection<Class> indexableClasses =
        Collection<SearchIndexableData> SearchIndexableDatas =
                mSearchProvider.getSearchIndexableResources().getProviderValues();
        indexableClasses.removeAll(illegalClasses);

        for (Class clazz : indexableClasses) {
        for (SearchIndexableData bundle : SearchIndexableDatas) {

            Indexable.SearchIndexProvider provider =
                DatabaseIndexingUtils.getSearchIndexProvider(clazz);
            Indexable.SearchIndexProvider provider = bundle.getSearchIndexProvider();

            if (provider == null) {
                continue;
+5 −6
Original line number Diff line number Diff line
@@ -12,7 +12,6 @@
 * 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;
@@ -41,13 +40,13 @@ public class DatabaseIndexingUtils {
        } catch (NoSuchFieldException e) {
            Log.d(TAG, "Cannot find field '" + FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER + "'");
        } catch (SecurityException se) {
            Log.d(TAG, "Security exception for field '" +
                    FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER + "'");
            Log.d(TAG,
                    "Security exception for field '" + FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER + "'");
        } catch (IllegalAccessException e) {
            Log.d(TAG, "Illegal access to field '" + FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER + "'");
        } catch (IllegalArgumentException e) {
            Log.d(TAG, "Illegal argument when accessing field '" +
                    FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER + "'");
            Log.d(TAG, "Illegal argument when accessing field '"
                    + FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER + "'");
        }
        return null;
    }
+10 −3
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.core.codeinspection.CodeInspector;
import com.android.settings.dashboard.DashboardFragmentSearchIndexProviderInspector;
import com.android.settingslib.search.Indexable;
import com.android.settingslib.search.SearchIndexableData;
import com.android.settingslib.search.SearchIndexableResources;

import org.robolectric.RuntimeEnvironment;
@@ -79,6 +80,13 @@ public class SearchIndexProviderCodeInspector extends CodeInspector {
        final Set<String> notInSearchProviderRegistry = new ArraySet<>();
        final Set<String> notSharingPreferenceControllers = new ArraySet<>();
        final Set<String> notProvidingValidResource = new ArraySet<>();
        final Set<Class> providerClasses = new ArraySet<>();

        final SearchFeatureProvider provider = new SearchFeatureProviderImpl();
        for (SearchIndexableData bundle :
                provider.getSearchIndexableResources().getProviderValues()) {
            providerClasses.add(bundle.getTargetClass());
        }

        for (Class clazz : mClasses) {
            if (!isConcreteSettingsClass(clazz)) {
@@ -108,8 +116,7 @@ public class SearchIndexProviderCodeInspector extends CodeInspector {
                continue;
            }
            // Must be in SearchProviderRegistry
            SearchFeatureProvider provider = new SearchFeatureProviderImpl();
            if (!provider.getSearchIndexableResources().getProviderValues().contains(clazz)) {
            if (!providerClasses.contains(clazz)) {
                if (!notInSearchIndexableRegistryGrandfatherList.remove(className)) {
                    notInSearchProviderRegistry.add(className);
                }
Loading