1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.settings.applications.assist; 18 19 import static com.google.common.truth.Truth.assertThat; 20 import static org.mockito.Matchers.any; 21 import static org.mockito.Matchers.anyBoolean; 22 import static org.mockito.Matchers.anyInt; 23 import static org.mockito.Mockito.doReturn; 24 import static org.mockito.Mockito.mock; 25 import static org.mockito.Mockito.spy; 26 import static org.mockito.Mockito.verifyZeroInteractions; 27 import static org.mockito.Mockito.when; 28 29 import android.Manifest; 30 import android.app.SearchManager; 31 import android.content.ComponentName; 32 import android.content.Context; 33 import android.content.Intent; 34 import android.content.pm.ActivityInfo; 35 import android.content.pm.ApplicationInfo; 36 import android.content.pm.PackageManager; 37 import android.content.pm.ResolveInfo; 38 import android.content.pm.ServiceInfo; 39 import android.provider.Settings; 40 41 import com.android.internal.app.AssistUtils; 42 import com.android.settings.TestConfig; 43 import com.android.settings.applications.defaultapps.DefaultAppInfo; 44 import com.android.settings.testutils.SettingsRobolectricTestRunner; 45 import com.android.settings.testutils.shadow.ShadowSecureSettings; 46 47 import org.junit.Before; 48 import org.junit.Test; 49 import org.junit.runner.RunWith; 50 import org.mockito.Mock; 51 import org.mockito.MockitoAnnotations; 52 import org.robolectric.annotation.Config; 53 import org.robolectric.util.ReflectionHelpers; 54 55 import java.util.ArrayList; 56 import java.util.List; 57 58 @RunWith(SettingsRobolectricTestRunner.class) 59 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) 60 public class DefaultAssistPreferenceControllerTest { 61 62 private static final String TEST_KEY = "test_pref_key"; 63 64 @Mock 65 private Context mContext; 66 @Mock 67 private SearchManager mSearchManager; 68 @Mock 69 private PackageManager mPackageManager; 70 private DefaultAssistPreferenceController mController; 71 72 @Before 73 public void setUp() { 74 MockitoAnnotations.initMocks(this); 75 mController = new DefaultAssistPreferenceController(mContext, TEST_KEY, 76 true /* showSetting */); 77 } 78 79 @Test 80 public void isAlwaysAvailable() { 81 assertThat(mController.isAvailable()).isTrue(); 82 } 83 84 @Test 85 public void getPrefKey_shouldReturnKey() { 86 assertThat(mController.getPreferenceKey()) 87 .isEqualTo(TEST_KEY); 88 } 89 90 @Test 91 @Config(shadows = {ShadowSecureSettings.class}) 92 public void getDefaultAppInfo_hasDefaultAssist_shouldReturnKey() { 93 final String flattenKey = "com.android.settings/assist"; 94 Settings.Secure.putString(null, Settings.Secure.ASSISTANT, flattenKey); 95 DefaultAppInfo appInfo = mController.getDefaultAppInfo(); 96 97 assertThat(appInfo.getKey()).isEqualTo(flattenKey); 98 } 99 100 @Test 101 public void getSettingIntent_noSettingsActivity_shouldNotCrash() { 102 final String flattenKey = "com.android.settings/assist"; 103 Settings.Secure.putString(null, Settings.Secure.ASSISTANT, flattenKey); 104 when(mContext.getPackageManager()).thenReturn(mPackageManager); 105 DefaultAssistPreferenceController controller = spy( 106 new DefaultAssistPreferenceController(mContext, TEST_KEY, true /* showSetting */)); 107 final ResolveInfo resolveInfo = new ResolveInfo(); 108 resolveInfo.activityInfo = new ActivityInfo(); 109 resolveInfo.activityInfo.name = "assist"; 110 resolveInfo.activityInfo.applicationInfo = new ApplicationInfo(); 111 resolveInfo.activityInfo.applicationInfo.packageName = "com.android.settings"; 112 when(mPackageManager.resolveActivityAsUser(any(Intent.class), anyInt(), anyInt())) 113 .thenReturn(resolveInfo); 114 when(mContext.getSystemService(Context.SEARCH_SERVICE)).thenReturn(mSearchManager); 115 when(mSearchManager.getAssistIntent(anyBoolean())).thenReturn(mock(Intent.class)); 116 final ServiceInfo serviceInfo = new ServiceInfo(); 117 serviceInfo.permission = Manifest.permission.BIND_VOICE_INTERACTION; 118 resolveInfo.serviceInfo = serviceInfo; 119 final List<ResolveInfo> services = new ArrayList<>(); 120 services.add(resolveInfo); 121 when(mPackageManager.queryIntentServices(any(Intent.class), anyInt())).thenReturn(services); 122 doReturn(null).when(controller).getAssistSettingsActivity( 123 ComponentName.unflattenFromString(flattenKey), resolveInfo, mPackageManager); 124 125 controller.getSettingIntent(null); 126 // should not crash 127 } 128 129 @Test 130 public void getSettingIntent_doNotShowSetting_shouldNotTryToGetSettingIntent() { 131 final AssistUtils assistUtils = mock(AssistUtils.class); 132 final DefaultAssistPreferenceController controller = new DefaultAssistPreferenceController( 133 mContext, TEST_KEY, false /* showSetting */); 134 ReflectionHelpers.setField(controller, "mAssistUtils", assistUtils); 135 136 controller.getSettingIntent(null); 137 138 verifyZeroInteractions(assistUtils); 139 } 140 } 141