Loading src/com/android/settings/applications/ApplicationFeatureProviderImpl.java +4 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; } Loading src/com/android/settings/search/SearchFeatureProvider.java +6 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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() Loading src/com/android/settings/search/actionbar/SearchMenuController.java +7 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 */); Loading tests/robotests/src/com/android/settings/applications/ApplicationFeatureProviderImplTest.java +5 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } Loading tests/robotests/src/com/android/settings/search/SearchFeatureProviderImplTest.java +30 −5 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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. Loading @@ -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 */); Loading Loading
src/com/android/settings/applications/ApplicationFeatureProviderImpl.java +4 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; } Loading
src/com/android/settings/search/SearchFeatureProvider.java +6 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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() Loading
src/com/android/settings/search/actionbar/SearchMenuController.java +7 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 */); Loading
tests/robotests/src/com/android/settings/applications/ApplicationFeatureProviderImplTest.java +5 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } Loading
tests/robotests/src/com/android/settings/search/SearchFeatureProviderImplTest.java +30 −5 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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. Loading @@ -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 */); Loading