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

Commit d9d57be2 authored by Raff Tsai's avatar Raff Tsai Committed by Android (Google) Code Review
Browse files

Merge "Fix Settings crash when clicking search bar"

parents dda5cbad a75a724b
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ import android.text.TextUtils;
import android.util.ArraySet;

import com.android.internal.telephony.SmsApplication;
import com.android.settings.R;

import java.util.ArrayList;
import java.util.List;
@@ -138,6 +139,9 @@ public class ApplicationFeatureProviderImpl implements ApplicationFeatureProvide
        if (defaultSms != null) {
            keepEnabledPackages.add(defaultSms.getPackageName());
        }
        // Keep Settings intelligence enabled, otherwise search feature will be disabled.
        keepEnabledPackages.add(
                mContext.getString(R.string.config_settingsintelligence_package_name));
        return keepEnabledPackages;
    }

+6 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.provider.Settings;
import android.view.View;
import android.view.ViewGroup;
@@ -88,6 +89,11 @@ public interface SearchFeatureProvider {
            intent.setPackage(getSettingsIntelligencePkgName(activity));
            final Context context = activity.getApplicationContext();

            if (activity.getPackageManager().queryIntentActivities(intent,
                    PackageManager.MATCH_DEFAULT_ONLY).isEmpty()) {
                return;
            }

            FeatureFactory.getFactory(context).getSlicesFeatureProvider()
                    .indexSliceDataAsync(activity.getApplicationContext());
            FeatureFactory.getFactory(context).getMetricsFeatureProvider()
+7 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.settings.search.actionbar;
import android.annotation.NonNull;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
@@ -80,6 +81,12 @@ public class SearchMenuController implements LifecycleObserver, OnCreateOptionsM
        searchItem.setOnMenuItemClickListener(target -> {
            final Intent intent = SearchFeatureProvider.SEARCH_UI_INTENT;
            intent.setPackage(SettingsIntelligencePkgName);

            if (context.getPackageManager().queryIntentActivities(intent,
                    PackageManager.MATCH_DEFAULT_ONLY).isEmpty()) {
                return true;
            }

            FeatureFactory.getFactory(context).getMetricsFeatureProvider()
                    .action(context, MetricsProto.MetricsEvent.ACTION_SEARCH_RESULTS);
            mHost.startActivityForResult(intent, 0 /* requestCode */);
+5 −1
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import android.os.Build;
import android.os.UserHandle;
import android.os.UserManager;

import com.android.settings.R;
import com.android.settings.testutils.ApplicationTestUtils;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settingslib.testutils.shadow.ShadowDefaultDialerManager;
@@ -258,13 +259,16 @@ public final class ApplicationFeatureProviderImplTest {
    public void getKeepEnabledPackages_shouldContainDefaultPhoneAndSms() {
        final String testDialer = "com.android.test.defaultdialer";
        final String testSms = "com.android.test.defaultsms";
        final String settingsIntelligence = RuntimeEnvironment.application.getString(
                R.string.config_settingsintelligence_package_name);
        ShadowSmsApplication.setDefaultSmsApplication(new ComponentName(testSms, "receiver"));
        ShadowDefaultDialerManager.setDefaultDialerApplication(testDialer);
        ReflectionHelpers.setField(mProvider, "mContext", RuntimeEnvironment.application);

        final Set<String> keepEnabledPackages = mProvider.getKeepEnabledPackages();

        final List<String> expectedPackages = Arrays.asList(testDialer, testSms);
        final List<String> expectedPackages = Arrays.asList(testDialer, testSms,
                settingsIntelligence);
        assertThat(keepEnabledPackages).containsExactlyElementsIn(expectedPackages);
    }

+30 −5
Original line number Diff line number Diff line
@@ -19,14 +19,15 @@ package com.android.settings.search;

import static com.google.common.truth.Truth.assertThat;

import static org.mockito.Mockito.spy;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.ResolveInfo;
import android.provider.Settings;
import android.widget.Toolbar;

import com.android.settings.R;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.ShadowUtils;
@@ -37,25 +38,34 @@ import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.Shadows;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowPackageManager;

@RunWith(SettingsRobolectricTestRunner.class)
public class SearchFeatureProviderImplTest {

    private SearchFeatureProviderImpl mProvider;
    private Activity mActivity;
    private ShadowPackageManager mPackageManager;

    @Before
    public void setUp() {
        FakeFeatureFactory.setupForTest();
        mActivity = Robolectric.setupActivity(Activity.class);
        mProvider = spy(new SearchFeatureProviderImpl());
        mProvider = new SearchFeatureProviderImpl();
        mPackageManager = Shadows.shadowOf(mActivity.getPackageManager());
    }

    @Test
    @Config(shadows = ShadowUtils.class)
    public void initSearchToolbar_shouldInitWithOnClickListener() {
        mProvider.initSearchToolbar(mActivity, null);
    public void initSearchToolbar_hasResolvedInfo_shouldStartCorrectIntent() {
        final Intent searchIntent = new Intent(SearchFeatureProvider.SEARCH_UI_INTENT)
                .setPackage(mActivity.getString(R.string.config_settingsintelligence_package_name));
        final ResolveInfo info = new ResolveInfo();
        info.activityInfo = new ActivityInfo();
        mPackageManager.addResolveInfoForIntent(searchIntent, info);

        // Should not crash.
        mProvider.initSearchToolbar(mActivity, null);

        final Toolbar toolbar = new Toolbar(mActivity);
        // This ensures navigationView is created.
@@ -70,6 +80,21 @@ public class SearchFeatureProviderImplTest {
                .isEqualTo(Settings.ACTION_APP_SEARCH_SETTINGS);
    }

    @Test
    @Config(shadows = ShadowUtils.class)
    public void initSearchToolbar_NotHaveResolvedInfo_shouldNotStartActivity() {
        final Toolbar toolbar = new Toolbar(mActivity);
        // This ensures navigationView is created.
        toolbar.setNavigationContentDescription("test");
        mProvider.initSearchToolbar(mActivity, toolbar);

        toolbar.performClick();

        final Intent launchIntent = Shadows.shadowOf(mActivity).getNextStartedActivity();

        assertThat(launchIntent).isNull();
    }

    @Test(expected = IllegalArgumentException.class)
    public void verifyLaunchSearchResultPageCaller_nullCaller_shouldCrash() {
        mProvider.verifyLaunchSearchResultPageCaller(mActivity, null /* caller */);