blob: baa5d361c1a133e7cb603e8a33f4ba49bd6a316a [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;
Makoto Onukiac214972016-04-04 10:19:45 -070019import static org.mockito.Matchers.anyInt;
20import static org.mockito.Matchers.anyList;
Makoto Onuki4dbe0de2016-03-14 17:31:49 -070021import static org.mockito.Matchers.anyString;
22import static org.mockito.Matchers.eq;
Makoto Onukiac214972016-04-04 10:19:45 -070023import static org.mockito.Mockito.doAnswer;
Makoto Onuki7a6a05f2016-03-10 17:01:08 -080024import static org.mockito.Mockito.mock;
Makoto Onuki4dbe0de2016-03-14 17:31:49 -070025import static org.mockito.Mockito.reset;
Makoto Onukid99c6f02016-03-28 11:02:54 -070026import static org.mockito.Mockito.spy;
Makoto Onuki4dbe0de2016-03-14 17:31:49 -070027import static org.mockito.Mockito.times;
28import static org.mockito.Mockito.verify;
Makoto Onukicdc78f72016-03-21 15:47:52 -070029import static org.mockito.Mockito.when;
Makoto Onuki7a6a05f2016-03-10 17:01:08 -080030
Makoto Onuki6f7362d92016-03-04 13:39:41 -080031import android.annotation.NonNull;
Makoto Onukid99c6f02016-03-28 11:02:54 -070032import android.annotation.Nullable;
33import android.annotation.RequiresPermission;
Makoto Onuki6f7362d92016-03-04 13:39:41 -080034import android.annotation.UserIdInt;
35import android.app.Activity;
Makoto Onuki4dbe0de2016-03-14 17:31:49 -070036import android.content.BroadcastReceiver;
Makoto Onuki6f7362d92016-03-04 13:39:41 -080037import android.content.ComponentName;
38import android.content.Context;
39import android.content.Intent;
Makoto Onuki4dbe0de2016-03-14 17:31:49 -070040import android.content.IntentFilter;
Makoto Onuki0acbb142016-03-22 17:02:57 -070041import android.content.pm.ApplicationInfo;
Makoto Onuki7a6a05f2016-03-10 17:01:08 -080042import android.content.pm.ILauncherApps;
43import android.content.pm.LauncherApps;
Makoto Onuki6f7362d92016-03-04 13:39:41 -080044import android.content.pm.LauncherApps.ShortcutQuery;
Makoto Onuki0acbb142016-03-22 17:02:57 -070045import android.content.pm.PackageInfo;
Makoto Onuki7a6a05f2016-03-10 17:01:08 -080046import android.content.pm.PackageManager;
Makoto Onuki2d5b4652016-03-11 16:09:54 -080047import android.content.pm.PackageManagerInternal;
Makoto Onuki6f7362d92016-03-04 13:39:41 -080048import android.content.pm.ShortcutInfo;
49import android.content.pm.ShortcutManager;
50import android.content.pm.ShortcutServiceInternal;
Makoto Onuki0acbb142016-03-22 17:02:57 -070051import android.content.pm.Signature;
Makoto Onukiac214972016-04-04 10:19:45 -070052import android.content.pm.UserInfo;
Makoto Onuki55046222016-03-08 10:49:47 -080053import android.content.res.Resources;
54import android.graphics.Bitmap;
Makoto Onuki4362a662016-03-08 18:59:09 -080055import android.graphics.Bitmap.CompressFormat;
Makoto Onuki6f7362d92016-03-04 13:39:41 -080056import android.graphics.BitmapFactory;
57import android.graphics.drawable.Icon;
Makoto Onuki0acbb142016-03-22 17:02:57 -070058import android.net.Uri;
Makoto Onuki7a6a05f2016-03-10 17:01:08 -080059import android.os.BaseBundle;
Makoto Onuki6f7362d92016-03-04 13:39:41 -080060import android.os.Bundle;
61import android.os.FileUtils;
Makoto Onuki4dbe0de2016-03-14 17:31:49 -070062import android.os.Handler;
63import android.os.Looper;
Makoto Onuki2e210c42016-03-30 08:30:36 -070064import android.os.Parcel;
Makoto Onuki55046222016-03-08 10:49:47 -080065import android.os.ParcelFileDescriptor;
Makoto Onuki2e210c42016-03-30 08:30:36 -070066import android.os.PersistableBundle;
Makoto Onuki4dbe0de2016-03-14 17:31:49 -070067import android.os.Process;
Makoto Onuki6f7362d92016-03-04 13:39:41 -080068import android.os.UserHandle;
Makoto Onuki7a6a05f2016-03-10 17:01:08 -080069import android.os.UserManager;
Makoto Onuki4dbe0de2016-03-14 17:31:49 -070070import android.test.InstrumentationTestCase;
Makoto Onuki6f7362d92016-03-04 13:39:41 -080071import android.test.mock.MockContext;
Makoto Onuki55046222016-03-08 10:49:47 -080072import android.test.suitebuilder.annotation.SmallTest;
Makoto Onukicdc78f72016-03-21 15:47:52 -070073import android.util.ArraySet;
Makoto Onuki6f7362d92016-03-04 13:39:41 -080074import android.util.Log;
Makoto Onukiac214972016-04-04 10:19:45 -070075import android.util.Pair;
Makoto Onukide667372016-03-15 14:29:20 -070076import android.util.SparseArray;
Makoto Onuki6f7362d92016-03-04 13:39:41 -080077
78import com.android.frameworks.servicestests.R;
79import com.android.internal.util.Preconditions;
80import com.android.server.LocalServices;
81import com.android.server.SystemService;
Makoto Onuki7a6a05f2016-03-10 17:01:08 -080082import com.android.server.pm.LauncherAppsService.LauncherAppsImpl;
Makoto Onuki4362a662016-03-08 18:59:09 -080083import com.android.server.pm.ShortcutService.ConfigConstants;
Makoto Onuki55046222016-03-08 10:49:47 -080084import com.android.server.pm.ShortcutService.FileOutputStreamWithPath;
Makoto Onukid99c6f02016-03-28 11:02:54 -070085import com.android.server.pm.ShortcutUser.PackageWithUser;
Makoto Onuki2e210c42016-03-30 08:30:36 -070086import com.android.server.testutis.TestUtils;
Makoto Onuki55046222016-03-08 10:49:47 -080087
88import libcore.io.IoUtils;
Makoto Onuki6f7362d92016-03-04 13:39:41 -080089
90import org.junit.Assert;
Makoto Onuki4dbe0de2016-03-14 17:31:49 -070091import org.mockito.ArgumentCaptor;
Makoto Onuki6f7362d92016-03-04 13:39:41 -080092
93import java.io.BufferedReader;
94import java.io.ByteArrayOutputStream;
95import java.io.File;
96import java.io.FileReader;
Makoto Onuki55046222016-03-08 10:49:47 -080097import java.io.IOException;
Makoto Onuki6f7362d92016-03-04 13:39:41 -080098import java.io.PrintWriter;
99import java.util.ArrayList;
100import java.util.Arrays;
Makoto Onuki55046222016-03-08 10:49:47 -0800101import java.util.Collection;
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800102import java.util.HashMap;
103import java.util.HashSet;
104import java.util.List;
105import java.util.Map;
Makoto Onuki55046222016-03-08 10:49:47 -0800106import java.util.Set;
Makoto Onukiac214972016-04-04 10:19:45 -0700107import java.util.function.BiPredicate;
Makoto Onuki2e210c42016-03-30 08:30:36 -0700108import java.util.function.Consumer;
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800109
110/**
111 * Tests for ShortcutService and ShortcutManager.
112 *
113 m FrameworksServicesTests &&
114 adb install \
115 -r -g ${ANDROID_PRODUCT_OUT}/data/app/FrameworksServicesTests/FrameworksServicesTests.apk &&
116 adb shell am instrument -e class com.android.server.pm.ShortcutManagerTest \
117 -w com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
Makoto Onuki55046222016-03-08 10:49:47 -0800118
119 * TODO: Add checks with assertAllNotHaveIcon()
Makoto Onuki2e210c42016-03-30 08:30:36 -0700120 * TODO: Detailed test for hasShortcutPermissionInner().
121 * TODO: Add tests for the command line functions too.
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800122 */
Makoto Onuki55046222016-03-08 10:49:47 -0800123@SmallTest
Makoto Onuki4dbe0de2016-03-14 17:31:49 -0700124public class ShortcutManagerTest extends InstrumentationTestCase {
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800125 private static final String TAG = "ShortcutManagerTest";
126
127 /**
128 * Whether to enable dump or not. Should be only true when debugging to avoid bugs where
129 * dump affecting the behavior.
130 */
Makoto Onuki41066a62016-03-09 16:18:44 -0800131 private static final boolean ENABLE_DUMP = false; // DO NOT SUBMIT WITH true
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800132
Makoto Onukiac214972016-04-04 10:19:45 -0700133 private static final boolean DUMP_IN_TEARDOWN = false; // DO NOT SUBMIT WITH true
Makoto Onuki2e210c42016-03-30 08:30:36 -0700134
Makoto Onukid99c6f02016-03-28 11:02:54 -0700135 // public for mockito
136 public class BaseContext extends MockContext {
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800137 @Override
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800138 public Object getSystemService(String name) {
139 switch (name) {
140 case Context.USER_SERVICE:
141 return mMockUserManager;
142 }
143 throw new UnsupportedOperationException();
144 }
145
146 @Override
Makoto Onukicdc78f72016-03-21 15:47:52 -0700147 public String getSystemServiceName(Class<?> serviceClass) {
148 return getTestContext().getSystemServiceName(serviceClass);
149 }
150
151 @Override
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800152 public PackageManager getPackageManager() {
153 return mMockPackageManager;
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800154 }
Makoto Onuki55046222016-03-08 10:49:47 -0800155
156 @Override
157 public Resources getResources() {
Makoto Onuki4dbe0de2016-03-14 17:31:49 -0700158 return getTestContext().getResources();
159 }
160
161 @Override
162 public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user,
163 IntentFilter filter, String broadcastPermission, Handler scheduler) {
164 // ignore.
165 return null;
Makoto Onuki55046222016-03-08 10:49:47 -0800166 }
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800167 }
168
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800169 /** Context used in the client side */
Makoto Onukid99c6f02016-03-28 11:02:54 -0700170 public class ClientContext extends BaseContext {
Makoto Onuki55046222016-03-08 10:49:47 -0800171 @Override
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800172 public String getPackageName() {
173 return mInjectedClientPackage;
Makoto Onuki55046222016-03-08 10:49:47 -0800174 }
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800175 }
176
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800177 /** Context used in the service side */
Makoto Onukid99c6f02016-03-28 11:02:54 -0700178 public class ServiceContext extends BaseContext {
Makoto Onuki4dbe0de2016-03-14 17:31:49 -0700179 long injectClearCallingIdentity() {
180 final int prevCallingUid = mInjectedCallingUid;
181 mInjectedCallingUid = Process.SYSTEM_UID;
182 return prevCallingUid;
183 }
184
185 void injectRestoreCallingIdentity(long token) {
186 mInjectedCallingUid = (int) token;
187 }
Makoto Onukid99c6f02016-03-28 11:02:54 -0700188
189 @Override
190 public void startActivityAsUser(@RequiresPermission Intent intent, @Nullable Bundle options,
191 UserHandle userId) {
192 }
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800193 }
194
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800195 /** ShortcutService with injection override methods. */
196 private final class ShortcutServiceTestable extends ShortcutService {
Makoto Onuki4dbe0de2016-03-14 17:31:49 -0700197 final ServiceContext mContext;
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800198
Makoto Onukiaa8b94a2016-03-17 13:14:05 -0700199 public ShortcutServiceTestable(ServiceContext context, Looper looper) {
200 super(context, looper);
Makoto Onuki4dbe0de2016-03-14 17:31:49 -0700201 mContext = context;
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800202 }
203
204 @Override
Makoto Onuki4362a662016-03-08 18:59:09 -0800205 String injectShortcutManagerConstants() {
206 return ConfigConstants.KEY_RESET_INTERVAL_SEC + "=" + (INTERVAL / 1000) + ","
207 + ConfigConstants.KEY_MAX_SHORTCUTS + "=" + MAX_SHORTCUTS + ","
208 + ConfigConstants.KEY_MAX_DAILY_UPDATES + "=" + MAX_DAILY_UPDATES + ","
209 + ConfigConstants.KEY_MAX_ICON_DIMENSION_DP + "=" + MAX_ICON_DIMENSION + ","
210 + ConfigConstants.KEY_MAX_ICON_DIMENSION_DP_LOWRAM + "="
211 + MAX_ICON_DIMENSION_LOWRAM + ","
212 + ConfigConstants.KEY_ICON_FORMAT + "=PNG,"
213 + ConfigConstants.KEY_ICON_QUALITY + "=100";
214 }
215
216 @Override
Makoto Onuki4dbe0de2016-03-14 17:31:49 -0700217 long injectClearCallingIdentity() {
218 return mContext.injectClearCallingIdentity();
219 }
220
221 @Override
222 void injectRestoreCallingIdentity(long token) {
223 mContext.injectRestoreCallingIdentity(token);
224 }
225
226 @Override
Makoto Onuki4362a662016-03-08 18:59:09 -0800227 int injectDipToPixel(int dip) {
228 return dip;
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800229 }
230
231 @Override
232 long injectCurrentTimeMillis() {
233 return mInjectedCurrentTimeLillis;
234 }
235
236 @Override
237 int injectBinderCallingUid() {
238 return mInjectedCallingUid;
239 }
240
241 @Override
Makoto Onuki55046222016-03-08 10:49:47 -0800242 int injectGetPackageUid(String packageName, int userId) {
Makoto Onuki0acbb142016-03-22 17:02:57 -0700243 return getInjectedPackageInfo(packageName, userId, false).applicationInfo.uid;
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800244 }
245
246 @Override
247 File injectSystemDataPath() {
248 return new File(mInjectedFilePathRoot, "system");
249 }
250
251 @Override
252 File injectUserDataPath(@UserIdInt int userId) {
253 return new File(mInjectedFilePathRoot, "user-" + userId);
254 }
Makoto Onuki55046222016-03-08 10:49:47 -0800255
256 @Override
257 void injectValidateIconResPackage(ShortcutInfo shortcut, Icon icon) {
258 // Can't check
259 }
Makoto Onuki4362a662016-03-08 18:59:09 -0800260
261 @Override
262 boolean injectIsLowRamDevice() {
Makoto Onukicdc78f72016-03-21 15:47:52 -0700263 return mInjectedIsLowRamDevice;
Makoto Onuki4362a662016-03-08 18:59:09 -0800264 }
Makoto Onuki2d5b4652016-03-11 16:09:54 -0800265
266 @Override
267 PackageManagerInternal injectPackageManagerInternal() {
268 return mMockPackageManagerInternal;
269 }
270
271 @Override
272 boolean hasShortcutHostPermission(@NonNull String callingPackage, int userId) {
Makoto Onukiac214972016-04-04 10:19:45 -0700273 return mDefaultLauncherChecker.test(callingPackage, userId);
Makoto Onuki2d5b4652016-03-11 16:09:54 -0800274 }
Makoto Onuki4dbe0de2016-03-14 17:31:49 -0700275
276 @Override
Makoto Onuki0acbb142016-03-22 17:02:57 -0700277 PackageInfo injectPackageInfo(String packageName, @UserIdInt int userId,
278 boolean getSignatures) {
279 return getInjectedPackageInfo(packageName, userId, getSignatures);
280 }
281
282 @Override
Makoto Onuki905e8852016-03-28 10:40:58 -0700283 ApplicationInfo injectApplicationInfo(String packageName, @UserIdInt int userId) {
284 PackageInfo pi = injectPackageInfo(packageName, userId, /* getSignatures= */ false);
285 return pi != null ? pi.applicationInfo : null;
286 }
287
288 @Override
Makoto Onuki4dbe0de2016-03-14 17:31:49 -0700289 void postToHandler(Runnable r) {
290 final long token = mContext.injectClearCallingIdentity();
Makoto Onukiac214972016-04-04 10:19:45 -0700291 r.run();
Makoto Onuki4dbe0de2016-03-14 17:31:49 -0700292 mContext.injectRestoreCallingIdentity(token);
293 }
Makoto Onukide667372016-03-15 14:29:20 -0700294
295 @Override
296 void wtf(String message, Exception e) {
297 // During tests, WTF is fatal.
298 fail(message + " exception: " + e);
299 }
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800300 }
301
302 /** ShortcutManager with injection override methods. */
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800303 private class ShortcutManagerTestable extends ShortcutManager {
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800304 public ShortcutManagerTestable(Context context, ShortcutServiceTestable service) {
305 super(context, service);
306 }
307
308 @Override
309 protected int injectMyUserId() {
310 return UserHandle.getUserId(mInjectedCallingUid);
311 }
312 }
313
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800314 private class LauncherAppImplTestable extends LauncherAppsImpl {
Makoto Onuki4dbe0de2016-03-14 17:31:49 -0700315 final ServiceContext mContext;
316
317 public LauncherAppImplTestable(ServiceContext context) {
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800318 super(context);
Makoto Onuki4dbe0de2016-03-14 17:31:49 -0700319 mContext = context;
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800320 }
321
322 @Override
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800323 public void verifyCallingPackage(String callingPackage) {
324 // SKIP
325 }
Makoto Onuki4dbe0de2016-03-14 17:31:49 -0700326
327 @Override
Makoto Onukiaa8b94a2016-03-17 13:14:05 -0700328 void postToPackageMonitorHandler(Runnable r) {
Makoto Onuki4dbe0de2016-03-14 17:31:49 -0700329 final long token = mContext.injectClearCallingIdentity();
330 r.run();
331 mContext.injectRestoreCallingIdentity(token);
332 }
Makoto Onukid99c6f02016-03-28 11:02:54 -0700333
334 @Override
335 int injectBinderCallingUid() {
336 return mInjectedCallingUid;
337 }
Makoto Onukiac214972016-04-04 10:19:45 -0700338
339 @Override
340 long injectClearCallingIdentity() {
341 final int prevCallingUid = mInjectedCallingUid;
342 mInjectedCallingUid = Process.SYSTEM_UID;
343 return prevCallingUid;
344 }
345
346 @Override
347 void injectRestoreCallingIdentity(long token) {
348 mInjectedCallingUid = (int) token;
349 }
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800350 }
351
352 private class LauncherAppsTestable extends LauncherApps {
353 public LauncherAppsTestable(Context context, ILauncherApps service) {
354 super(context, service);
355 }
356 }
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800357
358 public static class ShortcutActivity extends Activity {
359 }
360
361 public static class ShortcutActivity2 extends Activity {
362 }
363
364 public static class ShortcutActivity3 extends Activity {
365 }
366
367 private ServiceContext mServiceContext;
368 private ClientContext mClientContext;
369
370 private ShortcutServiceTestable mService;
371 private ShortcutManagerTestable mManager;
372 private ShortcutServiceInternal mInternal;
373
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800374 private LauncherAppImplTestable mLauncherAppImpl;
Makoto Onukiac214972016-04-04 10:19:45 -0700375
376 // LauncherApps has per-instace state, so we need a differnt instance for each launcher.
377 private final Map<Pair<Integer, String>, LauncherAppsTestable>
378 mLauncherAppsMap = new HashMap<>();
379 private LauncherAppsTestable mLauncherApps; // Current one
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800380
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800381 private File mInjectedFilePathRoot;
382
383 private long mInjectedCurrentTimeLillis;
384
Makoto Onukicdc78f72016-03-21 15:47:52 -0700385 private boolean mInjectedIsLowRamDevice;
Makoto Onuki4362a662016-03-08 18:59:09 -0800386
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800387 private int mInjectedCallingUid;
388 private String mInjectedClientPackage;
389
Makoto Onuki0acbb142016-03-22 17:02:57 -0700390 private Map<String, PackageInfo> mInjectedPackages;
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800391
Makoto Onuki2e210c42016-03-30 08:30:36 -0700392 private Set<PackageWithUser> mUninstalledPackages;
Makoto Onukid99c6f02016-03-28 11:02:54 -0700393
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800394 private PackageManager mMockPackageManager;
Makoto Onuki2d5b4652016-03-11 16:09:54 -0800395 private PackageManagerInternal mMockPackageManagerInternal;
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800396 private UserManager mMockUserManager;
397
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800398 private static final String CALLING_PACKAGE_1 = "com.android.test.1";
399 private static final int CALLING_UID_1 = 10001;
400
401 private static final String CALLING_PACKAGE_2 = "com.android.test.2";
402 private static final int CALLING_UID_2 = 10002;
403
404 private static final String CALLING_PACKAGE_3 = "com.android.test.3";
405 private static final int CALLING_UID_3 = 10003;
406
Makoto Onuki2e210c42016-03-30 08:30:36 -0700407 private static final String CALLING_PACKAGE_4 = "com.android.test.4";
408 private static final int CALLING_UID_4 = 10004;
409
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800410 private static final String LAUNCHER_1 = "com.android.launcher.1";
411 private static final int LAUNCHER_UID_1 = 10011;
412
413 private static final String LAUNCHER_2 = "com.android.launcher.2";
414 private static final int LAUNCHER_UID_2 = 10012;
415
Makoto Onuki2e210c42016-03-30 08:30:36 -0700416 private static final String LAUNCHER_3 = "com.android.launcher.3";
417 private static final int LAUNCHER_UID_3 = 10013;
418
419 private static final String LAUNCHER_4 = "com.android.launcher.4";
420 private static final int LAUNCHER_UID_4 = 10014;
421
Makoto Onuki4dbe0de2016-03-14 17:31:49 -0700422 private static final int USER_0 = UserHandle.USER_SYSTEM;
Makoto Onuki41066a62016-03-09 16:18:44 -0800423 private static final int USER_10 = 10;
424 private static final int USER_11 = 11;
Makoto Onukid99c6f02016-03-28 11:02:54 -0700425 private static final int USER_P0 = 20; // profile of user 0
426
427 private static final UserHandle HANDLE_USER_0 = UserHandle.of(USER_0);
428 private static final UserHandle HANDLE_USER_10 = UserHandle.of(USER_10);
429 private static final UserHandle HANDLE_USER_11 = UserHandle.of(USER_11);
430 private static final UserHandle HANDLE_USER_P0 = UserHandle.of(USER_P0);
431
Makoto Onukiac214972016-04-04 10:19:45 -0700432 private static final UserInfo USER_INFO_0 = withProfileGroupId(
433 new UserInfo(USER_0, "user0",
434 UserInfo.FLAG_ADMIN | UserInfo.FLAG_PRIMARY | UserInfo.FLAG_INITIALIZED), 10);
435
436 private static final UserInfo USER_INFO_10 =
437 new UserInfo(USER_10, "user10", UserInfo.FLAG_INITIALIZED);
438
439 private static final UserInfo USER_INFO_11 =
440 new UserInfo(USER_11, "user11", UserInfo.FLAG_INITIALIZED);
441
442 private static final UserInfo USER_INFO_P0 = withProfileGroupId(
443 new UserInfo(USER_P0, "userP0",
444 UserInfo.FLAG_MANAGED_PROFILE), 10);
445
446 private BiPredicate<String, Integer> mDefaultLauncherChecker =
447 (callingPackage, userId) ->
448 LAUNCHER_1.equals(callingPackage) || LAUNCHER_2.equals(callingPackage)
449 || LAUNCHER_3.equals(callingPackage) || LAUNCHER_4.equals(callingPackage);
Makoto Onuki41066a62016-03-09 16:18:44 -0800450
Makoto Onukiaa8b94a2016-03-17 13:14:05 -0700451 private static final long START_TIME = 1440000000101L;
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800452
453 private static final long INTERVAL = 10000;
454
Makoto Onuki55046222016-03-08 10:49:47 -0800455 private static final int MAX_SHORTCUTS = 10;
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800456
457 private static final int MAX_DAILY_UPDATES = 3;
458
Makoto Onuki55046222016-03-08 10:49:47 -0800459 private static final int MAX_ICON_DIMENSION = 128;
460
Makoto Onuki4362a662016-03-08 18:59:09 -0800461 private static final int MAX_ICON_DIMENSION_LOWRAM = 32;
462
Makoto Onuki2e210c42016-03-30 08:30:36 -0700463 private static final ShortcutQuery QUERY_ALL = new ShortcutQuery();
464
465 static {
466 QUERY_ALL.setQueryFlags(
467 ShortcutQuery.FLAG_GET_DYNAMIC | ShortcutQuery.FLAG_GET_PINNED);
468 }
469
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800470 @Override
471 protected void setUp() throws Exception {
472 super.setUp();
473
Makoto Onukid99c6f02016-03-28 11:02:54 -0700474 mServiceContext = spy(new ServiceContext());
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800475 mClientContext = new ClientContext();
476
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800477 mMockPackageManager = mock(PackageManager.class);
Makoto Onuki2d5b4652016-03-11 16:09:54 -0800478 mMockPackageManagerInternal = mock(PackageManagerInternal.class);
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800479 mMockUserManager = mock(UserManager.class);
480
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800481 // Prepare injection values.
482
483 mInjectedCurrentTimeLillis = START_TIME;
484
Makoto Onuki0acbb142016-03-22 17:02:57 -0700485 mInjectedPackages = new HashMap<>();;
486 addPackage(CALLING_PACKAGE_1, CALLING_UID_1, 1);
487 addPackage(CALLING_PACKAGE_2, CALLING_UID_2, 2);
488 addPackage(CALLING_PACKAGE_3, CALLING_UID_3, 3);
Makoto Onuki2e210c42016-03-30 08:30:36 -0700489 addPackage(CALLING_PACKAGE_4, CALLING_UID_4, 10);
Makoto Onuki0acbb142016-03-22 17:02:57 -0700490 addPackage(LAUNCHER_1, LAUNCHER_UID_1, 4);
491 addPackage(LAUNCHER_2, LAUNCHER_UID_2, 5);
Makoto Onuki2e210c42016-03-30 08:30:36 -0700492 addPackage(LAUNCHER_3, LAUNCHER_UID_3, 6);
493 addPackage(LAUNCHER_4, LAUNCHER_UID_4, 10);
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800494
Makoto Onuki2e210c42016-03-30 08:30:36 -0700495 // CALLING_PACKAGE_3 / LAUNCHER_3 are not backup target.
496 updatePackageInfo(CALLING_PACKAGE_3,
497 pi -> pi.applicationInfo.flags &= ~ApplicationInfo.FLAG_ALLOW_BACKUP);
498 updatePackageInfo(LAUNCHER_3,
499 pi -> pi.applicationInfo.flags &= ~ApplicationInfo.FLAG_ALLOW_BACKUP);
500
501 mUninstalledPackages = new HashSet<>();
Makoto Onukid99c6f02016-03-28 11:02:54 -0700502
Makoto Onuki4dbe0de2016-03-14 17:31:49 -0700503 mInjectedFilePathRoot = new File(getTestContext().getCacheDir(), "test-files");
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800504
Makoto Onukiac214972016-04-04 10:19:45 -0700505 deleteAllSavedFiles();
506
507 // Set up users.
508 doAnswer(inv -> {
509 assertSystem();
510 return USER_INFO_0;
511 }).when(mMockUserManager).getUserInfo(eq(USER_0));
512
513 doAnswer(inv -> {
514 assertSystem();
515 return USER_INFO_10;
516 }).when(mMockUserManager).getUserInfo(eq(USER_10));
517
518 doAnswer(inv -> {
519 assertSystem();
520 return USER_INFO_11;
521 }).when(mMockUserManager).getUserInfo(eq(USER_11));
522
523 doAnswer(inv -> {
524 assertSystem();
525 return USER_INFO_P0;
526 }).when(mMockUserManager).getUserInfo(eq(USER_P0));
527
528 // User 0 is always running.
529 when(mMockUserManager.isUserRunning(eq(USER_0))).thenReturn(true);
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800530
531 initService();
532 setCaller(CALLING_PACKAGE_1);
533 }
534
Makoto Onukiac214972016-04-04 10:19:45 -0700535 private static UserInfo withProfileGroupId(UserInfo in, int groupId) {
536 in.profileGroupId = groupId;
537 return in;
538 }
539
Makoto Onuki2e210c42016-03-30 08:30:36 -0700540 @Override
541 protected void tearDown() throws Exception {
Makoto Onukiac214972016-04-04 10:19:45 -0700542 if (DUMP_IN_TEARDOWN) dumpsysOnLogcat("Teardown");
543
544 shutdownServices();
Makoto Onuki2e210c42016-03-30 08:30:36 -0700545
546 super.tearDown();
547 }
548
Makoto Onuki4dbe0de2016-03-14 17:31:49 -0700549 private Context getTestContext() {
550 return getInstrumentation().getContext();
551 }
552
Makoto Onukiac214972016-04-04 10:19:45 -0700553 private void deleteAllSavedFiles() {
554 // Empty the data directory.
555 if (mInjectedFilePathRoot.exists()) {
556 Assert.assertTrue("failed to delete dir",
557 FileUtils.deleteContents(mInjectedFilePathRoot));
558 }
559 mInjectedFilePathRoot.mkdirs();
560 }
561
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800562 /** (Re-) init the manager and the service. */
563 private void initService() {
Makoto Onukiac214972016-04-04 10:19:45 -0700564 shutdownServices();
565
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800566 LocalServices.removeServiceForTest(ShortcutServiceInternal.class);
567
568 // Instantiate targets.
Makoto Onukiaa8b94a2016-03-17 13:14:05 -0700569 mService = new ShortcutServiceTestable(mServiceContext, Looper.getMainLooper());
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800570 mManager = new ShortcutManagerTestable(mClientContext, mService);
571
572 mInternal = LocalServices.getService(ShortcutServiceInternal.class);
573
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800574 mLauncherAppImpl = new LauncherAppImplTestable(mServiceContext);
Makoto Onukiac214972016-04-04 10:19:45 -0700575 mLauncherApps = null;
576 mLauncherAppsMap.clear();
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800577
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800578 // Load the setting file.
579 mService.onBootPhase(SystemService.PHASE_LOCK_SETTINGS_READY);
580 }
581
Makoto Onukiac214972016-04-04 10:19:45 -0700582 private void shutdownServices() {
583 if (mService != null) {
584 // Flush all the unsaved data from the previous instance.
585 mService.saveDirtyInfo();
586 }
587 LocalServices.removeServiceForTest(ShortcutServiceInternal.class);
588
589 mService = null;
590 mManager = null;
591 mInternal = null;
592 mLauncherAppImpl = null;
593 mLauncherApps = null;
594 mLauncherAppsMap.clear();
595 }
596
Makoto Onuki0acbb142016-03-22 17:02:57 -0700597 private void addPackage(String packageName, int uid, int version) {
598 addPackage(packageName, uid, version, packageName);
599 }
600
Makoto Onukid99c6f02016-03-28 11:02:54 -0700601 private <T> List<T> list(T... array) {
602 return Arrays.asList(array);
603 }
604
Makoto Onuki2e210c42016-03-30 08:30:36 -0700605 private <T> Set<T> set(Set<T> in) {
606 return new ArraySet<T>(in);
607 }
608
Makoto Onuki0acbb142016-03-22 17:02:57 -0700609 private Signature[] genSignatures(String... signatures) {
610 final Signature[] sigs = new Signature[signatures.length];
611 for (int i = 0; i < signatures.length; i++){
612 sigs[i] = new Signature(signatures[i].getBytes());
613 }
614 return sigs;
615 }
616
617 private PackageInfo genPackage(String packageName, int uid, int version, String... signatures) {
618 final PackageInfo pi = new PackageInfo();
619 pi.packageName = packageName;
620 pi.applicationInfo = new ApplicationInfo();
621 pi.applicationInfo.uid = uid;
Makoto Onuki905e8852016-03-28 10:40:58 -0700622 pi.applicationInfo.flags = ApplicationInfo.FLAG_INSTALLED
623 | ApplicationInfo.FLAG_ALLOW_BACKUP;
Makoto Onuki0acbb142016-03-22 17:02:57 -0700624 pi.versionCode = version;
625 pi.signatures = genSignatures(signatures);
626
627 return pi;
628 }
629
630 private void addPackage(String packageName, int uid, int version, String... signatures) {
631 mInjectedPackages.put(packageName, genPackage(packageName, uid, version, signatures));
632 }
633
Makoto Onuki2e210c42016-03-30 08:30:36 -0700634 private void updatePackageInfo(String packageName, Consumer<PackageInfo> c) {
635 c.accept(mInjectedPackages.get(packageName));
636 }
637
Makoto Onukid99c6f02016-03-28 11:02:54 -0700638 private void uninstallPackage(int userId, String packageName) {
Makoto Onuki2e210c42016-03-30 08:30:36 -0700639 if (ENABLE_DUMP) {
640 Log.i(TAG, "Unnstall package " + packageName + " / " + userId);
641 }
Makoto Onukid99c6f02016-03-28 11:02:54 -0700642 mUninstalledPackages.add(PackageWithUser.of(userId, packageName));
643 }
644
Makoto Onuki2e210c42016-03-30 08:30:36 -0700645 private void installPackage(int userId, String packageName) {
646 if (ENABLE_DUMP) {
647 Log.i(TAG, "Install package " + packageName + " / " + userId);
648 }
649 mUninstalledPackages.remove(PackageWithUser.of(userId, packageName));
650 }
651
Makoto Onuki0acbb142016-03-22 17:02:57 -0700652 PackageInfo getInjectedPackageInfo(String packageName, @UserIdInt int userId,
653 boolean getSignatures) {
654 final PackageInfo pi = mInjectedPackages.get(packageName);
655 if (pi == null) return null;
656
657 final PackageInfo ret = new PackageInfo();
658 ret.packageName = pi.packageName;
659 ret.versionCode = pi.versionCode;
660 ret.applicationInfo = new ApplicationInfo(pi.applicationInfo);
661 ret.applicationInfo.uid = UserHandle.getUid(userId, pi.applicationInfo.uid);
Makoto Onukid99c6f02016-03-28 11:02:54 -0700662 if (mUninstalledPackages.contains(PackageWithUser.of(userId, packageName))) {
663 ret.applicationInfo.flags &= ~ApplicationInfo.FLAG_INSTALLED;
664 }
Makoto Onuki0acbb142016-03-22 17:02:57 -0700665
666 if (getSignatures) {
667 ret.signatures = pi.signatures;
668 }
669
670 return ret;
671 }
672
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800673 /** Replace the current calling package */
Makoto Onuki41066a62016-03-09 16:18:44 -0800674 private void setCaller(String packageName, int userId) {
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800675 mInjectedClientPackage = packageName;
Makoto Onuki0acbb142016-03-22 17:02:57 -0700676 mInjectedCallingUid =
677 Preconditions.checkNotNull(getInjectedPackageInfo(packageName, userId, false),
678 "Unknown package").applicationInfo.uid;
Makoto Onukiac214972016-04-04 10:19:45 -0700679
680 // Set up LauncherApps for this caller.
681 final Pair<Integer, String> key = Pair.create(userId, packageName);
682 if (!mLauncherAppsMap.containsKey(key)) {
683 mLauncherAppsMap.put(key, new LauncherAppsTestable(mClientContext, mLauncherAppImpl));
684 }
685 mLauncherApps = mLauncherAppsMap.get(key);
Makoto Onuki41066a62016-03-09 16:18:44 -0800686 }
687
688 private void setCaller(String packageName) {
689 setCaller(packageName, UserHandle.USER_SYSTEM);
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800690 }
691
692 private String getCallingPackage() {
693 return mInjectedClientPackage;
694 }
695
Makoto Onukiac214972016-04-04 10:19:45 -0700696 private void setDefaultLauncherChecker(BiPredicate<String, Integer> p) {
697 mDefaultLauncherChecker = p;
698 }
699
Makoto Onuki41066a62016-03-09 16:18:44 -0800700 private void runWithCaller(String packageName, int userId, Runnable r) {
701 final String previousPackage = mInjectedClientPackage;
Makoto Onuki0acbb142016-03-22 17:02:57 -0700702 final int previousUserId = UserHandle.getUserId(mInjectedCallingUid);
Makoto Onuki41066a62016-03-09 16:18:44 -0800703
704 setCaller(packageName, userId);
705
706 r.run();
707
Makoto Onuki0acbb142016-03-22 17:02:57 -0700708 setCaller(previousPackage, previousUserId);
Makoto Onuki41066a62016-03-09 16:18:44 -0800709 }
710
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800711 private int getCallingUserId() {
712 return UserHandle.getUserId(mInjectedCallingUid);
713 }
714
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800715 private UserHandle getCallingUser() {
716 return UserHandle.of(getCallingUserId());
717 }
718
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800719 /** For debugging */
720 private void dumpsysOnLogcat() {
Makoto Onuki2e210c42016-03-30 08:30:36 -0700721 dumpsysOnLogcat("");
722 }
723
724 private void dumpsysOnLogcat(String message) {
725 dumpsysOnLogcat(message, false);
726 }
727
728 private void dumpsysOnLogcat(String message, boolean force) {
729 if (force || !ENABLE_DUMP) return;
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800730
731 final ByteArrayOutputStream out = new ByteArrayOutputStream();
732 final PrintWriter pw = new PrintWriter(out);
733 mService.dumpInner(pw);
734 pw.close();
735
Makoto Onuki2e210c42016-03-30 08:30:36 -0700736 Log.e(TAG, "Dumping ShortcutService: " + message);
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800737 for (String line : out.toString().split("\n")) {
738 Log.e(TAG, line);
739 }
740 }
741
742 /**
743 * For debugging, dump arbitrary file on logcat.
744 */
745 private void dumpFileOnLogcat(String path) {
Makoto Onuki2e210c42016-03-30 08:30:36 -0700746 dumpFileOnLogcat(path, "");
747 }
748
749 private void dumpFileOnLogcat(String path, String message) {
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800750 if (!ENABLE_DUMP) return;
751
Makoto Onuki2e210c42016-03-30 08:30:36 -0700752 Log.i(TAG, "Dumping file: " + path + " " + message);
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800753 final StringBuilder sb = new StringBuilder();
754 try (BufferedReader br = new BufferedReader(new FileReader(path))) {
755 String line;
756 while ((line = br.readLine()) != null) {
757 Log.i(TAG, line);
758 }
759 } catch (Exception e) {
760 Log.e(TAG, "Couldn't read file", e);
761 fail("Exception " + e);
762 }
763 }
764
765 /**
766 * For debugging, dump the main state file on logcat.
767 */
768 private void dumpBaseStateFile() {
Makoto Onukiaa8b94a2016-03-17 13:14:05 -0700769 mService.saveDirtyInfo();
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800770 dumpFileOnLogcat(mInjectedFilePathRoot.getAbsolutePath()
771 + "/system/" + ShortcutService.FILENAME_BASE_STATE);
772 }
773
774 /**
775 * For debugging, dump per-user state file on logcat.
776 */
777 private void dumpUserFile(int userId) {
Makoto Onuki2e210c42016-03-30 08:30:36 -0700778 dumpUserFile(userId, "");
779 }
780
781 private void dumpUserFile(int userId, String message) {
Makoto Onukiaa8b94a2016-03-17 13:14:05 -0700782 mService.saveDirtyInfo();
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800783 dumpFileOnLogcat(mInjectedFilePathRoot.getAbsolutePath()
784 + "/user-" + userId
Makoto Onuki2e210c42016-03-30 08:30:36 -0700785 + "/" + ShortcutService.FILENAME_USER_PACKAGES, message);
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800786 }
787
Makoto Onuki4dbe0de2016-03-14 17:31:49 -0700788 private void waitOnMainThread() throws Throwable {
789 runTestOnUiThread(() -> {});
790 }
791
Makoto Onukie3ae7ec2016-03-29 15:45:25 -0700792 public static Bundle makeBundle(Object... keysAndValues) {
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800793 Preconditions.checkState((keysAndValues.length % 2) == 0);
794
795 if (keysAndValues.length == 0) {
796 return null;
797 }
798 final Bundle ret = new Bundle();
799
800 for (int i = keysAndValues.length - 2; i >= 0; i -= 2) {
801 final String key = keysAndValues[i].toString();
802 final Object value = keysAndValues[i + 1];
803
804 if (value == null) {
805 ret.putString(key, null);
806 } else if (value instanceof Integer) {
807 ret.putInt(key, (Integer) value);
808 } else if (value instanceof String) {
809 ret.putString(key, (String) value);
810 } else if (value instanceof Bundle) {
811 ret.putBundle(key, (Bundle) value);
812 } else {
813 fail("Type not supported yet: " + value.getClass().getName());
814 }
815 }
816 return ret;
817 }
818
819 /**
820 * Make a shortcut with an ID.
821 */
822 private ShortcutInfo makeShortcut(String id) {
823 return makeShortcut(
824 id, "Title-" + id, /* activity =*/ null, /* icon =*/ null,
825 makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* weight =*/ 0);
826 }
827
828 /**
829 * Make a shortcut with an ID and timestamp.
830 */
831 private ShortcutInfo makeShortcutWithTimestamp(String id, long timestamp) {
832 final ShortcutInfo s = makeShortcut(
833 id, "Title-" + id, /* activity =*/ null, /* icon =*/ null,
834 makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* weight =*/ 0);
835 s.setTimestamp(timestamp);
836 return s;
837 }
838
839 /**
Makoto Onuki55046222016-03-08 10:49:47 -0800840 * Make a shortcut with an ID and icon.
841 */
842 private ShortcutInfo makeShortcutWithIcon(String id, Icon icon) {
843 return makeShortcut(
844 id, "Title-" + id, /* activity =*/ null, icon,
845 makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* weight =*/ 0);
846 }
847
848 private ShortcutInfo makePackageShortcut(String packageName, String id) {
849 String origCaller = getCallingPackage();
850
851 setCaller(packageName);
852 ShortcutInfo s = makeShortcut(
853 id, "Title-" + id, /* activity =*/ null, /* icon =*/ null,
854 makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* weight =*/ 0);
855 setCaller(origCaller); // restore the caller
856
857 return s;
858 }
859
Makoto Onuki55046222016-03-08 10:49:47 -0800860 /**
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800861 * Make multiple shortcuts with IDs.
862 */
863 private List<ShortcutInfo> makeShortcuts(String... ids) {
864 final ArrayList<ShortcutInfo> ret = new ArrayList();
865 for (String id : ids) {
866 ret.add(makeShortcut(id));
867 }
868 return ret;
869 }
870
Makoto Onuki7a6a05f2016-03-10 17:01:08 -0800871 private ShortcutInfo.Builder makeShortcutBuilder() {
872 return new ShortcutInfo.Builder(mClientContext);
873 }
874
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800875 /**
876 * Make a shortcut with details.
877 */
878 private ShortcutInfo makeShortcut(String id, String title, ComponentName activity,
879 Icon icon, Intent intent, int weight) {
880 final ShortcutInfo.Builder b = new ShortcutInfo.Builder(mClientContext)
881 .setId(id)
882 .setTitle(title)
883 .setWeight(weight)
884 .setIntent(intent);
885 if (icon != null) {
886 b.setIcon(icon);
887 }
888 if (activity != null) {
889 b.setActivityComponent(activity);
890 }
891 final ShortcutInfo s = b.build();
892
893 s.setTimestamp(mInjectedCurrentTimeLillis); // HACK
894
895 return s;
896 }
897
898 /**
899 * Make an intent.
900 */
901 private Intent makeIntent(String action, Class<?> clazz, Object... bundleKeysAndValues) {
902 final Intent intent = new Intent(action);
903 intent.setComponent(makeComponent(clazz));
904 intent.replaceExtras(makeBundle(bundleKeysAndValues));
905 return intent;
906 }
907
908 /**
909 * Make an component name, with the client context.
910 */
911 @NonNull
912 private ComponentName makeComponent(Class<?> clazz) {
913 return new ComponentName(mClientContext, clazz);
914 }
915
Makoto Onukicdc78f72016-03-21 15:47:52 -0700916 private <T> Set<T> makeSet(T... values) {
917 final HashSet<T> ret = new HashSet<>();
918 for (T s : values) {
919 ret.add(s);
920 }
921 return ret;
922 }
923
Makoto Onukiac214972016-04-04 10:19:45 -0700924 private static void resetAll(Collection<?> mocks) {
925 for (Object o : mocks) {
926 reset(o);
927 }
928 }
929
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800930 @NonNull
931 private ShortcutInfo findById(List<ShortcutInfo> list, String id) {
932 for (ShortcutInfo s : list) {
933 if (s.getId().equals(id)) {
934 return s;
935 }
936 }
937 fail("Shortcut with id " + id + " not found");
938 return null;
939 }
940
Makoto Onukiac214972016-04-04 10:19:45 -0700941 private void assertSystem() {
942 assertEquals("Caller must be system", Process.SYSTEM_UID, mInjectedCallingUid);
943 }
944
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800945 private void assertResetTimes(long expectedLastResetTime, long expectedNextResetTime) {
946 assertEquals(expectedLastResetTime, mService.getLastResetTimeLocked());
947 assertEquals(expectedNextResetTime, mService.getNextResetTimeLocked());
948 }
949
950 @NonNull
951 private List<ShortcutInfo> assertShortcutIds(@NonNull List<ShortcutInfo> actualShortcuts,
952 String... expectedIds) {
Makoto Onukid99c6f02016-03-28 11:02:54 -0700953 final HashSet<String> expected = new HashSet<>(list(expectedIds));
Makoto Onuki6f7362d92016-03-04 13:39:41 -0800954 final HashSet<String> actual = new HashSet<>();
955 for (ShortcutInfo s : actualShortcuts) {
956 actual.add(s.getId());
957 }
958
959 // Compare the sets.
960 assertEquals(expected, actual);
961 return actualShortcuts;
962 }
963
964 @NonNull
965 private List<ShortcutInfo> assertAllHaveIntents(
966 @NonNull List<ShortcutInfo> actualShortcuts) {
967 for (ShortcutInfo s : actualShortcuts) {
968 assertNotNull("ID " + s.getId(), s.getIntent());
969 }
970 return actualShortcuts;
971 }
972
973 @NonNull
974 private List<ShortcutInfo> assertAllNotHaveIntents(
975 @NonNull List<ShortcutInfo> actualShortcuts) {
976 for (ShortcutInfo s : actualShortcuts) {
977 assertNull("ID " + s.getId(), s.getIntent());
978 }
979 return actualShortcuts;
980 }
981
982 @NonNull
983 private List<ShortcutInfo> assertAllHaveTitle(
984 @NonNull List<ShortcutInfo> actualShortcuts) {
985 for (ShortcutInfo s : actualShortcuts) {
986 assertNotNull("ID " + s.getId(), s.getTitle());
987 }
988 return actualShortcuts;
989 }
990
991 @NonNull
992 private List<ShortcutInfo> assertAllNotHaveTitle(
993 @NonNull List<ShortcutInfo> actualShortcuts) {
994 for (ShortcutInfo s : actualShortcuts) {
995 assertNull("ID " + s.getId(), s.getTitle());
996 }
997 return actualShortcuts;
998 }
999
1000 @NonNull
Makoto Onuki55046222016-03-08 10:49:47 -08001001 private List<ShortcutInfo> assertAllNotHaveIcon(
1002 @NonNull List<ShortcutInfo> actualShortcuts) {
1003 for (ShortcutInfo s : actualShortcuts) {
1004 assertNull("ID " + s.getId(), s.getIcon());
1005 }
1006 return actualShortcuts;
1007 }
1008
1009 @NonNull
1010 private List<ShortcutInfo> assertAllHaveIconResId(
1011 @NonNull List<ShortcutInfo> actualShortcuts) {
1012 for (ShortcutInfo s : actualShortcuts) {
1013 assertTrue("ID " + s.getId() + " not have icon res ID", s.hasIconResource());
1014 assertFalse("ID " + s.getId() + " shouldn't have icon FD", s.hasIconFile());
1015 }
1016 return actualShortcuts;
1017 }
1018
1019 @NonNull
1020 private List<ShortcutInfo> assertAllHaveIconFile(
1021 @NonNull List<ShortcutInfo> actualShortcuts) {
1022 for (ShortcutInfo s : actualShortcuts) {
1023 assertFalse("ID " + s.getId() + " shouldn't have icon res ID", s.hasIconResource());
1024 assertTrue("ID " + s.getId() + " not have icon FD", s.hasIconFile());
1025 }
1026 return actualShortcuts;
1027 }
1028
1029 @NonNull
Makoto Onuki41066a62016-03-09 16:18:44 -08001030 private List<ShortcutInfo> assertAllHaveIcon(
1031 @NonNull List<ShortcutInfo> actualShortcuts) {
1032 for (ShortcutInfo s : actualShortcuts) {
Makoto Onukiac214972016-04-04 10:19:45 -07001033 assertTrue("ID " + s.getId() + " has no icon ", s.hasIconFile() || s.hasIconResource());
Makoto Onuki41066a62016-03-09 16:18:44 -08001034 }
1035 return actualShortcuts;
1036 }
1037
1038 @NonNull
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001039 private List<ShortcutInfo> assertAllHaveFlags(@NonNull List<ShortcutInfo> actualShortcuts,
1040 int shortcutFlags) {
1041 for (ShortcutInfo s : actualShortcuts) {
Makoto Onukiac214972016-04-04 10:19:45 -07001042 assertTrue("ID " + s.getId() + " doesn't have flags " + shortcutFlags,
1043 s.hasFlags(shortcutFlags));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001044 }
1045 return actualShortcuts;
1046 }
1047
1048 @NonNull
Makoto Onuki55046222016-03-08 10:49:47 -08001049 private List<ShortcutInfo> assertAllKeyFieldsOnly(
1050 @NonNull List<ShortcutInfo> actualShortcuts) {
1051 for (ShortcutInfo s : actualShortcuts) {
1052 assertTrue("ID " + s.getId(), s.hasKeyFieldsOnly());
1053 }
1054 return actualShortcuts;
1055 }
1056
1057 @NonNull
1058 private List<ShortcutInfo> assertAllNotKeyFieldsOnly(
1059 @NonNull List<ShortcutInfo> actualShortcuts) {
1060 for (ShortcutInfo s : actualShortcuts) {
1061 assertFalse("ID " + s.getId(), s.hasKeyFieldsOnly());
1062 }
1063 return actualShortcuts;
1064 }
1065
1066 @NonNull
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001067 private List<ShortcutInfo> assertAllDynamic(@NonNull List<ShortcutInfo> actualShortcuts) {
1068 return assertAllHaveFlags(actualShortcuts, ShortcutInfo.FLAG_DYNAMIC);
1069 }
1070
1071 @NonNull
1072 private List<ShortcutInfo> assertAllPinned(@NonNull List<ShortcutInfo> actualShortcuts) {
1073 return assertAllHaveFlags(actualShortcuts, ShortcutInfo.FLAG_PINNED);
1074 }
1075
1076 @NonNull
1077 private List<ShortcutInfo> assertAllDynamicOrPinned(
1078 @NonNull List<ShortcutInfo> actualShortcuts) {
1079 for (ShortcutInfo s : actualShortcuts) {
1080 assertTrue("ID " + s.getId(), s.isDynamic() || s.isPinned());
1081 }
1082 return actualShortcuts;
1083 }
1084
Makoto Onukid99c6f02016-03-28 11:02:54 -07001085 private void assertDynamicOnly(ShortcutInfo si) {
1086 assertTrue(si.isDynamic());
1087 assertFalse(si.isPinned());
1088 }
1089
1090 private void assertPinnedOnly(ShortcutInfo si) {
1091 assertFalse(si.isDynamic());
1092 assertTrue(si.isPinned());
1093 }
1094
1095 private void assertDynamicAndPinned(ShortcutInfo si) {
1096 assertTrue(si.isDynamic());
1097 assertTrue(si.isPinned());
1098 }
1099
Makoto Onuki55046222016-03-08 10:49:47 -08001100 private void assertBitmapSize(int expectedWidth, int expectedHeight, @NonNull Bitmap bitmap) {
1101 assertEquals("width", expectedWidth, bitmap.getWidth());
1102 assertEquals("height", expectedHeight, bitmap.getHeight());
1103 }
1104
1105 private <T> void assertAllUnique(Collection<T> list) {
1106 final Set<Object> set = new HashSet<>();
1107 for (T item : list) {
1108 if (set.contains(item)) {
1109 fail("Duplicate item found: " + item + " (in the list: " + list + ")");
1110 }
1111 set.add(item);
1112 }
1113 }
1114
1115 @NonNull
1116 private Bitmap pfdToBitmap(@NonNull ParcelFileDescriptor pfd) {
1117 Preconditions.checkNotNull(pfd);
1118 try {
1119 return BitmapFactory.decodeFileDescriptor(pfd.getFileDescriptor());
1120 } finally {
1121 IoUtils.closeQuietly(pfd);
1122 }
1123 }
1124
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001125 private void assertBundleEmpty(BaseBundle b) {
1126 assertTrue(b == null || b.size() == 0);
1127 }
1128
Makoto Onuki41066a62016-03-09 16:18:44 -08001129 private ShortcutInfo getPackageShortcut(String packageName, String shortcutId, int userId) {
1130 return mService.getPackageShortcutForTest(packageName, shortcutId, userId);
1131 }
1132
Makoto Onukicdc78f72016-03-21 15:47:52 -07001133 private void assertShortcutExists(String packageName, String shortcutId, int userId) {
1134 assertTrue(getPackageShortcut(packageName, shortcutId, userId) != null);
1135 }
1136
1137 private void assertShortcutNotExists(String packageName, String shortcutId, int userId) {
1138 assertTrue(getPackageShortcut(packageName, shortcutId, userId) == null);
1139 }
1140
Makoto Onukid99c6f02016-03-28 11:02:54 -07001141 private Intent launchShortcutAndGetIntent(
1142 @NonNull String packageName, @NonNull String shortcutId, int userId) {
1143 reset(mServiceContext);
1144 assertTrue(mLauncherApps.startShortcut(packageName, shortcutId, null, null,
1145 UserHandle.of(userId)));
1146
1147 final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
1148 verify(mServiceContext).startActivityAsUser(
1149 intentCaptor.capture(),
1150 any(Bundle.class),
1151 eq(UserHandle.of(userId)));
1152 return intentCaptor.getValue();
1153 }
1154
1155 private void assertShortcutLaunchable(@NonNull String packageName, @NonNull String shortcutId,
1156 int userId) {
1157 assertNotNull(launchShortcutAndGetIntent(packageName, shortcutId, userId));
1158 }
1159
1160 private void assertShortcutNotLaunchable(@NonNull String packageName,
1161 @NonNull String shortcutId, int userId) {
1162 try {
1163 final boolean ok = mLauncherApps.startShortcut(packageName, shortcutId, null, null,
1164 UserHandle.of(userId));
1165 if (!ok) {
1166 return; // didn't launch, okay.
1167 }
1168 fail();
1169 } catch (SecurityException expected) {
1170 // security exception is okay too.
1171 }
1172 }
1173
Makoto Onuki41066a62016-03-09 16:18:44 -08001174 private ShortcutInfo getPackageShortcut(String packageName, String shortcutId) {
1175 return getPackageShortcut(packageName, shortcutId, getCallingUserId());
1176 }
1177
1178 private ShortcutInfo getCallerShortcut(String shortcutId) {
1179 return getPackageShortcut(getCallingPackage(), shortcutId, getCallingUserId());
1180 }
1181
Makoto Onukicdc78f72016-03-21 15:47:52 -07001182 private List<ShortcutInfo> getLauncherShortcuts(String launcher, int userId, int queryFlags) {
1183 final List<ShortcutInfo>[] ret = new List[1];
1184 runWithCaller(launcher, userId, () -> {
1185 final ShortcutQuery q = new ShortcutQuery();
1186 q.setQueryFlags(queryFlags);
1187 ret[0] = mLauncherApps.getShortcuts(q, UserHandle.of(userId));
1188 });
1189 return ret[0];
1190 }
1191
1192 private List<ShortcutInfo> getLauncherPinnedShortcuts(String launcher, int userId) {
1193 return getLauncherShortcuts(launcher, userId, ShortcutQuery.FLAG_GET_PINNED);
1194 }
1195
Makoto Onuki0acbb142016-03-22 17:02:57 -07001196
1197 private Intent genPackageDeleteIntent(String pakcageName, int userId) {
1198 Intent i = new Intent(Intent.ACTION_PACKAGE_REMOVED);
1199 i.setData(Uri.parse("package:" + pakcageName));
1200 i.putExtra(Intent.EXTRA_USER_HANDLE, userId);
1201 return i;
1202 }
1203
1204 private Intent genPackageUpdateIntent(String pakcageName, int userId) {
1205 Intent i = new Intent(Intent.ACTION_PACKAGE_ADDED);
1206 i.setData(Uri.parse("package:" + pakcageName));
1207 i.putExtra(Intent.EXTRA_USER_HANDLE, userId);
1208 i.putExtra(Intent.EXTRA_REPLACING, true);
1209 return i;
1210 }
1211
Makoto Onuki2e210c42016-03-30 08:30:36 -07001212 private ShortcutInfo parceled(ShortcutInfo si) {
1213 Parcel p = Parcel.obtain();
1214 p.writeParcelable(si, 0);
1215 p.setDataPosition(0);
1216 ShortcutInfo si2 = p.readParcelable(getClass().getClassLoader());
1217 p.recycle();
1218 return si2;
Makoto Onukicdc78f72016-03-21 15:47:52 -07001219 }
1220
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001221 /**
1222 * Test for the first launch path, no settings file available.
1223 */
1224 public void testFirstInitialize() {
1225 assertResetTimes(START_TIME, START_TIME + INTERVAL);
1226 }
1227
1228 /**
Makoto Onukicdc78f72016-03-21 15:47:52 -07001229 * Test for {@link ShortcutService#getLastResetTimeLocked()} and
1230 * {@link ShortcutService#getNextResetTimeLocked()}.
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001231 */
1232 public void testUpdateAndGetNextResetTimeLocked() {
1233 assertResetTimes(START_TIME, START_TIME + INTERVAL);
1234
1235 // Advance clock.
1236 mInjectedCurrentTimeLillis += 100;
1237
1238 // Shouldn't have changed.
1239 assertResetTimes(START_TIME, START_TIME + INTERVAL);
1240
1241 // Advance clock, almost the reset time.
1242 mInjectedCurrentTimeLillis = START_TIME + INTERVAL - 1;
1243
1244 // Shouldn't have changed.
1245 assertResetTimes(START_TIME, START_TIME + INTERVAL);
1246
1247 // Advance clock.
1248 mInjectedCurrentTimeLillis += 1;
1249
1250 assertResetTimes(START_TIME + INTERVAL, START_TIME + 2 * INTERVAL);
1251
1252 // Advance further; 4 days since start.
1253 mInjectedCurrentTimeLillis = START_TIME + 4 * INTERVAL + 50;
1254
1255 assertResetTimes(START_TIME + 4 * INTERVAL, START_TIME + 5 * INTERVAL);
1256 }
1257
1258 /**
1259 * Test for the restoration from saved file.
1260 */
1261 public void testInitializeFromSavedFile() {
1262
1263 mInjectedCurrentTimeLillis = START_TIME + 4 * INTERVAL + 50;
1264 assertResetTimes(START_TIME + 4 * INTERVAL, START_TIME + 5 * INTERVAL);
1265
1266 mService.saveBaseStateLocked();
1267
1268 dumpBaseStateFile();
1269
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07001270 mService.saveDirtyInfo();
1271
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001272 // Restore.
1273 initService();
1274
1275 assertResetTimes(START_TIME + 4 * INTERVAL, START_TIME + 5 * INTERVAL);
1276 }
1277
1278 /**
1279 * Test for the restoration from restored file.
1280 */
1281 public void testLoadFromBrokenFile() {
1282 // TODO Add various broken cases.
1283 }
1284
Makoto Onuki4362a662016-03-08 18:59:09 -08001285 public void testLoadConfig() {
1286 mService.updateConfigurationLocked(
1287 ConfigConstants.KEY_RESET_INTERVAL_SEC + "=123,"
1288 + ConfigConstants.KEY_MAX_SHORTCUTS + "=4,"
1289 + ConfigConstants.KEY_MAX_DAILY_UPDATES + "=5,"
1290 + ConfigConstants.KEY_MAX_ICON_DIMENSION_DP + "=100,"
1291 + ConfigConstants.KEY_MAX_ICON_DIMENSION_DP_LOWRAM + "=50,"
1292 + ConfigConstants.KEY_ICON_FORMAT + "=WEBP,"
1293 + ConfigConstants.KEY_ICON_QUALITY + "=75");
1294 assertEquals(123000, mService.getResetIntervalForTest());
1295 assertEquals(4, mService.getMaxDynamicShortcutsForTest());
1296 assertEquals(5, mService.getMaxDailyUpdatesForTest());
1297 assertEquals(100, mService.getMaxIconDimensionForTest());
1298 assertEquals(CompressFormat.WEBP, mService.getIconPersistFormatForTest());
1299 assertEquals(75, mService.getIconPersistQualityForTest());
1300
Makoto Onukicdc78f72016-03-21 15:47:52 -07001301 mInjectedIsLowRamDevice = true;
Makoto Onuki4362a662016-03-08 18:59:09 -08001302 mService.updateConfigurationLocked(
1303 ConfigConstants.KEY_MAX_ICON_DIMENSION_DP + "=100,"
1304 + ConfigConstants.KEY_MAX_ICON_DIMENSION_DP_LOWRAM + "=50,"
1305 + ConfigConstants.KEY_ICON_FORMAT + "=JPEG");
1306 assertEquals(ShortcutService.DEFAULT_RESET_INTERVAL_SEC * 1000,
1307 mService.getResetIntervalForTest());
1308
1309 assertEquals(ShortcutService.DEFAULT_MAX_SHORTCUTS_PER_APP,
1310 mService.getMaxDynamicShortcutsForTest());
1311
1312 assertEquals(ShortcutService.DEFAULT_MAX_DAILY_UPDATES,
1313 mService.getMaxDailyUpdatesForTest());
1314
1315 assertEquals(50, mService.getMaxIconDimensionForTest());
1316
1317 assertEquals(CompressFormat.JPEG, mService.getIconPersistFormatForTest());
1318
1319 assertEquals(ShortcutService.DEFAULT_ICON_PERSIST_QUALITY,
1320 mService.getIconPersistQualityForTest());
1321 }
1322
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001323 // === Test for app side APIs ===
1324
1325 /** Test for {@link android.content.pm.ShortcutManager#getMaxDynamicShortcutCount()} */
1326 public void testGetMaxDynamicShortcutCount() {
1327 assertEquals(MAX_SHORTCUTS, mManager.getMaxDynamicShortcutCount());
1328 }
1329
1330 /** Test for {@link android.content.pm.ShortcutManager#getRemainingCallCount()} */
1331 public void testGetRemainingCallCount() {
1332 assertEquals(MAX_DAILY_UPDATES, mManager.getRemainingCallCount());
1333 }
1334
1335 /** Test for {@link android.content.pm.ShortcutManager#getRateLimitResetTime()} */
1336 public void testGetRateLimitResetTime() {
1337 assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
1338
1339 mInjectedCurrentTimeLillis = START_TIME + 4 * INTERVAL + 50;
1340
1341 assertEquals(START_TIME + 5 * INTERVAL, mManager.getRateLimitResetTime());
1342 }
1343
1344 public void testSetDynamicShortcuts() {
Makoto Onuki0acbb142016-03-22 17:02:57 -07001345 setCaller(CALLING_PACKAGE_1, USER_0);
1346
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07001347 final Icon icon1 = Icon.createWithResource(getTestContext(), R.drawable.icon1);
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001348 final Icon icon2 = Icon.createWithBitmap(BitmapFactory.decodeResource(
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07001349 getTestContext().getResources(), R.drawable.icon2));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001350
1351 final ShortcutInfo si1 = makeShortcut(
1352 "shortcut1",
1353 "Title 1",
1354 makeComponent(ShortcutActivity.class),
1355 icon1,
1356 makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class,
1357 "key1", "val1", "nest", makeBundle("key", 123)),
1358 /* weight */ 10);
1359
1360 final ShortcutInfo si2 = makeShortcut(
1361 "shortcut2",
1362 "Title 2",
1363 /* activity */ null,
1364 icon2,
1365 makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class),
1366 /* weight */ 12);
1367 final ShortcutInfo si3 = makeShortcut("shortcut3");
1368
Makoto Onukid99c6f02016-03-28 11:02:54 -07001369 assertTrue(mManager.setDynamicShortcuts(list(si1, si2)));
Makoto Onuki55046222016-03-08 10:49:47 -08001370 assertShortcutIds(assertAllNotKeyFieldsOnly(
1371 mManager.getDynamicShortcuts()),
1372 "shortcut1", "shortcut2");
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001373 assertEquals(2, mManager.getRemainingCallCount());
1374
1375 // TODO: Check fields
1376
Makoto Onukid99c6f02016-03-28 11:02:54 -07001377 assertTrue(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki55046222016-03-08 10:49:47 -08001378 assertShortcutIds(assertAllNotKeyFieldsOnly(
1379 mManager.getDynamicShortcuts()),
1380 "shortcut1");
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001381 assertEquals(1, mManager.getRemainingCallCount());
1382
Makoto Onukid99c6f02016-03-28 11:02:54 -07001383 assertTrue(mManager.setDynamicShortcuts(list()));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001384 assertEquals(0, mManager.getDynamicShortcuts().size());
1385 assertEquals(0, mManager.getRemainingCallCount());
1386
1387 dumpsysOnLogcat();
1388
1389 mInjectedCurrentTimeLillis++; // Need to advance the clock for reset to work.
Makoto Onuki4554d0e2016-03-14 15:51:41 -07001390 mService.resetThrottlingInner(UserHandle.USER_SYSTEM);
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001391
1392 dumpsysOnLogcat();
1393
Makoto Onukid99c6f02016-03-28 11:02:54 -07001394 assertTrue(mManager.setDynamicShortcuts(list(si2, si3)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001395 assertEquals(2, mManager.getDynamicShortcuts().size());
1396
1397 // TODO Check max number
Makoto Onuki0acbb142016-03-22 17:02:57 -07001398
1399 runWithCaller(CALLING_PACKAGE_2, USER_10, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07001400 assertTrue(mManager.setDynamicShortcuts(list(makeShortcut("s1"))));
Makoto Onuki0acbb142016-03-22 17:02:57 -07001401 });
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001402 }
1403
1404 public void testAddDynamicShortcuts() {
Makoto Onuki0acbb142016-03-22 17:02:57 -07001405 setCaller(CALLING_PACKAGE_1, USER_0);
1406
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001407 final ShortcutInfo si1 = makeShortcut("shortcut1");
1408 final ShortcutInfo si2 = makeShortcut("shortcut2");
1409 final ShortcutInfo si3 = makeShortcut("shortcut3");
1410
1411 assertEquals(3, mManager.getRemainingCallCount());
1412
Makoto Onukid99c6f02016-03-28 11:02:54 -07001413 assertTrue(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001414 assertEquals(2, mManager.getRemainingCallCount());
Makoto Onuki55046222016-03-08 10:49:47 -08001415 assertShortcutIds(assertAllNotKeyFieldsOnly(
1416 mManager.getDynamicShortcuts()),
1417 "shortcut1");
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001418
1419 assertTrue(mManager.addDynamicShortcut(si2));
1420 assertEquals(1, mManager.getRemainingCallCount());
Makoto Onuki55046222016-03-08 10:49:47 -08001421 assertShortcutIds(assertAllNotKeyFieldsOnly(
1422 mManager.getDynamicShortcuts()),
1423 "shortcut1", "shortcut2");
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001424
1425 // Add with the same ID
1426 assertTrue(mManager.addDynamicShortcut(makeShortcut("shortcut1")));
1427 assertEquals(0, mManager.getRemainingCallCount());
Makoto Onuki55046222016-03-08 10:49:47 -08001428 assertShortcutIds(assertAllNotKeyFieldsOnly(
1429 mManager.getDynamicShortcuts()),
1430 "shortcut1", "shortcut2");
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001431
1432 // TODO Check max number
1433
1434 // TODO Check fields.
Makoto Onuki0acbb142016-03-22 17:02:57 -07001435
1436 runWithCaller(CALLING_PACKAGE_2, USER_10, () -> {
1437 assertTrue(mManager.addDynamicShortcut(makeShortcut("s1")));
Makoto Onuki0acbb142016-03-22 17:02:57 -07001438 });
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001439 }
1440
1441 public void testDeleteDynamicShortcut() {
1442 final ShortcutInfo si1 = makeShortcut("shortcut1");
1443 final ShortcutInfo si2 = makeShortcut("shortcut2");
1444 final ShortcutInfo si3 = makeShortcut("shortcut3");
1445
Makoto Onukid99c6f02016-03-28 11:02:54 -07001446 assertTrue(mManager.setDynamicShortcuts(list(si1, si2, si3)));
Makoto Onuki55046222016-03-08 10:49:47 -08001447 assertShortcutIds(assertAllNotKeyFieldsOnly(
1448 mManager.getDynamicShortcuts()),
1449 "shortcut1", "shortcut2", "shortcut3");
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001450
1451 assertEquals(2, mManager.getRemainingCallCount());
1452
1453 mManager.deleteDynamicShortcut("shortcut1");
Makoto Onuki55046222016-03-08 10:49:47 -08001454 assertShortcutIds(assertAllNotKeyFieldsOnly(
1455 mManager.getDynamicShortcuts()),
1456 "shortcut2", "shortcut3");
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001457
1458 mManager.deleteDynamicShortcut("shortcut1");
Makoto Onuki55046222016-03-08 10:49:47 -08001459 assertShortcutIds(assertAllNotKeyFieldsOnly(
1460 mManager.getDynamicShortcuts()),
1461 "shortcut2", "shortcut3");
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001462
1463 mManager.deleteDynamicShortcut("shortcutXXX");
Makoto Onuki55046222016-03-08 10:49:47 -08001464 assertShortcutIds(assertAllNotKeyFieldsOnly(
1465 mManager.getDynamicShortcuts()),
1466 "shortcut2", "shortcut3");
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001467
1468 mManager.deleteDynamicShortcut("shortcut2");
Makoto Onuki55046222016-03-08 10:49:47 -08001469 assertShortcutIds(assertAllNotKeyFieldsOnly(
1470 mManager.getDynamicShortcuts()),
1471 "shortcut3");
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001472
1473 mManager.deleteDynamicShortcut("shortcut3");
Makoto Onuki55046222016-03-08 10:49:47 -08001474 assertShortcutIds(assertAllNotKeyFieldsOnly(
1475 mManager.getDynamicShortcuts()));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001476
1477 // Still 2 calls left.
1478 assertEquals(2, mManager.getRemainingCallCount());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001479 }
1480
1481 public void testDeleteAllDynamicShortcuts() {
1482 final ShortcutInfo si1 = makeShortcut("shortcut1");
1483 final ShortcutInfo si2 = makeShortcut("shortcut2");
1484 final ShortcutInfo si3 = makeShortcut("shortcut3");
1485
Makoto Onukid99c6f02016-03-28 11:02:54 -07001486 assertTrue(mManager.setDynamicShortcuts(list(si1, si2, si3)));
Makoto Onuki55046222016-03-08 10:49:47 -08001487 assertShortcutIds(assertAllNotKeyFieldsOnly(
1488 mManager.getDynamicShortcuts()),
1489 "shortcut1", "shortcut2", "shortcut3");
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001490
1491 assertEquals(2, mManager.getRemainingCallCount());
1492
1493 mManager.deleteAllDynamicShortcuts();
1494 assertEquals(0, mManager.getDynamicShortcuts().size());
1495 assertEquals(2, mManager.getRemainingCallCount());
1496
1497 // Note delete shouldn't affect throttling, so...
1498 assertEquals(0, mManager.getDynamicShortcuts().size());
1499 assertEquals(0, mManager.getDynamicShortcuts().size());
1500 assertEquals(0, mManager.getDynamicShortcuts().size());
1501
1502 // This should still work.
Makoto Onukid99c6f02016-03-28 11:02:54 -07001503 assertTrue(mManager.setDynamicShortcuts(list(si1, si2, si3)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001504 assertEquals(3, mManager.getDynamicShortcuts().size());
1505
1506 // Still 1 call left
1507 assertEquals(1, mManager.getRemainingCallCount());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001508 }
1509
1510 public void testThrottling() {
1511 final ShortcutInfo si1 = makeShortcut("shortcut1");
1512
Makoto Onukid99c6f02016-03-28 11:02:54 -07001513 assertTrue(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001514 assertEquals(2, mManager.getRemainingCallCount());
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07001515 assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001516
1517 mInjectedCurrentTimeLillis++;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001518 assertTrue(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001519 assertEquals(1, mManager.getRemainingCallCount());
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07001520 assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001521
1522 mInjectedCurrentTimeLillis++;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001523 assertTrue(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001524 assertEquals(0, mManager.getRemainingCallCount());
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07001525 assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001526
1527 // Reached the max
1528
1529 mInjectedCurrentTimeLillis++;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001530 assertFalse(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001531 assertEquals(0, mManager.getRemainingCallCount());
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07001532 assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001533
1534 // Still throttled
1535 mInjectedCurrentTimeLillis = START_TIME + INTERVAL - 1;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001536 assertFalse(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001537 assertEquals(0, mManager.getRemainingCallCount());
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07001538 assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001539
1540 // Now it should work.
1541 mInjectedCurrentTimeLillis++;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001542 assertTrue(mManager.setDynamicShortcuts(list(si1))); // fail
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001543 assertEquals(2, mManager.getRemainingCallCount());
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07001544 assertEquals(START_TIME + INTERVAL * 2, mManager.getRateLimitResetTime());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001545
1546 mInjectedCurrentTimeLillis++;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001547 assertTrue(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001548 assertEquals(1, mManager.getRemainingCallCount());
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07001549 assertEquals(START_TIME + INTERVAL * 2, mManager.getRateLimitResetTime());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001550
1551 mInjectedCurrentTimeLillis++;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001552 assertTrue(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001553 assertEquals(0, mManager.getRemainingCallCount());
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07001554 assertEquals(START_TIME + INTERVAL * 2, mManager.getRateLimitResetTime());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001555
1556 mInjectedCurrentTimeLillis++;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001557 assertFalse(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001558 assertEquals(0, mManager.getRemainingCallCount());
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07001559 assertEquals(START_TIME + INTERVAL * 2, mManager.getRateLimitResetTime());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001560
1561 // 4 days later...
1562 mInjectedCurrentTimeLillis = START_TIME + 4 * INTERVAL;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001563 assertTrue(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001564 assertEquals(2, mManager.getRemainingCallCount());
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07001565 assertEquals(START_TIME + INTERVAL * 5, mManager.getRateLimitResetTime());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001566
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07001567 mInjectedCurrentTimeLillis++;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001568 assertTrue(mManager.setDynamicShortcuts(list(si1)));
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07001569 assertEquals(1, mManager.getRemainingCallCount());
1570 assertEquals(START_TIME + INTERVAL * 5, mManager.getRateLimitResetTime());
1571
1572 // Make sure getRemainingCallCount() itself gets reset without calling setDynamicShortcuts().
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001573 mInjectedCurrentTimeLillis = START_TIME + 8 * INTERVAL;
1574 assertEquals(3, mManager.getRemainingCallCount());
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07001575 assertEquals(START_TIME + INTERVAL * 9, mManager.getRateLimitResetTime());
1576
1577 mInjectedCurrentTimeLillis++;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001578 assertTrue(mManager.setDynamicShortcuts(list(si1)));
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07001579 assertEquals(2, mManager.getRemainingCallCount());
1580 assertEquals(START_TIME + INTERVAL * 9, mManager.getRateLimitResetTime());
1581 }
1582
1583 public void testThrottling_rewind() {
1584 final ShortcutInfo si1 = makeShortcut("shortcut1");
1585
Makoto Onukid99c6f02016-03-28 11:02:54 -07001586 assertTrue(mManager.setDynamicShortcuts(list(si1)));
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07001587 assertEquals(2, mManager.getRemainingCallCount());
1588 assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
1589
1590 mInjectedCurrentTimeLillis = 12345; // Clock reset!
1591
1592 // Since the clock looks invalid, the counter shouldn't have reset.
1593 assertEquals(2, mManager.getRemainingCallCount());
1594 assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
1595
1596 // Forward again. Still haven't reset yet.
1597 mInjectedCurrentTimeLillis = START_TIME + INTERVAL - 1;
1598 assertEquals(2, mManager.getRemainingCallCount());
1599 assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
1600
1601 // Now rewind -- this will reset the counters.
1602 mInjectedCurrentTimeLillis = START_TIME - 100000;
1603 assertEquals(3, mManager.getRemainingCallCount());
1604
Makoto Onukid99c6f02016-03-28 11:02:54 -07001605 assertTrue(mManager.setDynamicShortcuts(list(si1)));
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07001606 assertEquals(2, mManager.getRemainingCallCount());
1607
1608 // Forward again, should be reset now.
1609 mInjectedCurrentTimeLillis += INTERVAL;
1610 assertEquals(3, mManager.getRemainingCallCount());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001611 }
1612
1613 public void testThrottling_perPackage() {
1614 final ShortcutInfo si1 = makeShortcut("shortcut1");
1615
Makoto Onukid99c6f02016-03-28 11:02:54 -07001616 assertTrue(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001617 assertEquals(2, mManager.getRemainingCallCount());
1618
1619 mInjectedCurrentTimeLillis++;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001620 assertTrue(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001621 assertEquals(1, mManager.getRemainingCallCount());
1622
1623 mInjectedCurrentTimeLillis++;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001624 assertTrue(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001625 assertEquals(0, mManager.getRemainingCallCount());
1626
1627 // Reached the max
1628
1629 mInjectedCurrentTimeLillis++;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001630 assertFalse(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001631
1632 // Try from a different caller.
1633 mInjectedClientPackage = CALLING_PACKAGE_2;
1634 mInjectedCallingUid = CALLING_UID_2;
1635
1636 // Need to create a new one wit the updated package name.
1637 final ShortcutInfo si2 = makeShortcut("shortcut1");
1638
1639 assertEquals(3, mManager.getRemainingCallCount());
1640
Makoto Onukid99c6f02016-03-28 11:02:54 -07001641 assertTrue(mManager.setDynamicShortcuts(list(si2)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001642 assertEquals(2, mManager.getRemainingCallCount());
1643
1644 mInjectedCurrentTimeLillis++;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001645 assertTrue(mManager.setDynamicShortcuts(list(si2)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001646 assertEquals(1, mManager.getRemainingCallCount());
1647
1648 // Back to the original caller, still throttled.
1649 mInjectedClientPackage = CALLING_PACKAGE_1;
1650 mInjectedCallingUid = CALLING_UID_1;
1651
1652 mInjectedCurrentTimeLillis = START_TIME + INTERVAL - 1;
1653 assertEquals(0, mManager.getRemainingCallCount());
Makoto Onukid99c6f02016-03-28 11:02:54 -07001654 assertFalse(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001655 assertEquals(0, mManager.getRemainingCallCount());
1656
1657 // Now it should work.
1658 mInjectedCurrentTimeLillis++;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001659 assertTrue(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001660
1661 mInjectedCurrentTimeLillis++;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001662 assertTrue(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001663
1664 mInjectedCurrentTimeLillis++;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001665 assertTrue(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001666
1667 mInjectedCurrentTimeLillis++;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001668 assertFalse(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001669
1670 mInjectedCurrentTimeLillis = START_TIME + 4 * INTERVAL;
Makoto Onukid99c6f02016-03-28 11:02:54 -07001671 assertTrue(mManager.setDynamicShortcuts(list(si1)));
1672 assertTrue(mManager.setDynamicShortcuts(list(si1)));
1673 assertTrue(mManager.setDynamicShortcuts(list(si1)));
1674 assertFalse(mManager.setDynamicShortcuts(list(si1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001675
1676 mInjectedClientPackage = CALLING_PACKAGE_2;
1677 mInjectedCallingUid = CALLING_UID_2;
1678
1679 assertEquals(3, mManager.getRemainingCallCount());
1680
Makoto Onukid99c6f02016-03-28 11:02:54 -07001681 assertTrue(mManager.setDynamicShortcuts(list(si2)));
1682 assertTrue(mManager.setDynamicShortcuts(list(si2)));
1683 assertTrue(mManager.setDynamicShortcuts(list(si2)));
1684 assertFalse(mManager.setDynamicShortcuts(list(si2)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08001685 }
1686
Makoto Onuki55046222016-03-08 10:49:47 -08001687 public void testIcons() {
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07001688 final Icon res32x32 = Icon.createWithResource(getTestContext(), R.drawable.black_32x32);
1689 final Icon res64x64 = Icon.createWithResource(getTestContext(), R.drawable.black_64x64);
1690 final Icon res512x512 = Icon.createWithResource(getTestContext(), R.drawable.black_512x512);
Makoto Onuki55046222016-03-08 10:49:47 -08001691
1692 final Icon bmp32x32 = Icon.createWithBitmap(BitmapFactory.decodeResource(
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07001693 getTestContext().getResources(), R.drawable.black_32x32));
Makoto Onuki55046222016-03-08 10:49:47 -08001694 final Icon bmp64x64 = Icon.createWithBitmap(BitmapFactory.decodeResource(
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07001695 getTestContext().getResources(), R.drawable.black_64x64));
Makoto Onuki55046222016-03-08 10:49:47 -08001696 final Icon bmp512x512 = Icon.createWithBitmap(BitmapFactory.decodeResource(
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07001697 getTestContext().getResources(), R.drawable.black_512x512));
Makoto Onuki55046222016-03-08 10:49:47 -08001698
1699 // Set from package 1
1700 setCaller(CALLING_PACKAGE_1);
Makoto Onukid99c6f02016-03-28 11:02:54 -07001701 assertTrue(mManager.setDynamicShortcuts(list(
Makoto Onuki55046222016-03-08 10:49:47 -08001702 makeShortcutWithIcon("res32x32", res32x32),
1703 makeShortcutWithIcon("res64x64", res64x64),
1704 makeShortcutWithIcon("bmp32x32", bmp32x32),
1705 makeShortcutWithIcon("bmp64x64", bmp64x64),
1706 makeShortcutWithIcon("bmp512x512", bmp512x512),
1707 makeShortcut("none")
1708 )));
1709
1710 // getDynamicShortcuts() shouldn't return icons, thus assertAllNotHaveIcon().
1711 assertShortcutIds(assertAllNotHaveIcon(mManager.getDynamicShortcuts()),
1712 "res32x32",
1713 "res64x64",
1714 "bmp32x32",
1715 "bmp64x64",
1716 "bmp512x512",
1717 "none");
1718
1719 // Call from another caller with the same ID, just to make sure storage is per-package.
1720 setCaller(CALLING_PACKAGE_2);
Makoto Onukid99c6f02016-03-28 11:02:54 -07001721 assertTrue(mManager.setDynamicShortcuts(list(
Makoto Onuki55046222016-03-08 10:49:47 -08001722 makeShortcutWithIcon("res32x32", res512x512),
1723 makeShortcutWithIcon("res64x64", res512x512),
1724 makeShortcutWithIcon("none", res512x512)
1725 )));
1726 assertShortcutIds(assertAllNotHaveIcon(mManager.getDynamicShortcuts()),
1727 "res32x32",
1728 "res64x64",
1729 "none");
1730
Makoto Onuki41066a62016-03-09 16:18:44 -08001731 // Re-initialize and load from the files.
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07001732 mService.saveDirtyInfo();
Makoto Onuki41066a62016-03-09 16:18:44 -08001733 initService();
Makoto Onuki55046222016-03-08 10:49:47 -08001734
1735 // Load from launcher.
1736 Bitmap bmp;
1737
1738 setCaller(LAUNCHER_1);
Makoto Onuki55046222016-03-08 10:49:47 -08001739 // Check hasIconResource()/hasIconFile().
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001740 assertShortcutIds(assertAllHaveIconResId(mLauncherApps.getShortcutInfo(
Makoto Onukid99c6f02016-03-28 11:02:54 -07001741 CALLING_PACKAGE_1, list("res32x32"),
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001742 getCallingUser())), "res32x32");
Makoto Onuki55046222016-03-08 10:49:47 -08001743
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001744 assertShortcutIds(assertAllHaveIconResId(mLauncherApps.getShortcutInfo(
Makoto Onukid99c6f02016-03-28 11:02:54 -07001745 CALLING_PACKAGE_1, list("res64x64"), getCallingUser())),
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001746 "res64x64");
Makoto Onuki55046222016-03-08 10:49:47 -08001747
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001748 assertShortcutIds(assertAllHaveIconFile(mLauncherApps.getShortcutInfo(
Makoto Onukid99c6f02016-03-28 11:02:54 -07001749 CALLING_PACKAGE_1, list("bmp32x32"), getCallingUser())),
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001750 "bmp32x32");
1751
1752 assertShortcutIds(assertAllHaveIconFile(mLauncherApps.getShortcutInfo(
Makoto Onukid99c6f02016-03-28 11:02:54 -07001753 CALLING_PACKAGE_1, list("bmp64x64"), getCallingUser())),
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001754 "bmp64x64");
1755
1756 assertShortcutIds(assertAllHaveIconFile(mLauncherApps.getShortcutInfo(
Makoto Onukid99c6f02016-03-28 11:02:54 -07001757 CALLING_PACKAGE_1, list("bmp512x512"), getCallingUser())),
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001758 "bmp512x512");
Makoto Onuki55046222016-03-08 10:49:47 -08001759
1760 // Check
1761 assertEquals(
1762 R.drawable.black_32x32,
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001763 mLauncherApps.getShortcutIconResId(
1764 makePackageShortcut(CALLING_PACKAGE_1, "res32x32"), getCallingUser()));
Makoto Onuki55046222016-03-08 10:49:47 -08001765
1766 assertEquals(
1767 R.drawable.black_64x64,
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001768 mLauncherApps.getShortcutIconResId(
1769
1770 makePackageShortcut(CALLING_PACKAGE_1, "res64x64"), getCallingUser()));
Makoto Onuki55046222016-03-08 10:49:47 -08001771
1772 assertEquals(
1773 0, // because it's not a resource
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001774 mLauncherApps.getShortcutIconResId(
1775 makePackageShortcut(CALLING_PACKAGE_1, "bmp32x32"), getCallingUser()));
Makoto Onuki55046222016-03-08 10:49:47 -08001776 assertEquals(
1777 0, // because it's not a resource
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001778 mLauncherApps.getShortcutIconResId(
1779 makePackageShortcut(CALLING_PACKAGE_1, "bmp64x64"), getCallingUser()));
Makoto Onuki55046222016-03-08 10:49:47 -08001780 assertEquals(
1781 0, // because it's not a resource
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001782 mLauncherApps.getShortcutIconResId(
1783 makePackageShortcut(CALLING_PACKAGE_1, "bmp512x512"), getCallingUser()));
Makoto Onuki55046222016-03-08 10:49:47 -08001784
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001785 bmp = pfdToBitmap(mLauncherApps.getShortcutIconFd(
1786 makePackageShortcut(CALLING_PACKAGE_1, "bmp32x32"), getCallingUser()));
Makoto Onuki55046222016-03-08 10:49:47 -08001787 assertBitmapSize(32, 32, bmp);
1788
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001789 bmp = pfdToBitmap(mLauncherApps.getShortcutIconFd(
1790 makePackageShortcut(CALLING_PACKAGE_1, "bmp64x64"), getCallingUser()));
Makoto Onuki55046222016-03-08 10:49:47 -08001791 assertBitmapSize(64, 64, bmp);
1792
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001793 bmp = pfdToBitmap(mLauncherApps.getShortcutIconFd(
1794 makePackageShortcut(CALLING_PACKAGE_1, "bmp512x512"), getCallingUser()));
Makoto Onuki55046222016-03-08 10:49:47 -08001795 assertBitmapSize(128, 128, bmp);
1796
1797 // TODO Test the content URI case too.
1798 }
1799
1800 private void checkShrinkBitmap(int expectedWidth, int expectedHeight, int resId, int maxSize) {
1801 assertBitmapSize(expectedWidth, expectedHeight,
1802 ShortcutService.shrinkBitmap(BitmapFactory.decodeResource(
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07001803 getTestContext().getResources(), resId),
Makoto Onuki55046222016-03-08 10:49:47 -08001804 maxSize));
1805 }
1806
1807 public void testShrinkBitmap() {
1808 checkShrinkBitmap(32, 32, R.drawable.black_512x512, 32);
1809 checkShrinkBitmap(511, 511, R.drawable.black_512x512, 511);
1810 checkShrinkBitmap(512, 512, R.drawable.black_512x512, 512);
1811
1812 checkShrinkBitmap(1024, 4096, R.drawable.black_1024x4096, 4096);
1813 checkShrinkBitmap(1024, 4096, R.drawable.black_1024x4096, 4100);
1814 checkShrinkBitmap(512, 2048, R.drawable.black_1024x4096, 2048);
1815
1816 checkShrinkBitmap(4096, 1024, R.drawable.black_4096x1024, 4096);
1817 checkShrinkBitmap(4096, 1024, R.drawable.black_4096x1024, 4100);
1818 checkShrinkBitmap(2048, 512, R.drawable.black_4096x1024, 2048);
1819 }
1820
1821 private File openIconFileForWriteAndGetPath(int userId, String packageName)
1822 throws IOException {
1823 // Shortcut IDs aren't used in the path, so just pass the same ID.
1824 final FileOutputStreamWithPath out =
1825 mService.openIconFileForWrite(userId, makePackageShortcut(packageName, "id"));
1826 out.close();
1827 return out.getFile();
1828 }
1829
1830 public void testOpenIconFileForWrite() throws IOException {
1831 mInjectedCurrentTimeLillis = 1000;
1832
1833 final File p10_1_1 = openIconFileForWriteAndGetPath(10, CALLING_PACKAGE_1);
1834 final File p10_1_2 = openIconFileForWriteAndGetPath(10, CALLING_PACKAGE_1);
1835
1836 final File p10_2_1 = openIconFileForWriteAndGetPath(10, CALLING_PACKAGE_2);
1837 final File p10_2_2 = openIconFileForWriteAndGetPath(10, CALLING_PACKAGE_2);
1838
1839 final File p11_1_1 = openIconFileForWriteAndGetPath(11, CALLING_PACKAGE_1);
1840 final File p11_1_2 = openIconFileForWriteAndGetPath(11, CALLING_PACKAGE_1);
1841
1842 mInjectedCurrentTimeLillis++;
1843
1844 final File p10_1_3 = openIconFileForWriteAndGetPath(10, CALLING_PACKAGE_1);
1845 final File p10_1_4 = openIconFileForWriteAndGetPath(10, CALLING_PACKAGE_1);
1846 final File p10_1_5 = openIconFileForWriteAndGetPath(10, CALLING_PACKAGE_1);
1847
1848 final File p10_2_3 = openIconFileForWriteAndGetPath(10, CALLING_PACKAGE_2);
1849 final File p11_1_3 = openIconFileForWriteAndGetPath(11, CALLING_PACKAGE_1);
1850
1851 // Make sure their paths are all unique
Makoto Onukid99c6f02016-03-28 11:02:54 -07001852 assertAllUnique(list(
Makoto Onuki55046222016-03-08 10:49:47 -08001853 p10_1_1,
1854 p10_1_2,
1855 p10_1_3,
1856 p10_1_4,
1857 p10_1_5,
1858
1859 p10_2_1,
1860 p10_2_2,
1861 p10_2_3,
1862
1863 p11_1_1,
1864 p11_1_2,
1865 p11_1_3
1866 ));
1867
1868 // Check each set has the same parent.
1869 assertEquals(p10_1_1.getParent(), p10_1_2.getParent());
1870 assertEquals(p10_1_1.getParent(), p10_1_3.getParent());
1871 assertEquals(p10_1_1.getParent(), p10_1_4.getParent());
1872 assertEquals(p10_1_1.getParent(), p10_1_5.getParent());
1873
1874 assertEquals(p10_2_1.getParent(), p10_2_2.getParent());
1875 assertEquals(p10_2_1.getParent(), p10_2_3.getParent());
1876
1877 assertEquals(p11_1_1.getParent(), p11_1_2.getParent());
1878 assertEquals(p11_1_1.getParent(), p11_1_3.getParent());
1879
1880 // Check the parents are still unique.
Makoto Onukid99c6f02016-03-28 11:02:54 -07001881 assertAllUnique(list(
Makoto Onuki55046222016-03-08 10:49:47 -08001882 p10_1_1.getParent(),
1883 p10_2_1.getParent(),
1884 p11_1_1.getParent()
1885 ));
1886
1887 // All files created at the same time for the same package/user, expcet for the first ones,
1888 // will have "_" in the path.
1889 assertFalse(p10_1_1.getName().contains("_"));
1890 assertTrue(p10_1_2.getName().contains("_"));
1891 assertFalse(p10_1_3.getName().contains("_"));
1892 assertTrue(p10_1_4.getName().contains("_"));
1893 assertTrue(p10_1_5.getName().contains("_"));
1894
1895 assertFalse(p10_2_1.getName().contains("_"));
1896 assertTrue(p10_2_2.getName().contains("_"));
1897 assertFalse(p10_2_3.getName().contains("_"));
1898
1899 assertFalse(p11_1_1.getName().contains("_"));
1900 assertTrue(p11_1_2.getName().contains("_"));
1901 assertFalse(p11_1_3.getName().contains("_"));
1902 }
1903
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001904 public void testUpdateShortcuts() {
1905 runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07001906 assertTrue(mManager.setDynamicShortcuts(list(
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001907 makeShortcut("s1"),
1908 makeShortcut("s2"),
1909 makeShortcut("s3"),
1910 makeShortcut("s4"),
1911 makeShortcut("s5")
1912 )));
1913 });
1914 runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07001915 assertTrue(mManager.setDynamicShortcuts(list(
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001916 makeShortcut("s1"),
1917 makeShortcut("s2"),
1918 makeShortcut("s3"),
1919 makeShortcut("s4"),
1920 makeShortcut("s5")
1921 )));
1922 });
1923 runWithCaller(LAUNCHER_1, UserHandle.USER_SYSTEM, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07001924 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s2", "s3"),
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001925 getCallingUser());
Makoto Onukid99c6f02016-03-28 11:02:54 -07001926 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("s4", "s5"),
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001927 getCallingUser());
1928 });
1929 runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
1930 mManager.deleteDynamicShortcut("s1");
1931 mManager.deleteDynamicShortcut("s2");
1932 });
1933 runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
1934 mManager.deleteDynamicShortcut("s1");
1935 mManager.deleteDynamicShortcut("s3");
1936 mManager.deleteDynamicShortcut("s5");
1937 });
1938 runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
1939 assertShortcutIds(assertAllDynamic(
1940 mManager.getDynamicShortcuts()),
1941 "s3", "s4", "s5");
1942 assertShortcutIds(assertAllPinned(
1943 mManager.getPinnedShortcuts()),
1944 "s2", "s3");
1945 });
1946 runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
1947 assertShortcutIds(assertAllDynamic(
1948 mManager.getDynamicShortcuts()),
1949 "s2", "s4");
1950 assertShortcutIds(assertAllPinned(
1951 mManager.getPinnedShortcuts()),
1952 "s4", "s5");
1953 });
1954
1955 runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
1956 ShortcutInfo s2 = makeShortcutBuilder()
1957 .setId("s2")
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07001958 .setIcon(Icon.createWithResource(getTestContext(), R.drawable.black_32x32))
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001959 .build();
1960
1961 ShortcutInfo s4 = makeShortcutBuilder()
1962 .setId("s4")
1963 .setTitle("new title")
1964 .build();
1965
Makoto Onukid99c6f02016-03-28 11:02:54 -07001966 mManager.updateShortcuts(list(s2, s4));
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001967 });
1968 runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
1969 ShortcutInfo s2 = makeShortcutBuilder()
1970 .setId("s2")
1971 .setIntent(makeIntent(Intent.ACTION_ANSWER, ShortcutActivity.class,
1972 "key1", "val1"))
1973 .build();
1974
1975 ShortcutInfo s4 = makeShortcutBuilder()
1976 .setId("s4")
1977 .setIntent(new Intent(Intent.ACTION_ALL_APPS))
1978 .build();
1979
Makoto Onukid99c6f02016-03-28 11:02:54 -07001980 mManager.updateShortcuts(list(s2, s4));
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08001981 });
1982
1983 runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
1984 assertShortcutIds(assertAllDynamic(
1985 mManager.getDynamicShortcuts()),
1986 "s3", "s4", "s5");
1987 assertShortcutIds(assertAllPinned(
1988 mManager.getPinnedShortcuts()),
1989 "s2", "s3");
1990
1991 ShortcutInfo s = getCallerShortcut("s2");
1992 assertTrue(s.hasIconResource());
1993 assertEquals(R.drawable.black_32x32, s.getIconResourceId());
1994 assertEquals("Title-s2", s.getTitle());
1995
1996 s = getCallerShortcut("s4");
1997 assertFalse(s.hasIconResource());
1998 assertEquals(0, s.getIconResourceId());
1999 assertEquals("new title", s.getTitle());
2000 });
2001 runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
2002 assertShortcutIds(assertAllDynamic(
2003 mManager.getDynamicShortcuts()),
2004 "s2", "s4");
2005 assertShortcutIds(assertAllPinned(
2006 mManager.getPinnedShortcuts()),
2007 "s4", "s5");
2008
2009 ShortcutInfo s = getCallerShortcut("s2");
2010 assertFalse(s.hasIconResource());
2011 assertEquals(0, s.getIconResourceId());
2012 assertEquals("Title-s2", s.getTitle());
2013 assertEquals(Intent.ACTION_ANSWER, s.getIntent().getAction());
2014 assertEquals(1, s.getIntent().getExtras().size());
2015
2016 s = getCallerShortcut("s4");
2017 assertFalse(s.hasIconResource());
2018 assertEquals(0, s.getIconResourceId());
2019 assertEquals("Title-s4", s.getTitle());
2020 assertEquals(Intent.ACTION_ALL_APPS, s.getIntent().getAction());
2021 assertBundleEmpty(s.getIntent().getExtras());
2022 });
2023 // TODO Check with other fields too.
2024
2025 // TODO Check bitmap removal too.
Makoto Onuki0acbb142016-03-22 17:02:57 -07002026
2027 runWithCaller(CALLING_PACKAGE_2, USER_11, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07002028 mManager.updateShortcuts(list());
Makoto Onuki0acbb142016-03-22 17:02:57 -07002029 });
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08002030 }
2031
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002032 // === Test for launcher side APIs ===
2033
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08002034 private static ShortcutQuery buildQuery(long changedSince,
2035 String packageName, ComponentName componentName,
2036 /* @ShortcutQuery.QueryFlags */ int flags) {
2037 final ShortcutQuery q = new ShortcutQuery();
2038 q.setChangedSince(changedSince);
2039 q.setPackage(packageName);
2040 q.setActivity(componentName);
2041 q.setQueryFlags(flags);
2042 return q;
2043 }
2044
Makoto Onuki2e210c42016-03-30 08:30:36 -07002045 private static ShortcutQuery buildAllQuery(String packageName) {
2046 final ShortcutQuery q = new ShortcutQuery();
2047 q.setPackage(packageName);
2048 q.setQueryFlags(ShortcutQuery.FLAG_GET_DYNAMIC | ShortcutQuery.FLAG_GET_PINNED);
2049 return q;
2050 }
2051
2052 private static ShortcutQuery buildPinnedQuery(String packageName) {
2053 final ShortcutQuery q = new ShortcutQuery();
2054 q.setPackage(packageName);
2055 q.setQueryFlags(ShortcutQuery.FLAG_GET_PINNED);
2056 return q;
2057 }
2058
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002059 public void testGetShortcuts() {
2060
2061 // Set up shortcuts.
2062
2063 setCaller(CALLING_PACKAGE_1);
2064 final ShortcutInfo s1_1 = makeShortcutWithTimestamp("s1", 5000);
2065 final ShortcutInfo s1_2 = makeShortcutWithTimestamp("s2", 1000);
2066
Makoto Onukid99c6f02016-03-28 11:02:54 -07002067 assertTrue(mManager.setDynamicShortcuts(list(s1_1, s1_2)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002068
2069 setCaller(CALLING_PACKAGE_2);
2070 final ShortcutInfo s2_2 = makeShortcutWithTimestamp("s2", 1500);
2071 final ShortcutInfo s2_3 = makeShortcutWithTimestamp("s3", 3000);
2072 final ShortcutInfo s2_4 = makeShortcutWithTimestamp("s4", 500);
Makoto Onukid99c6f02016-03-28 11:02:54 -07002073 assertTrue(mManager.setDynamicShortcuts(list(s2_2, s2_3, s2_4)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002074
2075 setCaller(CALLING_PACKAGE_3);
Makoto Onuki9da23fc2016-03-29 11:14:42 -07002076 final ShortcutInfo s3_2 = makeShortcutWithTimestamp("s3", START_TIME + 5000);
Makoto Onukid99c6f02016-03-28 11:02:54 -07002077 assertTrue(mManager.setDynamicShortcuts(list(s3_2)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002078
2079 setCaller(LAUNCHER_1);
2080
2081 // Get dynamic
2082 assertAllDynamic(assertAllHaveTitle(assertAllNotHaveIntents(assertShortcutIds(
Makoto Onuki55046222016-03-08 10:49:47 -08002083 assertAllNotKeyFieldsOnly(
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08002084 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2085 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), getCallingUser())),
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002086 "s1", "s2"))));
2087
2088 // Get pinned
2089 assertShortcutIds(
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08002090 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002091 /* activity =*/ null,
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08002092 ShortcutQuery.FLAG_GET_PINNED), getCallingUser())
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002093 /* none */);
2094
2095 // Get both, with timestamp
2096 assertAllDynamic(assertAllHaveTitle(assertAllNotHaveIntents(assertShortcutIds(
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08002097 assertAllNotKeyFieldsOnly(mLauncherApps.getShortcuts(buildQuery(
Makoto Onuki55046222016-03-08 10:49:47 -08002098 /* time =*/ 1000, CALLING_PACKAGE_2,
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002099 /* activity =*/ null,
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08002100 ShortcutQuery.FLAG_GET_PINNED | ShortcutQuery.FLAG_GET_DYNAMIC),
2101 getCallingUser())),
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002102 "s2", "s3"))));
2103
2104 // FLAG_GET_KEY_FIELDS_ONLY
2105 assertAllDynamic(assertAllNotHaveTitle(assertAllNotHaveIntents(assertShortcutIds(
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08002106 assertAllKeyFieldsOnly(mLauncherApps.getShortcuts(buildQuery(
Makoto Onuki55046222016-03-08 10:49:47 -08002107 /* time =*/ 1000, CALLING_PACKAGE_2,
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002108 /* activity =*/ null,
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08002109 ShortcutQuery.FLAG_GET_DYNAMIC | ShortcutQuery.FLAG_GET_KEY_FIELDS_ONLY),
2110 getCallingUser())),
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002111 "s2", "s3"))));
2112
2113 // Pin some shortcuts.
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08002114 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
Makoto Onukid99c6f02016-03-28 11:02:54 -07002115 list("s3", "s4"), getCallingUser());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002116
2117 // Pinned ones only
2118 assertAllPinned(assertAllHaveTitle(assertAllNotHaveIntents(assertShortcutIds(
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08002119 assertAllNotKeyFieldsOnly(mLauncherApps.getShortcuts(buildQuery(
Makoto Onuki55046222016-03-08 10:49:47 -08002120 /* time =*/ 1000, CALLING_PACKAGE_2,
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002121 /* activity =*/ null,
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08002122 ShortcutQuery.FLAG_GET_PINNED),
2123 getCallingUser())),
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002124 "s3"))));
2125
2126 // All packages.
Makoto Onuki55046222016-03-08 10:49:47 -08002127 assertShortcutIds(assertAllNotKeyFieldsOnly(
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08002128 mLauncherApps.getShortcuts(buildQuery(
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002129 /* time =*/ 5000, /* package= */ null,
2130 /* activity =*/ null,
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08002131 ShortcutQuery.FLAG_GET_DYNAMIC | ShortcutQuery.FLAG_GET_PINNED),
2132 getCallingUser())),
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002133 "s1", "s3");
2134
2135 // TODO More tests: pinned but dynamic, filter by activity
2136 }
2137
2138 public void testGetShortcutInfo() {
2139 // Create shortcuts.
2140 setCaller(CALLING_PACKAGE_1);
2141 final ShortcutInfo s1_1 = makeShortcut(
2142 "s1",
2143 "Title 1",
2144 makeComponent(ShortcutActivity.class),
2145 /* icon =*/ null,
2146 makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class,
2147 "key1", "val1", "nest", makeBundle("key", 123)),
2148 /* weight */ 10);
2149
2150 final ShortcutInfo s1_2 = makeShortcut(
2151 "s2",
2152 "Title 2",
2153 /* activity */ null,
2154 /* icon =*/ null,
2155 makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class),
2156 /* weight */ 12);
2157
Makoto Onukid99c6f02016-03-28 11:02:54 -07002158 assertTrue(mManager.setDynamicShortcuts(list(s1_1, s1_2)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002159 dumpsysOnLogcat();
2160
2161 setCaller(CALLING_PACKAGE_2);
2162 final ShortcutInfo s2_1 = makeShortcut(
2163 "s1",
2164 "ABC",
2165 makeComponent(ShortcutActivity2.class),
2166 /* icon =*/ null,
2167 makeIntent(Intent.ACTION_ANSWER, ShortcutActivity2.class,
2168 "key1", "val1", "nest", makeBundle("key", 123)),
2169 /* weight */ 10);
Makoto Onukid99c6f02016-03-28 11:02:54 -07002170 assertTrue(mManager.setDynamicShortcuts(list(s2_1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002171 dumpsysOnLogcat();
2172
2173 // Pin some.
2174 setCaller(LAUNCHER_1);
2175
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08002176 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
Makoto Onukid99c6f02016-03-28 11:02:54 -07002177 list("s2"), getCallingUser());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002178
2179 dumpsysOnLogcat();
2180
2181 // Delete some.
2182 setCaller(CALLING_PACKAGE_1);
2183 assertShortcutIds(mManager.getPinnedShortcuts(), "s2");
2184 mManager.deleteDynamicShortcut("s2");
2185 assertShortcutIds(mManager.getPinnedShortcuts(), "s2");
2186
2187 dumpsysOnLogcat();
2188
2189 setCaller(LAUNCHER_1);
2190 List<ShortcutInfo> list;
2191
2192 // Note we don't guarantee the orders.
2193 list = assertShortcutIds(assertAllHaveTitle(assertAllNotHaveIntents(
Makoto Onuki55046222016-03-08 10:49:47 -08002194 assertAllNotKeyFieldsOnly(
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08002195 mLauncherApps.getShortcutInfo(CALLING_PACKAGE_1,
Makoto Onukid99c6f02016-03-28 11:02:54 -07002196 list("s2", "s1", "s3", null), getCallingUser())))),
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002197 "s1", "s2");
2198 assertEquals("Title 1", findById(list, "s1").getTitle());
2199 assertEquals("Title 2", findById(list, "s2").getTitle());
2200
2201 assertShortcutIds(assertAllHaveTitle(assertAllNotHaveIntents(
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08002202 mLauncherApps.getShortcutInfo(CALLING_PACKAGE_1,
Makoto Onukid99c6f02016-03-28 11:02:54 -07002203 list("s3"), getCallingUser())))
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002204 /* none */);
2205
2206 list = assertShortcutIds(assertAllHaveTitle(assertAllNotHaveIntents(
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08002207 mLauncherApps.getShortcutInfo(CALLING_PACKAGE_2,
Makoto Onukid99c6f02016-03-28 11:02:54 -07002208 list("s1", "s2", "s3"), getCallingUser()))),
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002209 "s1");
2210 assertEquals("ABC", findById(list, "s1").getTitle());
2211 }
2212
2213 public void testPinShortcutAndGetPinnedShortcuts() {
2214 // Create some shortcuts.
Makoto Onukide667372016-03-15 14:29:20 -07002215 runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
2216 final ShortcutInfo s1_1 = makeShortcutWithTimestamp("s1", 1000);
2217 final ShortcutInfo s1_2 = makeShortcutWithTimestamp("s2", 2000);
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002218
Makoto Onukid99c6f02016-03-28 11:02:54 -07002219 assertTrue(mManager.setDynamicShortcuts(list(s1_1, s1_2)));
Makoto Onukide667372016-03-15 14:29:20 -07002220 });
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002221
Makoto Onukide667372016-03-15 14:29:20 -07002222 runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
2223 final ShortcutInfo s2_2 = makeShortcutWithTimestamp("s2", 1500);
2224 final ShortcutInfo s2_3 = makeShortcutWithTimestamp("s3", 3000);
2225 final ShortcutInfo s2_4 = makeShortcutWithTimestamp("s4", 500);
Makoto Onukid99c6f02016-03-28 11:02:54 -07002226 assertTrue(mManager.setDynamicShortcuts(list(s2_2, s2_3, s2_4)));
Makoto Onukide667372016-03-15 14:29:20 -07002227 });
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002228
Makoto Onukide667372016-03-15 14:29:20 -07002229 runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
2230 final ShortcutInfo s3_2 = makeShortcutWithTimestamp("s2", 1000);
Makoto Onukid99c6f02016-03-28 11:02:54 -07002231 assertTrue(mManager.setDynamicShortcuts(list(s3_2)));
Makoto Onukide667372016-03-15 14:29:20 -07002232 });
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002233
2234 // Pin some.
Makoto Onukide667372016-03-15 14:29:20 -07002235 runWithCaller(LAUNCHER_1, USER_0, () -> {
2236 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
Makoto Onukid99c6f02016-03-28 11:02:54 -07002237 list("s2", "s3"), getCallingUser());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002238
Makoto Onukide667372016-03-15 14:29:20 -07002239 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
Makoto Onukid99c6f02016-03-28 11:02:54 -07002240 list("s3", "s4", "s5"), getCallingUser());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002241
Makoto Onukide667372016-03-15 14:29:20 -07002242 mLauncherApps.pinShortcuts(CALLING_PACKAGE_3,
Makoto Onukid99c6f02016-03-28 11:02:54 -07002243 list("s3"), getCallingUser()); // Note ID doesn't exist
Makoto Onukide667372016-03-15 14:29:20 -07002244 });
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002245
2246 // Delete some.
Makoto Onukide667372016-03-15 14:29:20 -07002247 runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
2248 assertShortcutIds(mManager.getPinnedShortcuts(), "s2");
2249 mManager.deleteDynamicShortcut("s2");
2250 assertShortcutIds(mManager.getPinnedShortcuts(), "s2");
2251 });
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002252
Makoto Onukide667372016-03-15 14:29:20 -07002253 runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
2254 assertShortcutIds(mManager.getPinnedShortcuts(), "s3", "s4");
2255 mManager.deleteDynamicShortcut("s3");
2256 assertShortcutIds(mManager.getPinnedShortcuts(), "s3", "s4");
2257 });
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002258
Makoto Onukide667372016-03-15 14:29:20 -07002259 runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
2260 assertShortcutIds(mManager.getPinnedShortcuts() /* none */);
2261 mManager.deleteDynamicShortcut("s2");
2262 assertShortcutIds(mManager.getPinnedShortcuts() /* none */);
2263 });
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002264
2265 // Get pinned shortcuts from launcher
Makoto Onukide667372016-03-15 14:29:20 -07002266 runWithCaller(LAUNCHER_1, USER_0, () -> {
2267 // CALLING_PACKAGE_1 deleted s2, but it's pinned, so it still exists.
2268 assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
2269 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2270 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
2271 "s2");
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002272
Makoto Onukide667372016-03-15 14:29:20 -07002273 assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
2274 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2275 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
2276 "s3", "s4");
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002277
Makoto Onukide667372016-03-15 14:29:20 -07002278 assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
2279 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_3,
2280 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser())))
2281 /* none */);
2282 });
2283 }
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002284
Makoto Onukide667372016-03-15 14:29:20 -07002285 public void testPinShortcutAndGetPinnedShortcuts_multi() {
2286 // Create some shortcuts.
2287 runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07002288 assertTrue(mManager.setDynamicShortcuts(list(
Makoto Onukide667372016-03-15 14:29:20 -07002289 makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
2290 });
2291
2292 runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07002293 assertTrue(mManager.setDynamicShortcuts(list(
Makoto Onukide667372016-03-15 14:29:20 -07002294 makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
2295 });
2296
2297 dumpsysOnLogcat();
2298
2299 // Pin some.
2300 runWithCaller(LAUNCHER_1, USER_0, () -> {
2301 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
Makoto Onukid99c6f02016-03-28 11:02:54 -07002302 list("s3", "s4"), getCallingUser());
Makoto Onukide667372016-03-15 14:29:20 -07002303
2304 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
Makoto Onukid99c6f02016-03-28 11:02:54 -07002305 list("s1", "s2", "s4"), getCallingUser());
Makoto Onukide667372016-03-15 14:29:20 -07002306 });
2307
2308 dumpsysOnLogcat();
2309
2310 // Delete some.
2311 runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
2312 assertShortcutIds(mManager.getPinnedShortcuts(), "s3");
2313 mManager.deleteDynamicShortcut("s3");
2314 assertShortcutIds(mManager.getPinnedShortcuts(), "s3");
2315 });
2316
2317 dumpsysOnLogcat();
2318
2319 runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
2320 assertShortcutIds(mManager.getPinnedShortcuts(), "s1", "s2");
2321 mManager.deleteDynamicShortcut("s1");
2322 mManager.deleteDynamicShortcut("s3");
2323 assertShortcutIds(mManager.getPinnedShortcuts(), "s1", "s2");
2324 });
2325
2326 dumpsysOnLogcat();
2327
2328 // Get pinned shortcuts from launcher
2329 runWithCaller(LAUNCHER_1, USER_0, () -> {
2330 assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
2331 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2332 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
2333 "s3");
2334
2335 assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
2336 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2337 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
2338 "s1", "s2");
2339
2340 assertShortcutIds(assertAllDynamicOrPinned(
2341 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2342 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED
2343 | ShortcutQuery.FLAG_GET_DYNAMIC), getCallingUser())),
2344 "s1", "s2", "s3");
2345
2346 assertShortcutIds(assertAllDynamicOrPinned(
2347 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2348 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED
2349 | ShortcutQuery.FLAG_GET_DYNAMIC), getCallingUser())),
2350 "s1", "s2");
2351 });
2352
2353 dumpsysOnLogcat();
2354
2355 runWithCaller(LAUNCHER_2, USER_0, () -> {
2356 // Launcher2 still has no pinned ones.
2357 assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
2358 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2359 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser())))
2360 /* none */);
2361 assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
2362 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2363 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser())))
2364 /* none */);
2365
2366 assertShortcutIds(assertAllDynamic(
2367 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2368 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED
2369 | ShortcutQuery.FLAG_GET_DYNAMIC), getCallingUser())),
2370 "s1", "s2");
2371 assertShortcutIds(assertAllDynamic(
2372 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2373 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED
2374 | ShortcutQuery.FLAG_GET_DYNAMIC), getCallingUser())),
2375 "s2");
2376
2377 // Now pin some.
2378 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
Makoto Onukid99c6f02016-03-28 11:02:54 -07002379 list("s1", "s2"), getCallingUser());
Makoto Onukide667372016-03-15 14:29:20 -07002380
2381 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
Makoto Onukid99c6f02016-03-28 11:02:54 -07002382 list("s1", "s2"), getCallingUser());
Makoto Onukide667372016-03-15 14:29:20 -07002383
2384 assertShortcutIds(assertAllDynamic(
2385 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2386 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED
2387 | ShortcutQuery.FLAG_GET_DYNAMIC), getCallingUser())),
2388 "s1", "s2");
2389
2390 // S1 was not visible to it, so shouldn't be pinned.
2391 assertShortcutIds(assertAllDynamic(
2392 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2393 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED
2394 | ShortcutQuery.FLAG_GET_DYNAMIC), getCallingUser())),
2395 "s2");
2396 });
2397
2398 // Re-initialize and load from the files.
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07002399 mService.saveDirtyInfo();
Makoto Onukide667372016-03-15 14:29:20 -07002400 initService();
2401
Makoto Onuki0acbb142016-03-22 17:02:57 -07002402 // Load from file.
2403 mService.handleUnlockUser(USER_0);
2404
2405 // Make sure package info is restored too.
Makoto Onukide667372016-03-15 14:29:20 -07002406 runWithCaller(LAUNCHER_1, USER_0, () -> {
2407 assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
2408 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2409 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
2410 "s3");
2411 assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
2412 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2413 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
2414 "s1", "s2");
2415 });
2416 runWithCaller(LAUNCHER_2, USER_0, () -> {
2417 assertShortcutIds(assertAllDynamic(
2418 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2419 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED
2420 | ShortcutQuery.FLAG_GET_DYNAMIC), getCallingUser())),
2421 "s1", "s2");
2422 assertShortcutIds(assertAllDynamic(
2423 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2424 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED
2425 | ShortcutQuery.FLAG_GET_DYNAMIC), getCallingUser())),
2426 "s2");
2427 });
2428
2429 // Delete all dynamic.
2430 runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
2431 mManager.deleteAllDynamicShortcuts();
2432
2433 assertEquals(0, mManager.getDynamicShortcuts().size());
2434 assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()), "s1", "s2", "s3");
2435 });
2436 runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
2437 mManager.deleteAllDynamicShortcuts();
2438
2439 assertEquals(0, mManager.getDynamicShortcuts().size());
2440 assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()), "s2", "s1");
2441 });
2442
2443 runWithCaller(LAUNCHER_1, USER_0, () -> {
2444 assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
2445 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2446 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
2447 "s3");
2448
2449 assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
2450 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2451 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
2452 "s1", "s2");
2453
2454 // from all packages.
2455 assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
2456 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, null,
2457 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
2458 "s1", "s2", "s3");
2459
2460 // Update pined. Note s2 and s3 are actually available, but not visible to this
2461 // launcher, so still can't be pinned.
Makoto Onukid99c6f02016-03-28 11:02:54 -07002462 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s1", "s2", "s3", "s4"),
Makoto Onukide667372016-03-15 14:29:20 -07002463 getCallingUser());
2464
2465 assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
2466 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2467 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
2468 "s3");
2469 });
2470 // Re-publish s1.
2471 runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
2472 assertTrue(mManager.addDynamicShortcut(makeShortcut("s1")));
2473
2474 assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts()), "s1");
2475 assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()), "s1", "s2", "s3");
2476 });
2477 runWithCaller(LAUNCHER_1, USER_0, () -> {
2478 assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
2479 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2480 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
2481 "s3");
2482
2483 // Now "s1" is visible, so can be pinned.
Makoto Onukid99c6f02016-03-28 11:02:54 -07002484 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s1", "s2", "s3", "s4"),
Makoto Onukide667372016-03-15 14:29:20 -07002485 getCallingUser());
2486
2487 assertShortcutIds(assertAllPinned(assertAllNotKeyFieldsOnly(
2488 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2489 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()))),
2490 "s1", "s3");
2491 });
2492
2493 // Now clear pinned shortcuts. First, from launcher 1.
2494 runWithCaller(LAUNCHER_1, USER_0, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07002495 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list(), getCallingUser());
2496 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list(), getCallingUser());
Makoto Onukide667372016-03-15 14:29:20 -07002497
2498 assertEquals(0,
2499 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2500 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()).size());
2501 assertEquals(0,
2502 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2503 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()).size());
2504 });
2505 runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
2506 assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts()), "s1");
2507 assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()), "s1", "s2");
2508 });
2509 runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
2510 assertEquals(0, mManager.getDynamicShortcuts().size());
2511 assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()), "s2");
2512 });
2513
2514 // Clear all pins from launcher 2.
2515 runWithCaller(LAUNCHER_2, USER_0, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07002516 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list(), getCallingUser());
2517 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list(), getCallingUser());
Makoto Onukide667372016-03-15 14:29:20 -07002518
2519 assertEquals(0,
2520 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2521 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()).size());
2522 assertEquals(0,
2523 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2524 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), getCallingUser()).size());
2525 });
2526 runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
2527 assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts()), "s1");
2528 assertEquals(0, mManager.getPinnedShortcuts().size());
2529 });
2530 runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
2531 assertEquals(0, mManager.getDynamicShortcuts().size());
2532 assertEquals(0, mManager.getPinnedShortcuts().size());
2533 });
Makoto Onuki6f7362d92016-03-04 13:39:41 -08002534 }
2535
Makoto Onukid99c6f02016-03-28 11:02:54 -07002536 public void testPinShortcutAndGetPinnedShortcuts_crossProfile_plusLaunch() {
2537 // Create some shortcuts.
2538 runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
2539 assertTrue(mManager.setDynamicShortcuts(list(
2540 makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
2541 });
2542 runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
2543 assertTrue(mManager.setDynamicShortcuts(list(
2544 makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
2545 });
2546 runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
2547 assertTrue(mManager.setDynamicShortcuts(list(
2548 makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"),
2549 makeShortcut("s4"), makeShortcut("s5"), makeShortcut("s6"))));
2550 });
2551
2552 // Pin some shortcuts and see the result.
2553
2554 runWithCaller(LAUNCHER_1, USER_0, () -> {
2555 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
2556 list("s1"), HANDLE_USER_0);
2557
2558 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
2559 list("s1", "s2", "s3"), HANDLE_USER_0);
2560 });
2561
2562 runWithCaller(LAUNCHER_1, USER_P0, () -> {
2563 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
2564 list("s2"), HANDLE_USER_0);
2565
2566 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
2567 list("s2", "s3"), HANDLE_USER_0);
2568 });
2569
2570 runWithCaller(LAUNCHER_2, USER_P0, () -> {
2571 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
2572 list("s3"), HANDLE_USER_0);
2573
2574 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
2575 list("s3"), HANDLE_USER_0);
2576 });
2577
2578 runWithCaller(LAUNCHER_2, USER_10, () -> {
2579 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
2580 list("s1", "s2", "s3"), HANDLE_USER_10);
2581 });
2582
2583 // Cross profile pinning.
2584 final int PIN_AND_DYNAMIC = ShortcutQuery.FLAG_GET_PINNED | ShortcutQuery.FLAG_GET_DYNAMIC;
2585
2586 runWithCaller(LAUNCHER_1, USER_0, () -> {
2587 assertShortcutIds(assertAllPinned(
2588 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2589 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
2590 "s1");
2591 assertShortcutIds(assertAllDynamic(
2592 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2593 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
2594 "s1", "s2", "s3");
2595 assertShortcutIds(assertAllDynamicOrPinned(
2596 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2597 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
2598 "s1", "s2", "s3");
2599
2600 assertShortcutIds(assertAllPinned(
2601 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2602 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
2603 "s1", "s2", "s3");
2604 assertShortcutIds(assertAllDynamic(
2605 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2606 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
2607 "s1", "s2", "s3");
2608 assertShortcutIds(assertAllDynamicOrPinned(
2609 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2610 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
2611 "s1", "s2", "s3");
2612
2613 assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
2614 assertShortcutLaunchable(CALLING_PACKAGE_1, "s2", USER_0);
2615 assertShortcutLaunchable(CALLING_PACKAGE_1, "s3", USER_0);
2616
2617 assertShortcutLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
2618 assertShortcutLaunchable(CALLING_PACKAGE_2, "s2", USER_0);
2619 assertShortcutLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
2620
2621 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s1", USER_10);
2622 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_10);
2623 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_10);
2624 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s4", USER_10);
2625 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s5", USER_10);
2626 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s6", USER_10);
2627 });
2628 runWithCaller(LAUNCHER_1, USER_P0, () -> {
2629 assertShortcutIds(assertAllPinned(
2630 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2631 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
2632 "s2");
2633 assertShortcutIds(assertAllDynamic(
2634 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2635 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
2636 "s1", "s2", "s3");
2637 assertShortcutIds(assertAllDynamicOrPinned(
2638 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2639 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
2640 "s1", "s2", "s3");
2641
2642 assertShortcutIds(assertAllPinned(
2643 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2644 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
2645 "s2", "s3");
2646 assertShortcutIds(assertAllDynamic(
2647 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2648 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
2649 "s1", "s2", "s3");
2650 assertShortcutIds(assertAllDynamicOrPinned(
2651 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2652 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
2653 "s1", "s2", "s3");
2654
2655 assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
2656 assertShortcutLaunchable(CALLING_PACKAGE_1, "s2", USER_0);
2657 assertShortcutLaunchable(CALLING_PACKAGE_1, "s3", USER_0);
2658
2659 assertShortcutLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
2660 assertShortcutLaunchable(CALLING_PACKAGE_2, "s2", USER_0);
2661 assertShortcutLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
2662
2663 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s1", USER_10);
2664 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_10);
2665 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_10);
2666 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s4", USER_10);
2667 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s5", USER_10);
2668 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s6", USER_10);
2669 });
2670 runWithCaller(LAUNCHER_2, USER_P0, () -> {
2671 assertShortcutIds(assertAllPinned(
2672 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2673 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
2674 "s3");
2675 assertShortcutIds(assertAllDynamic(
2676 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2677 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
2678 "s1", "s2", "s3");
2679 assertShortcutIds(assertAllDynamicOrPinned(
2680 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2681 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
2682 "s1", "s2", "s3");
2683
2684 assertShortcutIds(assertAllPinned(
2685 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2686 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
2687 "s3");
2688 assertShortcutIds(assertAllDynamic(
2689 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2690 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
2691 "s1", "s2", "s3");
2692 assertShortcutIds(assertAllDynamicOrPinned(
2693 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2694 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
2695 "s1", "s2", "s3");
2696
2697 assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
2698 assertShortcutLaunchable(CALLING_PACKAGE_1, "s2", USER_0);
2699 assertShortcutLaunchable(CALLING_PACKAGE_1, "s3", USER_0);
2700
2701 assertShortcutLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
2702 assertShortcutLaunchable(CALLING_PACKAGE_2, "s2", USER_0);
2703 assertShortcutLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
2704
2705 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s1", USER_10);
2706 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_10);
2707 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_10);
2708 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s4", USER_10);
2709 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s5", USER_10);
2710 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s6", USER_10);
2711 });
2712 runWithCaller(LAUNCHER_2, USER_10, () -> {
2713 assertShortcutIds(assertAllPinned(
2714 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2715 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_10)),
2716 "s1", "s2", "s3");
2717 assertShortcutIds(assertAllDynamic(
2718 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2719 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_10)),
2720 "s1", "s2", "s3", "s4", "s5", "s6");
2721 assertShortcutIds(assertAllDynamicOrPinned(
2722 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2723 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_10)),
2724 "s1", "s2", "s3", "s4", "s5", "s6");
2725 });
2726
2727 // Remove some dynamic shortcuts.
2728
2729 runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
2730 assertTrue(mManager.setDynamicShortcuts(list(
2731 makeShortcut("s1"))));
2732 });
2733 runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
2734 assertTrue(mManager.setDynamicShortcuts(list(
2735 makeShortcut("s1"))));
2736 });
2737 runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
2738 assertTrue(mManager.setDynamicShortcuts(list(
2739 makeShortcut("s1"))));
2740 });
2741
2742 runWithCaller(LAUNCHER_1, USER_0, () -> {
2743 assertShortcutIds(assertAllPinned(
2744 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2745 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
2746 "s1");
2747 assertShortcutIds(assertAllDynamic(
2748 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2749 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
2750 "s1");
2751 assertShortcutIds(assertAllDynamicOrPinned(
2752 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2753 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
2754 "s1");
2755
2756 assertShortcutIds(assertAllPinned(
2757 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2758 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
2759 "s1", "s2", "s3");
2760 assertShortcutIds(assertAllDynamic(
2761 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2762 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
2763 "s1");
2764 assertShortcutIds(assertAllDynamicOrPinned(
2765 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2766 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
2767 "s1", "s2", "s3");
2768
2769 assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
2770 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_0);
2771 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_0);
2772
2773 assertShortcutLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
2774 assertShortcutLaunchable(CALLING_PACKAGE_2, "s2", USER_0);
2775 assertShortcutLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
2776
2777 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s1", USER_10);
2778 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_10);
2779 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_10);
2780 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s4", USER_10);
2781 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s5", USER_10);
2782 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s6", USER_10);
2783 });
2784 runWithCaller(LAUNCHER_1, USER_P0, () -> {
2785 assertShortcutIds(assertAllPinned(
2786 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2787 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
2788 "s2");
2789 assertShortcutIds(assertAllDynamic(
2790 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2791 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
2792 "s1");
2793 assertShortcutIds(assertAllDynamicOrPinned(
2794 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2795 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
2796 "s1", "s2");
2797
2798 assertShortcutIds(assertAllPinned(
2799 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2800 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
2801 "s2", "s3");
2802 assertShortcutIds(assertAllDynamic(
2803 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2804 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
2805 "s1");
2806 assertShortcutIds(assertAllDynamicOrPinned(
2807 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2808 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
2809 "s1", "s2", "s3");
2810
2811 assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
2812 assertShortcutLaunchable(CALLING_PACKAGE_1, "s2", USER_0);
2813 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_0);
2814
2815 assertShortcutLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
2816 assertShortcutLaunchable(CALLING_PACKAGE_2, "s2", USER_0);
2817 assertShortcutLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
2818
2819 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s1", USER_10);
2820 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_10);
2821 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_10);
2822 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s4", USER_10);
2823 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s5", USER_10);
2824 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s6", USER_10);
2825 });
2826 runWithCaller(LAUNCHER_2, USER_P0, () -> {
2827 assertShortcutIds(assertAllPinned(
2828 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2829 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
2830 "s3");
2831 assertShortcutIds(assertAllDynamic(
2832 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2833 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
2834 "s1");
2835 assertShortcutIds(assertAllDynamicOrPinned(
2836 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2837 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
2838 "s1", "s3");
2839
2840 assertShortcutIds(assertAllPinned(
2841 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2842 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
2843 "s3");
2844 assertShortcutIds(assertAllDynamic(
2845 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2846 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
2847 "s1");
2848 assertShortcutIds(assertAllDynamicOrPinned(
2849 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2850 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
2851 "s1", "s3");
2852
2853 assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
2854 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_0);
2855 assertShortcutLaunchable(CALLING_PACKAGE_1, "s3", USER_0);
2856
2857 assertShortcutLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
2858 assertShortcutNotLaunchable(CALLING_PACKAGE_2, "s2", USER_0);
2859 assertShortcutLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
2860
2861 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s1", USER_10);
2862 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_10);
2863 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_10);
2864 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s4", USER_10);
2865 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s5", USER_10);
2866 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s6", USER_10);
2867 });
2868 runWithCaller(LAUNCHER_2, USER_10, () -> {
2869 assertShortcutIds(assertAllPinned(
2870 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2871 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_10)),
2872 "s1", "s2", "s3");
2873 assertShortcutIds(assertAllDynamic(
2874 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2875 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_10)),
2876 "s1");
2877 assertShortcutIds(assertAllDynamicOrPinned(
2878 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2879 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_10)),
2880 "s1", "s2", "s3");
2881
2882 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
2883 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_0);
2884 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_0);
2885
2886 assertShortcutNotLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
2887 assertShortcutNotLaunchable(CALLING_PACKAGE_2, "s2", USER_0);
2888 assertShortcutNotLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
2889
2890 assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_10);
2891 assertShortcutLaunchable(CALLING_PACKAGE_1, "s2", USER_10);
2892 assertShortcutLaunchable(CALLING_PACKAGE_1, "s3", USER_10);
2893 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s4", USER_10);
2894 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s5", USER_10);
2895 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s6", USER_10);
2896 });
2897
2898 // Save & load and make sure we still have the same information.
2899 mService.saveDirtyInfo();
2900 initService();
2901 mService.handleUnlockUser(USER_0);
2902
2903 runWithCaller(LAUNCHER_1, USER_0, () -> {
2904 assertShortcutIds(assertAllPinned(
2905 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2906 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
2907 "s1");
2908 assertShortcutIds(assertAllDynamic(
2909 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2910 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
2911 "s1");
2912 assertShortcutIds(assertAllDynamicOrPinned(
2913 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2914 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
2915 "s1");
2916
2917 assertShortcutIds(assertAllPinned(
2918 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2919 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
2920 "s1", "s2", "s3");
2921 assertShortcutIds(assertAllDynamic(
2922 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2923 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
2924 "s1");
2925 assertShortcutIds(assertAllDynamicOrPinned(
2926 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2927 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
2928 "s1", "s2", "s3");
2929
2930 assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
2931 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_0);
2932 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_0);
2933
2934 assertShortcutLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
2935 assertShortcutLaunchable(CALLING_PACKAGE_2, "s2", USER_0);
2936 assertShortcutLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
2937
2938 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s1", USER_10);
2939 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_10);
2940 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_10);
2941 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s4", USER_10);
2942 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s5", USER_10);
2943 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s6", USER_10);
2944 });
2945 runWithCaller(LAUNCHER_1, USER_P0, () -> {
2946 assertShortcutIds(assertAllPinned(
2947 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2948 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
2949 "s2");
2950 assertShortcutIds(assertAllDynamic(
2951 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2952 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
2953 "s1");
2954 assertShortcutIds(assertAllDynamicOrPinned(
2955 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2956 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
2957 "s1", "s2");
2958
2959 assertShortcutIds(assertAllPinned(
2960 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2961 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
2962 "s2", "s3");
2963 assertShortcutIds(assertAllDynamic(
2964 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2965 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
2966 "s1");
2967 assertShortcutIds(assertAllDynamicOrPinned(
2968 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
2969 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
2970 "s1", "s2", "s3");
2971
2972 assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
2973 assertShortcutLaunchable(CALLING_PACKAGE_1, "s2", USER_0);
2974 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_0);
2975
2976 assertShortcutLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
2977 assertShortcutLaunchable(CALLING_PACKAGE_2, "s2", USER_0);
2978 assertShortcutLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
2979
2980 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s1", USER_10);
2981 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_10);
2982 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_10);
2983 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s4", USER_10);
2984 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s5", USER_10);
2985 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s6", USER_10);
2986 });
2987 runWithCaller(LAUNCHER_2, USER_P0, () -> {
2988 assertShortcutIds(assertAllPinned(
2989 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2990 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
2991 "s3");
2992 assertShortcutIds(assertAllDynamic(
2993 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2994 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
2995 "s1");
2996 assertShortcutIds(assertAllDynamicOrPinned(
2997 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_1,
2998 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
2999 "s1", "s3");
3000
3001 assertShortcutIds(assertAllPinned(
3002 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
3003 /* activity =*/ null, ShortcutQuery.FLAG_GET_PINNED), HANDLE_USER_0)),
3004 "s3");
3005 assertShortcutIds(assertAllDynamic(
3006 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
3007 /* activity =*/ null, ShortcutQuery.FLAG_GET_DYNAMIC), HANDLE_USER_0)),
3008 "s1");
3009 assertShortcutIds(assertAllDynamicOrPinned(
3010 mLauncherApps.getShortcuts(buildQuery(/* time =*/ 0, CALLING_PACKAGE_2,
3011 /* activity =*/ null, PIN_AND_DYNAMIC), HANDLE_USER_0)),
3012 "s1", "s3");
3013
3014 assertShortcutLaunchable(CALLING_PACKAGE_1, "s1", USER_0);
3015 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_0);
3016 assertShortcutLaunchable(CALLING_PACKAGE_1, "s3", USER_0);
3017
3018 assertShortcutLaunchable(CALLING_PACKAGE_2, "s1", USER_0);
3019 assertShortcutNotLaunchable(CALLING_PACKAGE_2, "s2", USER_0);
3020 assertShortcutLaunchable(CALLING_PACKAGE_2, "s3", USER_0);
3021
3022 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s1", USER_10);
3023 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s2", USER_10);
3024 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s3", USER_10);
3025 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s4", USER_10);
3026 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s5", USER_10);
3027 assertShortcutNotLaunchable(CALLING_PACKAGE_1, "s6", USER_10);
3028 });
3029 }
3030
3031 public void testStartShortcut() {
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003032 // Create some shortcuts.
3033 setCaller(CALLING_PACKAGE_1);
3034 final ShortcutInfo s1_1 = makeShortcut(
3035 "s1",
3036 "Title 1",
3037 makeComponent(ShortcutActivity.class),
3038 /* icon =*/ null,
3039 makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class,
3040 "key1", "val1", "nest", makeBundle("key", 123)),
3041 /* weight */ 10);
3042
3043 final ShortcutInfo s1_2 = makeShortcut(
3044 "s2",
3045 "Title 2",
3046 /* activity */ null,
3047 /* icon =*/ null,
3048 makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class),
3049 /* weight */ 12);
3050
Makoto Onukid99c6f02016-03-28 11:02:54 -07003051 assertTrue(mManager.setDynamicShortcuts(list(s1_1, s1_2)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003052
3053 setCaller(CALLING_PACKAGE_2);
3054 final ShortcutInfo s2_1 = makeShortcut(
3055 "s1",
3056 "ABC",
3057 makeComponent(ShortcutActivity.class),
3058 /* icon =*/ null,
3059 makeIntent(Intent.ACTION_ANSWER, ShortcutActivity.class,
3060 "key1", "val1", "nest", makeBundle("key", 123)),
3061 /* weight */ 10);
Makoto Onukid99c6f02016-03-28 11:02:54 -07003062 assertTrue(mManager.setDynamicShortcuts(list(s2_1)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003063
3064 // Pin all.
3065 setCaller(LAUNCHER_1);
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08003066 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
Makoto Onukid99c6f02016-03-28 11:02:54 -07003067 list("s1", "s2"), getCallingUser());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003068
Makoto Onuki7a6a05f2016-03-10 17:01:08 -08003069 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
Makoto Onukid99c6f02016-03-28 11:02:54 -07003070 list("s1"), getCallingUser());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003071
3072 // Just to make it complicated, delete some.
3073 setCaller(CALLING_PACKAGE_1);
3074 mManager.deleteDynamicShortcut("s2");
3075
3076 // intent and check.
3077 setCaller(LAUNCHER_1);
Makoto Onukid99c6f02016-03-28 11:02:54 -07003078
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003079 Intent intent;
Makoto Onukid99c6f02016-03-28 11:02:54 -07003080 intent = launchShortcutAndGetIntent(CALLING_PACKAGE_1, "s1", USER_0);
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003081 assertEquals(ShortcutActivity2.class.getName(), intent.getComponent().getClassName());
3082
Makoto Onukid99c6f02016-03-28 11:02:54 -07003083
3084 intent = launchShortcutAndGetIntent(CALLING_PACKAGE_1, "s2", USER_0);
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003085 assertEquals(ShortcutActivity3.class.getName(), intent.getComponent().getClassName());
3086
Makoto Onukid99c6f02016-03-28 11:02:54 -07003087 intent = launchShortcutAndGetIntent(CALLING_PACKAGE_2, "s1", USER_0);
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003088 assertEquals(ShortcutActivity.class.getName(), intent.getComponent().getClassName());
3089
3090 // TODO Check extra, etc
3091 }
3092
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07003093 public void testLauncherCallback() throws Throwable {
Makoto Onukide667372016-03-15 14:29:20 -07003094 LauncherApps.Callback c0 = mock(LauncherApps.Callback.class);
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07003095
3096 // Set listeners
3097
3098 runWithCaller(LAUNCHER_1, USER_0, () -> {
3099 mLauncherApps.registerCallback(c0, new Handler(Looper.getMainLooper()));
3100 });
3101
3102 runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07003103 assertTrue(mManager.setDynamicShortcuts(list(
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07003104 makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
3105 });
3106
3107 waitOnMainThread();
3108 ArgumentCaptor<List> shortcuts = ArgumentCaptor.forClass(List.class);
3109 verify(c0).onShortcutsChanged(
3110 eq(CALLING_PACKAGE_1),
3111 shortcuts.capture(),
Makoto Onukid99c6f02016-03-28 11:02:54 -07003112 eq(HANDLE_USER_0)
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07003113 );
3114 assertShortcutIds(assertAllDynamic(shortcuts.getValue()),
3115 "s1", "s2", "s3");
3116
3117 // From different package.
3118 reset(c0);
3119 runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07003120 assertTrue(mManager.setDynamicShortcuts(list(
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07003121 makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
3122 });
3123 waitOnMainThread();
3124 shortcuts = ArgumentCaptor.forClass(List.class);
3125 verify(c0).onShortcutsChanged(
3126 eq(CALLING_PACKAGE_2),
3127 shortcuts.capture(),
Makoto Onukid99c6f02016-03-28 11:02:54 -07003128 eq(HANDLE_USER_0)
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07003129 );
3130 assertShortcutIds(assertAllDynamic(shortcuts.getValue()),
3131 "s1", "s2", "s3");
3132
3133 // Different user, callback shouldn't be called.
3134 reset(c0);
3135 runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07003136 assertTrue(mManager.setDynamicShortcuts(list(
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07003137 makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
3138 });
3139 waitOnMainThread();
3140 verify(c0, times(0)).onShortcutsChanged(
3141 anyString(),
3142 any(List.class),
3143 any(UserHandle.class)
3144 );
3145
3146 // Test for addDynamicShortcut.
3147 reset(c0);
3148 runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
Makoto Onukiac214972016-04-04 10:19:45 -07003149 dumpsysOnLogcat("before addDynamicShortcut");
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07003150 assertTrue(mManager.addDynamicShortcut(makeShortcut("s4")));
3151 });
3152
3153 waitOnMainThread();
3154 shortcuts = ArgumentCaptor.forClass(List.class);
3155 verify(c0).onShortcutsChanged(
3156 eq(CALLING_PACKAGE_1),
3157 shortcuts.capture(),
Makoto Onukid99c6f02016-03-28 11:02:54 -07003158 eq(HANDLE_USER_0)
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07003159 );
3160 assertShortcutIds(assertAllDynamic(shortcuts.getValue()),
3161 "s1", "s2", "s3", "s4");
3162
3163 // Test for remove
3164 reset(c0);
3165 runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
3166 mManager.deleteDynamicShortcut("s1");
3167 });
3168
3169 waitOnMainThread();
3170 shortcuts = ArgumentCaptor.forClass(List.class);
3171 verify(c0).onShortcutsChanged(
3172 eq(CALLING_PACKAGE_1),
3173 shortcuts.capture(),
Makoto Onukid99c6f02016-03-28 11:02:54 -07003174 eq(HANDLE_USER_0)
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07003175 );
3176 assertShortcutIds(assertAllDynamic(shortcuts.getValue()),
3177 "s2", "s3", "s4");
3178
3179 // Test for update
3180 reset(c0);
3181 runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07003182 assertTrue(mManager.updateShortcuts(list(
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07003183 makeShortcut("s1"), makeShortcut("s2"))));
3184 });
3185
3186 waitOnMainThread();
3187 shortcuts = ArgumentCaptor.forClass(List.class);
3188 verify(c0).onShortcutsChanged(
3189 eq(CALLING_PACKAGE_1),
3190 shortcuts.capture(),
Makoto Onukid99c6f02016-03-28 11:02:54 -07003191 eq(HANDLE_USER_0)
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07003192 );
3193 assertShortcutIds(assertAllDynamic(shortcuts.getValue()),
3194 "s2", "s3", "s4");
3195
3196 // Test for deleteAll
3197 reset(c0);
3198 runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
3199 mManager.deleteAllDynamicShortcuts();
3200 });
3201
3202 waitOnMainThread();
3203 shortcuts = ArgumentCaptor.forClass(List.class);
3204 verify(c0).onShortcutsChanged(
3205 eq(CALLING_PACKAGE_1),
3206 shortcuts.capture(),
Makoto Onukid99c6f02016-03-28 11:02:54 -07003207 eq(HANDLE_USER_0)
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07003208 );
3209 assertEquals(0, shortcuts.getValue().size());
Makoto Onukicdc78f72016-03-21 15:47:52 -07003210
3211 // Remove CALLING_PACKAGE_2
3212 reset(c0);
Makoto Onuki2e210c42016-03-30 08:30:36 -07003213 uninstallPackage(USER_0, CALLING_PACKAGE_2);
Makoto Onukid99c6f02016-03-28 11:02:54 -07003214 mService.cleanUpPackageLocked(CALLING_PACKAGE_2, USER_0, USER_0);
Makoto Onukicdc78f72016-03-21 15:47:52 -07003215
3216 // Should get a callback with an empty list.
3217 waitOnMainThread();
3218 shortcuts = ArgumentCaptor.forClass(List.class);
3219 verify(c0).onShortcutsChanged(
3220 eq(CALLING_PACKAGE_2),
3221 shortcuts.capture(),
Makoto Onukid99c6f02016-03-28 11:02:54 -07003222 eq(HANDLE_USER_0)
Makoto Onukicdc78f72016-03-21 15:47:52 -07003223 );
3224 assertEquals(0, shortcuts.getValue().size());
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07003225 }
3226
Makoto Onukiac214972016-04-04 10:19:45 -07003227 private void assertCallbackNotReceived(LauncherApps.Callback mock) {
3228 verify(mock, times(0)).onShortcutsChanged(anyString(), anyList(),
3229 any(UserHandle.class));
3230 }
3231
3232 private void assertCallbackReceived(LauncherApps.Callback mock,
3233 UserHandle user, String packageName, String... ids) {
3234 ArgumentCaptor<List> shortcutsCaptor = ArgumentCaptor.forClass(List.class);
3235
3236 verify(mock, times(1)).onShortcutsChanged(eq(packageName), shortcutsCaptor.capture(),
3237 eq(user));
3238 assertShortcutIds(shortcutsCaptor.getValue(), ids);
3239 }
3240
3241 public void testLauncherCallback_crossProfile() throws Throwable {
3242 prepareCrossProfileDataSet();
3243
3244 final Handler h = new Handler(Looper.getMainLooper());
3245
3246 final LauncherApps.Callback c0_1 = mock(LauncherApps.Callback.class);
3247 final LauncherApps.Callback c0_2 = mock(LauncherApps.Callback.class);
3248 final LauncherApps.Callback c0_3 = mock(LauncherApps.Callback.class);
3249 final LauncherApps.Callback c0_4 = mock(LauncherApps.Callback.class);
3250
3251 final LauncherApps.Callback cP0_1 = mock(LauncherApps.Callback.class);
3252 final LauncherApps.Callback c10_1 = mock(LauncherApps.Callback.class);
3253 final LauncherApps.Callback c10_2 = mock(LauncherApps.Callback.class);
3254 final LauncherApps.Callback c11_1 = mock(LauncherApps.Callback.class);
3255
3256 final List<LauncherApps.Callback> all =
3257 list(c0_1, c0_2, c0_3, c0_4, cP0_1, c10_1, c11_1);
3258
3259 setDefaultLauncherChecker((pkg, userId) -> {
3260 switch (userId) {
3261 case USER_0:
3262 return LAUNCHER_2.equals(pkg);
3263 case USER_P0:
3264 return LAUNCHER_1.equals(pkg);
3265 case USER_10:
3266 return LAUNCHER_1.equals(pkg);
3267 case USER_11:
3268 return LAUNCHER_1.equals(pkg);
3269 default:
3270 return false;
3271 }
3272 });
3273
3274 runWithCaller(LAUNCHER_1, USER_0, () -> mLauncherApps.registerCallback(c0_1, h));
3275 runWithCaller(LAUNCHER_2, USER_0, () -> mLauncherApps.registerCallback(c0_2, h));
3276 runWithCaller(LAUNCHER_3, USER_0, () -> mLauncherApps.registerCallback(c0_3, h));
3277 runWithCaller(LAUNCHER_4, USER_0, () -> mLauncherApps.registerCallback(c0_4, h));
3278 runWithCaller(LAUNCHER_1, USER_P0, () -> mLauncherApps.registerCallback(cP0_1, h));
3279 runWithCaller(LAUNCHER_1, USER_10, () -> mLauncherApps.registerCallback(c10_1, h));
3280 runWithCaller(LAUNCHER_2, USER_10, () -> mLauncherApps.registerCallback(c10_2, h));
3281 runWithCaller(LAUNCHER_1, USER_11, () -> mLauncherApps.registerCallback(c11_1, h));
3282
3283 // User 0.
3284
3285 resetAll(all);
3286 runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
3287 mManager.deleteDynamicShortcut("x");
3288 });
3289 waitOnMainThread();
3290
3291 assertCallbackNotReceived(c0_1);
3292 assertCallbackNotReceived(c0_3);
3293 assertCallbackNotReceived(c0_4);
3294 assertCallbackNotReceived(c10_1);
3295 assertCallbackNotReceived(c10_2);
3296 assertCallbackNotReceived(c11_1);
3297 assertCallbackReceived(c0_2, HANDLE_USER_0, CALLING_PACKAGE_1, "s1", "s2", "s3");
3298 assertCallbackReceived(cP0_1, HANDLE_USER_0, CALLING_PACKAGE_1, "s1", "s2", "s3", "s4");
3299
3300 // User 0, different package.
3301
3302 resetAll(all);
3303 runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
3304 mManager.deleteDynamicShortcut("x");
3305 });
3306 waitOnMainThread();
3307
3308 assertCallbackNotReceived(c0_1);
3309 assertCallbackNotReceived(c0_3);
3310 assertCallbackNotReceived(c0_4);
3311 assertCallbackNotReceived(c10_1);
3312 assertCallbackNotReceived(c10_2);
3313 assertCallbackNotReceived(c11_1);
3314 assertCallbackReceived(c0_2, HANDLE_USER_0, CALLING_PACKAGE_3, "s1", "s2", "s3", "s4");
3315 assertCallbackReceived(cP0_1, HANDLE_USER_0, CALLING_PACKAGE_3,
3316 "s1", "s2", "s3", "s4", "s5", "s6");
3317
3318 // Work profile, but not running, so don't send notifications.
3319
3320 resetAll(all);
3321 runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
3322 mManager.deleteDynamicShortcut("x");
3323 });
3324 waitOnMainThread();
3325
3326 assertCallbackNotReceived(c0_1);
3327 assertCallbackNotReceived(c0_2);
3328 assertCallbackNotReceived(c0_3);
3329 assertCallbackNotReceived(c0_4);
3330 assertCallbackNotReceived(cP0_1);
3331 assertCallbackNotReceived(c10_1);
3332 assertCallbackNotReceived(c10_2);
3333 assertCallbackNotReceived(c11_1);
3334
3335 // Work profile, now running.
3336
3337 when(mMockUserManager.isUserRunning(anyInt())).thenReturn(false);
3338 when(mMockUserManager.isUserRunning(eq(USER_P0))).thenReturn(true);
3339
3340 resetAll(all);
3341 runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
3342 mManager.deleteDynamicShortcut("x");
3343 });
3344 waitOnMainThread();
3345
3346 assertCallbackNotReceived(c0_1);
3347 assertCallbackNotReceived(c0_3);
3348 assertCallbackNotReceived(c0_4);
3349 assertCallbackNotReceived(c10_1);
3350 assertCallbackNotReceived(c10_2);
3351 assertCallbackNotReceived(c11_1);
3352 assertCallbackReceived(c0_2, HANDLE_USER_P0, CALLING_PACKAGE_1, "s1", "s2", "s3", "s5");
3353 assertCallbackReceived(cP0_1, HANDLE_USER_P0, CALLING_PACKAGE_1, "s1", "s2", "s3", "s4");
3354
3355 // Normal secondary user.
3356
3357 when(mMockUserManager.isUserRunning(anyInt())).thenReturn(false);
3358 when(mMockUserManager.isUserRunning(eq(USER_10))).thenReturn(true);
3359
3360 resetAll(all);
3361 runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
3362 mManager.deleteDynamicShortcut("x");
3363 });
3364 waitOnMainThread();
3365
3366 assertCallbackNotReceived(c0_1);
3367 assertCallbackNotReceived(c0_2);
3368 assertCallbackNotReceived(c0_3);
3369 assertCallbackNotReceived(c0_4);
3370 assertCallbackNotReceived(cP0_1);
3371 assertCallbackNotReceived(c10_2);
3372 assertCallbackNotReceived(c11_1);
3373 assertCallbackReceived(c10_1, HANDLE_USER_10, CALLING_PACKAGE_1,
3374 "x1", "x2", "x3", "x4", "x5");
3375 }
3376
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003377 // === Test for persisting ===
3378
3379 public void testSaveAndLoadUser_empty() {
Makoto Onukid99c6f02016-03-28 11:02:54 -07003380 assertTrue(mManager.setDynamicShortcuts(list()));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003381
3382 Log.i(TAG, "Saved state");
3383 dumpsysOnLogcat();
3384 dumpUserFile(0);
3385
3386 // Restore.
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07003387 mService.saveDirtyInfo();
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003388 initService();
3389
3390 assertEquals(0, mManager.getDynamicShortcuts().size());
3391 }
3392
3393 /**
3394 * Try save and load, also stop/start the user.
3395 */
3396 public void testSaveAndLoadUser() {
3397 // First, create some shortcuts and save.
Makoto Onuki41066a62016-03-09 16:18:44 -08003398 runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07003399 final Icon icon1 = Icon.createWithResource(getTestContext(), R.drawable.black_64x16);
Makoto Onuki41066a62016-03-09 16:18:44 -08003400 final Icon icon2 = Icon.createWithBitmap(BitmapFactory.decodeResource(
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07003401 getTestContext().getResources(), R.drawable.icon2));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003402
Makoto Onuki41066a62016-03-09 16:18:44 -08003403 final ShortcutInfo si1 = makeShortcut(
3404 "s1",
3405 "title1-1",
3406 makeComponent(ShortcutActivity.class),
3407 icon1,
3408 makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class,
3409 "key1", "val1", "nest", makeBundle("key", 123)),
3410 /* weight */ 10);
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003411
Makoto Onuki41066a62016-03-09 16:18:44 -08003412 final ShortcutInfo si2 = makeShortcut(
3413 "s2",
3414 "title1-2",
3415 /* activity */ null,
3416 icon2,
3417 makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class),
3418 /* weight */ 12);
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003419
Makoto Onukid99c6f02016-03-28 11:02:54 -07003420 assertTrue(mManager.setDynamicShortcuts(list(si1, si2)));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003421
Makoto Onuki41066a62016-03-09 16:18:44 -08003422 assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
3423 assertEquals(2, mManager.getRemainingCallCount());
3424 });
3425 runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07003426 final Icon icon1 = Icon.createWithResource(getTestContext(), R.drawable.black_16x64);
Makoto Onuki41066a62016-03-09 16:18:44 -08003427 final Icon icon2 = Icon.createWithBitmap(BitmapFactory.decodeResource(
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07003428 getTestContext().getResources(), R.drawable.icon2));
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003429
Makoto Onuki41066a62016-03-09 16:18:44 -08003430 final ShortcutInfo si1 = makeShortcut(
3431 "s1",
3432 "title2-1",
3433 makeComponent(ShortcutActivity.class),
3434 icon1,
3435 makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class,
3436 "key1", "val1", "nest", makeBundle("key", 123)),
3437 /* weight */ 10);
3438
3439 final ShortcutInfo si2 = makeShortcut(
3440 "s2",
3441 "title2-2",
3442 /* activity */ null,
3443 icon2,
3444 makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class),
3445 /* weight */ 12);
3446
Makoto Onukid99c6f02016-03-28 11:02:54 -07003447 assertTrue(mManager.setDynamicShortcuts(list(si1, si2)));
Makoto Onuki41066a62016-03-09 16:18:44 -08003448
3449 assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
3450 assertEquals(2, mManager.getRemainingCallCount());
3451 });
3452 runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07003453 final Icon icon1 = Icon.createWithResource(getTestContext(), R.drawable.black_64x64);
Makoto Onuki41066a62016-03-09 16:18:44 -08003454 final Icon icon2 = Icon.createWithBitmap(BitmapFactory.decodeResource(
Makoto Onuki4dbe0de2016-03-14 17:31:49 -07003455 getTestContext().getResources(), R.drawable.icon2));
Makoto Onuki41066a62016-03-09 16:18:44 -08003456
3457 final ShortcutInfo si1 = makeShortcut(
3458 "s1",
3459 "title10-1-1",
3460 makeComponent(ShortcutActivity.class),
3461 icon1,
3462 makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class,
3463 "key1", "val1", "nest", makeBundle("key", 123)),
3464 /* weight */ 10);
3465
3466 final ShortcutInfo si2 = makeShortcut(
3467 "s2",
3468 "title10-1-2",
3469 /* activity */ null,
3470 icon2,
3471 makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class),
3472 /* weight */ 12);
3473
Makoto Onukid99c6f02016-03-28 11:02:54 -07003474 assertTrue(mManager.setDynamicShortcuts(list(si1, si2)));
Makoto Onuki41066a62016-03-09 16:18:44 -08003475
3476 assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
3477 assertEquals(2, mManager.getRemainingCallCount());
3478 });
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003479
Makoto Onuki2d5b4652016-03-11 16:09:54 -08003480 mService.getShortcutsForTest().get(UserHandle.USER_SYSTEM).setLauncherComponent(
3481 mService, new ComponentName("pkg1", "class"));
3482
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003483 // Restore.
Makoto Onukiaa8b94a2016-03-17 13:14:05 -07003484 mService.saveDirtyInfo();
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003485 initService();
3486
3487 // Before the load, the map should be empty.
3488 assertEquals(0, mService.getShortcutsForTest().size());
3489
3490 // this will pre-load the per-user info.
Makoto Onukicdc78f72016-03-21 15:47:52 -07003491 mService.handleUnlockUser(UserHandle.USER_SYSTEM);
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003492
3493 // Now it's loaded.
3494 assertEquals(1, mService.getShortcutsForTest().size());
3495
Makoto Onuki41066a62016-03-09 16:18:44 -08003496 runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
3497 assertShortcutIds(assertAllDynamic(assertAllHaveIntents(assertAllHaveIcon(
3498 mManager.getDynamicShortcuts()))), "s1", "s2");
3499 assertEquals(2, mManager.getRemainingCallCount());
3500
3501 assertEquals("title1-1", getCallerShortcut("s1").getTitle());
3502 assertEquals("title1-2", getCallerShortcut("s2").getTitle());
3503 });
3504 runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
3505 assertShortcutIds(assertAllDynamic(assertAllHaveIntents(assertAllHaveIcon(
3506 mManager.getDynamicShortcuts()))), "s1", "s2");
3507 assertEquals(2, mManager.getRemainingCallCount());
3508
3509 assertEquals("title2-1", getCallerShortcut("s1").getTitle());
3510 assertEquals("title2-2", getCallerShortcut("s2").getTitle());
3511 });
3512
Makoto Onuki2d5b4652016-03-11 16:09:54 -08003513 assertEquals("pkg1", mService.getShortcutsForTest().get(UserHandle.USER_SYSTEM)
3514 .getLauncherComponent().getPackageName());
3515
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003516 // Start another user
Makoto Onukicdc78f72016-03-21 15:47:52 -07003517 mService.handleUnlockUser(USER_10);
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003518
3519 // Now the size is 2.
3520 assertEquals(2, mService.getShortcutsForTest().size());
3521
Makoto Onuki41066a62016-03-09 16:18:44 -08003522 runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
3523 assertShortcutIds(assertAllDynamic(assertAllHaveIntents(assertAllHaveIcon(
3524 mManager.getDynamicShortcuts()))), "s1", "s2");
3525 assertEquals(2, mManager.getRemainingCallCount());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003526
Makoto Onuki41066a62016-03-09 16:18:44 -08003527 assertEquals("title10-1-1", getCallerShortcut("s1").getTitle());
3528 assertEquals("title10-1-2", getCallerShortcut("s2").getTitle());
3529 });
Makoto Onuki2d5b4652016-03-11 16:09:54 -08003530 assertNull(mService.getShortcutsForTest().get(USER_10).getLauncherComponent());
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003531
3532 // Try stopping the user
Makoto Onukicdc78f72016-03-21 15:47:52 -07003533 mService.handleCleanupUser(USER_10);
Makoto Onuki6f7362d92016-03-04 13:39:41 -08003534
3535 // Now it's unloaded.
3536 assertEquals(1, mService.getShortcutsForTest().size());
3537
3538 // TODO Check all other fields
3539 }
Makoto Onuki2d5b4652016-03-11 16:09:54 -08003540
Makoto Onukicdc78f72016-03-21 15:47:52 -07003541 public void testCleanupPackage() {
3542 runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07003543 assertTrue(mManager.setDynamicShortcuts(list(
Makoto Onukicdc78f72016-03-21 15:47:52 -07003544 makeShortcut("s0_1"))));
3545 });
3546 runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07003547 assertTrue(mManager.setDynamicShortcuts(list(
Makoto Onukicdc78f72016-03-21 15:47:52 -07003548 makeShortcut("s0_2"))));
3549 });
3550 runWithCaller(LAUNCHER_1, USER_0, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07003551 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s0_1"),
3552 HANDLE_USER_0);
3553 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("s0_2"),
3554 HANDLE_USER_0);
Makoto Onukicdc78f72016-03-21 15:47:52 -07003555 });
3556 runWithCaller(LAUNCHER_2, USER_0, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07003557 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s0_1"),
3558 HANDLE_USER_0);
3559 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("s0_2"),
3560 HANDLE_USER_0);
Makoto Onukicdc78f72016-03-21 15:47:52 -07003561 });
3562
3563 runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07003564 assertTrue(mManager.setDynamicShortcuts(list(
Makoto Onukicdc78f72016-03-21 15:47:52 -07003565 makeShortcut("s10_1"))));
3566 });
3567 runWithCaller(CALLING_PACKAGE_2, USER_10, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07003568 assertTrue(mManager.setDynamicShortcuts(list(
Makoto Onukicdc78f72016-03-21 15:47:52 -07003569 makeShortcut("s10_2"))));
3570 });
3571 runWithCaller(LAUNCHER_1, USER_10, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07003572 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s10_1"),
3573 HANDLE_USER_10);
3574 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("s10_2"),
3575 HANDLE_USER_10);
Makoto Onukicdc78f72016-03-21 15:47:52 -07003576 });
3577 runWithCaller(LAUNCHER_2, USER_10, () -> {
Makoto Onukid99c6f02016-03-28 11:02:54 -07003578 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s10_1"),
3579 HANDLE_USER_10);
3580 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("s10_2"),
3581 HANDLE_USER_10);
Makoto Onukicdc78f72016-03-21 15:47:52 -07003582 });
3583
3584 // Remove all dynamic shortcuts; now all shortcuts are just pinned.
3585 runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
3586 mManager.deleteAllDynamicShortcuts();
3587 });
3588 runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
3589 mManager.deleteAllDynamicShortcuts();
3590 });
3591 runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
3592 mManager.deleteAllDynamicShortcuts();
3593 });
3594 runWithCaller(CALLING_PACKAGE_2, USER_10, () -> {
3595 mManager.deleteAllDynamicShortcuts();
3596 });
3597
3598
Makoto Onuki31459242016-03-22 11:12:18 -07003599 final SparseArray<ShortcutUser> users = mService.getShortcutsForTest();
Makoto Onukicdc78f72016-03-21 15:47:52 -07003600 assertEquals(2, users.size());
3601 assertEquals(USER_0, users.keyAt(0));
3602 assertEquals(USER_10, users.keyAt(1));
3603
Makoto Onuki31459242016-03-22 11:12:18 -07003604 final ShortcutUser user0 = users.get(USER_0);
3605 final ShortcutUser user10 = users.get(USER_10);
Makoto Onukicdc78f72016-03-21 15:47:52 -07003606
3607
3608 // Check the registered packages.
Makoto Onukid99c6f02016-03-28 11:02:54 -07003609 dumpsysOnLogcat();
Makoto Onukicdc78f72016-03-21 15:47:52 -07003610 assertEquals(makeSet(CALLING_PACKAGE_1, CALLING_PACKAGE_2),
Makoto Onuki2e210c42016-03-30 08:30:36 -07003611 set(user0.getAllPackages().keySet()));
Makoto Onukicdc78f72016-03-21 15:47:52 -07003612 assertEquals(makeSet(CALLING_PACKAGE_1, CALLING_PACKAGE_2),
Makoto Onuki2e210c42016-03-30 08:30:36 -07003613 set(user10.getAllPackages().keySet()));
Makoto Onukid99c6f02016-03-28 11:02:54 -07003614 assertEquals(
3615 makeSet(PackageWithUser.of(USER_0, LAUNCHER_1),
3616 PackageWithUser.of(USER_0, LAUNCHER_2)),
3617 set(user0.getAllLaunchers().keySet()));
3618 assertEquals(
3619 makeSet(PackageWithUser.of(USER_10, LAUNCHER_1),
3620 PackageWithUser.of(USER_10, LAUNCHER_2)),
3621 set(user10.getAllLaunchers().keySet()));
Makoto Onukicdc78f72016-03-21 15:47:52 -07003622 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_0),
3623 "s0_1", "s0_2");
3624 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_0),
3625 "s0_1", "s0_2");
3626 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_10),
3627 "s10_1", "s10_2");
3628 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_10),
3629 "s10_1", "s10_2");
3630 assertShortcutExists(CALLING_PACKAGE_1, "s0_1", USER_0);
3631 assertShortcutExists(CALLING_PACKAGE_2, "s0_2", USER_0);
3632 assertShortcutExists(CALLING_PACKAGE_1, "s10_1", USER_10);
3633 assertShortcutExists(CALLING_PACKAGE_2, "s10_2", USER_10);
3634
3635 mService.saveDirtyInfo();
3636
3637 // Nonexistent package.
Makoto Onuki2e210c42016-03-30 08:30:36 -07003638 uninstallPackage(USER_0, "abc");
Makoto Onukid99c6f02016-03-28 11:02:54 -07003639 mService.cleanUpPackageLocked("abc", USER_0, USER_0);
Makoto Onukicdc78f72016-03-21 15:47:52 -07003640
3641 // No changes.
3642 assertEquals(makeSet(CALLING_PACKAGE_1, CALLING_PACKAGE_2),
Makoto Onuki2e210c42016-03-30 08:30:36 -07003643 set(user0.getAllPackages().keySet()));
Makoto Onukicdc78f72016-03-21 15:47:52 -07003644 assertEquals(makeSet(CALLING_PACKAGE_1, CALLING_PACKAGE_2),
Makoto Onuki2e210c42016-03-30 08:30:36 -07003645 set(user10.getAllPackages().keySet()));
Makoto Onukid99c6f02016-03-28 11:02:54 -07003646 assertEquals(
3647 makeSet(PackageWithUser.of(USER_0, LAUNCHER_1),
3648 PackageWithUser.of(USER_0, LAUNCHER_2)),
3649 set(user0.getAllLaunchers().keySet()));
3650 assertEquals(
3651 makeSet(PackageWithUser.of(USER_10, LAUNCHER_1),
3652 PackageWithUser.of(USER_10, LAUNCHER_2)),
3653 set(user10.getAllLaunchers().keySet()));
Makoto Onukicdc78f72016-03-21 15:47:52 -07003654 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_0),
3655 "s0_1", "s0_2");
3656 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_0),
3657 "s0_1", "s0_2");
3658 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_10),
3659 "s10_1", "s10_2");
3660 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_10),
3661 "s10_1", "s10_2");
3662 assertShortcutExists(CALLING_PACKAGE_1, "s0_1", USER_0);
3663 assertShortcutExists(CALLING_PACKAGE_2, "s0_2", USER_0);
3664 assertShortcutExists(CALLING_PACKAGE_1, "s10_1", USER_10);
3665 assertShortcutExists(CALLING_PACKAGE_2, "s10_2", USER_10);
3666
3667 mService.saveDirtyInfo();
3668
3669 // Remove a package.
Makoto Onuki2e210c42016-03-30 08:30:36 -07003670 uninstallPackage(USER_0, CALLING_PACKAGE_1);
Makoto Onukid99c6f02016-03-28 11:02:54 -07003671 mService.cleanUpPackageLocked(CALLING_PACKAGE_1, USER_0, USER_0);
Makoto Onukicdc78f72016-03-21 15:47:52 -07003672
3673 assertEquals(makeSet(CALLING_PACKAGE_2),
Makoto Onuki2e210c42016-03-30 08:30:36 -07003674 set(user0.getAllPackages().keySet()));
Makoto Onukicdc78f72016-03-21 15:47:52 -07003675 assertEquals(makeSet(CALLING_PACKAGE_1, CALLING_PACKAGE_2),
Makoto Onuki2e210c42016-03-30 08:30:36 -07003676 set(user10.getAllPackages().keySet()));
Makoto Onukid99c6f02016-03-28 11:02:54 -07003677 assertEquals(
3678 makeSet(PackageWithUser.of(USER_0, LAUNCHER_1),
3679 PackageWithUser.of(USER_0, LAUNCHER_2)),
3680 set(user0.getAllLaunchers().keySet()));
3681 assertEquals(
3682 makeSet(PackageWithUser.of(USER_10, LAUNCHER_1),
3683 PackageWithUser.of(USER_10, LAUNCHER_2)),
3684 set(user10.getAllLaunchers().keySet()));
Makoto Onukicdc78f72016-03-21 15:47:52 -07003685 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_0),
3686 "s0_2");
3687 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_0),
3688 "s0_2");
3689 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_10),
3690 "s10_1", "s10_2");
3691 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_10),
3692 "s10_1", "s10_2");
3693 assertShortcutNotExists(CALLING_PACKAGE_1, "s0_1", USER_0);
3694 assertShortcutExists(CALLING_PACKAGE_2, "s0_2", USER_0);
3695 assertShortcutExists(CALLING_PACKAGE_1, "s10_1", USER_10);
3696 assertShortcutExists(CALLING_PACKAGE_2, "s10_2", USER_10);
3697
3698 mService.saveDirtyInfo();
3699
3700 // Remove a launcher.
Makoto Onuki2e210c42016-03-30 08:30:36 -07003701 uninstallPackage(USER_10, LAUNCHER_1);
Makoto Onukid99c6f02016-03-28 11:02:54 -07003702 mService.cleanUpPackageLocked(LAUNCHER_1, USER_10, USER_10);
Makoto Onukicdc78f72016-03-21 15:47:52 -07003703
3704 assertEquals(makeSet(CALLING_PACKAGE_2),
Makoto Onuki2e210c42016-03-30 08:30:36 -07003705 set(user0.getAllPackages().keySet()));
Makoto Onukicdc78f72016-03-21 15:47:52 -07003706 assertEquals(makeSet(CALLING_PACKAGE_1, CALLING_PACKAGE_2),
Makoto Onuki2e210c42016-03-30 08:30:36 -07003707 set(user10.getAllPackages().keySet()));
Makoto Onukid99c6f02016-03-28 11:02:54 -07003708 assertEquals(
3709 makeSet(PackageWithUser.of(USER_0, LAUNCHER_1),
3710 PackageWithUser.of(USER_0, LAUNCHER_2)),
3711 set(user0.getAllLaunchers().keySet()));
3712 assertEquals(
3713 makeSet(PackageWithUser.of(USER_10, LAUNCHER_2)),
3714 set(user10.getAllLaunchers().keySet()));
Makoto Onukicdc78f72016-03-21 15:47:52 -07003715 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_0),
3716 "s0_2");
3717 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_0),
3718 "s0_2");
3719 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_10),
3720 "s10_1", "s10_2");
3721 assertShortcutNotExists(CALLING_PACKAGE_1, "s0_1", USER_0);
3722 assertShortcutExists(CALLING_PACKAGE_2, "s0_2", USER_0);
3723 assertShortcutExists(CALLING_PACKAGE_1, "s10_1", USER_10);
3724 assertShortcutExists(CALLING_PACKAGE_2, "s10_2", USER_10);
3725
3726 mService.saveDirtyInfo();
3727
3728 // Remove a package.
Makoto Onuki2e210c42016-03-30 08:30:36 -07003729 uninstallPackage(USER_10, CALLING_PACKAGE_2);
Makoto Onukid99c6f02016-03-28 11:02:54 -07003730 mService.cleanUpPackageLocked(CALLING_PACKAGE_2, USER_10, USER_10);
Makoto Onukicdc78f72016-03-21 15:47:52 -07003731
3732 assertEquals(makeSet(CALLING_PACKAGE_2),
Makoto Onuki2e210c42016-03-30 08:30:36 -07003733 set(user0.getAllPackages().keySet()));
Makoto Onukicdc78f72016-03-21 15:47:52 -07003734 assertEquals(makeSet(CALLING_PACKAGE_1),
Makoto Onuki2e210c42016-03-30 08:30:36 -07003735 set(user10.getAllPackages().keySet()));
Makoto Onukid99c6f02016-03-28 11:02:54 -07003736 assertEquals(
3737 makeSet(PackageWithUser.of(USER_0, LAUNCHER_1),
3738 PackageWithUser.of(USER_0, LAUNCHER_2)),
3739 set(user0.getAllLaunchers().keySet()));
3740 assertEquals(
3741 makeSet(PackageWithUser.of(USER_10, LAUNCHER_2)),
3742 set(user10.getAllLaunchers().keySet()));
Makoto Onukicdc78f72016-03-21 15:47:52 -07003743 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_0),
3744 "s0_2");
3745 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_0),
3746 "s0_2");
3747 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_10),
3748 "s10_1");
3749 assertShortcutNotExists(CALLING_PACKAGE_1, "s0_1", USER_0);
3750 assertShortcutExists(CALLING_PACKAGE_2, "s0_2", USER_0);
3751 assertShortcutExists(CALLING_PACKAGE_1, "s10_1", USER_10);
3752 assertShortcutNotExists(CALLING_PACKAGE_2, "s10_2", USER_10);
3753
3754 mService.saveDirtyInfo();
3755
3756 // Remove the other launcher from user 10 too.
Makoto Onuki2e210c42016-03-30 08:30:36 -07003757 uninstallPackage(USER_10, LAUNCHER_2);
Makoto Onukid99c6f02016-03-28 11:02:54 -07003758 mService.cleanUpPackageLocked(LAUNCHER_2, USER_10, USER_10);
Makoto Onukicdc78f72016-03-21 15:47:52 -07003759
3760 assertEquals(makeSet(CALLING_PACKAGE_2),
Makoto Onuki2e210c42016-03-30 08:30:36 -07003761 set(user0.getAllPackages().keySet()));
Makoto Onukicdc78f72016-03-21 15:47:52 -07003762 assertEquals(makeSet(CALLING_PACKAGE_1),
Makoto Onuki2e210c42016-03-30 08:30:36 -07003763 set(user10.getAllPackages().keySet()));
Makoto Onukid99c6f02016-03-28 11:02:54 -07003764 assertEquals(
3765 makeSet(PackageWithUser.of(USER_0, LAUNCHER_1),
3766 PackageWithUser.of(USER_0, LAUNCHER_2)),
3767 set(user0.getAllLaunchers().keySet()));
3768 assertEquals(
3769 makeSet(),
3770 set(user10.getAllLaunchers().keySet()));
Makoto Onukicdc78f72016-03-21 15:47:52 -07003771 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_0),
3772 "s0_2");
3773 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_0),
3774 "s0_2");
3775
3776 // Note the pinned shortcuts on user-10 no longer referred, so they should both be removed.
3777 assertShortcutNotExists(CALLING_PACKAGE_1, "s0_1", USER_0);
3778 assertShortcutExists(CALLING_PACKAGE_2, "s0_2", USER_0);
3779 assertShortcutNotExists(CALLING_PACKAGE_1, "s10_1", USER_10);
3780 assertShortcutNotExists(CALLING_PACKAGE_2, "s10_2", USER_10);
3781
3782 mService.saveDirtyInfo();
3783
3784 // More remove.
Makoto Onuki2e210c42016-03-30 08:30:36 -07003785 uninstallPackage(USER_10, CALLING_PACKAGE_1);
Makoto Onukid99c6f02016-03-28 11:02:54 -07003786 mService.cleanUpPackageLocked(CALLING_PACKAGE_1, USER_10, USER_10);
Makoto Onukicdc78f72016-03-21 15:47:52 -07003787
3788 assertEquals(makeSet(CALLING_PACKAGE_2),
Makoto Onuki2e210c42016-03-30 08:30:36 -07003789 set(user0.getAllPackages().keySet()));
Makoto Onukicdc78f72016-03-21 15:47:52 -07003790 assertEquals(makeSet(),
Makoto Onuki2e210c42016-03-30 08:30:36 -07003791 set(user10.getAllPackages().keySet()));
Makoto Onukid99c6f02016-03-28 11:02:54 -07003792 assertEquals(
3793 makeSet(PackageWithUser.of(USER_0, LAUNCHER_1),
3794 PackageWithUser.of(USER_0, LAUNCHER_2)),
3795 set(user0.getAllLaunchers().keySet()));
Makoto Onukicdc78f72016-03-21 15:47:52 -07003796 assertEquals(makeSet(),
Makoto Onukid99c6f02016-03-28 11:02:54 -07003797 set(user10.getAllLaunchers().keySet()));
Makoto Onukicdc78f72016-03-21 15:47:52 -07003798 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_0),
3799 "s0_2");
3800 assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_2, USER_0),
3801 "s0_2");
3802
3803 // Note the pinned shortcuts on user-10 no longer referred, so they should both be removed.
3804 assertShortcutNotExists(CALLING_PACKAGE_1, "s0_1", USER_0);
3805 assertShortcutExists(CALLING_PACKAGE_2, "s0_2", USER_0);
3806 assertShortcutNotExists(CALLING_PACKAGE_1, "s10_1", USER_10);
3807 assertShortcutNotExists(CALLING_PACKAGE_2, "s10_2", USER_10);
3808
3809 mService.saveDirtyInfo();
3810 }
3811
Makoto Onukid99c6f02016-03-28 11:02:54 -07003812 public void testHandleGonePackage_crossProfile() {
3813 // Create some shortcuts.
3814 runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
3815 assertTrue(mManager.setDynamicShortcuts(list(
3816 makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
3817 });
3818 runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
3819 assertTrue(mManager.setDynamicShortcuts(list(
3820 makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
3821 });
3822 runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
3823 assertTrue(mManager.setDynamicShortcuts(list(
3824 makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
3825 });
3826 runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
3827 assertTrue(mManager.setDynamicShortcuts(list(
3828 makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
3829 });
3830
3831 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
3832 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
3833 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
3834
3835 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
3836 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
3837 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
3838
3839 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
3840 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
3841 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
3842
3843 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
3844 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
3845 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
3846
3847 // Pin some.
3848
3849 runWithCaller(LAUNCHER_1, USER_0, () -> {
3850 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
3851 list("s1"), HANDLE_USER_0);
3852
3853 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
3854 list("s2"), UserHandle.of(USER_P0));
3855
3856 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
3857 list("s3"), HANDLE_USER_0);
3858 });
3859
3860 runWithCaller(LAUNCHER_1, USER_P0, () -> {
3861 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
3862 list("s2"), HANDLE_USER_0);
3863
3864 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
3865 list("s3"), UserHandle.of(USER_P0));
3866
3867 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2,
3868 list("s1"), HANDLE_USER_0);
3869 });
3870
3871 runWithCaller(LAUNCHER_1, USER_10, () -> {
3872 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
3873 list("s3"), HANDLE_USER_10);
3874 });
3875
3876 // Check the state.
3877
3878 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
3879 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
3880 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
3881
3882 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
3883 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
3884 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
3885
3886 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
3887 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
3888 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
3889
3890 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
3891 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
3892 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
3893
Makoto Onukid99c6f02016-03-28 11:02:54 -07003894 // Make sure all the information is persisted.
3895 mService.saveDirtyInfo();
3896 initService();
3897 mService.handleUnlockUser(USER_0);
3898 mService.handleUnlockUser(USER_P0);
3899 mService.handleUnlockUser(USER_10);
3900
3901 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
3902 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
3903 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
3904
3905 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
3906 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
3907 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
3908
3909 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
3910 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
3911 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
3912
3913 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
3914 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
3915 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
3916
Makoto Onukid99c6f02016-03-28 11:02:54 -07003917 // Start uninstalling.
3918 uninstallPackage(USER_10, LAUNCHER_1);
3919 mService.cleanupGonePackages(USER_10);
3920
3921 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
3922 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
3923 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
3924
3925 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
3926 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
3927 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
3928
3929 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
3930 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
3931 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
3932
3933 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
3934 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
3935 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
3936
Makoto Onukid99c6f02016-03-28 11:02:54 -07003937 // Uninstall.
3938 uninstallPackage(USER_10, CALLING_PACKAGE_1);
3939 mService.cleanupGonePackages(USER_10);
3940
3941 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
3942 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
3943 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
3944
3945 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
3946 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
3947 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
3948
3949 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
3950 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
3951 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
3952
3953 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
3954 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
3955 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
3956
Makoto Onukid99c6f02016-03-28 11:02:54 -07003957 uninstallPackage(USER_P0, LAUNCHER_1);
3958 mService.cleanupGonePackages(USER_0);
3959
3960 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
3961 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
3962 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
3963
3964 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
3965 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
3966 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
3967
3968 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
3969 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
3970 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
3971
3972 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
3973 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
3974 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
3975
Makoto Onukid99c6f02016-03-28 11:02:54 -07003976 mService.cleanupGonePackages(USER_P0);
3977
3978 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
3979 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
3980 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
3981
3982 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
3983 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
3984 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
3985
3986 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
3987 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
3988 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
3989
3990 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
3991 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
3992 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
3993
Makoto Onukid99c6f02016-03-28 11:02:54 -07003994 uninstallPackage(USER_P0, CALLING_PACKAGE_1);
3995
3996 mService.saveDirtyInfo();
3997 initService();
3998 mService.handleUnlockUser(USER_0);
3999 mService.handleUnlockUser(USER_P0);
4000 mService.handleUnlockUser(USER_10);
4001
4002 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
4003 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
4004 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
4005
4006 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
4007 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
4008 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
4009
4010 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
4011 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
4012 assertDynamicAndPinned(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
4013
4014 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
4015 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
4016 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
4017
Makoto Onukid99c6f02016-03-28 11:02:54 -07004018 // Uninstall
4019 uninstallPackage(USER_0, LAUNCHER_1);
4020
4021 mService.saveDirtyInfo();
4022 initService();
4023 mService.handleUnlockUser(USER_0);
4024 mService.handleUnlockUser(USER_P0);
4025 mService.handleUnlockUser(USER_10);
4026
4027 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
4028 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
4029 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
4030
4031 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
4032 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
4033 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
4034
4035 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
4036 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
4037 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
4038
4039 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
4040 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
4041 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
4042
Makoto Onukid99c6f02016-03-28 11:02:54 -07004043 uninstallPackage(USER_0, CALLING_PACKAGE_2);
4044
4045 mService.saveDirtyInfo();
4046 initService();
4047 mService.handleUnlockUser(USER_0);
4048 mService.handleUnlockUser(USER_P0);
4049 mService.handleUnlockUser(USER_10);
4050
4051 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_0));
4052 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_0));
4053 assertDynamicOnly(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_0));
4054
4055 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_P0));
4056 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_P0));
4057 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_P0));
4058
4059 assertNull(getPackageShortcut(CALLING_PACKAGE_2, "s1", USER_0));
4060 assertNull(getPackageShortcut(CALLING_PACKAGE_2, "s2", USER_0));
4061 assertNull(getPackageShortcut(CALLING_PACKAGE_2, "s3", USER_0));
4062
4063 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s1", USER_10));
4064 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s2", USER_10));
4065 assertNull(getPackageShortcut(CALLING_PACKAGE_1, "s3", USER_10));
Makoto Onukid99c6f02016-03-28 11:02:54 -07004066 }
4067
Makoto Onuki0acbb142016-03-22 17:02:57 -07004068 private void checkCanRestoreTo(boolean expected, ShortcutPackageInfo spi,
4069 int version, String... signatures) {
Makoto Onuki2e210c42016-03-30 08:30:36 -07004070 assertEquals(expected, spi.canRestoreTo(mService, genPackage(
Makoto Onuki0acbb142016-03-22 17:02:57 -07004071 "dummy", /* uid */ 0, version, signatures)));
4072 }
4073
4074 public void testCanRestoreTo() {
4075 addPackage(CALLING_PACKAGE_1, CALLING_UID_1, 10, "sig1");
4076 addPackage(CALLING_PACKAGE_2, CALLING_UID_1, 10, "sig1", "sig2");
4077
4078 final ShortcutPackageInfo spi1 = ShortcutPackageInfo.generateForInstalledPackage(
4079 mService, CALLING_PACKAGE_1, USER_0);
4080 final ShortcutPackageInfo spi2 = ShortcutPackageInfo.generateForInstalledPackage(
4081 mService, CALLING_PACKAGE_2, USER_0);
4082
4083 checkCanRestoreTo(true, spi1, 10, "sig1");
4084 checkCanRestoreTo(true, spi1, 10, "x", "sig1");
4085 checkCanRestoreTo(true, spi1, 10, "sig1", "y");
4086 checkCanRestoreTo(true, spi1, 10, "x", "sig1", "y");
4087 checkCanRestoreTo(true, spi1, 11, "sig1");
4088
4089 checkCanRestoreTo(false, spi1, 10 /* empty */);
4090 checkCanRestoreTo(false, spi1, 10, "x");
4091 checkCanRestoreTo(false, spi1, 10, "x", "y");
4092 checkCanRestoreTo(false, spi1, 10, "x");
4093 checkCanRestoreTo(false, spi1, 9, "sig1");
4094
4095 checkCanRestoreTo(true, spi2, 10, "sig1", "sig2");
4096 checkCanRestoreTo(true, spi2, 10, "sig2", "sig1");
4097 checkCanRestoreTo(true, spi2, 10, "x", "sig1", "sig2");
4098 checkCanRestoreTo(true, spi2, 10, "x", "sig2", "sig1");
4099 checkCanRestoreTo(true, spi2, 10, "sig1", "sig2", "y");
4100 checkCanRestoreTo(true, spi2, 10, "sig2", "sig1", "y");
4101 checkCanRestoreTo(true, spi2, 10, "x", "sig1", "sig2", "y");
4102 checkCanRestoreTo(true, spi2, 10, "x", "sig2", "sig1", "y");
4103 checkCanRestoreTo(true, spi2, 11, "x", "sig2", "sig1", "y");
4104
4105 checkCanRestoreTo(false, spi2, 10, "sig1", "sig2x");
4106 checkCanRestoreTo(false, spi2, 10, "sig2", "sig1x");
4107 checkCanRestoreTo(false, spi2, 10, "x", "sig1x", "sig2");
4108 checkCanRestoreTo(false, spi2, 10, "x", "sig2x", "sig1");
4109 checkCanRestoreTo(false, spi2, 10, "sig1", "sig2x", "y");
4110 checkCanRestoreTo(false, spi2, 10, "sig2", "sig1x", "y");
4111 checkCanRestoreTo(false, spi2, 10, "x", "sig1x", "sig2", "y");
4112 checkCanRestoreTo(false, spi2, 10, "x", "sig2x", "sig1", "y");
4113 checkCanRestoreTo(false, spi2, 11, "x", "sig2x", "sig1", "y");
4114 }
4115
Makoto Onuki0acbb142016-03-22 17:02:57 -07004116 public void testHandlePackageDelete() {
4117 setCaller(CALLING_PACKAGE_1, USER_0);
4118 assertTrue(mManager.addDynamicShortcut(makeShortcut("s1")));
4119
4120 setCaller(CALLING_PACKAGE_2, USER_0);
4121 assertTrue(mManager.addDynamicShortcut(makeShortcut("s1")));
4122
4123 setCaller(CALLING_PACKAGE_3, USER_0);
4124 assertTrue(mManager.addDynamicShortcut(makeShortcut("s1")));
4125
4126 setCaller(CALLING_PACKAGE_1, USER_10);
4127 assertTrue(mManager.addDynamicShortcut(makeShortcut("s1")));
4128
4129 setCaller(CALLING_PACKAGE_2, USER_10);
4130 assertTrue(mManager.addDynamicShortcut(makeShortcut("s1")));
4131
4132 setCaller(CALLING_PACKAGE_3, USER_10);
4133 assertTrue(mManager.addDynamicShortcut(makeShortcut("s1")));
4134
Makoto Onuki9da23fc2016-03-29 11:14:42 -07004135 assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_0));
4136 assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_0));
4137 assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_0));
4138 assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_10));
4139 assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_10));
4140 assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_10));
Makoto Onuki0acbb142016-03-22 17:02:57 -07004141
Makoto Onuki2e210c42016-03-30 08:30:36 -07004142 uninstallPackage(USER_0, CALLING_PACKAGE_1);
Makoto Onuki0acbb142016-03-22 17:02:57 -07004143 mService.mPackageMonitor.onReceive(getTestContext(),
4144 genPackageDeleteIntent(CALLING_PACKAGE_1, USER_0));
4145
Makoto Onuki9da23fc2016-03-29 11:14:42 -07004146 assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_0));
4147 assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_0));
4148 assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_0));
4149 assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_10));
4150 assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_10));
4151 assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_10));
Makoto Onuki0acbb142016-03-22 17:02:57 -07004152
Makoto Onuki2e210c42016-03-30 08:30:36 -07004153 uninstallPackage(USER_10, CALLING_PACKAGE_2);
Makoto Onuki0acbb142016-03-22 17:02:57 -07004154 mService.mPackageMonitor.onReceive(getTestContext(),
4155 genPackageDeleteIntent(CALLING_PACKAGE_2, USER_10));
4156
Makoto Onuki9da23fc2016-03-29 11:14:42 -07004157 assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_0));
4158 assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_0));
4159 assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_0));
4160 assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_10));
4161 assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_10));
4162 assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_10));
Makoto Onuki0acbb142016-03-22 17:02:57 -07004163
4164 mInjectedPackages.remove(CALLING_PACKAGE_1);
4165 mInjectedPackages.remove(CALLING_PACKAGE_3);
4166
4167 mService.handleUnlockUser(USER_0);
Makoto Onuki9da23fc2016-03-29 11:14:42 -07004168
4169 assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_0));
4170 assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_0));
4171 assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_0));
4172 assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_10));
4173 assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_10));
4174 assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_10));
Makoto Onuki0acbb142016-03-22 17:02:57 -07004175
4176 mService.handleUnlockUser(USER_10);
Makoto Onuki9da23fc2016-03-29 11:14:42 -07004177
4178 assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_0));
4179 assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_0));
4180 assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_0));
4181 assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_10));
4182 assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_10));
4183 assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_10));
Makoto Onuki0acbb142016-03-22 17:02:57 -07004184 }
4185
Makoto Onuki2e210c42016-03-30 08:30:36 -07004186 private void backupAndRestore() {
4187 int prevUid = mInjectedCallingUid;
4188
4189 mInjectedCallingUid = Process.SYSTEM_UID; // Only system can call it.
4190
4191 dumpsysOnLogcat("Before backup");
4192
4193 final byte[] payload = mService.getBackupPayload(USER_0);
4194 if (ENABLE_DUMP) {
4195 final String xml = new String(payload);
4196 Log.i(TAG, "Backup payload:");
4197 for (String line : xml.split("\n")) {
4198 Log.i(TAG, line);
4199 }
4200 }
4201
4202 // Before doing anything else, uninstall all packages.
4203 for (int userId : list(USER_0, USER_P0)) {
4204 for (String pkg : list(CALLING_PACKAGE_1, CALLING_PACKAGE_2, CALLING_PACKAGE_3,
4205 LAUNCHER_1, LAUNCHER_2, LAUNCHER_3)) {
4206 uninstallPackage(userId, pkg);
4207 }
4208 }
4209
Makoto Onukiac214972016-04-04 10:19:45 -07004210 shutdownServices();
4211
4212 deleteAllSavedFiles();
4213
Makoto Onuki2e210c42016-03-30 08:30:36 -07004214 initService();
4215 mService.applyRestore(payload, USER_0);
4216
4217 // handleUnlockUser will perform the gone package check, but it shouldn't remove
4218 // shadow information.
4219 mService.handleUnlockUser(USER_0);
4220
4221 dumpsysOnLogcat("After restore");
4222
4223 mInjectedCallingUid = prevUid;
4224 }
4225
4226 private void prepareCrossProfileDataSet() {
4227 runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
4228 assertTrue(mManager.setDynamicShortcuts(list(
4229 makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"),
4230 makeShortcut("s4"), makeShortcut("s5"), makeShortcut("s6"))));
4231 });
4232 runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
4233 assertTrue(mManager.setDynamicShortcuts(list(
4234 makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"),
4235 makeShortcut("s4"), makeShortcut("s5"), makeShortcut("s6"))));
4236 });
4237 runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
4238 assertTrue(mManager.setDynamicShortcuts(list(
4239 makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"),
4240 makeShortcut("s4"), makeShortcut("s5"), makeShortcut("s6"))));
4241 });
4242 runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
4243 assertTrue(mManager.setDynamicShortcuts(list()));
4244 });
4245 runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
4246 assertTrue(mManager.setDynamicShortcuts(list(
4247 makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"),
4248 makeShortcut("s4"), makeShortcut("s5"), makeShortcut("s6"))));
4249 });
4250 runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
4251 assertTrue(mManager.setDynamicShortcuts(list(
4252 makeShortcut("x1"), makeShortcut("x2"), makeShortcut("x3"),
4253 makeShortcut("x4"), makeShortcut("x5"), makeShortcut("x6"))));
4254 });
4255
4256 runWithCaller(LAUNCHER_1, USER_0, () -> {
4257 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s1"), HANDLE_USER_0);
4258 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("s1", "s2"), HANDLE_USER_0);
4259 mLauncherApps.pinShortcuts(CALLING_PACKAGE_3, list("s1", "s2", "s3"), HANDLE_USER_0);
4260
4261 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s1", "s4"), HANDLE_USER_P0);
4262 });
4263 runWithCaller(LAUNCHER_2, USER_0, () -> {
4264 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s2"), HANDLE_USER_0);
4265 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("s2", "s3"), HANDLE_USER_0);
4266 mLauncherApps.pinShortcuts(CALLING_PACKAGE_3, list("s2", "s3", "s4"), HANDLE_USER_0);
4267
4268 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s2", "s5"), HANDLE_USER_P0);
4269 });
4270 runWithCaller(LAUNCHER_3, USER_0, () -> {
4271 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s3"), HANDLE_USER_0);
4272 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("s3", "s4"), HANDLE_USER_0);
4273 mLauncherApps.pinShortcuts(CALLING_PACKAGE_3, list("s3", "s4", "s5"), HANDLE_USER_0);
4274
4275 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s3", "s6"), HANDLE_USER_P0);
4276 });
4277 runWithCaller(LAUNCHER_4, USER_0, () -> {
4278 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list(), HANDLE_USER_0);
4279 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list(), HANDLE_USER_0);
4280 mLauncherApps.pinShortcuts(CALLING_PACKAGE_3, list(), HANDLE_USER_0);
4281 mLauncherApps.pinShortcuts(CALLING_PACKAGE_4, list(), HANDLE_USER_0);
4282 });
4283
4284 // Launcher on a managed profile is referring ot user 0!
4285 runWithCaller(LAUNCHER_1, USER_P0, () -> {
4286 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s3", "s4"), HANDLE_USER_0);
4287 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("s3", "s4", "s5"), HANDLE_USER_0);
4288 mLauncherApps.pinShortcuts(CALLING_PACKAGE_3, list("s3", "s4", "s5", "s6"),
4289 HANDLE_USER_0);
4290
4291 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s4", "s1"), HANDLE_USER_P0);
4292 });
4293 runWithCaller(LAUNCHER_1, USER_10, () -> {
4294 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("x4", "x5"), HANDLE_USER_10);
4295 mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("x4", "x5", "x6"), HANDLE_USER_10);
4296 mLauncherApps.pinShortcuts(CALLING_PACKAGE_3, list("x4", "x5", "x6", "x1"),
4297 HANDLE_USER_10);
4298 });
Makoto Onukiac214972016-04-04 10:19:45 -07004299
4300 // Then remove some dynamic shortcuts.
4301 runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
4302 assertTrue(mManager.setDynamicShortcuts(list(
4303 makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
4304 });
4305 runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
4306 assertTrue(mManager.setDynamicShortcuts(list(
4307 makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
4308 });
4309 runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
4310 assertTrue(mManager.setDynamicShortcuts(list(
4311 makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
4312 });
4313 runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
4314 assertTrue(mManager.setDynamicShortcuts(list()));
4315 });
4316 runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
4317 assertTrue(mManager.setDynamicShortcuts(list(
4318 makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
4319 });
4320 runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
4321 assertTrue(mManager.setDynamicShortcuts(list(
4322 makeShortcut("x1"), makeShortcut("x2"), makeShortcut("x3"))));
4323 });
Makoto Onuki2e210c42016-03-30 08:30:36 -07004324 }
4325
4326 private void prepareForBackupTest() {
4327
4328 prepareCrossProfileDataSet();
4329
4330 backupAndRestore();
4331 }
4332
4333 private void assertExistsAndShadow(ShortcutPackageItem spi) {
4334 assertNotNull(spi);
4335 assertTrue(spi.getPackageInfo().isShadow());
4336 }
4337
4338 /**
4339 * Make sure the backup data doesn't have the following information:
4340 * - Launchers on other users.
4341 * - Non-backup app information.
4342 *
4343 * But restores all other infomation.
4344 *
4345 * It also omits the following pieces of information, but that's tested in
4346 * {@link #testShortcutInfoSaveAndLoad_forBackup}.
4347 * - Unpinned dynamic shortcuts
4348 * - Bitmaps
4349 */
4350 public void testBackupAndRestore() {
4351 prepareForBackupTest();
4352
4353 checkBackupAndRestore_success();
4354 }
4355
4356 public void testBackupAndRestore_backupRestoreTwice() {
4357 prepareForBackupTest();
4358
4359 // Note doing a backup & restore again here shouldn't affect the result.
4360 dumpsysOnLogcat("Before second backup");
4361
4362 backupAndRestore();
4363
4364 dumpsysOnLogcat("After second backup");
4365
4366 checkBackupAndRestore_success();
4367 }
4368
4369 public void testBackupAndRestore_backupRestoreMultiple() {
4370 prepareForBackupTest();
4371
4372 // Note doing a backup & restore again here shouldn't affect the result.
4373 backupAndRestore();
4374
4375 // This also shouldn't affect the result.
4376 runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
4377 assertTrue(mManager.setDynamicShortcuts(list(
4378 makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"),
4379 makeShortcut("s4"), makeShortcut("s5"), makeShortcut("s6"))));
4380 });
4381
4382 backupAndRestore();
4383
4384 checkBackupAndRestore_success();
4385 }
4386
4387 public void testBackupAndRestore_restoreToNewVersion() {
4388 prepareForBackupTest();
4389
4390 // Note doing a backup & restore again here shouldn't affect the result.
4391 backupAndRestore();
4392
4393 addPackage(CALLING_PACKAGE_1, CALLING_UID_1, 2);
4394 addPackage(LAUNCHER_1, LAUNCHER_UID_1, 5);
4395
4396 checkBackupAndRestore_success();
4397 }
4398
4399 public void testBackupAndRestore_restoreToSuperSetSignatures() {
4400 prepareForBackupTest();
4401
4402 // Note doing a backup & restore again here shouldn't affect the result.
4403 backupAndRestore();
4404
Makoto Onukiac214972016-04-04 10:19:45 -07004405 // Change package signatures.
Makoto Onuki2e210c42016-03-30 08:30:36 -07004406 addPackage(CALLING_PACKAGE_1, CALLING_UID_1, 1, "sigx", CALLING_PACKAGE_1);
4407 addPackage(LAUNCHER_1, LAUNCHER_UID_1, 4, LAUNCHER_1, "sigy");
4408
4409 checkBackupAndRestore_success();
4410 }
4411
4412 private void checkBackupAndRestore_success() {
4413 // Make sure non-system user is not restored.
4414 final ShortcutUser userP0 = mService.getUserShortcutsLocked(USER_P0);
4415 assertEquals(0, userP0.getAllPackages().size());
4416 assertEquals(0, userP0.getAllLaunchers().size());
4417
4418 // Make sure only "allowBackup" apps are restored, and are shadow.
4419 final ShortcutUser user0 = mService.getUserShortcutsLocked(USER_0);
4420 assertExistsAndShadow(user0.getAllPackages().get(CALLING_PACKAGE_1));
4421 assertExistsAndShadow(user0.getAllPackages().get(CALLING_PACKAGE_2));
4422 assertExistsAndShadow(user0.getAllLaunchers().get(PackageWithUser.of(USER_0, LAUNCHER_1)));
4423 assertExistsAndShadow(user0.getAllLaunchers().get(PackageWithUser.of(USER_0, LAUNCHER_2)));
4424
4425 assertNull(user0.getAllPackages().get(CALLING_PACKAGE_3));
4426 assertNull(user0.getAllLaunchers().get(PackageWithUser.of(USER_0, LAUNCHER_3)));
4427 assertNull(user0.getAllLaunchers().get(PackageWithUser.of(USER_P0, LAUNCHER_1)));
4428
4429 installPackage(USER_0, CALLING_PACKAGE_1);
4430 runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
4431 assertEquals(0, mManager.getDynamicShortcuts().size());
4432 assertShortcutIds(assertAllPinned(
4433 mManager.getPinnedShortcuts()),
4434 "s1", "s2");
4435 });
4436
4437 installPackage(USER_0, LAUNCHER_1);
4438 runWithCaller(LAUNCHER_1, USER_0, () -> {
4439 assertShortcutIds(assertAllPinned(
4440 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0)),
4441 "s1");
4442 assertShortcutIds(assertAllPinned(
4443 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0))
4444 /* empty, not restored */ );
4445 assertShortcutIds(assertAllPinned(
4446 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
4447 /* empty, not restored */ );
4448
4449 assertEquals(0, mLauncherApps.getShortcuts(QUERY_ALL, HANDLE_USER_P0).size());
4450 });
4451
4452 installPackage(USER_0, CALLING_PACKAGE_2);
4453 runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
4454 assertEquals(0, mManager.getDynamicShortcuts().size());
4455 assertShortcutIds(assertAllPinned(
4456 mManager.getPinnedShortcuts()),
4457 "s1", "s2", "s3");
4458 });
4459
4460 runWithCaller(LAUNCHER_1, USER_0, () -> {
4461 assertShortcutIds(assertAllPinned(
4462 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0)),
4463 "s1");
4464 assertShortcutIds(assertAllPinned(
4465 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)),
4466 "s1", "s2");
4467 assertShortcutIds(assertAllPinned(
4468 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
4469 /* empty, not restored */ );
4470
4471 assertEquals(0, mLauncherApps.getShortcuts(QUERY_ALL, HANDLE_USER_P0).size());
4472 });
4473
4474 // 3 shouldn't be backed up, so no pinned shortcuts.
4475 installPackage(USER_0, CALLING_PACKAGE_3);
4476 runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
4477 assertEquals(0, mManager.getDynamicShortcuts().size());
4478 assertEquals(0, mManager.getPinnedShortcuts().size());
4479 });
4480
4481 // Launcher on a different profile shouldn't be restored.
4482 runWithCaller(LAUNCHER_1, USER_P0, () -> {
4483 assertEquals(0,
4484 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0)
4485 .size());
4486 assertEquals(0,
4487 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)
4488 .size());
4489 assertShortcutIds(assertAllPinned(
4490 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
4491 /* wasn't restored, so still empty */ );
4492 });
4493
4494 // Package on a different profile, no restore.
4495 installPackage(USER_P0, CALLING_PACKAGE_1);
4496 runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
4497 assertEquals(0, mManager.getDynamicShortcuts().size());
4498 assertEquals(0, mManager.getPinnedShortcuts().size());
4499 });
4500
4501 // Restore launcher 2 on user 0.
4502 installPackage(USER_0, LAUNCHER_2);
4503 runWithCaller(LAUNCHER_2, USER_0, () -> {
4504 assertShortcutIds(assertAllPinned(
4505 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0)),
4506 "s2");
4507 assertShortcutIds(assertAllPinned(
4508 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)),
4509 "s2", "s3");
4510 assertShortcutIds(assertAllPinned(
4511 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
4512 /* wasn't restored, so still empty */ );
4513
4514 assertEquals(0, mLauncherApps.getShortcuts(QUERY_ALL, HANDLE_USER_P0).size());
4515 });
4516
4517
4518 // Restoration of launcher2 shouldn't affect other packages; so do the same checks and
4519 // make sure they still have the same result.
4520 installPackage(USER_0, CALLING_PACKAGE_1);
4521 runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
4522 assertEquals(0, mManager.getDynamicShortcuts().size());
4523 assertShortcutIds(assertAllPinned(
4524 mManager.getPinnedShortcuts()),
4525 "s1", "s2");
4526 });
4527
4528 installPackage(USER_0, LAUNCHER_1);
4529 runWithCaller(LAUNCHER_1, USER_0, () -> {
4530 assertShortcutIds(assertAllPinned(
4531 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0)),
4532 "s1");
4533 assertShortcutIds(assertAllPinned(
4534 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)),
4535 "s1", "s2");
4536 assertShortcutIds(assertAllPinned(
4537 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
4538 /* wasn't restored, so still empty */ );
4539
4540 assertEquals(0, mLauncherApps.getShortcuts(QUERY_ALL, HANDLE_USER_P0).size());
4541 });
4542
4543 installPackage(USER_0, CALLING_PACKAGE_2);
4544 runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
4545 assertEquals(0, mManager.getDynamicShortcuts().size());
4546 assertShortcutIds(assertAllPinned(
4547 mManager.getPinnedShortcuts()),
4548 "s1", "s2", "s3");
4549 });
4550 }
4551
4552 public void testBackupAndRestore_publisherLowerVersion() {
4553 prepareForBackupTest();
4554
4555 // Note doing a backup & restore again here shouldn't affect the result.
4556 backupAndRestore();
4557
4558 addPackage(CALLING_PACKAGE_1, CALLING_UID_1, 0); // Lower version
4559
4560 checkBackupAndRestore_publisherNotRestored();
4561 }
4562
4563 public void testBackupAndRestore_publisherWrongSignature() {
4564 prepareForBackupTest();
4565
4566 // Note doing a backup & restore again here shouldn't affect the result.
4567 backupAndRestore();
4568
4569 addPackage(CALLING_PACKAGE_1, CALLING_UID_1, 10, "sigx"); // different signature
4570
4571 checkBackupAndRestore_publisherNotRestored();
4572 }
4573
4574 public void testBackupAndRestore_publisherNoLongerBackupTarget() {
4575 prepareForBackupTest();
4576
4577 // Note doing a backup & restore again here shouldn't affect the result.
4578 backupAndRestore();
4579
4580 updatePackageInfo(CALLING_PACKAGE_1,
4581 pi -> pi.applicationInfo.flags &= ~ApplicationInfo.FLAG_ALLOW_BACKUP);
4582
4583 checkBackupAndRestore_publisherNotRestored();
4584 }
4585
4586 private void checkBackupAndRestore_publisherNotRestored() {
4587 installPackage(USER_0, CALLING_PACKAGE_1);
4588 runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
4589 assertEquals(0, mManager.getDynamicShortcuts().size());
4590 assertEquals(0, mManager.getPinnedShortcuts().size());
4591 });
4592
4593 installPackage(USER_0, CALLING_PACKAGE_2);
4594 runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
4595 assertEquals(0, mManager.getDynamicShortcuts().size());
4596 assertShortcutIds(assertAllPinned(
4597 mManager.getPinnedShortcuts()),
4598 "s1", "s2", "s3");
4599 });
4600
4601 installPackage(USER_0, LAUNCHER_1);
4602 runWithCaller(LAUNCHER_1, USER_0, () -> {
4603 assertShortcutIds(assertAllPinned(
4604 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
4605 /* empty */);
4606 assertShortcutIds(assertAllPinned(
4607 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)),
4608 "s1", "s2");
4609 assertShortcutIds(assertAllPinned(
4610 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
4611 /* empty */);
4612 });
4613 installPackage(USER_0, LAUNCHER_2);
4614 runWithCaller(LAUNCHER_2, USER_0, () -> {
4615 assertShortcutIds(assertAllPinned(
4616 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
4617 /* empty */);
4618 assertShortcutIds(assertAllPinned(
4619 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)),
4620 "s2", "s3");
4621 assertShortcutIds(assertAllPinned(
4622 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
4623 /* empty */);
4624 });
4625
4626 installPackage(USER_0, CALLING_PACKAGE_3);
4627 runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
4628 assertEquals(0, mManager.getDynamicShortcuts().size());
4629 assertEquals(0, mManager.getPinnedShortcuts().size());
4630 });
4631
4632 runWithCaller(LAUNCHER_1, USER_0, () -> {
4633 assertShortcutIds(assertAllPinned(
4634 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
4635 /* empty */);
4636 assertShortcutIds(assertAllPinned(
4637 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)),
4638 "s1", "s2");
4639 assertShortcutIds(assertAllPinned(
4640 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
4641 /* empty */);
4642 });
4643 runWithCaller(LAUNCHER_2, USER_0, () -> {
4644 assertShortcutIds(assertAllPinned(
4645 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
4646 /* empty */);
4647 assertShortcutIds(assertAllPinned(
4648 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)),
4649 "s2", "s3");
4650 assertShortcutIds(assertAllPinned(
4651 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
4652 /* empty */);
4653 });
4654 }
4655
4656 public void testBackupAndRestore_launcherLowerVersion() {
4657 prepareForBackupTest();
4658
4659 // Note doing a backup & restore again here shouldn't affect the result.
4660 backupAndRestore();
4661
4662 addPackage(LAUNCHER_1, LAUNCHER_UID_1, 0); // Lower version
4663
4664 checkBackupAndRestore_launcherNotRestored();
4665 }
4666
4667 public void testBackupAndRestore_launcherWrongSignature() {
4668 prepareForBackupTest();
4669
4670 // Note doing a backup & restore again here shouldn't affect the result.
4671 backupAndRestore();
4672
4673 addPackage(LAUNCHER_1, LAUNCHER_UID_1, 10, "sigx"); // different signature
4674
4675 checkBackupAndRestore_launcherNotRestored();
4676 }
4677
4678 public void testBackupAndRestore_launcherNoLongerBackupTarget() {
4679 prepareForBackupTest();
4680
4681 // Note doing a backup & restore again here shouldn't affect the result.
4682 backupAndRestore();
4683
4684 updatePackageInfo(LAUNCHER_1,
4685 pi -> pi.applicationInfo.flags &= ~ApplicationInfo.FLAG_ALLOW_BACKUP);
4686
4687 checkBackupAndRestore_launcherNotRestored();
4688 }
4689
4690 private void checkBackupAndRestore_launcherNotRestored() {
4691 installPackage(USER_0, CALLING_PACKAGE_1);
4692 runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
4693 assertEquals(0, mManager.getDynamicShortcuts().size());
4694
4695 // s1 was pinned by launcher 1, which is not restored, yet, so we still see "s1" here.
4696 assertShortcutIds(assertAllPinned(
4697 mManager.getPinnedShortcuts()),
4698 "s1", "s2");
4699 });
4700
4701 installPackage(USER_0, CALLING_PACKAGE_2);
4702 runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
4703 assertEquals(0, mManager.getDynamicShortcuts().size());
4704 assertShortcutIds(assertAllPinned(
4705 mManager.getPinnedShortcuts()),
4706 "s1", "s2", "s3");
4707 });
4708
4709 // Now we try to restore launcher 1. Then we realize it's not restorable, so L1 has no pinned
4710 // shortcuts.
4711 installPackage(USER_0, LAUNCHER_1);
4712 runWithCaller(LAUNCHER_1, USER_0, () -> {
4713 assertShortcutIds(assertAllPinned(
4714 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
4715 /* empty */);
4716 assertShortcutIds(assertAllPinned(
4717 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0))
4718 /* empty */);
4719 assertShortcutIds(assertAllPinned(
4720 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
4721 /* empty */);
4722 });
4723
4724 runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
4725 assertEquals(0, mManager.getDynamicShortcuts().size());
4726
4727 // Now CALLING_PACKAGE_1 realizes "s1" is no longer pinned.
4728 assertShortcutIds(assertAllPinned(
4729 mManager.getPinnedShortcuts()),
4730 "s2");
4731 });
4732
4733 installPackage(USER_0, LAUNCHER_2);
4734 runWithCaller(LAUNCHER_2, USER_0, () -> {
4735 assertShortcutIds(assertAllPinned(
4736 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0)),
4737 "s2");
4738 assertShortcutIds(assertAllPinned(
4739 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)),
4740 "s2", "s3");
4741 assertShortcutIds(assertAllPinned(
4742 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
4743 /* empty */);
4744 });
4745
4746 installPackage(USER_0, CALLING_PACKAGE_3);
4747 runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
4748 assertEquals(0, mManager.getDynamicShortcuts().size());
4749 assertEquals(0, mManager.getPinnedShortcuts().size());
4750 });
4751
4752 runWithCaller(LAUNCHER_1, USER_0, () -> {
4753 assertShortcutIds(assertAllPinned(
4754 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
4755 /* empty */);
4756 assertShortcutIds(assertAllPinned(
4757 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0))
4758 /* empty */);
4759 assertShortcutIds(assertAllPinned(
4760 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
4761 /* empty */);
4762 });
4763 runWithCaller(LAUNCHER_2, USER_0, () -> {
4764 assertShortcutIds(assertAllPinned(
4765 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0)),
4766 "s2");
4767 assertShortcutIds(assertAllPinned(
4768 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)),
4769 "s2", "s3");
4770 assertShortcutIds(assertAllPinned(
4771 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
4772 /* empty */);
4773 });
4774 }
4775
4776 public void testBackupAndRestore_launcherAndPackageNoLongerBackupTarget() {
4777 prepareForBackupTest();
4778
4779 // Note doing a backup & restore again here shouldn't affect the result.
4780 backupAndRestore();
4781
4782 updatePackageInfo(CALLING_PACKAGE_1,
4783 pi -> pi.applicationInfo.flags &= ~ApplicationInfo.FLAG_ALLOW_BACKUP);
4784
4785 updatePackageInfo(LAUNCHER_1,
4786 pi -> pi.applicationInfo.flags &= ~ApplicationInfo.FLAG_ALLOW_BACKUP);
4787
4788 checkBackupAndRestore_publisherAndLauncherNotRestored();
4789 }
4790
4791 private void checkBackupAndRestore_publisherAndLauncherNotRestored() {
4792 installPackage(USER_0, CALLING_PACKAGE_1);
4793 runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
4794 assertEquals(0, mManager.getDynamicShortcuts().size());
4795 assertEquals(0, mManager.getPinnedShortcuts().size());
4796 });
4797
4798 installPackage(USER_0, CALLING_PACKAGE_2);
4799 runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
4800 assertEquals(0, mManager.getDynamicShortcuts().size());
4801 assertShortcutIds(assertAllPinned(
4802 mManager.getPinnedShortcuts()),
4803 "s1", "s2", "s3");
4804 });
4805
4806 installPackage(USER_0, LAUNCHER_1);
4807 runWithCaller(LAUNCHER_1, USER_0, () -> {
4808 assertShortcutIds(assertAllPinned(
4809 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
4810 /* empty */);
4811 assertShortcutIds(assertAllPinned(
4812 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0))
4813 /* empty */);
4814 assertShortcutIds(assertAllPinned(
4815 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
4816 /* empty */);
4817 });
4818 installPackage(USER_0, LAUNCHER_2);
4819 runWithCaller(LAUNCHER_2, USER_0, () -> {
4820 assertShortcutIds(assertAllPinned(
4821 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
4822 /* empty */);
4823 assertShortcutIds(assertAllPinned(
4824 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)),
4825 "s2", "s3");
4826 assertShortcutIds(assertAllPinned(
4827 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
4828 /* empty */);
4829 });
4830
4831 // Because launcher 1 wasn't restored, "s1" is no longer pinned.
4832 runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
4833 assertEquals(0, mManager.getDynamicShortcuts().size());
4834 assertShortcutIds(assertAllPinned(
4835 mManager.getPinnedShortcuts()),
4836 "s2", "s3");
4837 });
4838
4839 installPackage(USER_0, CALLING_PACKAGE_3);
4840 runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
4841 assertEquals(0, mManager.getDynamicShortcuts().size());
4842 assertEquals(0, mManager.getPinnedShortcuts().size());
4843 });
4844
4845 runWithCaller(LAUNCHER_1, USER_0, () -> {
4846 assertShortcutIds(assertAllPinned(
4847 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
4848 /* empty */);
4849 assertShortcutIds(assertAllPinned(
4850 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0))
4851 /* empty */);
4852 assertShortcutIds(assertAllPinned(
4853 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
4854 /* empty */);
4855 });
4856 runWithCaller(LAUNCHER_2, USER_0, () -> {
4857 assertShortcutIds(assertAllPinned(
4858 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0))
4859 /* empty */);
4860 assertShortcutIds(assertAllPinned(
4861 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_2), HANDLE_USER_0)),
4862 "s2", "s3");
4863 assertShortcutIds(assertAllPinned(
4864 mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0))
4865 /* empty */);
4866 });
4867 }
4868
4869 public void testSaveAndLoad_crossProfile() {
4870 prepareCrossProfileDataSet();
4871
4872 dumpsysOnLogcat("Before save & load");
4873
4874 mService.saveDirtyInfo();
4875 initService();
4876
4877 runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
4878 assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts()),
Makoto Onukiac214972016-04-04 10:19:45 -07004879 "s1", "s2", "s3");
Makoto Onuki2e210c42016-03-30 08:30:36 -07004880 assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()),
4881 "s1", "s2", "s3", "s4");
4882 });
4883 runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
4884 assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts()),
Makoto Onukiac214972016-04-04 10:19:45 -07004885 "s1", "s2", "s3");
Makoto Onuki2e210c42016-03-30 08:30:36 -07004886 assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()),
4887 "s1", "s2", "s3", "s4", "s5");
4888 });
4889 runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
4890 assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts()),
Makoto Onukiac214972016-04-04 10:19:45 -07004891 "s1", "s2", "s3");
Makoto Onuki2e210c42016-03-30 08:30:36 -07004892 assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()),
4893 "s1", "s2", "s3", "s4", "s5", "s6");
4894 });
4895 runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
4896 assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts())
4897 /* empty */);
4898 assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts())
4899 /* empty */);
4900 });
4901 runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
4902 assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts()),
Makoto Onukiac214972016-04-04 10:19:45 -07004903 "s1", "s2", "s3");
Makoto Onuki2e210c42016-03-30 08:30:36 -07004904 assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()),
4905 "s1", "s2", "s3", "s4", "s5", "s6");
4906 });
4907 runWithCaller(CALLING_PACKAGE_2, USER_P0, () -> {
4908 assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts())
4909 /* empty */);
4910 assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts())
4911 /* empty */);
4912 });
4913 runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
4914 assertShortcutIds(assertAllDynamic(mManager.getDynamicShortcuts()),
Makoto Onukiac214972016-04-04 10:19:45 -07004915 "x1", "x2", "x3");
Makoto Onuki2e210c42016-03-30 08:30:36 -07004916 assertShortcutIds(assertAllPinned(mManager.getPinnedShortcuts()),
4917 "x4", "x5");
4918 });
4919 runWithCaller(LAUNCHER_1, USER_0, () -> {
4920 assertShortcutIds(
4921 mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_0),
4922 "s1");
4923 assertShortcutIds(
4924 mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_0),
4925 "s1", "s2");
4926 assertShortcutIds(
4927 mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_3), HANDLE_USER_0),
4928 "s1", "s2", "s3");
4929 assertShortcutIds(
4930 mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_4), HANDLE_USER_0)
4931 /* empty */);
4932 assertShortcutIds(
4933 mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_P0),
4934 "s1", "s4");
4935 assertShortcutIds(
4936 mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_P0)
4937 /* empty */);
4938 TestUtils.assertExpectException(
4939 SecurityException.class, "", () -> {
4940 mLauncherApps.getShortcuts(
4941 buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_10);
4942 });
4943 });
4944 runWithCaller(LAUNCHER_2, USER_0, () -> {
4945 assertShortcutIds(
4946 mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_0),
4947 "s2");
4948 assertShortcutIds(
4949 mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_0),
4950 "s2", "s3");
4951 assertShortcutIds(
4952 mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_3), HANDLE_USER_0),
4953 "s2", "s3", "s4");
4954 assertShortcutIds(
4955 mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_4), HANDLE_USER_0)
4956 /* empty */);
4957 assertShortcutIds(
4958 mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_P0),
4959 "s2", "s5");
4960 assertShortcutIds(
4961 mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_P0)
4962 /* empty */);
4963 });
4964 runWithCaller(LAUNCHER_3, USER_0, () -> {
4965 assertShortcutIds(
4966 mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_0),
4967 "s3");
4968 assertShortcutIds(
4969 mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_0),
4970 "s3", "s4");
4971 assertShortcutIds(
4972 mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_3), HANDLE_USER_0),
4973 "s3", "s4", "s5");
4974 assertShortcutIds(
4975 mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_4), HANDLE_USER_0)
4976 /* empty */);
4977 assertShortcutIds(
4978 mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_P0),
4979 "s3", "s6");
4980 assertShortcutIds(
4981 mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_P0)
4982 /* empty */);
4983 });
4984 runWithCaller(LAUNCHER_4, USER_0, () -> {
4985 assertShortcutIds(
4986 mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_0)
4987 /* empty */);
4988 assertShortcutIds(
4989 mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_0)
4990 /* empty */);
4991 assertShortcutIds(
4992 mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_3), HANDLE_USER_0)
4993 /* empty */);
4994 assertShortcutIds(
4995 mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_4), HANDLE_USER_0)
4996 /* empty */);
4997 assertShortcutIds(
4998 mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_P0)
4999 /* empty */);
5000 assertShortcutIds(
5001 mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_P0)
5002 /* empty */);
5003 });
5004 runWithCaller(LAUNCHER_1, USER_P0, () -> {
5005 assertShortcutIds(
5006 mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_0),
5007 "s3", "s4");
5008 assertShortcutIds(
5009 mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_0),
5010 "s3", "s4", "s5");
5011 assertShortcutIds(
5012 mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_3), HANDLE_USER_0),
5013 "s3", "s4", "s5", "s6");
5014 assertShortcutIds(
5015 mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_P0),
5016 "s1", "s4");
5017 TestUtils.assertExpectException(
Makoto Onukiac214972016-04-04 10:19:45 -07005018 SecurityException.class, "unrelated profile", () -> {
Makoto Onuki2e210c42016-03-30 08:30:36 -07005019 mLauncherApps.getShortcuts(
5020 buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_10);
5021 });
5022 });
5023 runWithCaller(LAUNCHER_1, USER_10, () -> {
5024 assertShortcutIds(
5025 mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_1), HANDLE_USER_10),
5026 "x4", "x5");
5027 assertShortcutIds(
5028 mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_2), HANDLE_USER_10)
5029 /* empty */);
5030 assertShortcutIds(
5031 mLauncherApps.getShortcuts(buildPinnedQuery(CALLING_PACKAGE_3), HANDLE_USER_10)
5032 /* empty */);
5033 TestUtils.assertExpectException(
Makoto Onukiac214972016-04-04 10:19:45 -07005034 SecurityException.class, "unrelated profile", () -> {
Makoto Onuki2e210c42016-03-30 08:30:36 -07005035 mLauncherApps.getShortcuts(
5036 buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_0);
5037 });
5038 TestUtils.assertExpectException(
Makoto Onukiac214972016-04-04 10:19:45 -07005039 SecurityException.class, "unrelated profile", () -> {
Makoto Onuki2e210c42016-03-30 08:30:36 -07005040 mLauncherApps.getShortcuts(
5041 buildAllQuery(CALLING_PACKAGE_1), HANDLE_USER_P0);
5042 });
5043 });
5044 }
5045
5046 // ShortcutInfo tests
5047
5048 public void testShortcutInfoMissingMandatoryFields() {
5049 TestUtils.assertExpectException(
5050 IllegalArgumentException.class,
5051 "ID must be provided",
5052 () -> new ShortcutInfo.Builder(getTestContext()).build());
5053 TestUtils.assertExpectException(
5054 IllegalArgumentException.class,
5055 "title must be provided",
5056 () -> new ShortcutInfo.Builder(getTestContext()).setId("id").build()
5057 .enforceMandatoryFields());
5058 TestUtils.assertExpectException(
5059 NullPointerException.class,
5060 "Intent must be provided",
5061 () -> new ShortcutInfo.Builder(getTestContext()).setId("id").setTitle("x").build()
5062 .enforceMandatoryFields());
5063 }
5064
5065 public void testShortcutInfoParcel() {
5066 ShortcutInfo si = parceled(new ShortcutInfo.Builder(getTestContext())
5067 .setId("id")
5068 .setTitle("title")
5069 .setIntent(makeIntent("action", ShortcutActivity.class))
5070 .build());
5071 assertEquals(getTestContext().getPackageName(), si.getPackageName());
5072 assertEquals("id", si.getId());
5073 assertEquals("title", si.getTitle());
5074 assertEquals("action", si.getIntent().getAction());
5075
5076 PersistableBundle pb = new PersistableBundle();
5077 pb.putInt("k", 1);
5078
5079 si = new ShortcutInfo.Builder(getTestContext())
5080 .setId("id")
5081 .setActivityComponent(new ComponentName("a", "b"))
5082 .setIcon(Icon.createWithContentUri("content://a.b.c/"))
5083 .setTitle("title")
5084 .setText("text")
5085 .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
5086 .setWeight(123)
5087 .setExtras(pb)
5088 .build();
5089 si.addFlags(ShortcutInfo.FLAG_PINNED);
5090 si.setBitmapPath("abc");
5091 si.setIconResourceId(456);
5092
5093 si = parceled(si);
5094
5095 assertEquals(getTestContext().getPackageName(), si.getPackageName());
5096 assertEquals("id", si.getId());
5097 assertEquals(new ComponentName("a", "b"), si.getActivityComponent());
5098 assertEquals("content://a.b.c/", si.getIcon().getUriString());
5099 assertEquals("title", si.getTitle());
5100 assertEquals("text", si.getText());
5101 assertEquals("action", si.getIntent().getAction());
5102 assertEquals("val", si.getIntent().getStringExtra("key"));
5103 assertEquals(123, si.getWeight());
5104 assertEquals(1, si.getExtras().getInt("k"));
5105
5106 assertEquals(ShortcutInfo.FLAG_PINNED, si.getFlags());
5107 assertEquals("abc", si.getBitmapPath());
5108 assertEquals(456, si.getIconResourceId());
5109 }
5110
5111 public void testShortcutInfoClone() {
5112 PersistableBundle pb = new PersistableBundle();
5113 pb.putInt("k", 1);
5114 ShortcutInfo sorig = new ShortcutInfo.Builder(getTestContext())
5115 .setId("id")
5116 .setActivityComponent(new ComponentName("a", "b"))
5117 .setIcon(Icon.createWithContentUri("content://a.b.c/"))
5118 .setTitle("title")
5119 .setText("text")
5120 .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
5121 .setWeight(123)
5122 .setExtras(pb)
5123 .build();
5124 sorig.addFlags(ShortcutInfo.FLAG_PINNED);
5125 sorig.setBitmapPath("abc");
5126 sorig.setIconResourceId(456);
5127
5128 ShortcutInfo si = sorig.clone(/* clone flags*/ 0);
5129
5130 assertEquals(getTestContext().getPackageName(), si.getPackageName());
5131 assertEquals("id", si.getId());
5132 assertEquals(new ComponentName("a", "b"), si.getActivityComponent());
5133 assertEquals("content://a.b.c/", si.getIcon().getUriString());
5134 assertEquals("title", si.getTitle());
5135 assertEquals("text", si.getText());
5136 assertEquals("action", si.getIntent().getAction());
5137 assertEquals("val", si.getIntent().getStringExtra("key"));
5138 assertEquals(123, si.getWeight());
5139 assertEquals(1, si.getExtras().getInt("k"));
5140
5141 assertEquals(ShortcutInfo.FLAG_PINNED, si.getFlags());
5142 assertEquals("abc", si.getBitmapPath());
5143 assertEquals(456, si.getIconResourceId());
5144
5145 si = sorig.clone(ShortcutInfo.CLONE_REMOVE_FOR_CREATOR);
5146
5147 assertEquals(getTestContext().getPackageName(), si.getPackageName());
5148 assertEquals("id", si.getId());
5149 assertEquals(new ComponentName("a", "b"), si.getActivityComponent());
5150 assertEquals(null, si.getIcon());
5151 assertEquals("title", si.getTitle());
5152 assertEquals("text", si.getText());
5153 assertEquals("action", si.getIntent().getAction());
5154 assertEquals("val", si.getIntent().getStringExtra("key"));
5155 assertEquals(123, si.getWeight());
5156 assertEquals(1, si.getExtras().getInt("k"));
5157
5158 assertEquals(ShortcutInfo.FLAG_PINNED, si.getFlags());
5159 assertEquals(null, si.getBitmapPath());
5160 assertEquals(0, si.getIconResourceId());
5161
5162 si = sorig.clone(ShortcutInfo.CLONE_REMOVE_FOR_LAUNCHER);
5163
5164 assertEquals(getTestContext().getPackageName(), si.getPackageName());
5165 assertEquals("id", si.getId());
5166 assertEquals(new ComponentName("a", "b"), si.getActivityComponent());
5167 assertEquals(null, si.getIcon());
5168 assertEquals("title", si.getTitle());
5169 assertEquals("text", si.getText());
5170 assertEquals(null, si.getIntent());
5171 assertEquals(123, si.getWeight());
5172 assertEquals(1, si.getExtras().getInt("k"));
5173
5174 assertEquals(ShortcutInfo.FLAG_PINNED, si.getFlags());
5175 assertEquals(null, si.getBitmapPath());
5176 assertEquals(0, si.getIconResourceId());
5177
5178 si = sorig.clone(ShortcutInfo.CLONE_REMOVE_NON_KEY_INFO);
5179
5180 assertEquals(getTestContext().getPackageName(), si.getPackageName());
5181 assertEquals("id", si.getId());
5182 assertEquals(null, si.getActivityComponent());
5183 assertEquals(null, si.getIcon());
5184 assertEquals(null, si.getTitle());
5185 assertEquals(null, si.getText());
5186 assertEquals(null, si.getIntent());
5187 assertEquals(0, si.getWeight());
5188 assertEquals(null, si.getExtras());
5189
5190 assertEquals(ShortcutInfo.FLAG_PINNED | ShortcutInfo.FLAG_KEY_FIELDS_ONLY, si.getFlags());
5191 assertEquals(null, si.getBitmapPath());
5192 assertEquals(0, si.getIconResourceId());
5193 }
5194
5195 public void testShortcutInfoCopyNonNullFieldsFrom() throws InterruptedException {
5196 PersistableBundle pb = new PersistableBundle();
5197 pb.putInt("k", 1);
5198 ShortcutInfo sorig = new ShortcutInfo.Builder(getTestContext())
5199 .setId("id")
5200 .setActivityComponent(new ComponentName("a", "b"))
5201 .setIcon(Icon.createWithContentUri("content://a.b.c/"))
5202 .setTitle("title")
5203 .setText("text")
5204 .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
5205 .setWeight(123)
5206 .setExtras(pb)
5207 .build();
5208 sorig.addFlags(ShortcutInfo.FLAG_PINNED);
5209 sorig.setBitmapPath("abc");
5210 sorig.setIconResourceId(456);
5211
5212 ShortcutInfo si;
5213
5214 si = sorig.clone(/* flags=*/ 0);
5215 si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
5216 .setActivityComponent(new ComponentName("x", "y")).build());
5217 assertEquals(new ComponentName("x", "y"), si.getActivityComponent());
5218
5219 si = sorig.clone(/* flags=*/ 0);
5220 si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
5221 .setIcon(Icon.createWithContentUri("content://x.y.z/")).build());
5222 assertEquals("content://x.y.z/", si.getIcon().getUriString());
5223
5224 si = sorig.clone(/* flags=*/ 0);
5225 si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
5226 .setTitle("xyz").build());
5227 assertEquals("xyz", si.getTitle());
5228
5229 si = sorig.clone(/* flags=*/ 0);
5230 si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
5231 .setText("xxx").build());
5232 assertEquals("xxx", si.getText());
5233
5234 si = sorig.clone(/* flags=*/ 0);
5235 si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
5236 .setIntent(makeIntent("action2", ShortcutActivity.class)).build());
5237 assertEquals("action2", si.getIntent().getAction());
5238 assertEquals(null, si.getIntent().getStringExtra("key"));
5239
5240 si = sorig.clone(/* flags=*/ 0);
5241 si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
5242 .setIntent(makeIntent("action3", ShortcutActivity.class, "key", "x")).build());
5243 assertEquals("action3", si.getIntent().getAction());
5244 assertEquals("x", si.getIntent().getStringExtra("key"));
5245
5246 si = sorig.clone(/* flags=*/ 0);
5247 si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
5248 .setWeight(999).build());
5249 assertEquals(999, si.getWeight());
5250
5251
5252 PersistableBundle pb2 = new PersistableBundle();
5253 pb2.putInt("x", 99);
5254
5255 si = sorig.clone(/* flags=*/ 0);
5256 si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
5257 .setExtras(pb2).build());
5258 assertEquals(99, si.getExtras().getInt("x"));
5259
5260 final long timestamp = si.getLastChangedTimestamp();
5261 Thread.sleep(2);
5262
5263 si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
5264 .setTitle("xyz").build());
5265
5266 assertTrue(si.getLastChangedTimestamp() > timestamp);
5267 }
5268
5269 public void testShortcutInfoSaveAndLoad() throws InterruptedException {
5270 setCaller(CALLING_PACKAGE_1, USER_0);
5271
5272 final Icon bmp32x32 = Icon.createWithBitmap(BitmapFactory.decodeResource(
5273 getTestContext().getResources(), R.drawable.black_32x32));
5274
5275 PersistableBundle pb = new PersistableBundle();
5276 pb.putInt("k", 1);
5277 ShortcutInfo sorig = new ShortcutInfo.Builder(mClientContext)
5278 .setId("id")
5279 .setActivityComponent(new ComponentName(mClientContext, ShortcutActivity2.class))
5280 .setIcon(bmp32x32)
5281 .setTitle("title")
5282 .setText("text")
5283 .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
5284 .setWeight(123)
5285 .setExtras(pb)
5286 .build();
5287
5288 mManager.addDynamicShortcut(sorig);
5289
5290 Thread.sleep(2);
5291 final long now = System.currentTimeMillis();
5292
5293 // Save and load.
5294 mService.saveDirtyInfo();
5295 initService();
5296 mService.handleUnlockUser(USER_0);
5297
5298 ShortcutInfo si;
5299 si = mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "id", USER_0);
5300
5301 assertEquals(CALLING_PACKAGE_1, si.getPackageName());
5302 assertEquals("id", si.getId());
5303 assertEquals(ShortcutActivity2.class.getName(), si.getActivityComponent().getClassName());
5304 assertEquals(null, si.getIcon());
5305 assertEquals("title", si.getTitle());
5306 assertEquals("text", si.getText());
5307 assertEquals("action", si.getIntent().getAction());
5308 assertEquals("val", si.getIntent().getStringExtra("key"));
5309 assertEquals(123, si.getWeight());
5310 assertEquals(1, si.getExtras().getInt("k"));
5311
5312 assertEquals(ShortcutInfo.FLAG_DYNAMIC | ShortcutInfo.FLAG_HAS_ICON_FILE, si.getFlags());
5313 assertNotNull(si.getBitmapPath()); // Something should be set.
5314 assertEquals(0, si.getIconResourceId());
5315 assertTrue(si.getLastChangedTimestamp() < now);
5316 }
5317
5318 public void testShortcutInfoSaveAndLoad_forBackup() {
5319 setCaller(CALLING_PACKAGE_1, USER_0);
5320
5321 final Icon bmp32x32 = Icon.createWithBitmap(BitmapFactory.decodeResource(
5322 getTestContext().getResources(), R.drawable.black_32x32));
5323
5324 PersistableBundle pb = new PersistableBundle();
5325 pb.putInt("k", 1);
5326 ShortcutInfo sorig = new ShortcutInfo.Builder(mClientContext)
5327 .setId("id")
5328 .setActivityComponent(new ComponentName(mClientContext, ShortcutActivity2.class))
5329 .setIcon(bmp32x32)
5330 .setTitle("title")
5331 .setText("text")
5332 .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
5333 .setWeight(123)
5334 .setExtras(pb)
5335 .build();
5336
5337 mManager.addDynamicShortcut(sorig);
5338
5339 // Dynamic shortcuts won't be backed up, so we need to pin it.
5340 setCaller(LAUNCHER_1, USER_0);
5341 mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("id"), HANDLE_USER_0);
5342
5343 // Do backup & restore.
5344 backupAndRestore();
5345
5346 ShortcutInfo si;
5347 si = mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "id", USER_0);
5348
5349 assertEquals(CALLING_PACKAGE_1, si.getPackageName());
5350 assertEquals("id", si.getId());
5351 assertEquals(ShortcutActivity2.class.getName(), si.getActivityComponent().getClassName());
5352 assertEquals(null, si.getIcon());
5353 assertEquals("title", si.getTitle());
5354 assertEquals("text", si.getText());
5355 assertEquals("action", si.getIntent().getAction());
5356 assertEquals("val", si.getIntent().getStringExtra("key"));
5357 assertEquals(123, si.getWeight());
5358 assertEquals(1, si.getExtras().getInt("k"));
5359
5360 assertEquals(ShortcutInfo.FLAG_PINNED, si.getFlags());
5361 assertNull(si.getBitmapPath()); // No icon.
5362 assertEquals(0, si.getIconResourceId());
5363 }
5364
5365 public void testDumpsys_crossProfile() {
5366 prepareCrossProfileDataSet();
5367 dumpsysOnLogcat("test1", /* force= */ true);
5368 }
5369
5370 public void testDumpsys_withIcons() {
5371 testIcons();
5372 // Dump after having some icons.
5373 dumpsysOnLogcat("test1", /* force= */ true);
Makoto Onuki0acbb142016-03-22 17:02:57 -07005374 }
Makoto Onuki6f7362d92016-03-04 13:39:41 -08005375}