1 package com.android.settings.development; 2 3 import static com.android.settings.development.DevelopmentOptionsActivityRequestCodes.REQUEST_MOCK_LOCATION_APP; 4 import static com.google.common.truth.Truth.assertThat; 5 import static org.mockito.ArgumentMatchers.any; 6 import static org.mockito.ArgumentMatchers.anyInt; 7 import static org.mockito.ArgumentMatchers.anyString; 8 import static org.mockito.ArgumentMatchers.eq; 9 import static org.mockito.Mockito.spy; 10 import static org.mockito.Mockito.verify; 11 import static org.mockito.Mockito.when; 12 13 import android.app.Activity; 14 import android.app.AppOpsManager; 15 import android.content.Context; 16 import android.content.Intent; 17 import android.content.pm.ApplicationInfo; 18 import android.content.pm.PackageManager; 19 import android.support.v7.preference.Preference; 20 import android.support.v7.preference.PreferenceScreen; 21 22 import com.android.settings.R; 23 import com.android.settings.testutils.SettingsRobolectricTestRunner; 24 import com.android.settingslib.wrapper.PackageManagerWrapper; 25 26 import org.junit.Before; 27 import org.junit.Test; 28 import org.junit.runner.RunWith; 29 import org.mockito.Mock; 30 import org.mockito.MockitoAnnotations; 31 import org.robolectric.RuntimeEnvironment; 32 import org.robolectric.util.ReflectionHelpers; 33 34 import java.util.Collections; 35 36 @RunWith(SettingsRobolectricTestRunner.class) 37 public class MockLocationAppPreferenceControllerTest { 38 39 @Mock 40 private DevelopmentSettingsDashboardFragment mFragment; 41 @Mock 42 private AppOpsManager mAppOpsManager; 43 @Mock 44 private PackageManagerWrapper mPackageManager; 45 @Mock 46 private Preference mPreference; 47 @Mock 48 private PreferenceScreen mScreen; 49 @Mock 50 private AppOpsManager.PackageOps mPackageOps; 51 @Mock 52 private AppOpsManager.OpEntry mOpEntry; 53 @Mock 54 private ApplicationInfo mApplicationInfo; 55 56 private Context mContext; 57 private MockLocationAppPreferenceController mController; 58 59 @Before 60 public void setup() { 61 MockitoAnnotations.initMocks(this); 62 mContext = RuntimeEnvironment.application; 63 mController = spy(new MockLocationAppPreferenceController(mContext, mFragment)); 64 ReflectionHelpers.setField(mController, "mAppsOpsManager", mAppOpsManager); 65 ReflectionHelpers.setField(mController, "mPackageManager", mPackageManager); 66 when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference); 67 mController.displayPreference(mScreen); 68 } 69 70 @Test 71 public void updateState_foobarAppSelected_shouldSetSummaryToFoobar() { 72 final String appName = "foobar"; 73 when(mAppOpsManager.getPackagesForOps(any())).thenReturn( 74 Collections.singletonList(mPackageOps)); 75 when(mPackageOps.getOps()).thenReturn(Collections.singletonList(mOpEntry)); 76 when(mOpEntry.getMode()).thenReturn(AppOpsManager.MODE_ALLOWED); 77 when(mPackageOps.getPackageName()).thenReturn(appName); 78 79 mController.updateState(mPreference); 80 81 verify(mPreference).setSummary(mContext.getString(R.string.mock_location_app_set, appName)); 82 } 83 84 @Test 85 public void updateState_noAppSelected_shouldSetSummaryToDefault() { 86 when(mAppOpsManager.getPackagesForOps(any())).thenReturn(Collections.emptyList()); 87 88 mController.updateState(mPreference); 89 90 verify(mPreference).setSummary(mContext.getString(R.string.mock_location_app_not_set)); 91 } 92 93 @Test 94 public void onActivityResult_fooPrevAppBarNewApp_shouldRemoveFooAndSetBarAsMockLocationApp() 95 throws PackageManager.NameNotFoundException { 96 final String prevAppName = "foo"; 97 final String newAppName = "bar"; 98 final Intent intent = new Intent(); 99 intent.setAction(newAppName); 100 when(mAppOpsManager.getPackagesForOps(any())) 101 .thenReturn(Collections.singletonList(mPackageOps)); 102 when(mPackageOps.getOps()).thenReturn(Collections.singletonList(mOpEntry)); 103 when(mOpEntry.getMode()).thenReturn(AppOpsManager.MODE_ALLOWED); 104 when(mPackageOps.getPackageName()).thenReturn(prevAppName); 105 when(mPackageManager.getApplicationInfo(anyString(), 106 eq(PackageManager.MATCH_DISABLED_COMPONENTS))).thenReturn(mApplicationInfo); 107 108 final boolean handled = 109 mController.onActivityResult(REQUEST_MOCK_LOCATION_APP, Activity.RESULT_OK, intent); 110 111 assertThat(handled).isTrue(); 112 verify(mAppOpsManager).setMode(anyInt(), anyInt(), eq(newAppName), 113 eq(AppOpsManager.MODE_ALLOWED)); 114 verify(mAppOpsManager).setMode(anyInt(), anyInt(), eq(prevAppName), 115 eq(AppOpsManager.MODE_ERRORED)); 116 } 117 118 @Test 119 public void onActivityResult_incorrectCode_shouldReturnFalse() { 120 final boolean handled = mController.onActivityResult(30983150 /* request code */, 121 Activity.RESULT_OK, null /* intent */); 122 123 assertThat(handled).isFalse(); 124 } 125 126 @Test 127 public void handlePreferenceTreeClick_samePreferenceKey_shouldLaunchActivity() { 128 final String preferenceKey = mController.getPreferenceKey(); 129 when(mPreference.getKey()).thenReturn(preferenceKey); 130 131 final boolean handled = mController.handlePreferenceTreeClick(mPreference); 132 133 assertThat(handled).isTrue(); 134 verify(mFragment).startActivityForResult(any(), eq(REQUEST_MOCK_LOCATION_APP)); 135 } 136 137 @Test 138 public void handlePreferenceTreeClick_incorrectPreferenceKey_shouldReturnFalse() { 139 when(mPreference.getKey()).thenReturn("SomeRandomKey"); 140 141 assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse(); 142 } 143 } 144