blob: 350114c792bfb3eaac929dab61decd8be45e0a4e [file] [log] [blame]
Benjamin Franz563707b2017-06-29 15:06:13 +01001/*
Wale Ogunwale59507092018-10-29 09:00:30 -07002 * Copyright (C) 2018 The Android Open Source Project
Benjamin Franz563707b2017-06-29 15:06:13 +01003 *
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 *
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +09008 * http://www.apache.org/licenses/LICENSE-2.0
Benjamin Franz563707b2017-06-29 15:06:13 +01009 *
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
Wale Ogunwale59507092018-10-29 09:00:30 -070014 * limitations under the License
Benjamin Franz563707b2017-06-29 15:06:13 +010015 */
16
Wale Ogunwale59507092018-10-29 09:00:30 -070017package com.android.server.wm;
Benjamin Franz563707b2017-06-29 15:06:13 +010018
19import static android.content.pm.ApplicationInfo.FLAG_SUSPENDED;
Suprabh Shukla3c3af142018-03-30 00:28:37 -070020
Tadashi G. Takaokaa7a66952018-11-16 15:04:21 +090021import static com.android.dx.mockito.inline.extended.ExtendedMockito.when;
Suprabh Shukla3c3af142018-03-30 00:28:37 -070022import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME;
23
Benjamin Franz563707b2017-06-29 15:06:13 +010024import static org.junit.Assert.assertEquals;
25import static org.junit.Assert.assertFalse;
26import static org.junit.Assert.assertTrue;
27import static org.mockito.ArgumentMatchers.eq;
28import static org.mockito.ArgumentMatchers.nullable;
Benjamin Franz563707b2017-06-29 15:06:13 +010029
Wale Ogunwale86b74462018-07-02 08:42:43 -070030import android.app.ActivityManagerInternal;
Benjamin Franz563707b2017-06-29 15:06:13 +010031import android.app.KeyguardManager;
32import android.app.admin.DevicePolicyManagerInternal;
33import android.content.Context;
34import android.content.Intent;
35import android.content.pm.ActivityInfo;
36import android.content.pm.ApplicationInfo;
Suprabh Shukla3c3af142018-03-30 00:28:37 -070037import android.content.pm.PackageManagerInternal;
Suprabh Shukla389cb6f2018-10-01 18:20:39 -070038import android.content.pm.SuspendDialogInfo;
Benjamin Franz563707b2017-06-29 15:06:13 +010039import android.content.pm.UserInfo;
40import android.os.UserHandle;
41import android.os.UserManager;
Ben Gruvereb8fd1c2018-03-07 13:24:18 -080042import android.platform.test.annotations.Presubmit;
Adrian Roos3150dbf2018-03-28 18:06:52 +020043import android.testing.DexmakerShareClassLoaderRule;
Benjamin Franz563707b2017-06-29 15:06:13 +010044
Brett Chabota26eda92018-07-23 13:08:30 -070045import androidx.test.filters.SmallTest;
46
47import com.android.internal.app.HarmfulAppWarningActivity;
Suprabh Shukla125c7712018-05-07 17:00:07 -070048import com.android.internal.app.SuspendedAppActivity;
Benjamin Franz563707b2017-06-29 15:06:13 +010049import com.android.internal.app.UnlaunchableAppActivity;
50import com.android.server.LocalServices;
Wale Ogunwale59507092018-10-29 09:00:30 -070051import com.android.server.am.ActivityManagerService;
Ben Gruvereb8fd1c2018-03-07 13:24:18 -080052import com.android.server.pm.PackageManagerService;
Benjamin Franz563707b2017-06-29 15:06:13 +010053
54import org.junit.Before;
Adrian Roos3150dbf2018-03-28 18:06:52 +020055import org.junit.Rule;
Benjamin Franz563707b2017-06-29 15:06:13 +010056import org.junit.Test;
57import org.mockito.Mock;
58import org.mockito.MockitoAnnotations;
59
60/**
61 * Unit tests for {@link ActivityStartInterceptorTest}.
62 *
63 * Build/Install/Run:
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +090064 * atest WmTests:ActivityStartInterceptorTest
Benjamin Franz563707b2017-06-29 15:06:13 +010065 */
66@SmallTest
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +090067@Presubmit
Benjamin Franz563707b2017-06-29 15:06:13 +010068public class ActivityStartInterceptorTest {
69 private static final int TEST_USER_ID = 1;
70 private static final int TEST_REAL_CALLING_UID = 2;
71 private static final int TEST_REAL_CALLING_PID = 3;
72 private static final String TEST_CALLING_PACKAGE = "com.test.caller";
73 private static final int TEST_START_FLAGS = 4;
74 private static final Intent ADMIN_SUPPORT_INTENT =
75 new Intent("com.test.ADMIN_SUPPORT");
76 private static final Intent CONFIRM_CREDENTIALS_INTENT =
77 new Intent("com.test.CONFIRM_CREDENTIALS");
78 private static final UserInfo PARENT_USER_INFO = new UserInfo(0 /* userId */, "parent",
79 0 /* flags */);
80 private static final String TEST_PACKAGE_NAME = "com.test.package";
81
Adrian Roos3150dbf2018-03-28 18:06:52 +020082 @Rule
83 public final DexmakerShareClassLoaderRule mDexmakerShareClassLoaderRule =
84 new DexmakerShareClassLoaderRule();
85
Benjamin Franz563707b2017-06-29 15:06:13 +010086 @Mock
87 private Context mContext;
88 @Mock
Wale Ogunwalec9e57de2018-05-08 14:28:07 -070089 private ActivityManagerService mAm;
90 @Mock
91 private ActivityTaskManagerService mService;
Benjamin Franz563707b2017-06-29 15:06:13 +010092 @Mock
Wale Ogunwaled32da472018-11-16 07:19:28 -080093 private RootActivityContainer mRootActivityContainer;
94 @Mock
Benjamin Franz563707b2017-06-29 15:06:13 +010095 private ActivityStackSupervisor mSupervisor;
96 @Mock
97 private DevicePolicyManagerInternal mDevicePolicyManager;
98 @Mock
Suprabh Shukla3c3af142018-03-30 00:28:37 -070099 private PackageManagerInternal mPackageManagerInternal;
100 @Mock
Benjamin Franz563707b2017-06-29 15:06:13 +0100101 private UserManager mUserManager;
102 @Mock
Benjamin Franz563707b2017-06-29 15:06:13 +0100103 private KeyguardManager mKeyguardManager;
Ben Gruvereb8fd1c2018-03-07 13:24:18 -0800104 @Mock
105 private PackageManagerService mPackageManager;
Wale Ogunwale86b74462018-07-02 08:42:43 -0700106 @Mock
107 private ActivityManagerInternal mAmInternal;
Benjamin Franz563707b2017-06-29 15:06:13 +0100108
109 private ActivityStartInterceptor mInterceptor;
110 private ActivityInfo mAInfo = new ActivityInfo();
111
112 @Before
113 public void setUp() {
Benjamin Franz563707b2017-06-29 15:06:13 +0100114 MockitoAnnotations.initMocks(this);
Wale Ogunwale86b74462018-07-02 08:42:43 -0700115 mService.mAmInternal = mAmInternal;
Wale Ogunwaled32da472018-11-16 07:19:28 -0800116 mInterceptor = new ActivityStartInterceptor(
117 mService, mSupervisor, mRootActivityContainer, mContext);
Benjamin Franz563707b2017-06-29 15:06:13 +0100118 mInterceptor.setStates(TEST_USER_ID, TEST_REAL_CALLING_PID, TEST_REAL_CALLING_UID,
119 TEST_START_FLAGS, TEST_CALLING_PACKAGE);
120
Wale Ogunwale86b74462018-07-02 08:42:43 -0700121 // Mock ActivityManagerInternal
122 LocalServices.removeServiceForTest(ActivityManagerInternal.class);
123 LocalServices.addService(ActivityManagerInternal.class, mAmInternal);
124
Benjamin Franz563707b2017-06-29 15:06:13 +0100125 // Mock DevicePolicyManagerInternal
126 LocalServices.removeServiceForTest(DevicePolicyManagerInternal.class);
127 LocalServices.addService(DevicePolicyManagerInternal.class,
128 mDevicePolicyManager);
Wale Ogunwalec9e57de2018-05-08 14:28:07 -0700129 when(mDevicePolicyManager.createShowAdminSupportIntent(TEST_USER_ID, true))
Benjamin Franz563707b2017-06-29 15:06:13 +0100130 .thenReturn(ADMIN_SUPPORT_INTENT);
Wale Ogunwale906f9c62018-07-23 11:23:44 -0700131 when(mService.getPackageManagerInternalLocked()).thenReturn(mPackageManagerInternal);
Benjamin Franz563707b2017-06-29 15:06:13 +0100132
133 // Mock UserManager
134 when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
135 when(mUserManager.getProfileParent(TEST_USER_ID)).thenReturn(PARENT_USER_INFO);
136
137 // Mock KeyguardManager
138 when(mContext.getSystemService(Context.KEYGUARD_SERVICE)).thenReturn(mKeyguardManager);
139 when(mKeyguardManager.createConfirmDeviceCredentialIntent(
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900140 nullable(CharSequence.class), nullable(CharSequence.class), eq(TEST_USER_ID)))
141 .thenReturn(CONFIRM_CREDENTIALS_INTENT);
Benjamin Franz563707b2017-06-29 15:06:13 +0100142
Ben Gruvereb8fd1c2018-03-07 13:24:18 -0800143 // Mock PackageManager
Wale Ogunwale906f9c62018-07-23 11:23:44 -0700144 when(mService.getPackageManager()).thenReturn(mPackageManager);
Ben Gruvereb8fd1c2018-03-07 13:24:18 -0800145 when(mPackageManager.getHarmfulAppWarning(TEST_PACKAGE_NAME, TEST_USER_ID))
146 .thenReturn(null);
147
Benjamin Franz563707b2017-06-29 15:06:13 +0100148 // Initialise activity info
Benjamin Franz563707b2017-06-29 15:06:13 +0100149 mAInfo.applicationInfo = new ApplicationInfo();
Suprabh Shukla3c3af142018-03-30 00:28:37 -0700150 mAInfo.packageName = mAInfo.applicationInfo.packageName = TEST_PACKAGE_NAME;
Benjamin Franz563707b2017-06-29 15:06:13 +0100151 }
152
153 @Test
Suprabh Shukla3c3af142018-03-30 00:28:37 -0700154 public void testSuspendedByAdminPackage() {
Benjamin Franz563707b2017-06-29 15:06:13 +0100155 // GIVEN the package we're about to launch is currently suspended
156 mAInfo.applicationInfo.flags = FLAG_SUSPENDED;
157
Suprabh Shukla3c3af142018-03-30 00:28:37 -0700158 when(mPackageManagerInternal.getSuspendingPackage(TEST_PACKAGE_NAME, TEST_USER_ID))
159 .thenReturn(PLATFORM_PACKAGE_NAME);
160
Benjamin Franz563707b2017-06-29 15:06:13 +0100161 // THEN calling intercept returns true
162 assertTrue(mInterceptor.intercept(null, null, mAInfo, null, null, 0, 0, null));
163
164 // THEN the returned intent is the admin support intent
165 assertEquals(ADMIN_SUPPORT_INTENT, mInterceptor.mIntent);
166 }
167
168 @Test
Suprabh Shukla125c7712018-05-07 17:00:07 -0700169 public void testSuspendedPackage() {
170 mAInfo.applicationInfo.flags = FLAG_SUSPENDED;
171 final String suspendingPackage = "com.test.suspending.package";
Suprabh Shukla389cb6f2018-10-01 18:20:39 -0700172 final SuspendDialogInfo dialogInfo = new SuspendDialogInfo.Builder()
173 .setMessage("Test Message")
174 .setIcon(0x11110001)
175 .build();
Suprabh Shukla125c7712018-05-07 17:00:07 -0700176 when(mPackageManagerInternal.getSuspendingPackage(TEST_PACKAGE_NAME, TEST_USER_ID))
177 .thenReturn(suspendingPackage);
Suprabh Shukla389cb6f2018-10-01 18:20:39 -0700178 when(mPackageManagerInternal.getSuspendedDialogInfo(TEST_PACKAGE_NAME, TEST_USER_ID))
179 .thenReturn(dialogInfo);
Suprabh Shukla125c7712018-05-07 17:00:07 -0700180 // THEN calling intercept returns true
181 assertTrue(mInterceptor.intercept(null, null, mAInfo, null, null, 0, 0, null));
182
183 // Check intent parameters
Suprabh Shukla389cb6f2018-10-01 18:20:39 -0700184 assertEquals(dialogInfo,
185 mInterceptor.mIntent.getParcelableExtra(SuspendedAppActivity.EXTRA_DIALOG_INFO));
Suprabh Shukla125c7712018-05-07 17:00:07 -0700186 assertEquals(suspendingPackage,
187 mInterceptor.mIntent.getStringExtra(SuspendedAppActivity.EXTRA_SUSPENDING_PACKAGE));
188 assertEquals(TEST_PACKAGE_NAME,
189 mInterceptor.mIntent.getStringExtra(SuspendedAppActivity.EXTRA_SUSPENDED_PACKAGE));
190 assertEquals(TEST_USER_ID, mInterceptor.mIntent.getIntExtra(Intent.EXTRA_USER_ID, -1000));
191 }
192
193 @Test
Benjamin Franz563707b2017-06-29 15:06:13 +0100194 public void testInterceptQuietProfile() {
195 // GIVEN that the user the activity is starting as is currently in quiet mode
196 when(mUserManager.isQuietModeEnabled(eq(UserHandle.of(TEST_USER_ID)))).thenReturn(true);
197
198 // THEN calling intercept returns true
199 assertTrue(mInterceptor.intercept(null, null, mAInfo, null, null, 0, 0, null));
200
201 // THEN the returned intent is the quiet mode intent
202 assertTrue(UnlaunchableAppActivity.createInQuietModeDialogIntent(TEST_USER_ID)
203 .filterEquals(mInterceptor.mIntent));
204 }
205
206 @Test
207 public void testWorkChallenge() {
208 // GIVEN that the user the activity is starting as is currently locked
Wale Ogunwale86b74462018-07-02 08:42:43 -0700209 when(mAmInternal.shouldConfirmCredentials(TEST_USER_ID)).thenReturn(true);
Benjamin Franz563707b2017-06-29 15:06:13 +0100210
211 // THEN calling intercept returns true
212 mInterceptor.intercept(null, null, mAInfo, null, null, 0, 0, null);
213
214 // THEN the returned intent is the quiet mode intent
215 assertTrue(CONFIRM_CREDENTIALS_INTENT.filterEquals(mInterceptor.mIntent));
216 }
217
218 @Test
Ben Gruver49828732018-03-07 14:20:37 -0800219 public void testHarmfulAppWarning() {
220 // GIVEN the package we're about to launch has a harmful app warning set
221 when(mPackageManager.getHarmfulAppWarning(TEST_PACKAGE_NAME, TEST_USER_ID))
222 .thenReturn("This app is bad");
223
224 // THEN calling intercept returns true
225 assertTrue(mInterceptor.intercept(null, null, mAInfo, null, null, 0, 0, null));
226
227 // THEN the returned intent is the harmful app warning intent
Tadashi G. Takaoka74ccec22018-10-23 11:07:13 +0900228 assertEquals(HarmfulAppWarningActivity.class.getName(),
229 mInterceptor.mIntent.getComponent().getClassName());
Ben Gruver49828732018-03-07 14:20:37 -0800230 }
231
232 @Test
Benjamin Franz563707b2017-06-29 15:06:13 +0100233 public void testNoInterception() {
234 // GIVEN that none of the interception conditions are met
235
236 // THEN calling intercept returns false
237 assertFalse(mInterceptor.intercept(null, null, mAInfo, null, null, 0, 0, null));
238 }
239}