blob: 5d2924283ef731bf9999afe61f4e7d2928ea82f0 [file] [log] [blame]
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001/*
2 * Copyright (C) 2016 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 */
16package com.android.server.pm;
17
Makoto Onuki4dbe0de2016-03-14 17:31:49 -070018import static org.mockito.Matchers.any;
19import static org.mockito.Matchers.anyString;
20import static org.mockito.Matchers.eq;
Makoto Onuki7a6a05f2016-03-10 17:01:08 -080021import static org.mockito.Mockito.mock;
Makoto Onuki4dbe0de2016-03-14 17:31:49 -070022import static org.mockito.Mockito.reset;
Makoto Onukid99c6f02016-03-28 11:02:54 -070023import static org.mockito.Mockito.spy;
Makoto Onuki4dbe0de2016-03-14 17:31:49 -070024import static org.mockito.Mockito.times;
25import static org.mockito.Mockito.verify;
Makoto Onukicdc78f72016-03-21 15:47:52 -070026import static org.mockito.Mockito.when;
Makoto Onuki7a6a05f2016-03-10 17:01:08 -080027
Makoto Onuki6f7362d92016-03-04 13:39:41 -080028import android.annotation.NonNull;
Makoto Onukid99c6f02016-03-28 11:02:54 -070029import android.annotation.Nullable;
30import android.annotation.RequiresPermission;
Makoto Onuki6f7362d92016-03-04 13:39:41 -080031import android.annotation.UserIdInt;
32import android.app.Activity;
Makoto Onuki4dbe0de2016-03-14 17:31:49 -070033import android.content.BroadcastReceiver;
Makoto Onuki6f7362d92016-03-04 13:39:41 -080034import android.content.ComponentName;
35import android.content.Context;
36import android.content.Intent;
Makoto Onuki4dbe0de2016-03-14 17:31:49 -070037import android.content.IntentFilter;
Makoto Onuki0acbb142016-03-22 17:02:57 -070038import android.content.pm.ApplicationInfo;
Makoto Onuki7a6a05f2016-03-10 17:01:08 -080039import android.content.pm.ILauncherApps;
40import android.content.pm.LauncherApps;
Makoto Onuki6f7362d92016-03-04 13:39:41 -080041import android.content.pm.LauncherApps.ShortcutQuery;
Makoto Onuki0acbb142016-03-22 17:02:57 -070042import android.content.pm.PackageInfo;
Makoto Onuki7a6a05f2016-03-10 17:01:08 -080043import android.content.pm.PackageManager;
Makoto Onuki2d5b4652016-03-11 16:09:54 -080044import android.content.pm.PackageManagerInternal;
Makoto Onuki6f7362d92016-03-04 13:39:41 -080045import android.content.pm.ShortcutInfo;
46import android.content.pm.ShortcutManager;
47import android.content.pm.ShortcutServiceInternal;
Makoto Onuki0acbb142016-03-22 17:02:57 -070048import android.content.pm.Signature;
Makoto Onuki55046222016-03-08 10:49:47 -080049import android.content.res.Resources;
50import android.graphics.Bitmap;
Makoto Onuki4362a662016-03-08 18:59:09 -080051import android.graphics.Bitmap.CompressFormat;
Makoto Onuki6f7362d92016-03-04 13:39:41 -080052import android.graphics.BitmapFactory;
53import android.graphics.drawable.Icon;
Makoto Onuki0acbb142016-03-22 17:02:57 -070054import android.net.Uri;
Makoto Onuki7a6a05f2016-03-10 17:01:08 -080055import android.os.BaseBundle;
Makoto Onuki6f7362d92016-03-04 13:39:41 -080056import android.os.Bundle;
57import android.os.FileUtils;
Makoto Onuki4dbe0de2016-03-14 17:31:49 -070058import android.os.Handler;
59import android.os.Looper;
Makoto Onuki55046222016-03-08 10:49:47 -080060import android.os.ParcelFileDescriptor;
Makoto Onuki4dbe0de2016-03-14 17:31:49 -070061import android.os.Process;
Makoto Onuki6f7362d92016-03-04 13:39:41 -080062import android.os.UserHandle;
Makoto Onuki7a6a05f2016-03-10 17:01:08 -080063import android.os.UserManager;
Makoto Onuki4dbe0de2016-03-14 17:31:49 -070064import android.test.InstrumentationTestCase;
Makoto Onuki6f7362d92016-03-04 13:39:41 -080065import android.test.mock.MockContext;
Makoto Onuki55046222016-03-08 10:49:47 -080066import android.test.suitebuilder.annotation.SmallTest;
Makoto Onukicdc78f72016-03-21 15:47:52 -070067import android.util.ArraySet;
Makoto Onuki6f7362d92016-03-04 13:39:41 -080068import android.util.Log;
Makoto Onukide667372016-03-15 14:29:20 -070069import android.util.SparseArray;
Makoto Onuki6f7362d92016-03-04 13:39:41 -080070
71import com.android.frameworks.servicestests.R;
72import com.android.internal.util.Preconditions;
73import com.android.server.LocalServices;
74import com.android.server.SystemService;
Makoto Onuki7a6a05f2016-03-10 17:01:08 -080075import com.android.server.pm.LauncherAppsService.LauncherAppsImpl;
Makoto Onuki4362a662016-03-08 18:59:09 -080076import com.android.server.pm.ShortcutService.ConfigConstants;
Makoto Onuki55046222016-03-08 10:49:47 -080077import com.android.server.pm.ShortcutService.FileOutputStreamWithPath;
Makoto Onukid99c6f02016-03-28 11:02:54 -070078import com.android.server.pm.ShortcutUser.PackageWithUser;
Makoto Onuki55046222016-03-08 10:49:47 -080079
80import libcore.io.IoUtils;
Makoto Onuki6f7362d92016-03-04 13:39:41 -080081
82import org.junit.Assert;
Makoto Onuki4dbe0de2016-03-14 17:31:49 -070083import org.mockito.ArgumentCaptor;
Makoto Onuki6f7362d92016-03-04 13:39:41 -080084
85import java.io.BufferedReader;
86import java.io.ByteArrayOutputStream;
87import java.io.File;
88import java.io.FileReader;
Makoto Onuki55046222016-03-08 10:49:47 -080089import java.io.IOException;
Makoto Onuki6f7362d92016-03-04 13:39:41 -080090import java.io.PrintWriter;
91import java.util.ArrayList;
92import java.util.Arrays;
Makoto Onuki55046222016-03-08 10:49:47 -080093import java.util.Collection;
Makoto Onuki6f7362d92016-03-04 13:39:41 -080094import java.util.HashMap;
95import java.util.HashSet;
96import java.util.List;
97import java.util.Map;
Makoto Onuki55046222016-03-08 10:49:47 -080098import java.util.Set;
Makoto Onuki6f7362d92016-03-04 13:39:41 -080099
100/**
101 * Tests for ShortcutService and ShortcutManager.
102 *
103 m FrameworksServicesTests &&
104 adb install \
105 -r -g ${ANDROID_PRODUCT_OUT}/data/app/FrameworksServicesTests/FrameworksServicesTests.apk &&
106 adb shell am instrument -e class com.android.server.pm.ShortcutManagerTest \
107 -w com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
Makoto Onuki55046222016-03-08 10:49:47 -0800108
109 * TODO: Add checks with assertAllNotHaveIcon()
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800110 *
111 * TODO: separate, detailed tests for ShortcutInfo (CTS?) *
112 *
Makoto Onuki55046222016-03-08 10:49:47 -0800113 * TODO: Cross-user test (do in CTS?)
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800114 */
Makoto Onuki55046222016-03-08 10:49:47 -0800115@SmallTest
Makoto Onuki4dbe0de2016-03-14 17:31:49 -0700116public class ShortcutManagerTest extends InstrumentationTestCase {
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800117 private static final String TAG = "ShortcutManagerTest";
118
119 /**
120 * Whether to enable dump or not. Should be only true when debugging to avoid bugs where
121 * dump affecting the behavior.
122 */
Makoto Onuki41066a62016-03-09 16:18:44 -0800123 private static final boolean ENABLE_DUMP = false; // DO NOT SUBMIT WITH true
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800124
Makoto Onukid99c6f02016-03-28 11:02:54 -0700125 // public for mockito
126 public class BaseContext extends MockContext {
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800127 @Override
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800128 public Object getSystemService(String name) {
129 switch (name) {
130 case Context.USER_SERVICE:
131 return mMockUserManager;
132 }
133 throw new UnsupportedOperationException();
134 }
135
136 @Override
Makoto Onukicdc78f72016-03-21 15:47:52 -0700137 public String getSystemServiceName(Class<?> serviceClass) {
138 return getTestContext().getSystemServiceName(serviceClass);
139 }
140
141 @Override
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800142 public PackageManager getPackageManager() {
143 return mMockPackageManager;
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800144 }
Makoto Onuki55046222016-03-08 10:49:47 -0800145
146 @Override
147 public Resources getResources() {
Makoto Onuki4dbe0de2016-03-14 17:31:49 -0700148 return getTestContext().getResources();
149 }
150
151 @Override
152 public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user,
153 IntentFilter filter, String broadcastPermission, Handler scheduler) {
154 // ignore.
155 return null;
Makoto Onuki55046222016-03-08 10:49:47 -0800156 }
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800157 }
158
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800159 /** Context used in the client side */
Makoto Onukid99c6f02016-03-28 11:02:54 -0700160 public class ClientContext extends BaseContext {
Makoto Onuki55046222016-03-08 10:49:47 -0800161 @Override
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800162 public String getPackageName() {
163 return mInjectedClientPackage;
Makoto Onuki55046222016-03-08 10:49:47 -0800164 }
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800165 }
166
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800167 /** Context used in the service side */
Makoto Onukid99c6f02016-03-28 11:02:54 -0700168 public class ServiceContext extends BaseContext {
Makoto Onuki4dbe0de2016-03-14 17:31:49 -0700169 long injectClearCallingIdentity() {
170 final int prevCallingUid = mInjectedCallingUid;
171 mInjectedCallingUid = Process.SYSTEM_UID;
172 return prevCallingUid;
173 }
174
175 void injectRestoreCallingIdentity(long token) {
176 mInjectedCallingUid = (int) token;
177 }
Makoto Onukid99c6f02016-03-28 11:02:54 -0700178
179 @Override
180 public void startActivityAsUser(@RequiresPermission Intent intent, @Nullable Bundle options,
181 UserHandle userId) {
182 }
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800183 }
184
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800185 /** ShortcutService with injection override methods. */
186 private final class ShortcutServiceTestable extends ShortcutService {
Makoto Onuki4dbe0de2016-03-14 17:31:49 -0700187 final ServiceContext mContext;
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800188
Makoto Onukiaa8b94a2016-03-17 13:14:05 -0700189 public ShortcutServiceTestable(ServiceContext context, Looper looper) {
190 super(context, looper);
Makoto Onuki4dbe0de2016-03-14 17:31:49 -0700191 mContext = context;
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800192 }
193
194 @Override
Makoto Onuki4362a662016-03-08 18:59:09 -0800195 String injectShortcutManagerConstants() {
196 return ConfigConstants.KEY_RESET_INTERVAL_SEC + "=" + (INTERVAL / 1000) + ","
197 + ConfigConstants.KEY_MAX_SHORTCUTS + "=" + MAX_SHORTCUTS + ","
198 + ConfigConstants.KEY_MAX_DAILY_UPDATES + "=" + MAX_DAILY_UPDATES + ","
199 + ConfigConstants.KEY_MAX_ICON_DIMENSION_DP + "=" + MAX_ICON_DIMENSION + ","
200 + ConfigConstants.KEY_MAX_ICON_DIMENSION_DP_LOWRAM + "="
201 + MAX_ICON_DIMENSION_LOWRAM + ","
202 + ConfigConstants.KEY_ICON_FORMAT + "=PNG,"
203 + ConfigConstants.KEY_ICON_QUALITY + "=100";
204 }
205
206 @Override
Makoto Onuki4dbe0de2016-03-14 17:31:49 -0700207 long injectClearCallingIdentity() {
208 return mContext.injectClearCallingIdentity();
209 }
210
211 @Override
212 void injectRestoreCallingIdentity(long token) {
213 mContext.injectRestoreCallingIdentity(token);
214 }
215
216 @Override
Makoto Onuki4362a662016-03-08 18:59:09 -0800217 int injectDipToPixel(int dip) {
218 return dip;
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800219 }
220
221 @Override
222 long injectCurrentTimeMillis() {
223 return mInjectedCurrentTimeLillis;
224 }
225
226 @Override
227 int injectBinderCallingUid() {
228 return mInjectedCallingUid;
229 }
230
231 @Override
Makoto Onuki55046222016-03-08 10:49:47 -0800232 int injectGetPackageUid(String packageName, int userId) {
Makoto Onuki0acbb142016-03-22 17:02:57 -0700233 return getInjectedPackageInfo(packageName, userId, false).applicationInfo.uid;
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800234 }
235
236 @Override
237 File injectSystemDataPath() {
238 return new File(mInjectedFilePathRoot, "system");
239 }
240
241 @Override
242 File injectUserDataPath(@UserIdInt int userId) {
243 return new File(mInjectedFilePathRoot, "user-" + userId);
244 }
Makoto Onuki55046222016-03-08 10:49:47 -0800245
246 @Override
247 void injectValidateIconResPackage(ShortcutInfo shortcut, Icon icon) {
248 // Can't check
249 }
Makoto Onuki4362a662016-03-08 18:59:09 -0800250
251 @Override
252 boolean injectIsLowRamDevice() {
Makoto Onukicdc78f72016-03-21 15:47:52 -0700253 return mInjectedIsLowRamDevice;
Makoto Onuki4362a662016-03-08 18:59:09 -0800254 }
Makoto Onuki2d5b4652016-03-11 16:09:54 -0800255
256 @Override
257 PackageManagerInternal injectPackageManagerInternal() {
258 return mMockPackageManagerInternal;
259 }
260
261 @Override
262 boolean hasShortcutHostPermission(@NonNull String callingPackage, int userId) {
263 // Sort of hack; do a simpler check.
264 return LAUNCHER_1.equals(callingPackage) || LAUNCHER_2.equals(callingPackage);
265 }
Makoto Onuki4dbe0de2016-03-14 17:31:49 -0700266
267 @Override
Makoto Onuki0acbb142016-03-22 17:02:57 -0700268 PackageInfo injectPackageInfo(String packageName, @UserIdInt int userId,
269 boolean getSignatures) {
270 return getInjectedPackageInfo(packageName, userId, getSignatures);
271 }
272
273 @Override
Makoto Onuki905e8852016-03-28 10:40:58 -0700274 ApplicationInfo injectApplicationInfo(String packageName, @UserIdInt int userId) {
275 PackageInfo pi = injectPackageInfo(packageName, userId, /* getSignatures= */ false);
276 return pi != null ? pi.applicationInfo : null;
277 }
278
279 @Override
Makoto Onuki4dbe0de2016-03-14 17:31:49 -0700280 void postToHandler(Runnable r) {
281 final long token = mContext.injectClearCallingIdentity();
Makoto Onukiaa8b94a2016-03-17 13:14:05 -0700282 super.postToHandler(r);
283 try {
284 runTestOnUiThread(() -> {});
285 } catch (Throwable e) {
286 fail("runTestOnUiThread failed: " + e);
287 }
Makoto Onuki4dbe0de2016-03-14 17:31:49 -0700288 mContext.injectRestoreCallingIdentity(token);
289 }
Makoto Onukide667372016-03-15 14:29:20 -0700290
291 @Override
292 void wtf(String message, Exception e) {
293 // During tests, WTF is fatal.
294 fail(message + " exception: " + e);
295 }
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800296 }
297
298 /** ShortcutManager with injection override methods. */
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800299 private class ShortcutManagerTestable extends ShortcutManager {
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800300 public ShortcutManagerTestable(Context context, ShortcutServiceTestable service) {
301 super(context, service);
302 }
303
304 @Override
305 protected int injectMyUserId() {
306 return UserHandle.getUserId(mInjectedCallingUid);
307 }
308 }
309
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800310 private class LauncherAppImplTestable extends LauncherAppsImpl {
Makoto Onuki4dbe0de2016-03-14 17:31:49 -0700311 final ServiceContext mContext;
312
313 public LauncherAppImplTestable(ServiceContext context) {
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800314 super(context);
Makoto Onuki4dbe0de2016-03-14 17:31:49 -0700315 mContext = context;
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800316 }
317
318 @Override
319 public void ensureInUserProfiles(UserHandle userToCheck, String message) {
Makoto Onuki4dbe0de2016-03-14 17:31:49 -0700320 if (getCallingUserId() == userToCheck.getIdentifier()) {
321 return; // okay
322 }
Makoto Onukid99c6f02016-03-28 11:02:54 -0700323 if (getCallingUserId() == USER_0 && userToCheck.getIdentifier() == USER_P0) {
324 return; // profile, okay.
325 }
326 if (getCallingUserId() == USER_P0 && userToCheck.getIdentifier() == USER_0) {
327 return; // profile, okay.
328 }
Makoto Onuki4dbe0de2016-03-14 17:31:49 -0700329
Makoto Onukid99c6f02016-03-28 11:02:54 -0700330 if (mInjectedCallingUid != Process.SYSTEM_UID) {
331 throw new SecurityException("To access other users, you need to be SYSTEM" +
332 ", but current UID=" + mInjectedCallingUid);
333 }
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800334 }
335
336 @Override
337 public void verifyCallingPackage(String callingPackage) {
338 // SKIP
339 }
Makoto Onuki4dbe0de2016-03-14 17:31:49 -0700340
341 @Override
342 boolean isEnabledProfileOf(UserHandle user, UserHandle listeningUser, String debugMsg) {
343 // This requires CROSS_USER
344 assertEquals(Process.SYSTEM_UID, mInjectedCallingUid);
345 return user.getIdentifier() == listeningUser.getIdentifier();
346 }
347
348 @Override
Makoto Onukiaa8b94a2016-03-17 13:14:05 -0700349 void postToPackageMonitorHandler(Runnable r) {
Makoto Onuki4dbe0de2016-03-14 17:31:49 -0700350 final long token = mContext.injectClearCallingIdentity();
351 r.run();
352 mContext.injectRestoreCallingIdentity(token);
353 }
Makoto Onukid99c6f02016-03-28 11:02:54 -0700354
355 @Override
356 int injectBinderCallingUid() {
357 return mInjectedCallingUid;
358 }
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800359 }
360
361 private class LauncherAppsTestable extends LauncherApps {
362 public LauncherAppsTestable(Context context, ILauncherApps service) {
363 super(context, service);
364 }
365 }
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800366
367 public static class ShortcutActivity extends Activity {
368 }
369
370 public static class ShortcutActivity2 extends Activity {
371 }
372
373 public static class ShortcutActivity3 extends Activity {
374 }
375
376 private ServiceContext mServiceContext;
377 private ClientContext mClientContext;
378
379 private ShortcutServiceTestable mService;
380 private ShortcutManagerTestable mManager;
381 private ShortcutServiceInternal mInternal;
382
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800383 private LauncherAppImplTestable mLauncherAppImpl;
384 private LauncherAppsTestable mLauncherApps;
385
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800386 private File mInjectedFilePathRoot;
387
388 private long mInjectedCurrentTimeLillis;
389
Makoto Onukicdc78f72016-03-21 15:47:52 -0700390 private boolean mInjectedIsLowRamDevice;
Makoto Onuki4362a662016-03-08 18:59:09 -0800391
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800392 private int mInjectedCallingUid;
393 private String mInjectedClientPackage;
394
Makoto Onuki0acbb142016-03-22 17:02:57 -0700395 private Map<String, PackageInfo> mInjectedPackages;
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800396
Makoto Onukid99c6f02016-03-28 11:02:54 -0700397 private ArrayList<PackageWithUser> mUninstalledPackages;
398
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800399 private PackageManager mMockPackageManager;
Makoto Onuki2d5b4652016-03-11 16:09:54 -0800400 private PackageManagerInternal mMockPackageManagerInternal;
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800401 private UserManager mMockUserManager;
402
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800403 private static final String CALLING_PACKAGE_1 = "com.android.test.1";
404 private static final int CALLING_UID_1 = 10001;
405
406 private static final String CALLING_PACKAGE_2 = "com.android.test.2";
407 private static final int CALLING_UID_2 = 10002;
408
409 private static final String CALLING_PACKAGE_3 = "com.android.test.3";
410 private static final int CALLING_UID_3 = 10003;
411
412 private static final String LAUNCHER_1 = "com.android.launcher.1";
413 private static final int LAUNCHER_UID_1 = 10011;
414
415 private static final String LAUNCHER_2 = "com.android.launcher.2";
416 private static final int LAUNCHER_UID_2 = 10012;
417
Makoto Onuki4dbe0de2016-03-14 17:31:49 -0700418 private static final int USER_0 = UserHandle.USER_SYSTEM;
Makoto Onuki41066a62016-03-09 16:18:44 -0800419 private static final int USER_10 = 10;
420 private static final int USER_11 = 11;
Makoto Onukid99c6f02016-03-28 11:02:54 -0700421 private static final int USER_P0 = 20; // profile of user 0
422
423 private static final UserHandle HANDLE_USER_0 = UserHandle.of(USER_0);
424 private static final UserHandle HANDLE_USER_10 = UserHandle.of(USER_10);
425 private static final UserHandle HANDLE_USER_11 = UserHandle.of(USER_11);
426 private static final UserHandle HANDLE_USER_P0 = UserHandle.of(USER_P0);
427
Makoto Onuki41066a62016-03-09 16:18:44 -0800428
Makoto Onukiaa8b94a2016-03-17 13:14:05 -0700429 private static final long START_TIME = 1440000000101L;
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800430
431 private static final long INTERVAL = 10000;
432
Makoto Onuki55046222016-03-08 10:49:47 -0800433 private static final int MAX_SHORTCUTS = 10;
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800434
435 private static final int MAX_DAILY_UPDATES = 3;
436
Makoto Onuki55046222016-03-08 10:49:47 -0800437 private static final int MAX_ICON_DIMENSION = 128;
438
Makoto Onuki4362a662016-03-08 18:59:09 -0800439 private static final int MAX_ICON_DIMENSION_LOWRAM = 32;
440
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800441 @Override
442 protected void setUp() throws Exception {
443 super.setUp();
444
Makoto Onukid99c6f02016-03-28 11:02:54 -0700445 mServiceContext = spy(new ServiceContext());
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800446 mClientContext = new ClientContext();
447
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800448 mMockPackageManager = mock(PackageManager.class);
Makoto Onuki2d5b4652016-03-11 16:09:54 -0800449 mMockPackageManagerInternal = mock(PackageManagerInternal.class);
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800450 mMockUserManager = mock(UserManager.class);
451
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800452 // Prepare injection values.
453
454 mInjectedCurrentTimeLillis = START_TIME;
455
Makoto Onuki0acbb142016-03-22 17:02:57 -0700456 mInjectedPackages = new HashMap<>();;
457 addPackage(CALLING_PACKAGE_1, CALLING_UID_1, 1);
458 addPackage(CALLING_PACKAGE_2, CALLING_UID_2, 2);
459 addPackage(CALLING_PACKAGE_3, CALLING_UID_3, 3);
460 addPackage(LAUNCHER_1, LAUNCHER_UID_1, 4);
461 addPackage(LAUNCHER_2, LAUNCHER_UID_2, 5);
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800462
Makoto Onukid99c6f02016-03-28 11:02:54 -0700463 mUninstalledPackages = new ArrayList<>();
464
Makoto Onuki4dbe0de2016-03-14 17:31:49 -0700465 mInjectedFilePathRoot = new File(getTestContext().getCacheDir(), "test-files");
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800466
467 // Empty the data directory.
468 if (mInjectedFilePathRoot.exists()) {
469 Assert.assertTrue("failed to delete dir",
470 FileUtils.deleteContents(mInjectedFilePathRoot));
471 }
472 mInjectedFilePathRoot.mkdirs();
473
474 initService();
475 setCaller(CALLING_PACKAGE_1);
476 }
477
Makoto Onuki4dbe0de2016-03-14 17:31:49 -0700478 private Context getTestContext() {
479 return getInstrumentation().getContext();
480 }
481
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800482 /** (Re-) init the manager and the service. */
483 private void initService() {
484 LocalServices.removeServiceForTest(ShortcutServiceInternal.class);
485
486 // Instantiate targets.
Makoto Onukiaa8b94a2016-03-17 13:14:05 -0700487 mService = new ShortcutServiceTestable(mServiceContext, Looper.getMainLooper());
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800488 mManager = new ShortcutManagerTestable(mClientContext, mService);
489
490 mInternal = LocalServices.getService(ShortcutServiceInternal.class);
491
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800492 mLauncherAppImpl = new LauncherAppImplTestable(mServiceContext);
493 mLauncherApps = new LauncherAppsTestable(mClientContext, mLauncherAppImpl);
494
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800495 // Load the setting file.
496 mService.onBootPhase(SystemService.PHASE_LOCK_SETTINGS_READY);
497 }
498
Makoto Onuki0acbb142016-03-22 17:02:57 -0700499 private void addPackage(String packageName, int uid, int version) {
500 addPackage(packageName, uid, version, packageName);
501 }
502
Makoto Onukid99c6f02016-03-28 11:02:54 -0700503 private <T> List<T> list(T... array) {
504 return Arrays.asList(array);
505 }
506
Makoto Onuki0acbb142016-03-22 17:02:57 -0700507 private Signature[] genSignatures(String... signatures) {
508 final Signature[] sigs = new Signature[signatures.length];
509 for (int i = 0; i < signatures.length; i++){
510 sigs[i] = new Signature(signatures[i].getBytes());
511 }
512 return sigs;
513 }
514
515 private PackageInfo genPackage(String packageName, int uid, int version, String... signatures) {
516 final PackageInfo pi = new PackageInfo();
517 pi.packageName = packageName;
518 pi.applicationInfo = new ApplicationInfo();
519 pi.applicationInfo.uid = uid;
Makoto Onuki905e8852016-03-28 10:40:58 -0700520 pi.applicationInfo.flags = ApplicationInfo.FLAG_INSTALLED
521 | ApplicationInfo.FLAG_ALLOW_BACKUP;
Makoto Onuki0acbb142016-03-22 17:02:57 -0700522 pi.versionCode = version;
523 pi.signatures = genSignatures(signatures);
524
525 return pi;
526 }
527
528 private void addPackage(String packageName, int uid, int version, String... signatures) {
529 mInjectedPackages.put(packageName, genPackage(packageName, uid, version, signatures));
530 }
531
Makoto Onukid99c6f02016-03-28 11:02:54 -0700532 private void uninstallPackage(int userId, String packageName) {
533 mUninstalledPackages.add(PackageWithUser.of(userId, packageName));
534 }
535
Makoto Onuki0acbb142016-03-22 17:02:57 -0700536 PackageInfo getInjectedPackageInfo(String packageName, @UserIdInt int userId,
537 boolean getSignatures) {
538 final PackageInfo pi = mInjectedPackages.get(packageName);
539 if (pi == null) return null;
540
541 final PackageInfo ret = new PackageInfo();
542 ret.packageName = pi.packageName;
543 ret.versionCode = pi.versionCode;
544 ret.applicationInfo = new ApplicationInfo(pi.applicationInfo);
545 ret.applicationInfo.uid = UserHandle.getUid(userId, pi.applicationInfo.uid);
Makoto Onukid99c6f02016-03-28 11:02:54 -0700546 if (mUninstalledPackages.contains(PackageWithUser.of(userId, packageName))) {
547 ret.applicationInfo.flags &= ~ApplicationInfo.FLAG_INSTALLED;
548 }
Makoto Onuki0acbb142016-03-22 17:02:57 -0700549
550 if (getSignatures) {
551 ret.signatures = pi.signatures;
552 }
553
554 return ret;
555 }
556
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800557 /** Replace the current calling package */
Makoto Onuki41066a62016-03-09 16:18:44 -0800558 private void setCaller(String packageName, int userId) {
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800559 mInjectedClientPackage = packageName;
Makoto Onuki0acbb142016-03-22 17:02:57 -0700560 mInjectedCallingUid =
561 Preconditions.checkNotNull(getInjectedPackageInfo(packageName, userId, false),
562 "Unknown package").applicationInfo.uid;
Makoto Onuki41066a62016-03-09 16:18:44 -0800563 }
564
565 private void setCaller(String packageName) {
566 setCaller(packageName, UserHandle.USER_SYSTEM);
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800567 }
568
569 private String getCallingPackage() {
570 return mInjectedClientPackage;
571 }
572
Makoto Onuki41066a62016-03-09 16:18:44 -0800573 private void runWithCaller(String packageName, int userId, Runnable r) {
574 final String previousPackage = mInjectedClientPackage;
Makoto Onuki0acbb142016-03-22 17:02:57 -0700575 final int previousUserId = UserHandle.getUserId(mInjectedCallingUid);
Makoto Onuki41066a62016-03-09 16:18:44 -0800576
577 setCaller(packageName, userId);
578
579 r.run();
580
Makoto Onuki0acbb142016-03-22 17:02:57 -0700581 setCaller(previousPackage, previousUserId);
Makoto Onuki41066a62016-03-09 16:18:44 -0800582 }
583
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800584 private int getCallingUserId() {
585 return UserHandle.getUserId(mInjectedCallingUid);
586 }
587
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800588 private UserHandle getCallingUser() {
589 return UserHandle.of(getCallingUserId());
590 }
591
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800592 /** For debugging */
593 private void dumpsysOnLogcat() {
594 if (!ENABLE_DUMP) return;
595
596 final ByteArrayOutputStream out = new ByteArrayOutputStream();
597 final PrintWriter pw = new PrintWriter(out);
598 mService.dumpInner(pw);
599 pw.close();
600
601 Log.e(TAG, "Dumping ShortcutService:");
602 for (String line : out.toString().split("\n")) {
603 Log.e(TAG, line);
604 }
605 }
606
607 /**
608 * For debugging, dump arbitrary file on logcat.
609 */
610 private void dumpFileOnLogcat(String path) {
611 if (!ENABLE_DUMP) return;
612
613 Log.i(TAG, "Dumping file: " + path);
614 final StringBuilder sb = new StringBuilder();
615 try (BufferedReader br = new BufferedReader(new FileReader(path))) {
616 String line;
617 while ((line = br.readLine()) != null) {
618 Log.i(TAG, line);
619 }
620 } catch (Exception e) {
621 Log.e(TAG, "Couldn't read file", e);
622 fail("Exception " + e);
623 }
624 }
625
626 /**
627 * For debugging, dump the main state file on logcat.
628 */
629 private void dumpBaseStateFile() {
Makoto Onukiaa8b94a2016-03-17 13:14:05 -0700630 mService.saveDirtyInfo();
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800631 dumpFileOnLogcat(mInjectedFilePathRoot.getAbsolutePath()
632 + "/system/" + ShortcutService.FILENAME_BASE_STATE);
633 }
634
635 /**
636 * For debugging, dump per-user state file on logcat.
637 */
638 private void dumpUserFile(int userId) {
Makoto Onukiaa8b94a2016-03-17 13:14:05 -0700639 mService.saveDirtyInfo();
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800640 dumpFileOnLogcat(mInjectedFilePathRoot.getAbsolutePath()
641 + "/user-" + userId
642 + "/" + ShortcutService.FILENAME_USER_PACKAGES);
643 }
644
Makoto Onuki4dbe0de2016-03-14 17:31:49 -0700645 private void waitOnMainThread() throws Throwable {
646 runTestOnUiThread(() -> {});
647 }
648
Makoto Onukie3ae7ec2016-03-29 15:45:25 -0700649 public static Bundle makeBundle(Object... keysAndValues) {
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800650 Preconditions.checkState((keysAndValues.length % 2) == 0);
651
652 if (keysAndValues.length == 0) {
653 return null;
654 }
655 final Bundle ret = new Bundle();
656
657 for (int i = keysAndValues.length - 2; i >= 0; i -= 2) {
658 final String key = keysAndValues[i].toString();
659 final Object value = keysAndValues[i + 1];
660
661 if (value == null) {
662 ret.putString(key, null);
663 } else if (value instanceof Integer) {
664 ret.putInt(key, (Integer) value);
665 } else if (value instanceof String) {
666 ret.putString(key, (String) value);
667 } else if (value instanceof Bundle) {
668 ret.putBundle(key, (Bundle) value);
669 } else {
670 fail("Type not supported yet: " + value.getClass().getName());
671 }
672 }
673 return ret;
674 }
675
676 /**
677 * Make a shortcut with an ID.
678 */
679 private ShortcutInfo makeShortcut(String id) {
680 return makeShortcut(
681 id, "Title-" + id, /* activity =*/ null, /* icon =*/ null,
682 makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* weight =*/ 0);
683 }
684
685 /**
686 * Make a shortcut with an ID and timestamp.
687 */
688 private ShortcutInfo makeShortcutWithTimestamp(String id, long timestamp) {
689 final ShortcutInfo s = makeShortcut(
690 id, "Title-" + id, /* activity =*/ null, /* icon =*/ null,
691 makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* weight =*/ 0);
692 s.setTimestamp(timestamp);
693 return s;
694 }
695
696 /**
Makoto Onuki55046222016-03-08 10:49:47 -0800697 * Make a shortcut with an ID and icon.
698 */
699 private ShortcutInfo makeShortcutWithIcon(String id, Icon icon) {
700 return makeShortcut(
701 id, "Title-" + id, /* activity =*/ null, icon,
702 makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* weight =*/ 0);
703 }
704
705 private ShortcutInfo makePackageShortcut(String packageName, String id) {
706 String origCaller = getCallingPackage();
707
708 setCaller(packageName);
709 ShortcutInfo s = makeShortcut(
710 id, "Title-" + id, /* activity =*/ null, /* icon =*/ null,
711 makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* weight =*/ 0);
712 setCaller(origCaller); // restore the caller
713
714 return s;
715 }
716
Makoto Onuki55046222016-03-08 10:49:47 -0800717 /**
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800718 * Make multiple shortcuts with IDs.
719 */
720 private List<ShortcutInfo> makeShortcuts(String... ids) {
721 final ArrayList<ShortcutInfo> ret = new ArrayList();
722 for (String id : ids) {
723 ret.add(makeShortcut(id));
724 }
725 return ret;
726 }
727
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800728 private ShortcutInfo.Builder makeShortcutBuilder() {
729 return new ShortcutInfo.Builder(mClientContext);
730 }
731
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800732 /**
733 * Make a shortcut with details.
734 */
735 private ShortcutInfo makeShortcut(String id, String title, ComponentName activity,
736 Icon icon, Intent intent, int weight) {
737 final ShortcutInfo.Builder b = new ShortcutInfo.Builder(mClientContext)
738 .setId(id)
739 .setTitle(title)
740 .setWeight(weight)
741 .setIntent(intent);
742 if (icon != null) {
743 b.setIcon(icon);
744 }
745 if (activity != null) {
746 b.setActivityComponent(activity);
747 }
748 final ShortcutInfo s = b.build();
749
750 s.setTimestamp(mInjectedCurrentTimeLillis); // HACK
751
752 return s;
753 }
754
755 /**
756 * Make an intent.
757 */
758 private Intent makeIntent(String action, Class<?> clazz, Object... bundleKeysAndValues) {
759 final Intent intent = new Intent(action);
760 intent.setComponent(makeComponent(clazz));
761 intent.replaceExtras(makeBundle(bundleKeysAndValues));
762 return intent;
763 }
764
765 /**
766 * Make an component name, with the client context.
767 */
768 @NonNull
769 private ComponentName makeComponent(Class<?> clazz) {
770 return new ComponentName(mClientContext, clazz);
771 }
772
Makoto Onukicdc78f72016-03-21 15:47:52 -0700773 private <T> Set<T> makeSet(T... values) {
774 final HashSet<T> ret = new HashSet<>();
775 for (T s : values) {
776 ret.add(s);
777 }
778 return ret;
779 }
780
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800781 @NonNull
782 private ShortcutInfo findById(List<ShortcutInfo> list, String id) {
783 for (ShortcutInfo s : list) {
784 if (s.getId().equals(id)) {
785 return s;
786 }
787 }
788 fail("Shortcut with id " + id + " not found");
789 return null;
790 }
791
792 private void assertResetTimes(long expectedLastResetTime, long expectedNextResetTime) {
793 assertEquals(expectedLastResetTime, mService.getLastResetTimeLocked());
794 assertEquals(expectedNextResetTime, mService.getNextResetTimeLocked());
795 }
796
797 @NonNull
798 private List<ShortcutInfo> assertShortcutIds(@NonNull List<ShortcutInfo> actualShortcuts,
799 String... expectedIds) {
Makoto Onukid99c6f02016-03-28 11:02:54 -0700800 final HashSet<String> expected = new HashSet<>(list(expectedIds));
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800801 final HashSet<String> actual = new HashSet<>();
802 for (ShortcutInfo s : actualShortcuts) {
803 actual.add(s.getId());
804 }
805
806 // Compare the sets.
807 assertEquals(expected, actual);
808 return actualShortcuts;
809 }
810
811 @NonNull
812 private List<ShortcutInfo> assertAllHaveIntents(
813 @NonNull List<ShortcutInfo> actualShortcuts) {
814 for (ShortcutInfo s : actualShortcuts) {
815 assertNotNull("ID " + s.getId(), s.getIntent());
816 }
817 return actualShortcuts;
818 }
819
820 @NonNull
821 private List<ShortcutInfo> assertAllNotHaveIntents(
822 @NonNull List<ShortcutInfo> actualShortcuts) {
823 for (ShortcutInfo s : actualShortcuts) {
824 assertNull("ID " + s.getId(), s.getIntent());
825 }
826 return actualShortcuts;
827 }
828
829 @NonNull
830 private List<ShortcutInfo> assertAllHaveTitle(
831 @NonNull List<ShortcutInfo> actualShortcuts) {
832 for (ShortcutInfo s : actualShortcuts) {
833 assertNotNull("ID " + s.getId(), s.getTitle());
834 }
835 return actualShortcuts;
836 }
837
838 @NonNull
839 private List<ShortcutInfo> assertAllNotHaveTitle(
840 @NonNull List<ShortcutInfo> actualShortcuts) {
841 for (ShortcutInfo s : actualShortcuts) {
842 assertNull("ID " + s.getId(), s.getTitle());
843 }
844 return actualShortcuts;
845 }
846
847 @NonNull
Makoto Onuki55046222016-03-08 10:49:47 -0800848 private List<ShortcutInfo> assertAllNotHaveIcon(
849 @NonNull List<ShortcutInfo> actualShortcuts) {
850 for (ShortcutInfo s : actualShortcuts) {
851 assertNull("ID " + s.getId(), s.getIcon());
852 }
853 return actualShortcuts;
854 }
855
856 @NonNull
857 private List<ShortcutInfo> assertAllHaveIconResId(
858 @NonNull List<ShortcutInfo> actualShortcuts) {
859 for (ShortcutInfo s : actualShortcuts) {
860 assertTrue("ID " + s.getId() + " not have icon res ID", s.hasIconResource());
861 assertFalse("ID " + s.getId() + " shouldn't have icon FD", s.hasIconFile());
862 }
863 return actualShortcuts;
864 }
865
866 @NonNull
867 private List<ShortcutInfo> assertAllHaveIconFile(
868 @NonNull List<ShortcutInfo> actualShortcuts) {
869 for (ShortcutInfo s : actualShortcuts) {
870 assertFalse("ID " + s.getId() + " shouldn't have icon res ID", s.hasIconResource());
871 assertTrue("ID " + s.getId() + " not have icon FD", s.hasIconFile());
872 }
873 return actualShortcuts;
874 }
875
876 @NonNull
Makoto Onuki41066a62016-03-09 16:18:44 -0800877 private List<ShortcutInfo> assertAllHaveIcon(
878 @NonNull List<ShortcutInfo> actualShortcuts) {
879 for (ShortcutInfo s : actualShortcuts) {
880 assertTrue("ID " + s.getId(), s.hasIconFile() || s.hasIconResource());
881 }
882 return actualShortcuts;
883 }
884
885 @NonNull
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800886 private List<ShortcutInfo> assertAllHaveFlags(@NonNull List<ShortcutInfo> actualShortcuts,
887 int shortcutFlags) {
888 for (ShortcutInfo s : actualShortcuts) {
889 assertTrue("ID " + s.getId(), s.hasFlags(shortcutFlags));
890 }
891 return actualShortcuts;
892 }
893
894 @NonNull
Makoto Onuki55046222016-03-08 10:49:47 -0800895 private List<ShortcutInfo> assertAllKeyFieldsOnly(
896 @NonNull List<ShortcutInfo> actualShortcuts) {
897 for (ShortcutInfo s : actualShortcuts) {
898 assertTrue("ID " + s.getId(), s.hasKeyFieldsOnly());
899 }
900 return actualShortcuts;
901 }
902
903 @NonNull
904 private List<ShortcutInfo> assertAllNotKeyFieldsOnly(
905 @NonNull List<ShortcutInfo> actualShortcuts) {
906 for (ShortcutInfo s : actualShortcuts) {
907 assertFalse("ID " + s.getId(), s.hasKeyFieldsOnly());
908 }
909 return actualShortcuts;
910 }
911
912 @NonNull
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800913 private List<ShortcutInfo> assertAllDynamic(@NonNull List<ShortcutInfo> actualShortcuts) {
914 return assertAllHaveFlags(actualShortcuts, ShortcutInfo.FLAG_DYNAMIC);
915 }
916
917 @NonNull
918 private List<ShortcutInfo> assertAllPinned(@NonNull List<ShortcutInfo> actualShortcuts) {
919 return assertAllHaveFlags(actualShortcuts, ShortcutInfo.FLAG_PINNED);
920 }
921
922 @NonNull
923 private List<ShortcutInfo> assertAllDynamicOrPinned(
924 @NonNull List<ShortcutInfo> actualShortcuts) {
925 for (ShortcutInfo s : actualShortcuts) {
926 assertTrue("ID " + s.getId(), s.isDynamic() || s.isPinned());
927 }
928 return actualShortcuts;
929 }
930
Makoto Onukid99c6f02016-03-28 11:02:54 -0700931 private void assertDynamicOnly(ShortcutInfo si) {
932 assertTrue(si.isDynamic());
933 assertFalse(si.isPinned());
934 }
935
936 private void assertPinnedOnly(ShortcutInfo si) {
937 assertFalse(si.isDynamic());
938 assertTrue(si.isPinned());
939 }
940
941 private void assertDynamicAndPinned(ShortcutInfo si) {
942 assertTrue(si.isDynamic());
943 assertTrue(si.isPinned());
944 }
945
Makoto Onuki55046222016-03-08 10:49:47 -0800946 private void assertBitmapSize(int expectedWidth, int expectedHeight, @NonNull Bitmap bitmap) {
947 assertEquals("width", expectedWidth, bitmap.getWidth());
948 assertEquals("height", expectedHeight, bitmap.getHeight());
949 }
950
951 private <T> void assertAllUnique(Collection<T> list) {
952 final Set<Object> set = new HashSet<>();
953 for (T item : list) {
954 if (set.contains(item)) {
955 fail("Duplicate item found: " + item + " (in the list: " + list + ")");
956 }
957 set.add(item);
958 }
959 }
960
961 @NonNull
962 private Bitmap pfdToBitmap(@NonNull ParcelFileDescriptor pfd) {
963 Preconditions.checkNotNull(pfd);
964 try {
965 return BitmapFactory.decodeFileDescriptor(pfd.getFileDescriptor());
966 } finally {
967 IoUtils.closeQuietly(pfd);
968 }
969 }
970
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800971 private void assertBundleEmpty(BaseBundle b) {
972 assertTrue(b == null || b.size() == 0);
973 }
974
Makoto Onuki41066a62016-03-09 16:18:44 -0800975 private ShortcutInfo getPackageShortcut(String packageName, String shortcutId, int userId) {
976 return mService.getPackageShortcutForTest(packageName, shortcutId, userId);
977 }
978
Makoto Onukicdc78f72016-03-21 15:47:52 -0700979 private void assertShortcutExists(String packageName, String shortcutId, int userId) {
980 assertTrue(getPackageShortcut(packageName, shortcutId, userId) != null);
981 }
982
983 private void assertShortcutNotExists(String packageName, String shortcutId, int userId) {
984 assertTrue(getPackageShortcut(packageName, shortcutId, userId) == null);
985 }
986
Makoto Onukid99c6f02016-03-28 11:02:54 -0700987 private Intent launchShortcutAndGetIntent(
988 @NonNull String packageName, @NonNull String shortcutId, int userId) {
989 reset(mServiceContext);
990 assertTrue(mLauncherApps.startShortcut(packageName, shortcutId, null, null,
991 UserHandle.of(userId)));
992
993 final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
994 verify(mServiceContext).startActivityAsUser(
995 intentCaptor.capture(),
996 any(Bundle.class),
997 eq(UserHandle.of(userId)));
998 return intentCaptor.getValue();
999 }
1000
1001 private void assertShortcutLaunchable(@NonNull String packageName, @NonNull String shortcutId,
1002 int userId) {
1003 assertNotNull(launchShortcutAndGetIntent(packageName, shortcutId, userId));
1004 }
1005
1006 private void assertShortcutNotLaunchable(@NonNull String packageName,
1007 @NonNull String shortcutId, int userId) {
1008 try {
1009 final boolean ok = mLauncherApps.startShortcut(packageName, shortcutId, null, null,
1010 UserHandle.of(userId));
1011 if (!ok) {
1012 return; // didn't launch, okay.
1013 }
1014 fail();
1015 } catch (SecurityException expected) {
1016 // security exception is okay too.
1017 }
1018 }
1019
Makoto Onuki41066a62016-03-09 16:18:44 -08001020 private ShortcutInfo getPackageShortcut(String packageName, String shortcutId) {
1021 return getPackageShortcut(packageName, shortcutId, getCallingUserId());
1022 }
1023
1024 private ShortcutInfo getCallerShortcut(String shortcutId) {
1025 return getPackageShortcut(getCallingPackage(), shortcutId, getCallingUserId());
1026 }
1027
Makoto Onukicdc78f72016-03-21 15:47:52 -07001028 private List<ShortcutInfo> getLauncherShortcuts(String launcher, int userId, int queryFlags) {
1029 final List<ShortcutInfo>[] ret = new List[1];
1030 runWithCaller(launcher, userId, () -> {
1031 final ShortcutQuery q = new ShortcutQuery();
1032 q.setQueryFlags(queryFlags);
1033 ret[0] = mLauncherApps.getShortcuts(q, UserHandle.of(userId));
1034 });
1035 return ret[0];
1036 }
1037
1038 private List<ShortcutInfo> getLauncherPinnedShortcuts(String launcher, int userId) {
1039 return getLauncherShortcuts(launcher, userId, ShortcutQuery.FLAG_GET_PINNED);
1040 }
1041
Makoto Onuki0acbb142016-03-22 17:02:57 -07001042
1043 private Intent genPackageDeleteIntent(String pakcageName, int userId) {
1044 Intent i = new Intent(Intent.ACTION_PACKAGE_REMOVED);
1045 i.setData(Uri.parse("package:" + pakcageName));
1046 i.putExtra(Intent.EXTRA_USER_HANDLE, userId);
1047 return i;
1048 }
1049
1050 private Intent genPackageUpdateIntent(String pakcageName, int userId) {
1051 Intent i = new Intent(Intent.ACTION_PACKAGE_ADDED);
1052 i.setData(Uri.parse("package:" + pakcageName));
1053 i.putExtra(Intent.EXTRA_USER_HANDLE, userId);
1054 i.putExtra(Intent.EXTRA_REPLACING, true);
1055 return i;
1056 }
1057
Makoto Onukicdc78f72016-03-21 15:47:52 -07001058 /**
1059 * Wrap a set in an ArraySet just to get a better toString.
1060 */
1061 private <T> Set<T> set(Set<T> in) {
1062 return new ArraySet<T>(in);
1063 }
1064
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001065 /**
1066 * Test for the first launch path, no settings file available.
1067 */
1068 public void testFirstInitialize() {
1069 assertResetTimes(START_TIME, START_TIME + INTERVAL);
1070 }
1071
1072 /**
Makoto Onukicdc78f72016-03-21 15:47:52 -07001073 * Test for {@link ShortcutService#getLastResetTimeLocked()} and
1074 * {@link ShortcutService#getNextResetTimeLocked()}.
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001075 */
1076 public void testUpdateAndGetNextResetTimeLocked() {
1077 assertResetTimes(START_TIME, START_TIME + INTERVAL);
1078
1079 // Advance clock.
1080 mInjectedCurrentTimeLillis += 100;
1081
1082 // Shouldn't have changed.
1083 assertResetTimes(START_TIME, START_TIME + INTERVAL);
1084
1085 // Advance clock, almost the reset time.
1086 mInjectedCurrentTimeLillis = START_TIME + INTERVAL - 1;
1087
1088 // Shouldn't have changed.
1089 assertResetTimes(START_TIME, START_TIME + INTERVAL);
1090
1091 // Advance clock.
1092 mInjectedCurrentTimeLillis += 1;
1093
1094 assertResetTimes(START_TIME + INTERVAL, START_TIME + 2 * INTERVAL);
1095
1096 // Advance further; 4 days since start.
1097 mInjectedCurrentTimeLillis = START_TIME + 4 * INTERVAL + 50;
1098
1099 assertResetTimes(START_TIME + 4 * INTERVAL, START_TIME + 5 * INTERVAL);
1100 }
1101
1102 /**
1103 * Test for the restoration from saved file.
1104 */
1105 public void testInitializeFromSavedFile() {
1106
1107 mInjectedCurrentTimeLillis = START_TIME + 4 * INTERVAL + 50;
1108 assertResetTimes(START_TIME + 4 * INTERVAL, START_TIME + 5 * INTERVAL);
1109
1110 mService.saveBaseStateLocked();
1111
1112 dumpBaseStateFile();
1113
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07001114 mService.saveDirtyInfo();
1115
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001116 // Restore.
1117 initService();
1118
1119 assertResetTimes(START_TIME + 4 * INTERVAL, START_TIME + 5 * INTERVAL);
1120 }
1121
1122 /**
1123 * Test for the restoration from restored file.
1124 */
1125 public void testLoadFromBrokenFile() {
1126 // TODO Add various broken cases.
1127 }
1128
Makoto Onuki4362a662016-03-08 18:59:09 -08001129 public void testLoadConfig() {
1130 mService.updateConfigurationLocked(
1131 ConfigConstants.KEY_RESET_INTERVAL_SEC + "=123,"
1132 + ConfigConstants.KEY_MAX_SHORTCUTS + "=4,"
1133 + ConfigConstants.KEY_MAX_DAILY_UPDATES + "=5,"
1134 + ConfigConstants.KEY_MAX_ICON_DIMENSION_DP + "=100,"
1135 + ConfigConstants.KEY_MAX_ICON_DIMENSION_DP_LOWRAM + "=50,"
1136 + ConfigConstants.KEY_ICON_FORMAT + "=WEBP,"
1137 + ConfigConstants.KEY_ICON_QUALITY + "=75");
1138 assertEquals(123000, mService.getResetIntervalForTest());
1139 assertEquals(4, mService.getMaxDynamicShortcutsForTest());
1140 assertEquals(5, mService.getMaxDailyUpdatesForTest());
1141 assertEquals(100, mService.getMaxIconDimensionForTest());
1142 assertEquals(CompressFormat.WEBP, mService.getIconPersistFormatForTest());
1143 assertEquals(75, mService.getIconPersistQualityForTest());
1144
Makoto Onukicdc78f72016-03-21 15:47:52 -07001145 mInjectedIsLowRamDevice = true;
Makoto Onuki4362a662016-03-08 18:59:09 -08001146 mService.updateConfigurationLocked(
1147 ConfigConstants.KEY_MAX_ICON_DIMENSION_DP + "=100,"
1148 + ConfigConstants.KEY_MAX_ICON_DIMENSION_DP_LOWRAM + "=50,"
1149 + ConfigConstants.KEY_ICON_FORMAT + "=JPEG");
1150 assertEquals(ShortcutService.DEFAULT_RESET_INTERVAL_SEC * 1000,
1151 mService.getResetIntervalForTest());
1152
1153 assertEquals(ShortcutService.DEFAULT_MAX_SHORTCUTS_PER_APP,
1154 mService.getMaxDynamicShortcutsForTest());
1155
1156 assertEquals(ShortcutService.DEFAULT_MAX_DAILY_UPDATES,
1157 mService.getMaxDailyUpdatesForTest());
1158
1159 assertEquals(50, mService.getMaxIconDimensionForTest());
1160
1161 assertEquals(CompressFormat.JPEG, mService.getIconPersistFormatForTest());
1162
1163 assertEquals(ShortcutService.DEFAULT_ICON_PERSIST_QUALITY,
1164 mService.getIconPersistQualityForTest());
1165 }
1166
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001167 // === Test for app side APIs ===
1168
1169 /** Test for {@link android.content.pm.ShortcutManager#getMaxDynamicShortcutCount()} */
1170 public void testGetMaxDynamicShortcutCount() {
1171 assertEquals(MAX_SHORTCUTS, mManager.getMaxDynamicShortcutCount());
1172 }
1173
1174 /** Test for {@link android.content.pm.ShortcutManager#getRemainingCallCount()} */
1175 public void testGetRemainingCallCount() {
1176 assertEquals(MAX_DAILY_UPDATES, mManager.getRemainingCallCount());
1177 }
1178
1179 /** Test for {@link android.content.pm.ShortcutManager#getRateLimitResetTime()} */
1180 public void testGetRateLimitResetTime() {
1181 assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
1182
1183 mInjectedCurrentTimeLillis = START_TIME + 4 * INTERVAL + 50;
1184
1185 assertEquals(START_TIME + 5 * INTERVAL, mManager.getRateLimitResetTime());
1186 }
1187
1188 public void testSetDynamicShortcuts() {
Makoto Onuki0acbb142016-03-22 17:02:57 -07001189 setCaller(CALLING_PACKAGE_1, USER_0);
1190
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07001191 final Icon icon1 = Icon.createWithResource(getTestContext(), R.drawable.icon1);
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001192 final Icon icon2 = Icon.createWithBitmap(BitmapFactory.decodeResource(
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07001193 getTestContext().getResources(), R.drawable.icon2));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001194
1195 final ShortcutInfo si1 = makeShortcut(
1196 "shortcut1",
1197 "Title 1",
1198 makeComponent(ShortcutActivity.class),
1199 icon1,
1200 makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class,
1201 "key1", "val1", "nest", makeBundle("key", 123)),
1202 /* weight */ 10);
1203
1204 final ShortcutInfo si2 = makeShortcut(
1205 "shortcut2",
1206 "Title 2",
1207 /* activity */ null,
1208 icon2,
1209 makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class),
1210 /* weight */ 12);
1211 final ShortcutInfo si3 = makeShortcut("shortcut3");
1212
Makoto Onukid99c6f02016-03-28 11:02:54 -07001213 assertTrue(mManager.setDynamicShortcuts(list(si1, si2)));
Makoto Onuki55046222016-03-08 10:49:47 -08001214 assertShortcutIds(assertAllNotKeyFieldsOnly(
1215 mManager.getDynamicShortcuts()),
1216 "shortcut1", "shortcut2");
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001217 assertEquals(2, mManager.getRemainingCallCount());
1218
1219 // TODO: Check fields
1220
Makoto Onukid99c6f02016-03-28 11:02:54 -07001221 assertTrue(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki55046222016-03-08 10:49:47 -08001222 assertShortcutIds(assertAllNotKeyFieldsOnly(
1223 mManager.getDynamicShortcuts()),
1224 "shortcut1");
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001225 assertEquals(1, mManager.getRemainingCallCount());
1226
Makoto Onukid99c6f02016-03-28 11:02:54 -07001227 assertTrue(mManager.setDynamicShortcuts(list()));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001228 assertEquals(0, mManager.getDynamicShortcuts().size());
1229 assertEquals(0, mManager.getRemainingCallCount());
1230
1231 dumpsysOnLogcat();
1232
1233 mInjectedCurrentTimeLillis++; // Need to advance the clock for reset to work.
Makoto Onuki4554d0e2016-03-14 15:51:41 -07001234 mService.resetThrottlingInner(UserHandle.USER_SYSTEM);
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001235
1236 dumpsysOnLogcat();
1237
Makoto Onukid99c6f02016-03-28 11:02:54 -07001238 assertTrue(mManager.setDynamicShortcuts(list(si2, si3)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001239 assertEquals(2, mManager.getDynamicShortcuts().size());
1240
1241 // TODO Check max number
Makoto Onuki0acbb142016-03-22 17:02:57 -07001242
1243 runWithCaller(CALLING_PACKAGE_2, USER_10, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07001244 assertTrue(mManager.setDynamicShortcuts(list(makeShortcut("s1"))));
Makoto Onuki0acbb142016-03-22 17:02:57 -07001245 });
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001246 }
1247
1248 public void testAddDynamicShortcuts() {
Makoto Onuki0acbb142016-03-22 17:02:57 -07001249 setCaller(CALLING_PACKAGE_1, USER_0);
1250
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001251 final ShortcutInfo si1 = makeShortcut("shortcut1");
1252 final ShortcutInfo si2 = makeShortcut("shortcut2");
1253 final ShortcutInfo si3 = makeShortcut("shortcut3");
1254
1255 assertEquals(3, mManager.getRemainingCallCount());
1256
Makoto Onukid99c6f02016-03-28 11:02:54 -07001257 assertTrue(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001258 assertEquals(2, mManager.getRemainingCallCount());
Makoto Onuki55046222016-03-08 10:49:47 -08001259 assertShortcutIds(assertAllNotKeyFieldsOnly(
1260 mManager.getDynamicShortcuts()),
1261 "shortcut1");
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001262
1263 assertTrue(mManager.addDynamicShortcut(si2));
1264 assertEquals(1, mManager.getRemainingCallCount());
Makoto Onuki55046222016-03-08 10:49:47 -08001265 assertShortcutIds(assertAllNotKeyFieldsOnly(
1266 mManager.getDynamicShortcuts()),
1267 "shortcut1", "shortcut2");
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001268
1269 // Add with the same ID
1270 assertTrue(mManager.addDynamicShortcut(makeShortcut("shortcut1")));
1271 assertEquals(0, mManager.getRemainingCallCount());
Makoto Onuki55046222016-03-08 10:49:47 -08001272 assertShortcutIds(assertAllNotKeyFieldsOnly(
1273 mManager.getDynamicShortcuts()),
1274 "shortcut1", "shortcut2");
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001275
1276 // TODO Check max number
1277
1278 // TODO Check fields.
Makoto Onuki0acbb142016-03-22 17:02:57 -07001279
1280 runWithCaller(CALLING_PACKAGE_2, USER_10, () -> {
1281 assertTrue(mManager.addDynamicShortcut(makeShortcut("s1")));
Makoto Onuki0acbb142016-03-22 17:02:57 -07001282 });
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001283 }
1284
1285 public void testDeleteDynamicShortcut() {
1286 final ShortcutInfo si1 = makeShortcut("shortcut1");
1287 final ShortcutInfo si2 = makeShortcut("shortcut2");
1288 final ShortcutInfo si3 = makeShortcut("shortcut3");
1289
Makoto Onukid99c6f02016-03-28 11:02:54 -07001290 assertTrue(mManager.setDynamicShortcuts(list(si1, si2, si3)));
Makoto Onuki55046222016-03-08 10:49:47 -08001291 assertShortcutIds(assertAllNotKeyFieldsOnly(
1292 mManager.getDynamicShortcuts()),
1293 "shortcut1", "shortcut2", "shortcut3");
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001294
1295 assertEquals(2, mManager.getRemainingCallCount());
1296
1297 mManager.deleteDynamicShortcut("shortcut1");
Makoto Onuki55046222016-03-08 10:49:47 -08001298 assertShortcutIds(assertAllNotKeyFieldsOnly(
1299 mManager.getDynamicShortcuts()),
1300 "shortcut2", "shortcut3");
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001301
1302 mManager.deleteDynamicShortcut("shortcut1");
Makoto Onuki55046222016-03-08 10:49:47 -08001303 assertShortcutIds(assertAllNotKeyFieldsOnly(
1304 mManager.getDynamicShortcuts()),
1305 "shortcut2", "shortcut3");
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001306
1307 mManager.deleteDynamicShortcut("shortcutXXX");
Makoto Onuki55046222016-03-08 10:49:47 -08001308 assertShortcutIds(assertAllNotKeyFieldsOnly(
1309 mManager.getDynamicShortcuts()),
1310 "shortcut2", "shortcut3");
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001311
1312 mManager.deleteDynamicShortcut("shortcut2");
Makoto Onuki55046222016-03-08 10:49:47 -08001313 assertShortcutIds(assertAllNotKeyFieldsOnly(
1314 mManager.getDynamicShortcuts()),
1315 "shortcut3");
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001316
1317 mManager.deleteDynamicShortcut("shortcut3");
Makoto Onuki55046222016-03-08 10:49:47 -08001318 assertShortcutIds(assertAllNotKeyFieldsOnly(
1319 mManager.getDynamicShortcuts()));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001320
1321 // Still 2 calls left.
1322 assertEquals(2, mManager.getRemainingCallCount());
1323
1324 // TODO Make sure pinned shortcuts won't be deleted.
1325 }
1326
1327 public void testDeleteAllDynamicShortcuts() {
1328 final ShortcutInfo si1 = makeShortcut("shortcut1");
1329 final ShortcutInfo si2 = makeShortcut("shortcut2");
1330 final ShortcutInfo si3 = makeShortcut("shortcut3");
1331
Makoto Onukid99c6f02016-03-28 11:02:54 -07001332 assertTrue(mManager.setDynamicShortcuts(list(si1, si2, si3)));
Makoto Onuki55046222016-03-08 10:49:47 -08001333 assertShortcutIds(assertAllNotKeyFieldsOnly(
1334 mManager.getDynamicShortcuts()),
1335 "shortcut1", "shortcut2", "shortcut3");
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001336
1337 assertEquals(2, mManager.getRemainingCallCount());
1338
1339 mManager.deleteAllDynamicShortcuts();
1340 assertEquals(0, mManager.getDynamicShortcuts().size());
1341 assertEquals(2, mManager.getRemainingCallCount());
1342
1343 // Note delete shouldn't affect throttling, so...
1344 assertEquals(0, mManager.getDynamicShortcuts().size());
1345 assertEquals(0, mManager.getDynamicShortcuts().size());
1346 assertEquals(0, mManager.getDynamicShortcuts().size());
1347
1348 // This should still work.
Makoto Onukid99c6f02016-03-28 11:02:54 -07001349 assertTrue(mManager.setDynamicShortcuts(list(si1, si2, si3)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001350 assertEquals(3, mManager.getDynamicShortcuts().size());
1351
1352 // Still 1 call left
1353 assertEquals(1, mManager.getRemainingCallCount());
1354
1355 // TODO Make sure pinned shortcuts won't be deleted.
1356 }
1357
1358 public void testThrottling() {
1359 final ShortcutInfo si1 = makeShortcut("shortcut1");
1360
Makoto Onukid99c6f02016-03-28 11:02:54 -07001361 assertTrue(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001362 assertEquals(2, mManager.getRemainingCallCount());
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07001363 assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001364
1365 mInjectedCurrentTimeLillis++;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001366 assertTrue(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001367 assertEquals(1, mManager.getRemainingCallCount());
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07001368 assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001369
1370 mInjectedCurrentTimeLillis++;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001371 assertTrue(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001372 assertEquals(0, mManager.getRemainingCallCount());
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07001373 assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001374
1375 // Reached the max
1376
1377 mInjectedCurrentTimeLillis++;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001378 assertFalse(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001379 assertEquals(0, mManager.getRemainingCallCount());
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07001380 assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001381
1382 // Still throttled
1383 mInjectedCurrentTimeLillis = START_TIME + INTERVAL - 1;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001384 assertFalse(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001385 assertEquals(0, mManager.getRemainingCallCount());
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07001386 assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001387
1388 // Now it should work.
1389 mInjectedCurrentTimeLillis++;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001390 assertTrue(mManager.setDynamicShortcuts(list(si1))); // fail
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001391 assertEquals(2, mManager.getRemainingCallCount());
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07001392 assertEquals(START_TIME + INTERVAL * 2, mManager.getRateLimitResetTime());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001393
1394 mInjectedCurrentTimeLillis++;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001395 assertTrue(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001396 assertEquals(1, mManager.getRemainingCallCount());
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07001397 assertEquals(START_TIME + INTERVAL * 2, mManager.getRateLimitResetTime());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001398
1399 mInjectedCurrentTimeLillis++;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001400 assertTrue(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001401 assertEquals(0, mManager.getRemainingCallCount());
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07001402 assertEquals(START_TIME + INTERVAL * 2, mManager.getRateLimitResetTime());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001403
1404 mInjectedCurrentTimeLillis++;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001405 assertFalse(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001406 assertEquals(0, mManager.getRemainingCallCount());
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07001407 assertEquals(START_TIME + INTERVAL * 2, mManager.getRateLimitResetTime());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001408
1409 // 4 days later...
1410 mInjectedCurrentTimeLillis = START_TIME + 4 * INTERVAL;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001411 assertTrue(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001412 assertEquals(2, mManager.getRemainingCallCount());
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07001413 assertEquals(START_TIME + INTERVAL * 5, mManager.getRateLimitResetTime());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001414
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07001415 mInjectedCurrentTimeLillis++;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001416 assertTrue(mManager.setDynamicShortcuts(list(si1)));
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07001417 assertEquals(1, mManager.getRemainingCallCount());
1418 assertEquals(START_TIME + INTERVAL * 5, mManager.getRateLimitResetTime());
1419
1420 // Make sure getRemainingCallCount() itself gets reset without calling setDynamicShortcuts().
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001421 mInjectedCurrentTimeLillis = START_TIME + 8 * INTERVAL;
1422 assertEquals(3, mManager.getRemainingCallCount());
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07001423 assertEquals(START_TIME + INTERVAL * 9, mManager.getRateLimitResetTime());
1424
1425 mInjectedCurrentTimeLillis++;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001426 assertTrue(mManager.setDynamicShortcuts(list(si1)));
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07001427 assertEquals(2, mManager.getRemainingCallCount());
1428 assertEquals(START_TIME + INTERVAL * 9, mManager.getRateLimitResetTime());
1429 }
1430
1431 public void testThrottling_rewind() {
1432 final ShortcutInfo si1 = makeShortcut("shortcut1");
1433
Makoto Onukid99c6f02016-03-28 11:02:54 -07001434 assertTrue(mManager.setDynamicShortcuts(list(si1)));
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07001435 assertEquals(2, mManager.getRemainingCallCount());
1436 assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
1437
1438 mInjectedCurrentTimeLillis = 12345; // Clock reset!
1439
1440 // Since the clock looks invalid, the counter shouldn't have reset.
1441 assertEquals(2, mManager.getRemainingCallCount());
1442 assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
1443
1444 // Forward again. Still haven't reset yet.
1445 mInjectedCurrentTimeLillis = START_TIME + INTERVAL - 1;
1446 assertEquals(2, mManager.getRemainingCallCount());
1447 assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
1448
1449 // Now rewind -- this will reset the counters.
1450 mInjectedCurrentTimeLillis = START_TIME - 100000;
1451 assertEquals(3, mManager.getRemainingCallCount());
1452
Makoto Onukid99c6f02016-03-28 11:02:54 -07001453 assertTrue(mManager.setDynamicShortcuts(list(si1)));
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07001454 assertEquals(2, mManager.getRemainingCallCount());
1455
1456 // Forward again, should be reset now.
1457 mInjectedCurrentTimeLillis += INTERVAL;
1458 assertEquals(3, mManager.getRemainingCallCount());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001459 }
1460
1461 public void testThrottling_perPackage() {
1462 final ShortcutInfo si1 = makeShortcut("shortcut1");
1463
Makoto Onukid99c6f02016-03-28 11:02:54 -07001464 assertTrue(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001465 assertEquals(2, mManager.getRemainingCallCount());
1466
1467 mInjectedCurrentTimeLillis++;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001468 assertTrue(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001469 assertEquals(1, mManager.getRemainingCallCount());
1470
1471 mInjectedCurrentTimeLillis++;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001472 assertTrue(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001473 assertEquals(0, mManager.getRemainingCallCount());
1474
1475 // Reached the max
1476
1477 mInjectedCurrentTimeLillis++;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001478 assertFalse(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001479
1480 // Try from a different caller.
1481 mInjectedClientPackage = CALLING_PACKAGE_2;
1482 mInjectedCallingUid = CALLING_UID_2;
1483
1484 // Need to create a new one wit the updated package name.
1485 final ShortcutInfo si2 = makeShortcut("shortcut1");
1486
1487 assertEquals(3, mManager.getRemainingCallCount());
1488
Makoto Onukid99c6f02016-03-28 11:02:54 -07001489 assertTrue(mManager.setDynamicShortcuts(list(si2)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001490 assertEquals(2, mManager.getRemainingCallCount());
1491
1492 mInjectedCurrentTimeLillis++;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001493 assertTrue(mManager.setDynamicShortcuts(list(si2)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001494 assertEquals(1, mManager.getRemainingCallCount());
1495
1496 // Back to the original caller, still throttled.
1497 mInjectedClientPackage = CALLING_PACKAGE_1;
1498 mInjectedCallingUid = CALLING_UID_1;
1499
1500 mInjectedCurrentTimeLillis = START_TIME + INTERVAL - 1;
1501 assertEquals(0, mManager.getRemainingCallCount());
Makoto Onukid99c6f02016-03-28 11:02:54 -07001502 assertFalse(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001503 assertEquals(0, mManager.getRemainingCallCount());
1504
1505 // Now it should work.
1506 mInjectedCurrentTimeLillis++;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001507 assertTrue(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001508
1509 mInjectedCurrentTimeLillis++;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001510 assertTrue(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001511
1512 mInjectedCurrentTimeLillis++;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001513 assertTrue(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001514
1515 mInjectedCurrentTimeLillis++;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001516 assertFalse(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001517
1518 mInjectedCurrentTimeLillis = START_TIME + 4 * INTERVAL;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001519 assertTrue(mManager.setDynamicShortcuts(list(si1)));
1520 assertTrue(mManager.setDynamicShortcuts(list(si1)));
1521 assertTrue(mManager.setDynamicShortcuts(list(si1)));
1522 assertFalse(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001523
1524 mInjectedClientPackage = CALLING_PACKAGE_2;
1525 mInjectedCallingUid = CALLING_UID_2;
1526
1527 assertEquals(3, mManager.getRemainingCallCount());
1528
Makoto Onukid99c6f02016-03-28 11:02:54 -07001529 assertTrue(mManager.setDynamicShortcuts(list(si2)));
1530 assertTrue(mManager.setDynamicShortcuts(list(si2)));
1531 assertTrue(mManager.setDynamicShortcuts(list(si2)));
1532 assertFalse(mManager.setDynamicShortcuts(list(si2)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001533 }
1534
Makoto Onuki55046222016-03-08 10:49:47 -08001535 public void testIcons() {
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07001536 final Icon res32x32 = Icon.createWithResource(getTestContext(), R.drawable.black_32x32);
1537 final Icon res64x64 = Icon.createWithResource(getTestContext(), R.drawable.black_64x64);
1538 final Icon res512x512 = Icon.createWithResource(getTestContext(), R.drawable.black_512x512);
Makoto Onuki55046222016-03-08 10:49:47 -08001539
1540 final Icon bmp32x32 = Icon.createWithBitmap(BitmapFactory.decodeResource(
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07001541 getTestContext().getResources(), R.drawable.black_32x32));
Makoto Onuki55046222016-03-08 10:49:47 -08001542 final Icon bmp64x64 = Icon.createWithBitmap(BitmapFactory.decodeResource(
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07001543 getTestContext().getResources(), R.drawable.black_64x64));
Makoto Onuki55046222016-03-08 10:49:47 -08001544 final Icon bmp512x512 = Icon.createWithBitmap(BitmapFactory.decodeResource(
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07001545 getTestContext().getResources(), R.drawable.black_512x512));
Makoto Onuki55046222016-03-08 10:49:47 -08001546
1547 // Set from package 1
1548 setCaller(CALLING_PACKAGE_1);
Makoto Onukid99c6f02016-03-28 11:02:54 -07001549 assertTrue(mManager.setDynamicShortcuts(list(
Makoto Onuki55046222016-03-08 10:49:47 -08001550 makeShortcutWithIcon("res32x32", res32x32),
1551 makeShortcutWithIcon("res64x64", res64x64),
1552 makeShortcutWithIcon("bmp32x32", bmp32x32),
1553 makeShortcutWithIcon("bmp64x64", bmp64x64),
1554 makeShortcutWithIcon("bmp512x512", bmp512x512),
1555 makeShortcut("none")
1556 )));
1557
1558 // getDynamicShortcuts() shouldn't return icons, thus assertAllNotHaveIcon().
1559 assertShortcutIds(assertAllNotHaveIcon(mManager.getDynamicShortcuts()),
1560 "res32x32",
1561 "res64x64",
1562 "bmp32x32",
1563 "bmp64x64",
1564 "bmp512x512",
1565 "none");
1566
1567 // Call from another caller with the same ID, just to make sure storage is per-package.
1568 setCaller(CALLING_PACKAGE_2);
Makoto Onukid99c6f02016-03-28 11:02:54 -07001569 assertTrue(mManager.setDynamicShortcuts(list(
Makoto Onuki55046222016-03-08 10:49:47 -08001570 makeShortcutWithIcon("res32x32", res512x512),
1571 makeShortcutWithIcon("res64x64", res512x512),
1572 makeShortcutWithIcon("none", res512x512)
1573 )));
1574 assertShortcutIds(assertAllNotHaveIcon(mManager.getDynamicShortcuts()),
1575 "res32x32",
1576 "res64x64",
1577 "none");
1578
Makoto Onuki41066a62016-03-09 16:18:44 -08001579 // Re-initialize and load from the files.
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07001580 mService.saveDirtyInfo();
Makoto Onuki41066a62016-03-09 16:18:44 -08001581 initService();
Makoto Onuki55046222016-03-08 10:49:47 -08001582
1583 // Load from launcher.
1584 Bitmap bmp;
1585
1586 setCaller(LAUNCHER_1);
Makoto Onuki55046222016-03-08 10:49:47 -08001587 // Check hasIconResource()/hasIconFile().
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001588 assertShortcutIds(assertAllHaveIconResId(mLauncherApps.getShortcutInfo(
Makoto Onukid99c6f02016-03-28 11:02:54 -07001589 CALLING_PACKAGE_1, list("res32x32"),
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001590 getCallingUser())), "res32x32");
Makoto Onuki55046222016-03-08 10:49:47 -08001591
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001592 assertShortcutIds(assertAllHaveIconResId(mLauncherApps.getShortcutInfo(
Makoto Onukid99c6f02016-03-28 11:02:54 -07001593 CALLING_PACKAGE_1, list("res64x64"), getCallingUser())),
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001594 "res64x64");
Makoto Onuki55046222016-03-08 10:49:47 -08001595
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001596 assertShortcutIds(assertAllHaveIconFile(mLauncherApps.getShortcutInfo(
Makoto Onukid99c6f02016-03-28 11:02:54 -07001597 CALLING_PACKAGE_1, list("bmp32x32"), getCallingUser())),
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001598 "bmp32x32");
1599
1600 assertShortcutIds(assertAllHaveIconFile(mLauncherApps.getShortcutInfo(
Makoto Onukid99c6f02016-03-28 11:02:54 -07001601 CALLING_PACKAGE_1, list("bmp64x64"), getCallingUser())),
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001602 "bmp64x64");
1603
1604 assertShortcutIds(assertAllHaveIconFile(mLauncherApps.getShortcutInfo(
Makoto Onukid99c6f02016-03-28 11:02:54 -07001605 CALLING_PACKAGE_1, list("bmp512x512"), getCallingUser())),
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001606 "bmp512x512");
Makoto Onuki55046222016-03-08 10:49:47 -08001607
1608 // Check
1609 assertEquals(
1610 R.drawable.black_32x32,
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001611 mLauncherApps.getShortcutIconResId(
1612 makePackageShortcut(CALLING_PACKAGE_1, "res32x32"), getCallingUser()));
Makoto Onuki55046222016-03-08 10:49:47 -08001613
1614 assertEquals(
1615 R.drawable.black_64x64,
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001616 mLauncherApps.getShortcutIconResId(
1617
1618 makePackageShortcut(CALLING_PACKAGE_1, "res64x64"), getCallingUser()));
Makoto Onuki55046222016-03-08 10:49:47 -08001619
1620 assertEquals(
1621 0, // because it's not a resource
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001622 mLauncherApps.getShortcutIconResId(
1623 makePackageShortcut(CALLING_PACKAGE_1, "bmp32x32"), getCallingUser()));
Makoto Onuki55046222016-03-08 10:49:47 -08001624 assertEquals(
1625 0, // because it's not a resource
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001626 mLauncherApps.getShortcutIconResId(
1627 makePackageShortcut(CALLING_PACKAGE_1, "bmp64x64"), getCallingUser()));
Makoto Onuki55046222016-03-08 10:49:47 -08001628 assertEquals(
1629 0, // because it's not a resource
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001630 mLauncherApps.getShortcutIconResId(
1631 makePackageShortcut(CALLING_PACKAGE_1, "bmp512x512"), getCallingUser()));
Makoto Onuki55046222016-03-08 10:49:47 -08001632
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001633 bmp = pfdToBitmap(mLauncherApps.getShortcutIconFd(
1634 makePackageShortcut(CALLING_PACKAGE_1, "bmp32x32"), getCallingUser()));
Makoto Onuki55046222016-03-08 10:49:47 -08001635 assertBitmapSize(32, 32, bmp);
1636
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001637 bmp = pfdToBitmap(mLauncherApps.getShortcutIconFd(
1638 makePackageShortcut(CALLING_PACKAGE_1, "bmp64x64"), getCallingUser()));
Makoto Onuki55046222016-03-08 10:49:47 -08001639 assertBitmapSize(64, 64, bmp);
1640
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001641 bmp = pfdToBitmap(mLauncherApps.getShortcutIconFd(
1642 makePackageShortcut(CALLING_PACKAGE_1, "bmp512x512"), getCallingUser()));
Makoto Onuki55046222016-03-08 10:49:47 -08001643 assertBitmapSize(128, 128, bmp);
1644
1645 // TODO Test the content URI case too.
1646 }
1647
1648 private void checkShrinkBitmap(int expectedWidth, int expectedHeight, int resId, int maxSize) {
1649 assertBitmapSize(expectedWidth, expectedHeight,
1650 ShortcutService.shrinkBitmap(BitmapFactory.decodeResource(
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07001651 getTestContext().getResources(), resId),
Makoto Onuki55046222016-03-08 10:49:47 -08001652 maxSize));
1653 }
1654
1655 public void testShrinkBitmap() {
1656 checkShrinkBitmap(32, 32, R.drawable.black_512x512, 32);
1657 checkShrinkBitmap(511, 511, R.drawable.black_512x512, 511);
1658 checkShrinkBitmap(512, 512, R.drawable.black_512x512, 512);
1659
1660 checkShrinkBitmap(1024, 4096, R.drawable.black_1024x4096, 4096);
1661 checkShrinkBitmap(1024, 4096, R.drawable.black_1024x4096, 4100);
1662 checkShrinkBitmap(512, 2048, R.drawable.black_1024x4096, 2048);
1663
1664 checkShrinkBitmap(4096, 1024, R.drawable.black_4096x1024, 4096);
1665 checkShrinkBitmap(4096, 1024, R.drawable.black_4096x1024, 4100);
1666 checkShrinkBitmap(2048, 512, R.drawable.black_4096x1024, 2048);
1667 }
1668
1669 private File openIconFileForWriteAndGetPath(int userId, String packageName)
1670 throws IOException {
1671 // Shortcut IDs aren't used in the path, so just pass the same ID.
1672 final FileOutputStreamWithPath out =
1673 mService.openIconFileForWrite(userId, makePackageShortcut(packageName, "id"));
1674 out.close();
1675 return out.getFile();
1676 }
1677
1678 public void testOpenIconFileForWrite() throws IOException {
1679 mInjectedCurrentTimeLillis = 1000;
1680
1681 final File p10_1_1 = openIconFileForWriteAndGetPath(10, CALLING_PACKAGE_1);
1682 final File p10_1_2 = openIconFileForWriteAndGetPath(10, CALLING_PACKAGE_1);
1683
1684 final File p10_2_1 = openIconFileForWriteAndGetPath(10, CALLING_PACKAGE_2);
1685 final File p10_2_2 = openIconFileForWriteAndGetPath(10, CALLING_PACKAGE_2);
1686
1687 final File p11_1_1 = openIconFileForWriteAndGetPath(11, CALLING_PACKAGE_1);
1688 final File p11_1_2 = openIconFileForWriteAndGetPath(11, CALLING_PACKAGE_1);
1689
1690 mInjectedCurrentTimeLillis++;
1691
1692 final File p10_1_3 = openIconFileForWriteAndGetPath(10, CALLING_PACKAGE_1);
1693 final File p10_1_4 = openIconFileForWriteAndGetPath(10, CALLING_PACKAGE_1);
1694 final File p10_1_5 = openIconFileForWriteAndGetPath(10, CALLING_PACKAGE_1);
1695
1696 final File p10_2_3 = openIconFileForWriteAndGetPath(10, CALLING_PACKAGE_2);
1697 final File p11_1_3 = openIconFileForWriteAndGetPath(11, CALLING_PACKAGE_1);
1698
1699 // Make sure their paths are all unique
Makoto Onukid99c6f02016-03-28 11:02:54 -07001700 assertAllUnique(list(
Makoto Onuki55046222016-03-08 10:49:47 -08001701 p10_1_1,
1702 p10_1_2,
1703 p10_1_3,
1704 p10_1_4,
1705 p10_1_5,
1706
1707 p10_2_1,
1708 p10_2_2,
1709 p10_2_3,
1710
1711 p11_1_1,
1712 p11_1_2,
1713 p11_1_3
1714 ));
1715
1716 // Check each set has the same parent.
1717 assertEquals(p10_1_1.getParent(), p10_1_2.getParent());
1718 assertEquals(p10_1_1.getParent(), p10_1_3.getParent());
1719 assertEquals(p10_1_1.getParent(), p10_1_4.getParent());
1720 assertEquals(p10_1_1.getParent(), p10_1_5.getParent());
1721
1722 assertEquals(p10_2_1.getParent(), p10_2_2.getParent());
1723 assertEquals(p10_2_1.getParent(), p10_2_3.getParent());
1724
1725 assertEquals(p11_1_1.getParent(), p11_1_2.getParent());
1726 assertEquals(p11_1_1.getParent(), p11_1_3.getParent());
1727
1728 // Check the parents are still unique.
Makoto Onukid99c6f02016-03-28 11:02:54 -07001729 assertAllUnique(list(
Makoto Onuki55046222016-03-08 10:49:47 -08001730 p10_1_1.getParent(),
1731 p10_2_1.getParent(),
1732 p11_1_1.getParent()
1733 ));
1734
1735 // All files created at the same time for the same package/user, expcet for the first ones,
1736 // will have "_" in the path.
1737 assertFalse(p10_1_1.getName().contains("_"));
1738 assertTrue(p10_1_2.getName().contains("_"));
1739 assertFalse(p10_1_3.getName().contains("_"));
1740 assertTrue(p10_1_4.getName().contains("_"));
1741 assertTrue(p10_1_5.getName().contains("_"));
1742
1743 assertFalse(p10_2_1.getName().contains("_"));
1744 assertTrue(p10_2_2.getName().contains("_"));
1745 assertFalse(p10_2_3.getName().contains("_"));
1746
1747 assertFalse(p11_1_1.getName().contains("_"));
1748 assertTrue(p11_1_2.getName().contains("_"));
1749 assertFalse(p11_1_3.getName().contains("_"));
1750 }
1751
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001752 public void testUpdateShortcuts() {
1753 runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07001754 assertTrue(mManager.setDynamicShortcuts(list(
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001755 makeShortcut("s1"),
1756 makeShortcut("s2"),
1757 makeShortcut("s3"),
1758 makeShortcut("s4"),
1759 makeShortcut("s5")
1760 )));
1761 });
1762 runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07001763 assertTrue(mManager.setDynamicShortcuts(list(
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001764 makeShortcut("s1"),
1765 makeShortcut("s2"),
1766 makeShortcut("s3"),
1767 makeShortcut("s4"),
1768 makeShortcut("s5")
1769 )));
1770 });
1771 runWithCaller(LAUNCHER_1, UserHandle.USER_SYSTEM, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07001772 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s2", "s3"),
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001773 getCallingUser());
Makoto Onukid99c6f02016-03-28 11:02:54 -07001774 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("s4", "s5"),
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001775 getCallingUser());
1776 });
1777 runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
1778 mManager.deleteDynamicShortcut("s1");
1779 mManager.deleteDynamicShortcut("s2");
1780 });
1781 runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
1782 mManager.deleteDynamicShortcut("s1");
1783 mManager.deleteDynamicShortcut("s3");
1784 mManager.deleteDynamicShortcut("s5");
1785 });
1786 runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
1787 assertShortcutIds(assertAllDynamic(
1788 mManager.getDynamicShortcuts()),
1789 "s3", "s4", "s5");
1790 assertShortcutIds(assertAllPinned(
1791 mManager.getPinnedShortcuts()),
1792 "s2", "s3");
1793 });
1794 runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
1795 assertShortcutIds(assertAllDynamic(
1796 mManager.getDynamicShortcuts()),
1797 "s2", "s4");
1798 assertShortcutIds(assertAllPinned(
1799 mManager.getPinnedShortcuts()),
1800 "s4", "s5");
1801 });
1802
1803 runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
1804 ShortcutInfo s2 = makeShortcutBuilder()
1805 .setId("s2")
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07001806 .setIcon(Icon.createWithResource(getTestContext(), R.drawable.black_32x32))
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001807 .build();
1808
1809 ShortcutInfo s4 = makeShortcutBuilder()
1810 .setId("s4")
1811 .setTitle("new title")
1812 .build();
1813
Makoto Onukid99c6f02016-03-28 11:02:54 -07001814 mManager.updateShortcuts(list(s2, s4));
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001815 });
1816 runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
1817 ShortcutInfo s2 = makeShortcutBuilder()
1818 .setId("s2")
1819 .setIntent(makeIntent(Intent.ACTION_ANSWER, ShortcutActivity.class,
1820 "key1", "val1"))
1821 .build();
1822
1823 ShortcutInfo s4 = makeShortcutBuilder()
1824 .setId("s4")
1825 .setIntent(new Intent(Intent.ACTION_ALL_APPS))
1826 .build();
1827
Makoto Onukid99c6f02016-03-28 11:02:54 -07001828 mManager.updateShortcuts(list(s2, s4));
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001829 });
1830
1831 runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
1832 assertShortcutIds(assertAllDynamic(
1833 mManager.getDynamicShortcuts()),
1834 "s3", "s4", "s5");
1835 assertShortcutIds(assertAllPinned(
1836 mManager.getPinnedShortcuts()),
1837 "s2", "s3");
1838
1839 ShortcutInfo s = getCallerShortcut("s2");
1840 assertTrue(s.hasIconResource());
1841 assertEquals(R.drawable.black_32x32, s.getIconResourceId());
1842 assertEquals("Title-s2", s.getTitle());
1843
1844 s = getCallerShortcut("s4");
1845 assertFalse(s.hasIconResource());
1846 assertEquals(0, s.getIconResourceId());
1847 assertEquals("new title", s.getTitle());
1848 });
1849 runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
1850 assertShortcutIds(assertAllDynamic(
1851 mManager.getDynamicShortcuts()),
1852 "s2", "s4");
1853 assertShortcutIds(assertAllPinned(
1854 mManager.getPinnedShortcuts()),
1855 "s4", "s5");
1856
1857 ShortcutInfo s = getCallerShortcut("s2");
1858 assertFalse(s.hasIconResource());
1859 assertEquals(0, s.getIconResourceId());
1860 assertEquals("Title-s2", s.getTitle());
1861 assertEquals(Intent.ACTION_ANSWER, s.getIntent().getAction());
1862 assertEquals(1, s.getIntent().getExtras().size());
1863
1864 s = getCallerShortcut("s4");
1865 assertFalse(s.hasIconResource());
1866 assertEquals(0, s.getIconResourceId());
1867 assertEquals("Title-s4", s.getTitle());
1868 assertEquals(Intent.ACTION_ALL_APPS, s.getIntent().getAction());
1869 assertBundleEmpty(s.getIntent().getExtras());
1870 });
1871 // TODO Check with other fields too.
1872
1873 // TODO Check bitmap removal too.
Makoto Onuki0acbb142016-03-22 17:02:57 -07001874
1875 runWithCaller(CALLING_PACKAGE_2, USER_11, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07001876 mManager.updateShortcuts(list());
Makoto Onuki0acbb142016-03-22 17:02:57 -07001877 });
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001878 }
1879
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001880 // TODO: updateShortcuts()
1881 // TODO: getPinnedShortcuts()
1882
1883 // === Test for launcher side APIs ===
1884
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001885 private static ShortcutQuery buildQuery(long changedSince,
1886 String packageName, ComponentName componentName,
1887 /* @ShortcutQuery.QueryFlags */ int flags) {
1888 final ShortcutQuery q = new ShortcutQuery();
1889 q.setChangedSince(changedSince);
1890 q.setPackage(packageName);
1891 q.setActivity(componentName);
1892 q.setQueryFlags(flags);
1893 return q;
1894 }
1895
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001896 public void testGetShortcuts() {
1897
1898 // Set up shortcuts.
1899
1900 setCaller(CALLING_PACKAGE_1);
1901 final ShortcutInfo s1_1 = makeShortcutWithTimestamp("s1", 5000);
1902 final ShortcutInfo s1_2 = makeShortcutWithTimestamp("s2", 1000);
1903
Makoto Onukid99c6f02016-03-28 11:02:54 -07001904 assertTrue(mManager.setDynamicShortcuts(list(s1_1, s1_2)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001905
1906 setCaller(CALLING_PACKAGE_2);
1907 final ShortcutInfo s2_2 = makeShortcutWithTimestamp("s2", 1500);
1908 final ShortcutInfo s2_3 = makeShortcutWithTimestamp("s3", 3000);
1909 final ShortcutInfo s2_4 = makeShortcutWithTimestamp("s4", 500);
Makoto Onukid99c6f02016-03-28 11:02:54 -07001910 assertTrue(mManager.setDynamicShortcuts(list(s2_2, s2_3, s2_4)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001911
1912 setCaller(CALLING_PACKAGE_3);
Makoto Onuki9da23fc2016-03-29 11:14:42 -07001913 final ShortcutInfo s3_2 = makeShortcutWithTimestamp("s3", START_TIME + 5000);
Makoto Onukid99c6f02016-03-28 11:02:54 -07001914 assertTrue(mManager.setDynamicShortcuts(list(s3_2)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001915
1916 setCaller(LAUNCHER_1);
1917
1918 // Get dynamic
1919 assertAllDynamic(assertAllHaveTitle(assertAllNotHaveIntents(assertShortcutIds(
Makoto Onuki55046222016-03-08 10:49:47 -08001920 assertAllNotKeyFieldsOnly(
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001921 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
1922 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), getCallingUser())),
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001923 "s1", "s2"))));
1924
1925 // Get pinned
1926 assertShortcutIds(
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001927 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001928 /* activity =*/ null,
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001929 ShortcutQuery.FLAG_GET_PINNED), getCallingUser())
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001930 /* none */);
1931
1932 // Get both, with timestamp
1933 assertAllDynamic(assertAllHaveTitle(assertAllNotHaveIntents(assertShortcutIds(
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001934 assertAllNotKeyFieldsOnly(mLauncherApps.getShortcuts(buildQuery(
Makoto Onuki55046222016-03-08 10:49:47 -08001935 /* time =*/ 1000, CALLING_PACKAGE_2,
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001936 /* activity =*/ null,
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001937 ShortcutQuery.FLAG_GET_PINNED | ShortcutQuery.FLAG_GET_DYNAMIC),
1938 getCallingUser())),
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001939 "s2", "s3"))));
1940
1941 // FLAG_GET_KEY_FIELDS_ONLY
1942 assertAllDynamic(assertAllNotHaveTitle(assertAllNotHaveIntents(assertShortcutIds(
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001943 assertAllKeyFieldsOnly(mLauncherApps.getShortcuts(buildQuery(
Makoto Onuki55046222016-03-08 10:49:47 -08001944 /* time =*/ 1000, CALLING_PACKAGE_2,
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001945 /* activity =*/ null,
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001946 ShortcutQuery.FLAG_GET_DYNAMIC | ShortcutQuery.FLAG_GET_KEY_FIELDS_ONLY),
1947 getCallingUser())),
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001948 "s2", "s3"))));
1949
1950 // Pin some shortcuts.
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001951 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
Makoto Onukid99c6f02016-03-28 11:02:54 -07001952 list("s3", "s4"), getCallingUser());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001953
1954 // Pinned ones only
1955 assertAllPinned(assertAllHaveTitle(assertAllNotHaveIntents(assertShortcutIds(
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001956 assertAllNotKeyFieldsOnly(mLauncherApps.getShortcuts(buildQuery(
Makoto Onuki55046222016-03-08 10:49:47 -08001957 /* time =*/ 1000, CALLING_PACKAGE_2,
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001958 /* activity =*/ null,
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001959 ShortcutQuery.FLAG_GET_PINNED),
1960 getCallingUser())),
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001961 "s3"))));
1962
1963 // All packages.
Makoto Onuki55046222016-03-08 10:49:47 -08001964 assertShortcutIds(assertAllNotKeyFieldsOnly(
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001965 mLauncherApps.getShortcuts(buildQuery(
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001966 /* time =*/ 5000, /* package= */ null,
1967 /* activity =*/ null,
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001968 ShortcutQuery.FLAG_GET_DYNAMIC | ShortcutQuery.FLAG_GET_PINNED),
1969 getCallingUser())),
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001970 "s1", "s3");
1971
1972 // TODO More tests: pinned but dynamic, filter by activity
1973 }
1974
1975 public void testGetShortcutInfo() {
1976 // Create shortcuts.
1977 setCaller(CALLING_PACKAGE_1);
1978 final ShortcutInfo s1_1 = makeShortcut(
1979 "s1",
1980 "Title 1",
1981 makeComponent(ShortcutActivity.class),
1982 /* icon =*/ null,
1983 makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class,
1984 "key1", "val1", "nest", makeBundle("key", 123)),
1985 /* weight */ 10);
1986
1987 final ShortcutInfo s1_2 = makeShortcut(
1988 "s2",
1989 "Title 2",
1990 /* activity */ null,
1991 /* icon =*/ null,
1992 makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class),
1993 /* weight */ 12);
1994
Makoto Onukid99c6f02016-03-28 11:02:54 -07001995 assertTrue(mManager.setDynamicShortcuts(list(s1_1, s1_2)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001996 dumpsysOnLogcat();
1997
1998 setCaller(CALLING_PACKAGE_2);
1999 final ShortcutInfo s2_1 = makeShortcut(
2000 "s1",
2001 "ABC",
2002 makeComponent(ShortcutActivity2.class),
2003 /* icon =*/ null,
2004 makeIntent(Intent.ACTION_ANSWER, ShortcutActivity2.class,
2005 "key1", "val1", "nest", makeBundle("key", 123)),
2006 /* weight */ 10);
Makoto Onukid99c6f02016-03-28 11:02:54 -07002007 assertTrue(mManager.setDynamicShortcuts(list(s2_1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002008 dumpsysOnLogcat();
2009
2010 // Pin some.
2011 setCaller(LAUNCHER_1);
2012
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08002013 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
Makoto Onukid99c6f02016-03-28 11:02:54 -07002014 list("s2"), getCallingUser());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002015
2016 dumpsysOnLogcat();
2017
2018 // Delete some.
2019 setCaller(CALLING_PACKAGE_1);
2020 assertShortcutIds(mManager.getPinnedShortcuts(), "s2");
2021 mManager.deleteDynamicShortcut("s2");
2022 assertShortcutIds(mManager.getPinnedShortcuts(), "s2");
2023
2024 dumpsysOnLogcat();
2025
2026 setCaller(LAUNCHER_1);
2027 List<ShortcutInfo> list;
2028
2029 // Note we don't guarantee the orders.
2030 list = assertShortcutIds(assertAllHaveTitle(assertAllNotHaveIntents(
Makoto Onuki55046222016-03-08 10:49:47 -08002031 assertAllNotKeyFieldsOnly(
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08002032 mLauncherApps.getShortcutInfo(CALLING_PACKAGE_1,
Makoto Onukid99c6f02016-03-28 11:02:54 -07002033 list("s2", "s1", "s3", null), getCallingUser())))),
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002034 "s1", "s2");
2035 assertEquals("Title 1", findById(list, "s1").getTitle());
2036 assertEquals("Title 2", findById(list, "s2").getTitle());
2037
2038 assertShortcutIds(assertAllHaveTitle(assertAllNotHaveIntents(
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08002039 mLauncherApps.getShortcutInfo(CALLING_PACKAGE_1,
Makoto Onukid99c6f02016-03-28 11:02:54 -07002040 list("s3"), getCallingUser())))
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002041 /* none */);
2042
2043 list = assertShortcutIds(assertAllHaveTitle(assertAllNotHaveIntents(
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08002044 mLauncherApps.getShortcutInfo(CALLING_PACKAGE_2,
Makoto Onukid99c6f02016-03-28 11:02:54 -07002045 list("s1", "s2", "s3"), getCallingUser()))),
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002046 "s1");
2047 assertEquals("ABC", findById(list, "s1").getTitle());
2048 }
2049
2050 public void testPinShortcutAndGetPinnedShortcuts() {
2051 // Create some shortcuts.
Makoto Onukide667372016-03-15 14:29:20 -07002052 runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
2053 final ShortcutInfo s1_1 = makeShortcutWithTimestamp("s1", 1000);
2054 final ShortcutInfo s1_2 = makeShortcutWithTimestamp("s2", 2000);
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002055
Makoto Onukid99c6f02016-03-28 11:02:54 -07002056 assertTrue(mManager.setDynamicShortcuts(list(s1_1, s1_2)));
Makoto Onukide667372016-03-15 14:29:20 -07002057 });
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002058
Makoto Onukide667372016-03-15 14:29:20 -07002059 runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
2060 final ShortcutInfo s2_2 = makeShortcutWithTimestamp("s2", 1500);
2061 final ShortcutInfo s2_3 = makeShortcutWithTimestamp("s3", 3000);
2062 final ShortcutInfo s2_4 = makeShortcutWithTimestamp("s4", 500);
Makoto Onukid99c6f02016-03-28 11:02:54 -07002063 assertTrue(mManager.setDynamicShortcuts(list(s2_2, s2_3, s2_4)));
Makoto Onukide667372016-03-15 14:29:20 -07002064 });
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002065
Makoto Onukide667372016-03-15 14:29:20 -07002066 runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
2067 final ShortcutInfo s3_2 = makeShortcutWithTimestamp("s2", 1000);
Makoto Onukid99c6f02016-03-28 11:02:54 -07002068 assertTrue(mManager.setDynamicShortcuts(list(s3_2)));
Makoto Onukide667372016-03-15 14:29:20 -07002069 });
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002070
2071 // Pin some.
Makoto Onukide667372016-03-15 14:29:20 -07002072 runWithCaller(LAUNCHER_1, USER_0, () -> {
2073 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
Makoto Onukid99c6f02016-03-28 11:02:54 -07002074 list("s2", "s3"), getCallingUser());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002075
Makoto Onukide667372016-03-15 14:29:20 -07002076 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
Makoto Onukid99c6f02016-03-28 11:02:54 -07002077 list("s3", "s4", "s5"), getCallingUser());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002078
Makoto Onukide667372016-03-15 14:29:20 -07002079 mLauncherApps.pinShortcuts(CALLING_PACKAGE_3,
Makoto Onukid99c6f02016-03-28 11:02:54 -07002080 list("s3"), getCallingUser()); // Note ID doesn't exist
Makoto Onukide667372016-03-15 14:29:20 -07002081 });
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002082
2083 // Delete some.
Makoto Onukide667372016-03-15 14:29:20 -07002084 runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
2085 assertShortcutIds(mManager.getPinnedShortcuts(), "s2");
2086 mManager.deleteDynamicShortcut("s2");
2087 assertShortcutIds(mManager.getPinnedShortcuts(), "s2");
2088 });
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002089
Makoto Onukide667372016-03-15 14:29:20 -07002090 runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
2091 assertShortcutIds(mManager.getPinnedShortcuts(), "s3", "s4");
2092 mManager.deleteDynamicShortcut("s3");
2093 assertShortcutIds(mManager.getPinnedShortcuts(), "s3", "s4");
2094 });
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002095
Makoto Onukide667372016-03-15 14:29:20 -07002096 runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
2097 assertShortcutIds(mManager.getPinnedShortcuts() /* none */);
2098 mManager.deleteDynamicShortcut("s2");
2099 assertShortcutIds(mManager.getPinnedShortcuts() /* none */);
2100 });
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002101
2102 // Get pinned shortcuts from launcher
Makoto Onukide667372016-03-15 14:29:20 -07002103 runWithCaller(LAUNCHER_1, USER_0, () -> {
2104 // CALLING_PACKAGE_1 deleted s2, but it's pinned, so it still exists.
2105 assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
2106 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2107 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
2108 "s2");
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002109
Makoto Onukide667372016-03-15 14:29:20 -07002110 assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
2111 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2112 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
2113 "s3", "s4");
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002114
Makoto Onukide667372016-03-15 14:29:20 -07002115 assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
2116 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_3,
2117 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser())))
2118 /* none */);
2119 });
2120 }
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002121
Makoto Onukide667372016-03-15 14:29:20 -07002122 public void testPinShortcutAndGetPinnedShortcuts_multi() {
2123 // Create some shortcuts.
2124 runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07002125 assertTrue(mManager.setDynamicShortcuts(list(
Makoto Onukide667372016-03-15 14:29:20 -07002126 makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
2127 });
2128
2129 runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07002130 assertTrue(mManager.setDynamicShortcuts(list(
Makoto Onukide667372016-03-15 14:29:20 -07002131 makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
2132 });
2133
2134 dumpsysOnLogcat();
2135
2136 // Pin some.
2137 runWithCaller(LAUNCHER_1, USER_0, () -> {
2138 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
Makoto Onukid99c6f02016-03-28 11:02:54 -07002139 list("s3", "s4"), getCallingUser());
Makoto Onukide667372016-03-15 14:29:20 -07002140
2141 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
Makoto Onukid99c6f02016-03-28 11:02:54 -07002142 list("s1", "s2", "s4"), getCallingUser());
Makoto Onukide667372016-03-15 14:29:20 -07002143 });
2144
2145 dumpsysOnLogcat();
2146
2147 // Delete some.
2148 runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
2149 assertShortcutIds(mManager.getPinnedShortcuts(), "s3");
2150 mManager.deleteDynamicShortcut("s3");
2151 assertShortcutIds(mManager.getPinnedShortcuts(), "s3");
2152 });
2153
2154 dumpsysOnLogcat();
2155
2156 runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
2157 assertShortcutIds(mManager.getPinnedShortcuts(), "s1", "s2");
2158 mManager.deleteDynamicShortcut("s1");
2159 mManager.deleteDynamicShortcut("s3");
2160 assertShortcutIds(mManager.getPinnedShortcuts(), "s1", "s2");
2161 });
2162
2163 dumpsysOnLogcat();
2164
2165 // Get pinned shortcuts from launcher
2166 runWithCaller(LAUNCHER_1, USER_0, () -> {
2167 assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
2168 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2169 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
2170 "s3");
2171
2172 assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
2173 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2174 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
2175 "s1", "s2");
2176
2177 assertShortcutIds(assertAllDynamicOrPinned(
2178 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2179 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED
2180 | ShortcutQuery.FLAG_GET_DYNAMIC), getCallingUser())),
2181 "s1", "s2", "s3");
2182
2183 assertShortcutIds(assertAllDynamicOrPinned(
2184 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2185 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED
2186 | ShortcutQuery.FLAG_GET_DYNAMIC), getCallingUser())),
2187 "s1", "s2");
2188 });
2189
2190 dumpsysOnLogcat();
2191
2192 runWithCaller(LAUNCHER_2, USER_0, () -> {
2193 // Launcher2 still has no pinned ones.
2194 assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
2195 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2196 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser())))
2197 /* none */);
2198 assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
2199 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2200 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser())))
2201 /* none */);
2202
2203 assertShortcutIds(assertAllDynamic(
2204 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2205 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED
2206 | ShortcutQuery.FLAG_GET_DYNAMIC), getCallingUser())),
2207 "s1", "s2");
2208 assertShortcutIds(assertAllDynamic(
2209 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2210 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED
2211 | ShortcutQuery.FLAG_GET_DYNAMIC), getCallingUser())),
2212 "s2");
2213
2214 // Now pin some.
2215 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
Makoto Onukid99c6f02016-03-28 11:02:54 -07002216 list("s1", "s2"), getCallingUser());
Makoto Onukide667372016-03-15 14:29:20 -07002217
2218 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
Makoto Onukid99c6f02016-03-28 11:02:54 -07002219 list("s1", "s2"), getCallingUser());
Makoto Onukide667372016-03-15 14:29:20 -07002220
2221 assertShortcutIds(assertAllDynamic(
2222 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2223 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED
2224 | ShortcutQuery.FLAG_GET_DYNAMIC), getCallingUser())),
2225 "s1", "s2");
2226
2227 // S1 was not visible to it, so shouldn't be pinned.
2228 assertShortcutIds(assertAllDynamic(
2229 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2230 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED
2231 | ShortcutQuery.FLAG_GET_DYNAMIC), getCallingUser())),
2232 "s2");
2233 });
2234
2235 // Re-initialize and load from the files.
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07002236 mService.saveDirtyInfo();
Makoto Onukide667372016-03-15 14:29:20 -07002237 initService();
2238
Makoto Onuki0acbb142016-03-22 17:02:57 -07002239 // Load from file.
2240 mService.handleUnlockUser(USER_0);
2241
2242 // Make sure package info is restored too.
Makoto Onukide667372016-03-15 14:29:20 -07002243 runWithCaller(LAUNCHER_1, USER_0, () -> {
2244 assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
2245 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2246 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
2247 "s3");
2248 assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
2249 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2250 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
2251 "s1", "s2");
2252 });
2253 runWithCaller(LAUNCHER_2, USER_0, () -> {
2254 assertShortcutIds(assertAllDynamic(
2255 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2256 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED
2257 | ShortcutQuery.FLAG_GET_DYNAMIC), getCallingUser())),
2258 "s1", "s2");
2259 assertShortcutIds(assertAllDynamic(
2260 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2261 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED
2262 | ShortcutQuery.FLAG_GET_DYNAMIC), getCallingUser())),
2263 "s2");
2264 });
2265
2266 // Delete all dynamic.
2267 runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
2268 mManager.deleteAllDynamicShortcuts();
2269
2270 assertEquals(0, mManager.getDynamicShortcuts().size());
2271 assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()), "s1", "s2", "s3");
2272 });
2273 runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
2274 mManager.deleteAllDynamicShortcuts();
2275
2276 assertEquals(0, mManager.getDynamicShortcuts().size());
2277 assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()), "s2", "s1");
2278 });
2279
2280 runWithCaller(LAUNCHER_1, USER_0, () -> {
2281 assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
2282 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2283 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
2284 "s3");
2285
2286 assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
2287 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2288 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
2289 "s1", "s2");
2290
2291 // from all packages.
2292 assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
2293 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, null,
2294 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
2295 "s1", "s2", "s3");
2296
2297 // Update pined. Note s2 and s3 are actually available, but not visible to this
2298 // launcher, so still can't be pinned.
Makoto Onukid99c6f02016-03-28 11:02:54 -07002299 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s1", "s2", "s3", "s4"),
Makoto Onukide667372016-03-15 14:29:20 -07002300 getCallingUser());
2301
2302 assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
2303 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2304 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
2305 "s3");
2306 });
2307 // Re-publish s1.
2308 runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
2309 assertTrue(mManager.addDynamicShortcut(makeShortcut("s1")));
2310
2311 assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts()), "s1");
2312 assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()), "s1", "s2", "s3");
2313 });
2314 runWithCaller(LAUNCHER_1, USER_0, () -> {
2315 assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
2316 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2317 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
2318 "s3");
2319
2320 // Now "s1" is visible, so can be pinned.
Makoto Onukid99c6f02016-03-28 11:02:54 -07002321 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s1", "s2", "s3", "s4"),
Makoto Onukide667372016-03-15 14:29:20 -07002322 getCallingUser());
2323
2324 assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
2325 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2326 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
2327 "s1", "s3");
2328 });
2329
2330 // Now clear pinned shortcuts. First, from launcher 1.
2331 runWithCaller(LAUNCHER_1, USER_0, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07002332 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list(), getCallingUser());
2333 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list(), getCallingUser());
Makoto Onukide667372016-03-15 14:29:20 -07002334
2335 assertEquals(0,
2336 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2337 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()).size());
2338 assertEquals(0,
2339 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2340 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()).size());
2341 });
2342 runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
2343 assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts()), "s1");
2344 assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()), "s1", "s2");
2345 });
2346 runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
2347 assertEquals(0, mManager.getDynamicShortcuts().size());
2348 assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()), "s2");
2349 });
2350
2351 // Clear all pins from launcher 2.
2352 runWithCaller(LAUNCHER_2, USER_0, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07002353 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list(), getCallingUser());
2354 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list(), getCallingUser());
Makoto Onukide667372016-03-15 14:29:20 -07002355
2356 assertEquals(0,
2357 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2358 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()).size());
2359 assertEquals(0,
2360 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2361 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()).size());
2362 });
2363 runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
2364 assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts()), "s1");
2365 assertEquals(0, mManager.getPinnedShortcuts().size());
2366 });
2367 runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
2368 assertEquals(0, mManager.getDynamicShortcuts().size());
2369 assertEquals(0, mManager.getPinnedShortcuts().size());
2370 });
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002371 }
2372
Makoto Onukid99c6f02016-03-28 11:02:54 -07002373 public void testPinShortcutAndGetPinnedShortcuts_crossProfile_plusLaunch() {
2374 // Create some shortcuts.
2375 runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
2376 assertTrue(mManager.setDynamicShortcuts(list(
2377 makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
2378 });
2379 runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
2380 assertTrue(mManager.setDynamicShortcuts(list(
2381 makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
2382 });
2383 runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
2384 assertTrue(mManager.setDynamicShortcuts(list(
2385 makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"),
2386 makeShortcut("s4"), makeShortcut("s5"), makeShortcut("s6"))));
2387 });
2388
2389 // Pin some shortcuts and see the result.
2390
2391 runWithCaller(LAUNCHER_1, USER_0, () -> {
2392 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
2393 list("s1"), HANDLE_USER_0);
2394
2395 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
2396 list("s1", "s2", "s3"), HANDLE_USER_0);
2397 });
2398
2399 runWithCaller(LAUNCHER_1, USER_P0, () -> {
2400 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
2401 list("s2"), HANDLE_USER_0);
2402
2403 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
2404 list("s2", "s3"), HANDLE_USER_0);
2405 });
2406
2407 runWithCaller(LAUNCHER_2, USER_P0, () -> {
2408 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
2409 list("s3"), HANDLE_USER_0);
2410
2411 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
2412 list("s3"), HANDLE_USER_0);
2413 });
2414
2415 runWithCaller(LAUNCHER_2, USER_10, () -> {
2416 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
2417 list("s1", "s2", "s3"), HANDLE_USER_10);
2418 });
2419
2420 // Cross profile pinning.
2421 final int PIN_AND_DYNAMIC = ShortcutQuery.FLAG_GET_PINNED | ShortcutQuery.FLAG_GET_DYNAMIC;
2422
2423 runWithCaller(LAUNCHER_1, USER_0, () -> {
2424 assertShortcutIds(assertAllPinned(
2425 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2426 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
2427 "s1");
2428 assertShortcutIds(assertAllDynamic(
2429 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2430 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
2431 "s1", "s2", "s3");
2432 assertShortcutIds(assertAllDynamicOrPinned(
2433 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2434 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
2435 "s1", "s2", "s3");
2436
2437 assertShortcutIds(assertAllPinned(
2438 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2439 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
2440 "s1", "s2", "s3");
2441 assertShortcutIds(assertAllDynamic(
2442 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2443 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
2444 "s1", "s2", "s3");
2445 assertShortcutIds(assertAllDynamicOrPinned(
2446 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2447 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
2448 "s1", "s2", "s3");
2449
2450 assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
2451 assertShortcutLaunchable(CALLING_PACKAGE_1, "s2", USER_0);
2452 assertShortcutLaunchable(CALLING_PACKAGE_1, "s3", USER_0);
2453
2454 assertShortcutLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
2455 assertShortcutLaunchable(CALLING_PACKAGE_2, "s2", USER_0);
2456 assertShortcutLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
2457
2458 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s1", USER_10);
2459 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_10);
2460 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_10);
2461 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s4", USER_10);
2462 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s5", USER_10);
2463 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s6", USER_10);
2464 });
2465 runWithCaller(LAUNCHER_1, USER_P0, () -> {
2466 assertShortcutIds(assertAllPinned(
2467 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2468 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
2469 "s2");
2470 assertShortcutIds(assertAllDynamic(
2471 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2472 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
2473 "s1", "s2", "s3");
2474 assertShortcutIds(assertAllDynamicOrPinned(
2475 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2476 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
2477 "s1", "s2", "s3");
2478
2479 assertShortcutIds(assertAllPinned(
2480 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2481 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
2482 "s2", "s3");
2483 assertShortcutIds(assertAllDynamic(
2484 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2485 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
2486 "s1", "s2", "s3");
2487 assertShortcutIds(assertAllDynamicOrPinned(
2488 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2489 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
2490 "s1", "s2", "s3");
2491
2492 assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
2493 assertShortcutLaunchable(CALLING_PACKAGE_1, "s2", USER_0);
2494 assertShortcutLaunchable(CALLING_PACKAGE_1, "s3", USER_0);
2495
2496 assertShortcutLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
2497 assertShortcutLaunchable(CALLING_PACKAGE_2, "s2", USER_0);
2498 assertShortcutLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
2499
2500 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s1", USER_10);
2501 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_10);
2502 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_10);
2503 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s4", USER_10);
2504 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s5", USER_10);
2505 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s6", USER_10);
2506 });
2507 runWithCaller(LAUNCHER_2, USER_P0, () -> {
2508 assertShortcutIds(assertAllPinned(
2509 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2510 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
2511 "s3");
2512 assertShortcutIds(assertAllDynamic(
2513 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2514 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
2515 "s1", "s2", "s3");
2516 assertShortcutIds(assertAllDynamicOrPinned(
2517 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2518 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
2519 "s1", "s2", "s3");
2520
2521 assertShortcutIds(assertAllPinned(
2522 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2523 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
2524 "s3");
2525 assertShortcutIds(assertAllDynamic(
2526 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2527 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
2528 "s1", "s2", "s3");
2529 assertShortcutIds(assertAllDynamicOrPinned(
2530 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2531 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
2532 "s1", "s2", "s3");
2533
2534 assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
2535 assertShortcutLaunchable(CALLING_PACKAGE_1, "s2", USER_0);
2536 assertShortcutLaunchable(CALLING_PACKAGE_1, "s3", USER_0);
2537
2538 assertShortcutLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
2539 assertShortcutLaunchable(CALLING_PACKAGE_2, "s2", USER_0);
2540 assertShortcutLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
2541
2542 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s1", USER_10);
2543 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_10);
2544 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_10);
2545 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s4", USER_10);
2546 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s5", USER_10);
2547 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s6", USER_10);
2548 });
2549 runWithCaller(LAUNCHER_2, USER_10, () -> {
2550 assertShortcutIds(assertAllPinned(
2551 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2552 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_10)),
2553 "s1", "s2", "s3");
2554 assertShortcutIds(assertAllDynamic(
2555 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2556 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_10)),
2557 "s1", "s2", "s3", "s4", "s5", "s6");
2558 assertShortcutIds(assertAllDynamicOrPinned(
2559 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2560 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_10)),
2561 "s1", "s2", "s3", "s4", "s5", "s6");
2562 });
2563
2564 // Remove some dynamic shortcuts.
2565
2566 runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
2567 assertTrue(mManager.setDynamicShortcuts(list(
2568 makeShortcut("s1"))));
2569 });
2570 runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
2571 assertTrue(mManager.setDynamicShortcuts(list(
2572 makeShortcut("s1"))));
2573 });
2574 runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
2575 assertTrue(mManager.setDynamicShortcuts(list(
2576 makeShortcut("s1"))));
2577 });
2578
2579 runWithCaller(LAUNCHER_1, USER_0, () -> {
2580 assertShortcutIds(assertAllPinned(
2581 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2582 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
2583 "s1");
2584 assertShortcutIds(assertAllDynamic(
2585 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2586 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
2587 "s1");
2588 assertShortcutIds(assertAllDynamicOrPinned(
2589 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2590 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
2591 "s1");
2592
2593 assertShortcutIds(assertAllPinned(
2594 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2595 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
2596 "s1", "s2", "s3");
2597 assertShortcutIds(assertAllDynamic(
2598 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2599 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
2600 "s1");
2601 assertShortcutIds(assertAllDynamicOrPinned(
2602 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2603 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
2604 "s1", "s2", "s3");
2605
2606 assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
2607 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_0);
2608 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_0);
2609
2610 assertShortcutLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
2611 assertShortcutLaunchable(CALLING_PACKAGE_2, "s2", USER_0);
2612 assertShortcutLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
2613
2614 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s1", USER_10);
2615 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_10);
2616 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_10);
2617 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s4", USER_10);
2618 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s5", USER_10);
2619 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s6", USER_10);
2620 });
2621 runWithCaller(LAUNCHER_1, USER_P0, () -> {
2622 assertShortcutIds(assertAllPinned(
2623 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2624 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
2625 "s2");
2626 assertShortcutIds(assertAllDynamic(
2627 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2628 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
2629 "s1");
2630 assertShortcutIds(assertAllDynamicOrPinned(
2631 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2632 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
2633 "s1", "s2");
2634
2635 assertShortcutIds(assertAllPinned(
2636 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2637 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
2638 "s2", "s3");
2639 assertShortcutIds(assertAllDynamic(
2640 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2641 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
2642 "s1");
2643 assertShortcutIds(assertAllDynamicOrPinned(
2644 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2645 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
2646 "s1", "s2", "s3");
2647
2648 assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
2649 assertShortcutLaunchable(CALLING_PACKAGE_1, "s2", USER_0);
2650 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_0);
2651
2652 assertShortcutLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
2653 assertShortcutLaunchable(CALLING_PACKAGE_2, "s2", USER_0);
2654 assertShortcutLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
2655
2656 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s1", USER_10);
2657 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_10);
2658 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_10);
2659 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s4", USER_10);
2660 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s5", USER_10);
2661 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s6", USER_10);
2662 });
2663 runWithCaller(LAUNCHER_2, USER_P0, () -> {
2664 assertShortcutIds(assertAllPinned(
2665 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2666 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
2667 "s3");
2668 assertShortcutIds(assertAllDynamic(
2669 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2670 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
2671 "s1");
2672 assertShortcutIds(assertAllDynamicOrPinned(
2673 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2674 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
2675 "s1", "s3");
2676
2677 assertShortcutIds(assertAllPinned(
2678 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2679 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
2680 "s3");
2681 assertShortcutIds(assertAllDynamic(
2682 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2683 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
2684 "s1");
2685 assertShortcutIds(assertAllDynamicOrPinned(
2686 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2687 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
2688 "s1", "s3");
2689
2690 assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
2691 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_0);
2692 assertShortcutLaunchable(CALLING_PACKAGE_1, "s3", USER_0);
2693
2694 assertShortcutLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
2695 assertShortcutNotLaunchable(CALLING_PACKAGE_2, "s2", USER_0);
2696 assertShortcutLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
2697
2698 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s1", USER_10);
2699 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_10);
2700 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_10);
2701 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s4", USER_10);
2702 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s5", USER_10);
2703 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s6", USER_10);
2704 });
2705 runWithCaller(LAUNCHER_2, USER_10, () -> {
2706 assertShortcutIds(assertAllPinned(
2707 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2708 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_10)),
2709 "s1", "s2", "s3");
2710 assertShortcutIds(assertAllDynamic(
2711 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2712 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_10)),
2713 "s1");
2714 assertShortcutIds(assertAllDynamicOrPinned(
2715 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2716 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_10)),
2717 "s1", "s2", "s3");
2718
2719 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
2720 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_0);
2721 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_0);
2722
2723 assertShortcutNotLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
2724 assertShortcutNotLaunchable(CALLING_PACKAGE_2, "s2", USER_0);
2725 assertShortcutNotLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
2726
2727 assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_10);
2728 assertShortcutLaunchable(CALLING_PACKAGE_1, "s2", USER_10);
2729 assertShortcutLaunchable(CALLING_PACKAGE_1, "s3", USER_10);
2730 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s4", USER_10);
2731 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s5", USER_10);
2732 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s6", USER_10);
2733 });
2734
2735 // Save & load and make sure we still have the same information.
2736 mService.saveDirtyInfo();
2737 initService();
2738 mService.handleUnlockUser(USER_0);
2739
2740 runWithCaller(LAUNCHER_1, USER_0, () -> {
2741 assertShortcutIds(assertAllPinned(
2742 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2743 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
2744 "s1");
2745 assertShortcutIds(assertAllDynamic(
2746 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2747 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
2748 "s1");
2749 assertShortcutIds(assertAllDynamicOrPinned(
2750 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2751 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
2752 "s1");
2753
2754 assertShortcutIds(assertAllPinned(
2755 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2756 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
2757 "s1", "s2", "s3");
2758 assertShortcutIds(assertAllDynamic(
2759 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2760 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
2761 "s1");
2762 assertShortcutIds(assertAllDynamicOrPinned(
2763 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2764 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
2765 "s1", "s2", "s3");
2766
2767 assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
2768 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_0);
2769 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_0);
2770
2771 assertShortcutLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
2772 assertShortcutLaunchable(CALLING_PACKAGE_2, "s2", USER_0);
2773 assertShortcutLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
2774
2775 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s1", USER_10);
2776 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_10);
2777 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_10);
2778 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s4", USER_10);
2779 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s5", USER_10);
2780 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s6", USER_10);
2781 });
2782 runWithCaller(LAUNCHER_1, USER_P0, () -> {
2783 assertShortcutIds(assertAllPinned(
2784 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2785 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
2786 "s2");
2787 assertShortcutIds(assertAllDynamic(
2788 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2789 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
2790 "s1");
2791 assertShortcutIds(assertAllDynamicOrPinned(
2792 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2793 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
2794 "s1", "s2");
2795
2796 assertShortcutIds(assertAllPinned(
2797 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2798 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
2799 "s2", "s3");
2800 assertShortcutIds(assertAllDynamic(
2801 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2802 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
2803 "s1");
2804 assertShortcutIds(assertAllDynamicOrPinned(
2805 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2806 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
2807 "s1", "s2", "s3");
2808
2809 assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
2810 assertShortcutLaunchable(CALLING_PACKAGE_1, "s2", USER_0);
2811 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_0);
2812
2813 assertShortcutLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
2814 assertShortcutLaunchable(CALLING_PACKAGE_2, "s2", USER_0);
2815 assertShortcutLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
2816
2817 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s1", USER_10);
2818 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_10);
2819 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_10);
2820 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s4", USER_10);
2821 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s5", USER_10);
2822 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s6", USER_10);
2823 });
2824 runWithCaller(LAUNCHER_2, USER_P0, () -> {
2825 assertShortcutIds(assertAllPinned(
2826 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2827 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
2828 "s3");
2829 assertShortcutIds(assertAllDynamic(
2830 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2831 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
2832 "s1");
2833 assertShortcutIds(assertAllDynamicOrPinned(
2834 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2835 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
2836 "s1", "s3");
2837
2838 assertShortcutIds(assertAllPinned(
2839 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2840 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
2841 "s3");
2842 assertShortcutIds(assertAllDynamic(
2843 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2844 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
2845 "s1");
2846 assertShortcutIds(assertAllDynamicOrPinned(
2847 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2848 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
2849 "s1", "s3");
2850
2851 assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
2852 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_0);
2853 assertShortcutLaunchable(CALLING_PACKAGE_1, "s3", USER_0);
2854
2855 assertShortcutLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
2856 assertShortcutNotLaunchable(CALLING_PACKAGE_2, "s2", USER_0);
2857 assertShortcutLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
2858
2859 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s1", USER_10);
2860 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_10);
2861 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_10);
2862 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s4", USER_10);
2863 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s5", USER_10);
2864 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s6", USER_10);
2865 });
2866 }
2867
2868 public void testStartShortcut() {
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002869 // Create some shortcuts.
2870 setCaller(CALLING_PACKAGE_1);
2871 final ShortcutInfo s1_1 = makeShortcut(
2872 "s1",
2873 "Title 1",
2874 makeComponent(ShortcutActivity.class),
2875 /* icon =*/ null,
2876 makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class,
2877 "key1", "val1", "nest", makeBundle("key", 123)),
2878 /* weight */ 10);
2879
2880 final ShortcutInfo s1_2 = makeShortcut(
2881 "s2",
2882 "Title 2",
2883 /* activity */ null,
2884 /* icon =*/ null,
2885 makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class),
2886 /* weight */ 12);
2887
Makoto Onukid99c6f02016-03-28 11:02:54 -07002888 assertTrue(mManager.setDynamicShortcuts(list(s1_1, s1_2)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002889
2890 setCaller(CALLING_PACKAGE_2);
2891 final ShortcutInfo s2_1 = makeShortcut(
2892 "s1",
2893 "ABC",
2894 makeComponent(ShortcutActivity.class),
2895 /* icon =*/ null,
2896 makeIntent(Intent.ACTION_ANSWER, ShortcutActivity.class,
2897 "key1", "val1", "nest", makeBundle("key", 123)),
2898 /* weight */ 10);
Makoto Onukid99c6f02016-03-28 11:02:54 -07002899 assertTrue(mManager.setDynamicShortcuts(list(s2_1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002900
2901 // Pin all.
2902 setCaller(LAUNCHER_1);
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08002903 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
Makoto Onukid99c6f02016-03-28 11:02:54 -07002904 list("s1", "s2"), getCallingUser());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002905
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08002906 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
Makoto Onukid99c6f02016-03-28 11:02:54 -07002907 list("s1"), getCallingUser());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002908
2909 // Just to make it complicated, delete some.
2910 setCaller(CALLING_PACKAGE_1);
2911 mManager.deleteDynamicShortcut("s2");
2912
2913 // intent and check.
2914 setCaller(LAUNCHER_1);
Makoto Onukid99c6f02016-03-28 11:02:54 -07002915
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002916 Intent intent;
Makoto Onukid99c6f02016-03-28 11:02:54 -07002917 intent = launchShortcutAndGetIntent(CALLING_PACKAGE_1, "s1", USER_0);
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002918 assertEquals(ShortcutActivity2.class.getName(), intent.getComponent().getClassName());
2919
Makoto Onukid99c6f02016-03-28 11:02:54 -07002920
2921 intent = launchShortcutAndGetIntent(CALLING_PACKAGE_1, "s2", USER_0);
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002922 assertEquals(ShortcutActivity3.class.getName(), intent.getComponent().getClassName());
2923
Makoto Onukid99c6f02016-03-28 11:02:54 -07002924 intent = launchShortcutAndGetIntent(CALLING_PACKAGE_2, "s1", USER_0);
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002925 assertEquals(ShortcutActivity.class.getName(), intent.getComponent().getClassName());
2926
2927 // TODO Check extra, etc
2928 }
2929
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07002930 public void testLauncherCallback() throws Throwable {
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07002931
Makoto Onukide667372016-03-15 14:29:20 -07002932 // TODO Add "multi" version -- run the test with two launchers and make sure the callback
2933 // argument only contains the ones that are actually visible to each launcher.
2934
Makoto Onukicdc78f72016-03-21 15:47:52 -07002935 when(mMockUserManager.isUserRunning(eq(USER_0))).thenReturn(true);
2936
Makoto Onukide667372016-03-15 14:29:20 -07002937 LauncherApps.Callback c0 = mock(LauncherApps.Callback.class);
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07002938
2939 // Set listeners
2940
2941 runWithCaller(LAUNCHER_1, USER_0, () -> {
2942 mLauncherApps.registerCallback(c0, new Handler(Looper.getMainLooper()));
2943 });
2944
2945 runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07002946 assertTrue(mManager.setDynamicShortcuts(list(
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07002947 makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
2948 });
2949
2950 waitOnMainThread();
2951 ArgumentCaptor<List> shortcuts = ArgumentCaptor.forClass(List.class);
2952 verify(c0).onShortcutsChanged(
2953 eq(CALLING_PACKAGE_1),
2954 shortcuts.capture(),
Makoto Onukid99c6f02016-03-28 11:02:54 -07002955 eq(HANDLE_USER_0)
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07002956 );
2957 assertShortcutIds(assertAllDynamic(shortcuts.getValue()),
2958 "s1", "s2", "s3");
2959
2960 // From different package.
2961 reset(c0);
2962 runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07002963 assertTrue(mManager.setDynamicShortcuts(list(
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07002964 makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
2965 });
2966 waitOnMainThread();
2967 shortcuts = ArgumentCaptor.forClass(List.class);
2968 verify(c0).onShortcutsChanged(
2969 eq(CALLING_PACKAGE_2),
2970 shortcuts.capture(),
Makoto Onukid99c6f02016-03-28 11:02:54 -07002971 eq(HANDLE_USER_0)
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07002972 );
2973 assertShortcutIds(assertAllDynamic(shortcuts.getValue()),
2974 "s1", "s2", "s3");
2975
2976 // Different user, callback shouldn't be called.
2977 reset(c0);
2978 runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07002979 assertTrue(mManager.setDynamicShortcuts(list(
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07002980 makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
2981 });
2982 waitOnMainThread();
2983 verify(c0, times(0)).onShortcutsChanged(
2984 anyString(),
2985 any(List.class),
2986 any(UserHandle.class)
2987 );
2988
2989 // Test for addDynamicShortcut.
2990 reset(c0);
2991 runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
2992 assertTrue(mManager.addDynamicShortcut(makeShortcut("s4")));
2993 });
2994
2995 waitOnMainThread();
2996 shortcuts = ArgumentCaptor.forClass(List.class);
2997 verify(c0).onShortcutsChanged(
2998 eq(CALLING_PACKAGE_1),
2999 shortcuts.capture(),
Makoto Onukid99c6f02016-03-28 11:02:54 -07003000 eq(HANDLE_USER_0)
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07003001 );
3002 assertShortcutIds(assertAllDynamic(shortcuts.getValue()),
3003 "s1", "s2", "s3", "s4");
3004
3005 // Test for remove
3006 reset(c0);
3007 runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
3008 mManager.deleteDynamicShortcut("s1");
3009 });
3010
3011 waitOnMainThread();
3012 shortcuts = ArgumentCaptor.forClass(List.class);
3013 verify(c0).onShortcutsChanged(
3014 eq(CALLING_PACKAGE_1),
3015 shortcuts.capture(),
Makoto Onukid99c6f02016-03-28 11:02:54 -07003016 eq(HANDLE_USER_0)
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07003017 );
3018 assertShortcutIds(assertAllDynamic(shortcuts.getValue()),
3019 "s2", "s3", "s4");
3020
3021 // Test for update
3022 reset(c0);
3023 runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07003024 assertTrue(mManager.updateShortcuts(list(
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07003025 makeShortcut("s1"), makeShortcut("s2"))));
3026 });
3027
3028 waitOnMainThread();
3029 shortcuts = ArgumentCaptor.forClass(List.class);
3030 verify(c0).onShortcutsChanged(
3031 eq(CALLING_PACKAGE_1),
3032 shortcuts.capture(),
Makoto Onukid99c6f02016-03-28 11:02:54 -07003033 eq(HANDLE_USER_0)
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07003034 );
3035 assertShortcutIds(assertAllDynamic(shortcuts.getValue()),
3036 "s2", "s3", "s4");
3037
3038 // Test for deleteAll
3039 reset(c0);
3040 runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
3041 mManager.deleteAllDynamicShortcuts();
3042 });
3043
3044 waitOnMainThread();
3045 shortcuts = ArgumentCaptor.forClass(List.class);
3046 verify(c0).onShortcutsChanged(
3047 eq(CALLING_PACKAGE_1),
3048 shortcuts.capture(),
Makoto Onukid99c6f02016-03-28 11:02:54 -07003049 eq(HANDLE_USER_0)
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07003050 );
3051 assertEquals(0, shortcuts.getValue().size());
Makoto Onukicdc78f72016-03-21 15:47:52 -07003052
3053 // Remove CALLING_PACKAGE_2
3054 reset(c0);
Makoto Onukid99c6f02016-03-28 11:02:54 -07003055 mService.cleanUpPackageLocked(CALLING_PACKAGE_2, USER_0, USER_0);
Makoto Onukicdc78f72016-03-21 15:47:52 -07003056
3057 // Should get a callback with an empty list.
3058 waitOnMainThread();
3059 shortcuts = ArgumentCaptor.forClass(List.class);
3060 verify(c0).onShortcutsChanged(
3061 eq(CALLING_PACKAGE_2),
3062 shortcuts.capture(),
Makoto Onukid99c6f02016-03-28 11:02:54 -07003063 eq(HANDLE_USER_0)
Makoto Onukicdc78f72016-03-21 15:47:52 -07003064 );
3065 assertEquals(0, shortcuts.getValue().size());
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07003066 }
3067
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003068 // === Test for persisting ===
3069
3070 public void testSaveAndLoadUser_empty() {
Makoto Onukid99c6f02016-03-28 11:02:54 -07003071 assertTrue(mManager.setDynamicShortcuts(list()));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003072
3073 Log.i(TAG, "Saved state");
3074 dumpsysOnLogcat();
3075 dumpUserFile(0);
3076
3077 // Restore.
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07003078 mService.saveDirtyInfo();
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003079 initService();
3080
3081 assertEquals(0, mManager.getDynamicShortcuts().size());
3082 }
3083
3084 /**
3085 * Try save and load, also stop/start the user.
3086 */
3087 public void testSaveAndLoadUser() {
3088 // First, create some shortcuts and save.
Makoto Onuki41066a62016-03-09 16:18:44 -08003089 runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07003090 final Icon icon1 = Icon.createWithResource(getTestContext(), R.drawable.black_64x16);
Makoto Onuki41066a62016-03-09 16:18:44 -08003091 final Icon icon2 = Icon.createWithBitmap(BitmapFactory.decodeResource(
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07003092 getTestContext().getResources(), R.drawable.icon2));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003093
Makoto Onuki41066a62016-03-09 16:18:44 -08003094 final ShortcutInfo si1 = makeShortcut(
3095 "s1",
3096 "title1-1",
3097 makeComponent(ShortcutActivity.class),
3098 icon1,
3099 makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class,
3100 "key1", "val1", "nest", makeBundle("key", 123)),
3101 /* weight */ 10);
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003102
Makoto Onuki41066a62016-03-09 16:18:44 -08003103 final ShortcutInfo si2 = makeShortcut(
3104 "s2",
3105 "title1-2",
3106 /* activity */ null,
3107 icon2,
3108 makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class),
3109 /* weight */ 12);
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003110
Makoto Onukid99c6f02016-03-28 11:02:54 -07003111 assertTrue(mManager.setDynamicShortcuts(list(si1, si2)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003112
Makoto Onuki41066a62016-03-09 16:18:44 -08003113 assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
3114 assertEquals(2, mManager.getRemainingCallCount());
3115 });
3116 runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07003117 final Icon icon1 = Icon.createWithResource(getTestContext(), R.drawable.black_16x64);
Makoto Onuki41066a62016-03-09 16:18:44 -08003118 final Icon icon2 = Icon.createWithBitmap(BitmapFactory.decodeResource(
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07003119 getTestContext().getResources(), R.drawable.icon2));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003120
Makoto Onuki41066a62016-03-09 16:18:44 -08003121 final ShortcutInfo si1 = makeShortcut(
3122 "s1",
3123 "title2-1",
3124 makeComponent(ShortcutActivity.class),
3125 icon1,
3126 makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class,
3127 "key1", "val1", "nest", makeBundle("key", 123)),
3128 /* weight */ 10);
3129
3130 final ShortcutInfo si2 = makeShortcut(
3131 "s2",
3132 "title2-2",
3133 /* activity */ null,
3134 icon2,
3135 makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class),
3136 /* weight */ 12);
3137
Makoto Onukid99c6f02016-03-28 11:02:54 -07003138 assertTrue(mManager.setDynamicShortcuts(list(si1, si2)));
Makoto Onuki41066a62016-03-09 16:18:44 -08003139
3140 assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
3141 assertEquals(2, mManager.getRemainingCallCount());
3142 });
3143 runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07003144 final Icon icon1 = Icon.createWithResource(getTestContext(), R.drawable.black_64x64);
Makoto Onuki41066a62016-03-09 16:18:44 -08003145 final Icon icon2 = Icon.createWithBitmap(BitmapFactory.decodeResource(
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07003146 getTestContext().getResources(), R.drawable.icon2));
Makoto Onuki41066a62016-03-09 16:18:44 -08003147
3148 final ShortcutInfo si1 = makeShortcut(
3149 "s1",
3150 "title10-1-1",
3151 makeComponent(ShortcutActivity.class),
3152 icon1,
3153 makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class,
3154 "key1", "val1", "nest", makeBundle("key", 123)),
3155 /* weight */ 10);
3156
3157 final ShortcutInfo si2 = makeShortcut(
3158 "s2",
3159 "title10-1-2",
3160 /* activity */ null,
3161 icon2,
3162 makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class),
3163 /* weight */ 12);
3164
Makoto Onukid99c6f02016-03-28 11:02:54 -07003165 assertTrue(mManager.setDynamicShortcuts(list(si1, si2)));
Makoto Onuki41066a62016-03-09 16:18:44 -08003166
3167 assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
3168 assertEquals(2, mManager.getRemainingCallCount());
3169 });
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003170
Makoto Onuki2d5b4652016-03-11 16:09:54 -08003171 mService.getShortcutsForTest().get(UserHandle.USER_SYSTEM).setLauncherComponent(
3172 mService, new ComponentName("pkg1", "class"));
3173
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003174 // Restore.
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07003175 mService.saveDirtyInfo();
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003176 initService();
3177
3178 // Before the load, the map should be empty.
3179 assertEquals(0, mService.getShortcutsForTest().size());
3180
3181 // this will pre-load the per-user info.
Makoto Onukicdc78f72016-03-21 15:47:52 -07003182 mService.handleUnlockUser(UserHandle.USER_SYSTEM);
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003183
3184 // Now it's loaded.
3185 assertEquals(1, mService.getShortcutsForTest().size());
3186
Makoto Onuki41066a62016-03-09 16:18:44 -08003187 runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
3188 assertShortcutIds(assertAllDynamic(assertAllHaveIntents(assertAllHaveIcon(
3189 mManager.getDynamicShortcuts()))), "s1", "s2");
3190 assertEquals(2, mManager.getRemainingCallCount());
3191
3192 assertEquals("title1-1", getCallerShortcut("s1").getTitle());
3193 assertEquals("title1-2", getCallerShortcut("s2").getTitle());
3194 });
3195 runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
3196 assertShortcutIds(assertAllDynamic(assertAllHaveIntents(assertAllHaveIcon(
3197 mManager.getDynamicShortcuts()))), "s1", "s2");
3198 assertEquals(2, mManager.getRemainingCallCount());
3199
3200 assertEquals("title2-1", getCallerShortcut("s1").getTitle());
3201 assertEquals("title2-2", getCallerShortcut("s2").getTitle());
3202 });
3203
Makoto Onuki2d5b4652016-03-11 16:09:54 -08003204 assertEquals("pkg1", mService.getShortcutsForTest().get(UserHandle.USER_SYSTEM)
3205 .getLauncherComponent().getPackageName());
3206
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003207 // Start another user
Makoto Onukicdc78f72016-03-21 15:47:52 -07003208 mService.handleUnlockUser(USER_10);
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003209
3210 // Now the size is 2.
3211 assertEquals(2, mService.getShortcutsForTest().size());
3212
Makoto Onuki41066a62016-03-09 16:18:44 -08003213 runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
3214 assertShortcutIds(assertAllDynamic(assertAllHaveIntents(assertAllHaveIcon(
3215 mManager.getDynamicShortcuts()))), "s1", "s2");
3216 assertEquals(2, mManager.getRemainingCallCount());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003217
Makoto Onuki41066a62016-03-09 16:18:44 -08003218 assertEquals("title10-1-1", getCallerShortcut("s1").getTitle());
3219 assertEquals("title10-1-2", getCallerShortcut("s2").getTitle());
3220 });
Makoto Onuki2d5b4652016-03-11 16:09:54 -08003221 assertNull(mService.getShortcutsForTest().get(USER_10).getLauncherComponent());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003222
3223 // Try stopping the user
Makoto Onukicdc78f72016-03-21 15:47:52 -07003224 mService.handleCleanupUser(USER_10);
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003225
3226 // Now it's unloaded.
3227 assertEquals(1, mService.getShortcutsForTest().size());
3228
3229 // TODO Check all other fields
3230 }
Makoto Onuki2d5b4652016-03-11 16:09:54 -08003231
Makoto Onukicdc78f72016-03-21 15:47:52 -07003232 public void testCleanupPackage() {
3233 runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07003234 assertTrue(mManager.setDynamicShortcuts(list(
Makoto Onukicdc78f72016-03-21 15:47:52 -07003235 makeShortcut("s0_1"))));
3236 });
3237 runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07003238 assertTrue(mManager.setDynamicShortcuts(list(
Makoto Onukicdc78f72016-03-21 15:47:52 -07003239 makeShortcut("s0_2"))));
3240 });
3241 runWithCaller(LAUNCHER_1, USER_0, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07003242 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s0_1"),
3243 HANDLE_USER_0);
3244 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("s0_2"),
3245 HANDLE_USER_0);
Makoto Onukicdc78f72016-03-21 15:47:52 -07003246 });
3247 runWithCaller(LAUNCHER_2, USER_0, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07003248 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s0_1"),
3249 HANDLE_USER_0);
3250 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("s0_2"),
3251 HANDLE_USER_0);
Makoto Onukicdc78f72016-03-21 15:47:52 -07003252 });
3253
3254 runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07003255 assertTrue(mManager.setDynamicShortcuts(list(
Makoto Onukicdc78f72016-03-21 15:47:52 -07003256 makeShortcut("s10_1"))));
3257 });
3258 runWithCaller(CALLING_PACKAGE_2, USER_10, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07003259 assertTrue(mManager.setDynamicShortcuts(list(
Makoto Onukicdc78f72016-03-21 15:47:52 -07003260 makeShortcut("s10_2"))));
3261 });
3262 runWithCaller(LAUNCHER_1, USER_10, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07003263 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s10_1"),
3264 HANDLE_USER_10);
3265 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("s10_2"),
3266 HANDLE_USER_10);
Makoto Onukicdc78f72016-03-21 15:47:52 -07003267 });
3268 runWithCaller(LAUNCHER_2, USER_10, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07003269 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s10_1"),
3270 HANDLE_USER_10);
3271 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("s10_2"),
3272 HANDLE_USER_10);
Makoto Onukicdc78f72016-03-21 15:47:52 -07003273 });
3274
3275 // Remove all dynamic shortcuts; now all shortcuts are just pinned.
3276 runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
3277 mManager.deleteAllDynamicShortcuts();
3278 });
3279 runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
3280 mManager.deleteAllDynamicShortcuts();
3281 });
3282 runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
3283 mManager.deleteAllDynamicShortcuts();
3284 });
3285 runWithCaller(CALLING_PACKAGE_2, USER_10, () -> {
3286 mManager.deleteAllDynamicShortcuts();
3287 });
3288
3289
Makoto Onuki31459242016-03-22 11:12:18 -07003290 final SparseArray<ShortcutUser> users = mService.getShortcutsForTest();
Makoto Onukicdc78f72016-03-21 15:47:52 -07003291 assertEquals(2, users.size());
3292 assertEquals(USER_0, users.keyAt(0));
3293 assertEquals(USER_10, users.keyAt(1));
3294
Makoto Onuki31459242016-03-22 11:12:18 -07003295 final ShortcutUser user0 = users.get(USER_0);
3296 final ShortcutUser user10 = users.get(USER_10);
Makoto Onukicdc78f72016-03-21 15:47:52 -07003297
3298
3299 // Check the registered packages.
Makoto Onukid99c6f02016-03-28 11:02:54 -07003300 dumpsysOnLogcat();
Makoto Onukicdc78f72016-03-21 15:47:52 -07003301 assertEquals(makeSet(CALLING_PACKAGE_1, CALLING_PACKAGE_2),
3302 set(user0.getPackages().keySet()));
3303 assertEquals(makeSet(CALLING_PACKAGE_1, CALLING_PACKAGE_2),
3304 set(user10.getPackages().keySet()));
Makoto Onukid99c6f02016-03-28 11:02:54 -07003305 assertEquals(
3306 makeSet(PackageWithUser.of(USER_0, LAUNCHER_1),
3307 PackageWithUser.of(USER_0, LAUNCHER_2)),
3308 set(user0.getAllLaunchers().keySet()));
3309 assertEquals(
3310 makeSet(PackageWithUser.of(USER_10, LAUNCHER_1),
3311 PackageWithUser.of(USER_10, LAUNCHER_2)),
3312 set(user10.getAllLaunchers().keySet()));
Makoto Onukicdc78f72016-03-21 15:47:52 -07003313 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_0),
3314 "s0_1", "s0_2");
3315 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_0),
3316 "s0_1", "s0_2");
3317 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_10),
3318 "s10_1", "s10_2");
3319 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_10),
3320 "s10_1", "s10_2");
3321 assertShortcutExists(CALLING_PACKAGE_1, "s0_1", USER_0);
3322 assertShortcutExists(CALLING_PACKAGE_2, "s0_2", USER_0);
3323 assertShortcutExists(CALLING_PACKAGE_1, "s10_1", USER_10);
3324 assertShortcutExists(CALLING_PACKAGE_2, "s10_2", USER_10);
3325
3326 mService.saveDirtyInfo();
3327
3328 // Nonexistent package.
Makoto Onukid99c6f02016-03-28 11:02:54 -07003329 mService.cleanUpPackageLocked("abc", USER_0, USER_0);
Makoto Onukicdc78f72016-03-21 15:47:52 -07003330
3331 // No changes.
3332 assertEquals(makeSet(CALLING_PACKAGE_1, CALLING_PACKAGE_2),
3333 set(user0.getPackages().keySet()));
3334 assertEquals(makeSet(CALLING_PACKAGE_1, CALLING_PACKAGE_2),
3335 set(user10.getPackages().keySet()));
Makoto Onukid99c6f02016-03-28 11:02:54 -07003336 assertEquals(
3337 makeSet(PackageWithUser.of(USER_0, LAUNCHER_1),
3338 PackageWithUser.of(USER_0, LAUNCHER_2)),
3339 set(user0.getAllLaunchers().keySet()));
3340 assertEquals(
3341 makeSet(PackageWithUser.of(USER_10, LAUNCHER_1),
3342 PackageWithUser.of(USER_10, LAUNCHER_2)),
3343 set(user10.getAllLaunchers().keySet()));
Makoto Onukicdc78f72016-03-21 15:47:52 -07003344 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_0),
3345 "s0_1", "s0_2");
3346 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_0),
3347 "s0_1", "s0_2");
3348 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_10),
3349 "s10_1", "s10_2");
3350 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_10),
3351 "s10_1", "s10_2");
3352 assertShortcutExists(CALLING_PACKAGE_1, "s0_1", USER_0);
3353 assertShortcutExists(CALLING_PACKAGE_2, "s0_2", USER_0);
3354 assertShortcutExists(CALLING_PACKAGE_1, "s10_1", USER_10);
3355 assertShortcutExists(CALLING_PACKAGE_2, "s10_2", USER_10);
3356
3357 mService.saveDirtyInfo();
3358
3359 // Remove a package.
Makoto Onukid99c6f02016-03-28 11:02:54 -07003360 mService.cleanUpPackageLocked(CALLING_PACKAGE_1, USER_0, USER_0);
Makoto Onukicdc78f72016-03-21 15:47:52 -07003361
3362 assertEquals(makeSet(CALLING_PACKAGE_2),
3363 set(user0.getPackages().keySet()));
3364 assertEquals(makeSet(CALLING_PACKAGE_1, CALLING_PACKAGE_2),
3365 set(user10.getPackages().keySet()));
Makoto Onukid99c6f02016-03-28 11:02:54 -07003366 assertEquals(
3367 makeSet(PackageWithUser.of(USER_0, LAUNCHER_1),
3368 PackageWithUser.of(USER_0, LAUNCHER_2)),
3369 set(user0.getAllLaunchers().keySet()));
3370 assertEquals(
3371 makeSet(PackageWithUser.of(USER_10, LAUNCHER_1),
3372 PackageWithUser.of(USER_10, LAUNCHER_2)),
3373 set(user10.getAllLaunchers().keySet()));
Makoto Onukicdc78f72016-03-21 15:47:52 -07003374 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_0),
3375 "s0_2");
3376 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_0),
3377 "s0_2");
3378 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_10),
3379 "s10_1", "s10_2");
3380 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_10),
3381 "s10_1", "s10_2");
3382 assertShortcutNotExists(CALLING_PACKAGE_1, "s0_1", USER_0);
3383 assertShortcutExists(CALLING_PACKAGE_2, "s0_2", USER_0);
3384 assertShortcutExists(CALLING_PACKAGE_1, "s10_1", USER_10);
3385 assertShortcutExists(CALLING_PACKAGE_2, "s10_2", USER_10);
3386
3387 mService.saveDirtyInfo();
3388
3389 // Remove a launcher.
Makoto Onukid99c6f02016-03-28 11:02:54 -07003390 mService.cleanUpPackageLocked(LAUNCHER_1, USER_10, USER_10);
Makoto Onukicdc78f72016-03-21 15:47:52 -07003391
3392 assertEquals(makeSet(CALLING_PACKAGE_2),
3393 set(user0.getPackages().keySet()));
3394 assertEquals(makeSet(CALLING_PACKAGE_1, CALLING_PACKAGE_2),
3395 set(user10.getPackages().keySet()));
Makoto Onukid99c6f02016-03-28 11:02:54 -07003396 assertEquals(
3397 makeSet(PackageWithUser.of(USER_0, LAUNCHER_1),
3398 PackageWithUser.of(USER_0, LAUNCHER_2)),
3399 set(user0.getAllLaunchers().keySet()));
3400 assertEquals(
3401 makeSet(PackageWithUser.of(USER_10, LAUNCHER_2)),
3402 set(user10.getAllLaunchers().keySet()));
Makoto Onukicdc78f72016-03-21 15:47:52 -07003403 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_0),
3404 "s0_2");
3405 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_0),
3406 "s0_2");
3407 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_10),
3408 "s10_1", "s10_2");
3409 assertShortcutNotExists(CALLING_PACKAGE_1, "s0_1", USER_0);
3410 assertShortcutExists(CALLING_PACKAGE_2, "s0_2", USER_0);
3411 assertShortcutExists(CALLING_PACKAGE_1, "s10_1", USER_10);
3412 assertShortcutExists(CALLING_PACKAGE_2, "s10_2", USER_10);
3413
3414 mService.saveDirtyInfo();
3415
3416 // Remove a package.
Makoto Onukid99c6f02016-03-28 11:02:54 -07003417 mService.cleanUpPackageLocked(CALLING_PACKAGE_2, USER_10, USER_10);
Makoto Onukicdc78f72016-03-21 15:47:52 -07003418
3419 assertEquals(makeSet(CALLING_PACKAGE_2),
3420 set(user0.getPackages().keySet()));
3421 assertEquals(makeSet(CALLING_PACKAGE_1),
3422 set(user10.getPackages().keySet()));
Makoto Onukid99c6f02016-03-28 11:02:54 -07003423 assertEquals(
3424 makeSet(PackageWithUser.of(USER_0, LAUNCHER_1),
3425 PackageWithUser.of(USER_0, LAUNCHER_2)),
3426 set(user0.getAllLaunchers().keySet()));
3427 assertEquals(
3428 makeSet(PackageWithUser.of(USER_10, LAUNCHER_2)),
3429 set(user10.getAllLaunchers().keySet()));
Makoto Onukicdc78f72016-03-21 15:47:52 -07003430 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_0),
3431 "s0_2");
3432 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_0),
3433 "s0_2");
3434 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_10),
3435 "s10_1");
3436 assertShortcutNotExists(CALLING_PACKAGE_1, "s0_1", USER_0);
3437 assertShortcutExists(CALLING_PACKAGE_2, "s0_2", USER_0);
3438 assertShortcutExists(CALLING_PACKAGE_1, "s10_1", USER_10);
3439 assertShortcutNotExists(CALLING_PACKAGE_2, "s10_2", USER_10);
3440
3441 mService.saveDirtyInfo();
3442
3443 // Remove the other launcher from user 10 too.
Makoto Onukid99c6f02016-03-28 11:02:54 -07003444 mService.cleanUpPackageLocked(LAUNCHER_2, USER_10, USER_10);
Makoto Onukicdc78f72016-03-21 15:47:52 -07003445
3446 assertEquals(makeSet(CALLING_PACKAGE_2),
3447 set(user0.getPackages().keySet()));
3448 assertEquals(makeSet(CALLING_PACKAGE_1),
3449 set(user10.getPackages().keySet()));
Makoto Onukid99c6f02016-03-28 11:02:54 -07003450 assertEquals(
3451 makeSet(PackageWithUser.of(USER_0, LAUNCHER_1),
3452 PackageWithUser.of(USER_0, LAUNCHER_2)),
3453 set(user0.getAllLaunchers().keySet()));
3454 assertEquals(
3455 makeSet(),
3456 set(user10.getAllLaunchers().keySet()));
Makoto Onukicdc78f72016-03-21 15:47:52 -07003457 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_0),
3458 "s0_2");
3459 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_0),
3460 "s0_2");
3461
3462 // Note the pinned shortcuts on user-10 no longer referred, so they should both be removed.
3463 assertShortcutNotExists(CALLING_PACKAGE_1, "s0_1", USER_0);
3464 assertShortcutExists(CALLING_PACKAGE_2, "s0_2", USER_0);
3465 assertShortcutNotExists(CALLING_PACKAGE_1, "s10_1", USER_10);
3466 assertShortcutNotExists(CALLING_PACKAGE_2, "s10_2", USER_10);
3467
3468 mService.saveDirtyInfo();
3469
3470 // More remove.
Makoto Onukid99c6f02016-03-28 11:02:54 -07003471 mService.cleanUpPackageLocked(CALLING_PACKAGE_1, USER_10, USER_10);
Makoto Onukicdc78f72016-03-21 15:47:52 -07003472
3473 assertEquals(makeSet(CALLING_PACKAGE_2),
3474 set(user0.getPackages().keySet()));
3475 assertEquals(makeSet(),
3476 set(user10.getPackages().keySet()));
Makoto Onukid99c6f02016-03-28 11:02:54 -07003477 assertEquals(
3478 makeSet(PackageWithUser.of(USER_0, LAUNCHER_1),
3479 PackageWithUser.of(USER_0, LAUNCHER_2)),
3480 set(user0.getAllLaunchers().keySet()));
Makoto Onukicdc78f72016-03-21 15:47:52 -07003481 assertEquals(makeSet(),
Makoto Onukid99c6f02016-03-28 11:02:54 -07003482 set(user10.getAllLaunchers().keySet()));
Makoto Onukicdc78f72016-03-21 15:47:52 -07003483 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_0),
3484 "s0_2");
3485 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_0),
3486 "s0_2");
3487
3488 // Note the pinned shortcuts on user-10 no longer referred, so they should both be removed.
3489 assertShortcutNotExists(CALLING_PACKAGE_1, "s0_1", USER_0);
3490 assertShortcutExists(CALLING_PACKAGE_2, "s0_2", USER_0);
3491 assertShortcutNotExists(CALLING_PACKAGE_1, "s10_1", USER_10);
3492 assertShortcutNotExists(CALLING_PACKAGE_2, "s10_2", USER_10);
3493
3494 mService.saveDirtyInfo();
3495 }
3496
Makoto Onuki9da23fc2016-03-29 11:14:42 -07003497
3498 public void testSaveAndLoadUser_forBackup() {
3499 // Create some shortcuts.
3500 runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
3501 assertTrue(mManager.setDynamicShortcuts(list(
3502 makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
3503 });
3504 runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
3505 assertTrue(mManager.setDynamicShortcuts(list(
3506 makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
3507 });
3508 runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
3509 assertTrue(mManager.setDynamicShortcuts(list(
3510 makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
3511 });
3512 runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
3513 assertTrue(mManager.setDynamicShortcuts(list(
3514 makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
3515 });
3516
3517 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
3518 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
3519 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
3520
3521 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
3522 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
3523 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
3524
3525 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
3526 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
3527 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
3528
3529 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
3530 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
3531 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
3532
3533 // Pin some.
3534
3535 runWithCaller(LAUNCHER_1, USER_0, () -> {
3536 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
3537 list("s1"), HANDLE_USER_0);
3538
3539 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
3540 list("s2"), UserHandle.of(USER_P0));
3541
3542 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
3543 list("s3"), HANDLE_USER_0);
3544 });
3545
3546 runWithCaller(LAUNCHER_1, USER_P0, () -> {
3547 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
3548 list("s2"), HANDLE_USER_0);
3549
3550 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
3551 list("s3"), UserHandle.of(USER_P0));
3552
3553 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
3554 list("s1"), HANDLE_USER_0);
3555 });
3556
3557 runWithCaller(LAUNCHER_1, USER_10, () -> {
3558 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
3559 list("s3"), HANDLE_USER_10);
3560 });
3561
3562 // Check the state.
3563
3564 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
3565 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
3566 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
3567
3568 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
3569 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
3570 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
3571
3572 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
3573 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
3574 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
3575
3576 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
3577 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
3578 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
3579
3580 // Make sure all the information is persisted.
3581 mService.saveDirtyInfo();
3582 initService();
3583 mService.handleUnlockUser(USER_0);
3584 mService.handleUnlockUser(USER_P0);
3585 mService.handleUnlockUser(USER_10);
3586 }
3587
Makoto Onukid99c6f02016-03-28 11:02:54 -07003588 public void testHandleGonePackage_crossProfile() {
3589 // Create some shortcuts.
3590 runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
3591 assertTrue(mManager.setDynamicShortcuts(list(
3592 makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
3593 });
3594 runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
3595 assertTrue(mManager.setDynamicShortcuts(list(
3596 makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
3597 });
3598 runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
3599 assertTrue(mManager.setDynamicShortcuts(list(
3600 makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
3601 });
3602 runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
3603 assertTrue(mManager.setDynamicShortcuts(list(
3604 makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
3605 });
3606
3607 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
3608 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
3609 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
3610
3611 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
3612 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
3613 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
3614
3615 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
3616 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
3617 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
3618
3619 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
3620 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
3621 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
3622
3623 // Pin some.
3624
3625 runWithCaller(LAUNCHER_1, USER_0, () -> {
3626 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
3627 list("s1"), HANDLE_USER_0);
3628
3629 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
3630 list("s2"), UserHandle.of(USER_P0));
3631
3632 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
3633 list("s3"), HANDLE_USER_0);
3634 });
3635
3636 runWithCaller(LAUNCHER_1, USER_P0, () -> {
3637 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
3638 list("s2"), HANDLE_USER_0);
3639
3640 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
3641 list("s3"), UserHandle.of(USER_P0));
3642
3643 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
3644 list("s1"), HANDLE_USER_0);
3645 });
3646
3647 runWithCaller(LAUNCHER_1, USER_10, () -> {
3648 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
3649 list("s3"), HANDLE_USER_10);
3650 });
3651
3652 // Check the state.
3653
3654 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
3655 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
3656 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
3657
3658 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
3659 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
3660 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
3661
3662 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
3663 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
3664 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
3665
3666 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
3667 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
3668 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
3669
Makoto Onukid99c6f02016-03-28 11:02:54 -07003670 // Make sure all the information is persisted.
3671 mService.saveDirtyInfo();
3672 initService();
3673 mService.handleUnlockUser(USER_0);
3674 mService.handleUnlockUser(USER_P0);
3675 mService.handleUnlockUser(USER_10);
3676
3677 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
3678 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
3679 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
3680
3681 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
3682 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
3683 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
3684
3685 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
3686 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
3687 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
3688
3689 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
3690 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
3691 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
3692
Makoto Onukid99c6f02016-03-28 11:02:54 -07003693 // Start uninstalling.
3694 uninstallPackage(USER_10, LAUNCHER_1);
3695 mService.cleanupGonePackages(USER_10);
3696
3697 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
3698 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
3699 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
3700
3701 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
3702 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
3703 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
3704
3705 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
3706 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
3707 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
3708
3709 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
3710 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
3711 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
3712
Makoto Onukid99c6f02016-03-28 11:02:54 -07003713 // Uninstall.
3714 uninstallPackage(USER_10, CALLING_PACKAGE_1);
3715 mService.cleanupGonePackages(USER_10);
3716
3717 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
3718 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
3719 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
3720
3721 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
3722 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
3723 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
3724
3725 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
3726 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
3727 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
3728
3729 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
3730 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
3731 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
3732
Makoto Onukid99c6f02016-03-28 11:02:54 -07003733 uninstallPackage(USER_P0, LAUNCHER_1);
3734 mService.cleanupGonePackages(USER_0);
3735
3736 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
3737 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
3738 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
3739
3740 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
3741 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
3742 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
3743
3744 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
3745 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
3746 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
3747
3748 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
3749 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
3750 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
3751
Makoto Onukid99c6f02016-03-28 11:02:54 -07003752 mService.cleanupGonePackages(USER_P0);
3753
3754 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
3755 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
3756 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
3757
3758 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
3759 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
3760 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
3761
3762 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
3763 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
3764 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
3765
3766 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
3767 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
3768 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
3769
Makoto Onukid99c6f02016-03-28 11:02:54 -07003770 uninstallPackage(USER_P0, CALLING_PACKAGE_1);
3771
3772 mService.saveDirtyInfo();
3773 initService();
3774 mService.handleUnlockUser(USER_0);
3775 mService.handleUnlockUser(USER_P0);
3776 mService.handleUnlockUser(USER_10);
3777
3778 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
3779 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
3780 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
3781
3782 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
3783 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
3784 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
3785
3786 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
3787 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
3788 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
3789
3790 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
3791 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
3792 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
3793
Makoto Onukid99c6f02016-03-28 11:02:54 -07003794 // Uninstall
3795 uninstallPackage(USER_0, LAUNCHER_1);
3796
3797 mService.saveDirtyInfo();
3798 initService();
3799 mService.handleUnlockUser(USER_0);
3800 mService.handleUnlockUser(USER_P0);
3801 mService.handleUnlockUser(USER_10);
3802
3803 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
3804 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
3805 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
3806
3807 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
3808 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
3809 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
3810
3811 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
3812 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
3813 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
3814
3815 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
3816 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
3817 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
3818
Makoto Onukid99c6f02016-03-28 11:02:54 -07003819 uninstallPackage(USER_0, CALLING_PACKAGE_2);
3820
3821 mService.saveDirtyInfo();
3822 initService();
3823 mService.handleUnlockUser(USER_0);
3824 mService.handleUnlockUser(USER_P0);
3825 mService.handleUnlockUser(USER_10);
3826
3827 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
3828 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
3829 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
3830
3831 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
3832 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
3833 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
3834
3835 assertNull(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
3836 assertNull(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
3837 assertNull(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
3838
3839 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
3840 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
3841 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
Makoto Onukid99c6f02016-03-28 11:02:54 -07003842 }
3843
Makoto Onuki2d5b4652016-03-11 16:09:54 -08003844 // TODO Detailed test for hasShortcutPermissionInner().
3845
3846 // TODO Add tests for the command line functions too.
Makoto Onuki0acbb142016-03-22 17:02:57 -07003847
3848 private void checkCanRestoreTo(boolean expected, ShortcutPackageInfo spi,
3849 int version, String... signatures) {
3850 assertEquals(expected, spi.canRestoreTo(genPackage(
3851 "dummy", /* uid */ 0, version, signatures)));
3852 }
3853
3854 public void testCanRestoreTo() {
3855 addPackage(CALLING_PACKAGE_1, CALLING_UID_1, 10, "sig1");
3856 addPackage(CALLING_PACKAGE_2, CALLING_UID_1, 10, "sig1", "sig2");
3857
3858 final ShortcutPackageInfo spi1 = ShortcutPackageInfo.generateForInstalledPackage(
3859 mService, CALLING_PACKAGE_1, USER_0);
3860 final ShortcutPackageInfo spi2 = ShortcutPackageInfo.generateForInstalledPackage(
3861 mService, CALLING_PACKAGE_2, USER_0);
3862
3863 checkCanRestoreTo(true, spi1, 10, "sig1");
3864 checkCanRestoreTo(true, spi1, 10, "x", "sig1");
3865 checkCanRestoreTo(true, spi1, 10, "sig1", "y");
3866 checkCanRestoreTo(true, spi1, 10, "x", "sig1", "y");
3867 checkCanRestoreTo(true, spi1, 11, "sig1");
3868
3869 checkCanRestoreTo(false, spi1, 10 /* empty */);
3870 checkCanRestoreTo(false, spi1, 10, "x");
3871 checkCanRestoreTo(false, spi1, 10, "x", "y");
3872 checkCanRestoreTo(false, spi1, 10, "x");
3873 checkCanRestoreTo(false, spi1, 9, "sig1");
3874
3875 checkCanRestoreTo(true, spi2, 10, "sig1", "sig2");
3876 checkCanRestoreTo(true, spi2, 10, "sig2", "sig1");
3877 checkCanRestoreTo(true, spi2, 10, "x", "sig1", "sig2");
3878 checkCanRestoreTo(true, spi2, 10, "x", "sig2", "sig1");
3879 checkCanRestoreTo(true, spi2, 10, "sig1", "sig2", "y");
3880 checkCanRestoreTo(true, spi2, 10, "sig2", "sig1", "y");
3881 checkCanRestoreTo(true, spi2, 10, "x", "sig1", "sig2", "y");
3882 checkCanRestoreTo(true, spi2, 10, "x", "sig2", "sig1", "y");
3883 checkCanRestoreTo(true, spi2, 11, "x", "sig2", "sig1", "y");
3884
3885 checkCanRestoreTo(false, spi2, 10, "sig1", "sig2x");
3886 checkCanRestoreTo(false, spi2, 10, "sig2", "sig1x");
3887 checkCanRestoreTo(false, spi2, 10, "x", "sig1x", "sig2");
3888 checkCanRestoreTo(false, spi2, 10, "x", "sig2x", "sig1");
3889 checkCanRestoreTo(false, spi2, 10, "sig1", "sig2x", "y");
3890 checkCanRestoreTo(false, spi2, 10, "sig2", "sig1x", "y");
3891 checkCanRestoreTo(false, spi2, 10, "x", "sig1x", "sig2", "y");
3892 checkCanRestoreTo(false, spi2, 10, "x", "sig2x", "sig1", "y");
3893 checkCanRestoreTo(false, spi2, 11, "x", "sig2x", "sig1", "y");
3894 }
3895
Makoto Onuki0acbb142016-03-22 17:02:57 -07003896 public void testHandlePackageDelete() {
3897 setCaller(CALLING_PACKAGE_1, USER_0);
3898 assertTrue(mManager.addDynamicShortcut(makeShortcut("s1")));
3899
3900 setCaller(CALLING_PACKAGE_2, USER_0);
3901 assertTrue(mManager.addDynamicShortcut(makeShortcut("s1")));
3902
3903 setCaller(CALLING_PACKAGE_3, USER_0);
3904 assertTrue(mManager.addDynamicShortcut(makeShortcut("s1")));
3905
3906 setCaller(CALLING_PACKAGE_1, USER_10);
3907 assertTrue(mManager.addDynamicShortcut(makeShortcut("s1")));
3908
3909 setCaller(CALLING_PACKAGE_2, USER_10);
3910 assertTrue(mManager.addDynamicShortcut(makeShortcut("s1")));
3911
3912 setCaller(CALLING_PACKAGE_3, USER_10);
3913 assertTrue(mManager.addDynamicShortcut(makeShortcut("s1")));
3914
Makoto Onuki9da23fc2016-03-29 11:14:42 -07003915 assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_0));
3916 assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_0));
3917 assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_0));
3918 assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_10));
3919 assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_10));
3920 assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_10));
Makoto Onuki0acbb142016-03-22 17:02:57 -07003921
3922 mService.mPackageMonitor.onReceive(getTestContext(),
3923 genPackageDeleteIntent(CALLING_PACKAGE_1, USER_0));
3924
Makoto Onuki9da23fc2016-03-29 11:14:42 -07003925 assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_0));
3926 assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_0));
3927 assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_0));
3928 assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_10));
3929 assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_10));
3930 assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_10));
Makoto Onuki0acbb142016-03-22 17:02:57 -07003931
3932 mService.mPackageMonitor.onReceive(getTestContext(),
3933 genPackageDeleteIntent(CALLING_PACKAGE_2, USER_10));
3934
Makoto Onuki9da23fc2016-03-29 11:14:42 -07003935 assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_0));
3936 assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_0));
3937 assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_0));
3938 assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_10));
3939 assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_10));
3940 assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_10));
Makoto Onuki0acbb142016-03-22 17:02:57 -07003941
3942 mInjectedPackages.remove(CALLING_PACKAGE_1);
3943 mInjectedPackages.remove(CALLING_PACKAGE_3);
3944
3945 mService.handleUnlockUser(USER_0);
Makoto Onuki9da23fc2016-03-29 11:14:42 -07003946
3947 assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_0));
3948 assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_0));
3949 assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_0));
3950 assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_10));
3951 assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_10));
3952 assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_10));
Makoto Onuki0acbb142016-03-22 17:02:57 -07003953
3954 mService.handleUnlockUser(USER_10);
Makoto Onuki9da23fc2016-03-29 11:14:42 -07003955
3956 assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_0));
3957 assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_0));
3958 assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_0));
3959 assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_10));
3960 assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_10));
3961 assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_10));
Makoto Onuki0acbb142016-03-22 17:02:57 -07003962 }
3963
3964 public void testHandlePackageUpdate() {
Makoto Onuki9da23fc2016-03-29 11:14:42 -07003965 // TODO: Make sure unshadow is called.
Makoto Onuki0acbb142016-03-22 17:02:57 -07003966 }
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003967}