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.defaultapps; 18 19 import static com.google.common.truth.Truth.assertThat; 20 import static org.mockito.Matchers.any; 21 import static org.mockito.Matchers.anyInt; 22 import static org.mockito.Matchers.anyList; 23 import static org.mockito.Matchers.eq; 24 import static org.mockito.Mockito.doAnswer; 25 import static org.mockito.Mockito.doReturn; 26 import static org.mockito.Mockito.mock; 27 import static org.mockito.Mockito.spy; 28 import static org.mockito.Mockito.verify; 29 import static org.mockito.Mockito.when; 30 31 import android.app.Activity; 32 import android.content.ComponentName; 33 import android.content.Context; 34 import android.content.IntentFilter; 35 import android.content.pm.ActivityInfo; 36 import android.content.pm.ApplicationInfo; 37 import android.content.pm.PackageManager; 38 import android.content.pm.PackageManager.NameNotFoundException; 39 import android.content.pm.ResolveInfo; 40 import android.content.pm.UserInfo; 41 import android.os.Build; 42 import android.os.UserManager; 43 44 import com.android.settings.testutils.SettingsRobolectricTestRunner; 45 import com.android.settingslib.applications.DefaultAppInfo; 46 import com.android.settingslib.wrapper.PackageManagerWrapper; 47 48 import org.junit.Before; 49 import org.junit.Test; 50 import org.junit.runner.RunWith; 51 import org.mockito.Answers; 52 import org.mockito.Mock; 53 import org.mockito.MockitoAnnotations; 54 import org.robolectric.RuntimeEnvironment; 55 import org.robolectric.util.ReflectionHelpers; 56 57 import java.util.ArrayList; 58 import java.util.List; 59 60 @RunWith(SettingsRobolectricTestRunner.class) 61 public class DefaultHomePickerTest { 62 63 private static final String TEST_APP_KEY = "com.android.settings/DefaultEmergencyPickerTest"; 64 65 @Mock(answer = Answers.RETURNS_DEEP_STUBS) 66 private Activity mActivity; 67 @Mock 68 private UserManager mUserManager; 69 @Mock 70 private PackageManagerWrapper mPackageManagerWrapper; 71 @Mock 72 private PackageManager mPackageManager; 73 74 private Context mContext; 75 private DefaultHomePicker mPicker; 76 77 @Before 78 public void setUp() { 79 MockitoAnnotations.initMocks(this); 80 when(mActivity.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager); 81 when(mPackageManagerWrapper.getPackageManager()).thenReturn(mPackageManager); 82 83 mPicker = spy(new DefaultHomePicker()); 84 mPicker.onAttach((Context) mActivity); 85 86 ReflectionHelpers.setField(mPicker, "mPm", mPackageManagerWrapper); 87 mContext = spy(RuntimeEnvironment.application); 88 doReturn(mContext).when(mPicker).getContext(); 89 } 90 91 @Test 92 public void setDefaultAppKey_shouldUpdateDefault() { 93 assertThat(mPicker.setDefaultKey(TEST_APP_KEY)).isTrue(); 94 95 verify(mPackageManagerWrapper).replacePreferredActivity(any(IntentFilter.class), 96 anyInt(), any(ComponentName[].class), any(ComponentName.class)); 97 verify(mContext).startActivity(any()); 98 } 99 100 @Test 101 public void getDefaultAppKey_shouldReturnDefault() { 102 final ComponentName cn = mock(ComponentName.class); 103 when(mPackageManagerWrapper.getHomeActivities(anyList())).thenReturn(cn); 104 mPicker.getDefaultKey(); 105 verify(cn).flattenToString(); 106 } 107 108 @Test 109 public void getCandidates_allLaunchersAvailableIfNoManagedProfile() 110 throws NameNotFoundException { 111 addLaunchers(); 112 List<DefaultAppInfo> candidates = mPicker.getCandidates(); 113 assertThat(candidates.size()).isEqualTo(2); 114 assertThat(candidates.get(0).summary).isNull(); 115 assertThat(candidates.get(0).enabled).isTrue(); 116 assertThat(candidates.get(1).summary).isNull(); 117 assertThat(candidates.get(1).enabled).isTrue(); 118 } 119 120 @Test 121 public void getCandidates_onlyLollipopPlusLaunchersAvailableIfManagedProfile() { 122 List<UserInfo> profiles = new ArrayList<>(); 123 profiles.add(new UserInfo(/*id=*/ 10, "TestUserName", UserInfo.FLAG_MANAGED_PROFILE)); 124 when(mUserManager.getProfiles(anyInt())).thenReturn(profiles); 125 126 addLaunchers(); 127 List<DefaultAppInfo> candidates = mPicker.getCandidates(); 128 assertThat(candidates.size()).isEqualTo(2); 129 DefaultAppInfo lollipopPlusLauncher = candidates.get(0); 130 assertThat(lollipopPlusLauncher.summary).isNull(); 131 assertThat(lollipopPlusLauncher.enabled).isTrue(); 132 133 DefaultAppInfo preLollipopLauncher = candidates.get(1); 134 assertThat(preLollipopLauncher.summary).isNotNull(); 135 assertThat(preLollipopLauncher.enabled).isFalse(); 136 } 137 138 private ResolveInfo createLauncher( 139 String packageName, String className, int targetSdk) throws NameNotFoundException { 140 ResolveInfo launcher = new ResolveInfo(); 141 launcher.activityInfo = new ActivityInfo(); 142 launcher.activityInfo.packageName = packageName; 143 launcher.activityInfo.name = className; 144 ApplicationInfo launcherAppInfo = new ApplicationInfo(); 145 launcherAppInfo.targetSdkVersion = targetSdk; 146 when(mPackageManager.getApplicationInfo(eq(launcher.activityInfo.packageName), anyInt())) 147 .thenReturn(launcherAppInfo); 148 return launcher; 149 } 150 151 private void addLaunchers() { 152 doAnswer(invocation -> { 153 // The result of this method is stored in the first parameter... 154 List<ResolveInfo> parameter = (List<ResolveInfo>) invocation.getArguments()[0]; 155 parameter.add(createLauncher( 156 "package.1", "LollipopPlusLauncher", Build.VERSION_CODES.LOLLIPOP)); 157 parameter.add(createLauncher( 158 "package.2", "PreLollipopLauncher", Build.VERSION_CODES.KITKAT)); 159 return null; 160 }) 161 .when(mPackageManagerWrapper).getHomeActivities(anyList()); 162 } 163 } 164