151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki/*
251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki * Copyright (C) 2016 The Android Open Source Project
351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki *
451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki * Licensed under the Apache License, Version 2.0 (the "License");
551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki * you may not use this file except in compliance with the License.
651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki * You may obtain a copy of the License at
751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki *
851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki *      http://www.apache.org/licenses/LICENSE-2.0
951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki *
1051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki * Unless required by applicable law or agreed to in writing, software
1151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki * distributed under the License is distributed on an "AS IS" BASIS,
1251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki * See the License for the specific language governing permissions and
1451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki * limitations under the License.
1551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki */
1651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukipackage com.android.server.pm;
1751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
18d0010c5ef12ccf0b5c20e7c12cf86def990b4febMakoto Onukiimport static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.anyOrNull;
19d0010c5ef12ccf0b5c20e7c12cf86def990b4febMakoto Onukiimport static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.anyStringOrNull;
2051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.cloneShortcutList;
2151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.hashSet;
2251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.list;
2351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.makeBundle;
2451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.set;
2551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
2651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport static org.mockito.Matchers.any;
27157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onukiimport static org.mockito.Matchers.anyInt;
28157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onukiimport static org.mockito.Matchers.anyString;
2951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport static org.mockito.Matchers.eq;
3051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport static org.mockito.Mockito.doAnswer;
3151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport static org.mockito.Mockito.mock;
3251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport static org.mockito.Mockito.reset;
3351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport static org.mockito.Mockito.spy;
34ff14f73152775f91fe211729e2cb16a5da6933abMakoto Onukiimport static org.mockito.Mockito.times;
3551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport static org.mockito.Mockito.verify;
3651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport static org.mockito.Mockito.when;
3751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
3851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.annotation.NonNull;
3951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.annotation.UserIdInt;
4051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.app.Activity;
4133525d2f1a8116820f58fc90941cb53bcba54805Makoto Onukiimport android.app.ActivityManager;
42ea11db15bd0cfe6ecbc44dd80a988ddf0e8c1ce7Makoto Onukiimport android.app.ActivityManagerInternal;
4351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.app.IUidObserver;
44ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onukiimport android.app.usage.UsageStatsManagerInternal;
45440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onukiimport android.content.ActivityNotFoundException;
4651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.content.BroadcastReceiver;
4751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.content.ComponentName;
4851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.content.Context;
4951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.content.Intent;
5051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.content.IntentFilter;
512d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onukiimport android.content.IntentSender;
5251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.content.pm.ActivityInfo;
5351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.content.pm.ApplicationInfo;
5451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.content.pm.ILauncherApps;
5551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.content.pm.LauncherApps;
5651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.content.pm.LauncherApps.ShortcutQuery;
5751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.content.pm.PackageInfo;
5851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.content.pm.PackageManager;
5951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.content.pm.PackageManagerInternal;
60b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onukiimport android.content.pm.ResolveInfo;
6151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.content.pm.ShortcutInfo;
6251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.content.pm.ShortcutManager;
6351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.content.pm.ShortcutServiceInternal;
6451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.content.pm.Signature;
6551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.content.pm.UserInfo;
6651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.content.res.Resources;
6751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.content.res.XmlResourceParser;
6851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.graphics.drawable.Icon;
6951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.net.Uri;
7051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.os.Bundle;
7151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.os.FileUtils;
7251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.os.Handler;
7351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.os.Looper;
74b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onukiimport android.os.PersistableBundle;
7551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.os.Process;
76a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onukiimport android.os.RemoteException;
7751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.os.UserHandle;
7851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.os.UserManager;
7951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.test.InstrumentationTestCase;
8051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.test.mock.MockContext;
812d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onukiimport android.util.ArrayMap;
8251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.util.Log;
8351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.util.Pair;
8451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
8551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport com.android.internal.util.Preconditions;
8651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport com.android.server.LocalServices;
8751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport com.android.server.SystemService;
8851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport com.android.server.pm.LauncherAppsService.LauncherAppsImpl;
8951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport com.android.server.pm.ShortcutUser.PackageWithUser;
9051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
9151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport org.junit.Assert;
9251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport org.mockito.ArgumentCaptor;
9351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport org.mockito.invocation.InvocationOnMock;
9451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport org.mockito.stubbing.Answer;
9551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
9651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport java.io.BufferedReader;
9751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport java.io.ByteArrayOutputStream;
9851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport java.io.File;
9951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport java.io.FileReader;
10076269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onukiimport java.io.IOException;
10176269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onukiimport java.io.InputStreamReader;
10251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport java.io.PrintWriter;
10351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport java.util.ArrayList;
10451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport java.util.HashMap;
10551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport java.util.HashSet;
10651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport java.util.LinkedHashMap;
10751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport java.util.List;
108157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onukiimport java.util.Locale;
10951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport java.util.Map;
11051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport java.util.Set;
111b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onukiimport java.util.function.BiFunction;
11251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport java.util.function.BiPredicate;
11351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport java.util.function.Consumer;
114a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onukiimport java.util.function.Function;
11551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
11651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukipublic abstract class BaseShortcutManagerTest extends InstrumentationTestCase {
11751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static final String TAG = "ShortcutManagerTest";
11851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
1194e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki    protected static final boolean DUMP_IN_TEARDOWN = false; // DO NOT SUBMIT WITH true
1204e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki
12151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    /**
12251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki     * Whether to enable dump or not.  Should be only true when debugging to avoid bugs where
12351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki     * dump affecting the behavior.
12451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki     */
1254e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki    protected static final boolean ENABLE_DUMP = false // DO NOT SUBMIT WITH true
1264e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki            || DUMP_IN_TEARDOWN || ShortcutService.DEBUG;
12751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
12851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static final String[] EMPTY_STRINGS = new String[0]; // Just for readability.
12951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
130b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki    protected static final String MAIN_ACTIVITY_CLASS = "MainActivity";
1312d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki    protected static final String PIN_CONFIRM_ACTIVITY_CLASS = "PinConfirmActivity";
132b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki
13351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    // public for mockito
13451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public class BaseContext extends MockContext {
13551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
13651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        public Object getSystemService(String name) {
13751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            switch (name) {
13851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                case Context.USER_SERVICE:
13951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                    return mMockUserManager;
14051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            }
14151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            throw new UnsupportedOperationException();
14251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
14351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
14451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
14551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        public String getSystemServiceName(Class<?> serviceClass) {
14651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            return getTestContext().getSystemServiceName(serviceClass);
14751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
14851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
14951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
15051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        public PackageManager getPackageManager() {
15151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            return mMockPackageManager;
15251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
15351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
15451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
15551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        public Resources getResources() {
15651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            return getTestContext().getResources();
15751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
15851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
15951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
16051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user,
16151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                IntentFilter filter, String broadcastPermission, Handler scheduler) {
16251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            // ignore.
16351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            return null;
16451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
1654e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki
1664e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki        @Override
1674e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki        public void unregisterReceiver(BroadcastReceiver receiver) {
1684e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki            // ignore.
1694e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki        }
1702d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki
1712d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        @Override
1722d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        public void startActivityAsUser(Intent intent, UserHandle user) {
1732d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            // ignore, use spy to intercept it.
1742d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        }
17551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
17651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
17751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    /** Context used in the client side */
17851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public class ClientContext extends BaseContext {
17951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
18051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        public String getPackageName() {
18151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            return mInjectedClientPackage;
18251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
18351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
18451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
18551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        public int getUserId() {
18651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            return getCallingUserId();
18751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
18851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
18951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
19051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    /** Context used in the service side */
19151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public class ServiceContext extends BaseContext {
19251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        long injectClearCallingIdentity() {
19351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            final int prevCallingUid = mInjectedCallingUid;
19451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mInjectedCallingUid = Process.SYSTEM_UID;
19551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            return prevCallingUid;
19651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
19751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
19851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        void injectRestoreCallingIdentity(long token) {
19951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mInjectedCallingUid = (int) token;
20051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
20151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
20251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
20351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        public int getUserId() {
20451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            return UserHandle.USER_SYSTEM;
20551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
20651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
20751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        public PackageInfo injectGetActivitiesWithMetadata(
20851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                String packageName, @UserIdInt int userId) {
20951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            return BaseShortcutManagerTest.this.injectGetActivitiesWithMetadata(packageName, userId);
21051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
21151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
21251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        public XmlResourceParser injectXmlMetaData(ActivityInfo activityInfo, String key) {
21351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            return BaseShortcutManagerTest.this.injectXmlMetaData(activityInfo, key);
21451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
2152d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki
2162d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        public void sendIntentSender(IntentSender intent) {
2172d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            // Placeholder for spying.
2182d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        }
21951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
22051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
22151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    /** ShortcutService with injection override methods. */
22251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected final class ShortcutServiceTestable extends ShortcutService {
22351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final ServiceContext mContext;
22451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        IUidObserver mUidObserver;
22551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
22651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        public ShortcutServiceTestable(ServiceContext context, Looper looper) {
227ee6b6e4a1861336f8db52d8c93dbf32ee9615cfaMakoto Onuki            super(context, looper, /* onyForPackageManagerApis */ false);
22851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mContext = context;
22951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
23051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
23151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
2324e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki        public String injectGetLocaleTagsForUser(@UserIdInt int userId) {
2334e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki            return mInjectedLocale.toLanguageTag();
2344e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki        }
2354e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki
2364e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki        @Override
23751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        boolean injectShouldPerformVerification() {
23851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            return true; // Always verify during unit tests.
23951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
24051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
24151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
24251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        String injectShortcutManagerConstants() {
24351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            return ConfigConstants.KEY_RESET_INTERVAL_SEC + "=" + (INTERVAL / 1000) + ","
24451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                    + ConfigConstants.KEY_MAX_SHORTCUTS + "=" + MAX_SHORTCUTS + ","
24551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                    + ConfigConstants.KEY_MAX_UPDATES_PER_INTERVAL + "="
24651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                    + MAX_UPDATES_PER_INTERVAL + ","
24751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                    + ConfigConstants.KEY_MAX_ICON_DIMENSION_DP + "=" + MAX_ICON_DIMENSION + ","
24851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                    + ConfigConstants.KEY_MAX_ICON_DIMENSION_DP_LOWRAM + "="
24951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                    + MAX_ICON_DIMENSION_LOWRAM + ","
25051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                    + ConfigConstants.KEY_ICON_FORMAT + "=PNG,"
25151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                    + ConfigConstants.KEY_ICON_QUALITY + "=100";
25251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
25351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
25451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
25551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        long injectClearCallingIdentity() {
25651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            return mContext.injectClearCallingIdentity();
25751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
25851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
25951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
26051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        void injectRestoreCallingIdentity(long token) {
26151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mContext.injectRestoreCallingIdentity(token);
26251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
26351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
26451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
26551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        int injectDipToPixel(int dip) {
26651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            return dip;
26751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
26851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
26951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
27051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        long injectCurrentTimeMillis() {
27151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            return mInjectedCurrentTimeMillis;
27251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
27351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
27451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
27551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        long injectElapsedRealtime() {
27651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            // TODO This should be kept separately from mInjectedCurrentTimeMillis, since
27751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            // this should increase even if we rewind mInjectedCurrentTimeMillis in some tests.
27851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            return mInjectedCurrentTimeMillis - START_TIME;
27951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
28051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
28151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
282475c36539da9687d75447adb9054c98ce03c754aMakoto Onuki        long injectUptimeMillis() {
283475c36539da9687d75447adb9054c98ce03c754aMakoto Onuki            return mInjectedCurrentTimeMillis - START_TIME - mDeepSleepTime;
284475c36539da9687d75447adb9054c98ce03c754aMakoto Onuki        }
285475c36539da9687d75447adb9054c98ce03c754aMakoto Onuki
286475c36539da9687d75447adb9054c98ce03c754aMakoto Onuki        @Override
28751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        int injectBinderCallingUid() {
28851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            return mInjectedCallingUid;
28951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
29051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
29151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
29251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        int injectGetPackageUid(String packageName, int userId) {
29351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            return getInjectedPackageInfo(packageName, userId, false).applicationInfo.uid;
29451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
29551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
29651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
29751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        File injectSystemDataPath() {
29851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            return new File(mInjectedFilePathRoot, "system");
29951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
30051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
30151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
30251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        File injectUserDataPath(@UserIdInt int userId) {
30351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            return new File(mInjectedFilePathRoot, "user-" + userId);
30451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
30551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
30651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
30751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        void injectValidateIconResPackage(ShortcutInfo shortcut, Icon icon) {
30851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            // Can't check
30951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
31051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
31151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
31251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        boolean injectIsLowRamDevice() {
31351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            return mInjectedIsLowRamDevice;
31451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
31551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
31651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
31751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        void injectRegisterUidObserver(IUidObserver observer, int which) {
31851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mUidObserver = observer;
31951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
32051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
32151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
32251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        boolean hasShortcutHostPermission(@NonNull String callingPackage, int userId) {
32351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            return mDefaultLauncherChecker.test(callingPackage, userId);
32451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
32551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
32651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
3272d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        ComponentName getDefaultLauncher(@UserIdInt int userId) {
3282d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            final ComponentName activity = mDefaultLauncher.get(userId);
3292d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            if (activity != null) {
3302d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki                return activity;
3312d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            }
3322d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            return super.getDefaultLauncher(userId);
3332d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        }
3342d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki
3352d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        @Override
336ee6b6e4a1861336f8db52d8c93dbf32ee9615cfaMakoto Onuki        PackageInfo injectPackageInfoWithUninstalled(String packageName, @UserIdInt int userId,
33751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                boolean getSignatures) {
33851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            return getInjectedPackageInfo(packageName, userId, getSignatures);
33951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
34051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
34151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
342ee6b6e4a1861336f8db52d8c93dbf32ee9615cfaMakoto Onuki        ApplicationInfo injectApplicationInfoWithUninstalled(
343ee6b6e4a1861336f8db52d8c93dbf32ee9615cfaMakoto Onuki                String packageName, @UserIdInt int userId) {
344ee6b6e4a1861336f8db52d8c93dbf32ee9615cfaMakoto Onuki            PackageInfo pi = injectPackageInfoWithUninstalled(
345ee6b6e4a1861336f8db52d8c93dbf32ee9615cfaMakoto Onuki                    packageName, userId, /* getSignatures= */ false);
34651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            return pi != null ? pi.applicationInfo : null;
34751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
34851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
34951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
350ee6b6e4a1861336f8db52d8c93dbf32ee9615cfaMakoto Onuki        List<PackageInfo> injectGetPackagesWithUninstalled(@UserIdInt int userId) {
351ee6b6e4a1861336f8db52d8c93dbf32ee9615cfaMakoto Onuki            return BaseShortcutManagerTest.this.getInstalledPackagesWithUninstalled(userId);
35251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
35351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
35451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
355ee6b6e4a1861336f8db52d8c93dbf32ee9615cfaMakoto Onuki        ActivityInfo injectGetActivityInfoWithMetadataWithUninstalled(ComponentName activity,
356b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                @UserIdInt int userId) {
357b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki            final PackageInfo pi = mContext.injectGetActivitiesWithMetadata(
358b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                    activity.getPackageName(), userId);
359b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki            if (pi == null || pi.activities == null) {
360b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                return null;
361b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki            }
362b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki            for (ActivityInfo ai : pi.activities) {
363b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                if (!mEnabledActivityChecker.test(ai.getComponentName(), userId)) {
364b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                    continue;
365b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                }
366b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                if (activity.equals(ai.getComponentName())) {
367b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                    return ai;
368b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                }
369b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki            }
370b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki            return null;
371b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        }
372b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki
373b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        @Override
374b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        boolean injectIsMainActivity(@NonNull ComponentName activity, int userId) {
375b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki            if (!mEnabledActivityChecker.test(activity, userId)) {
376b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                return false;
377b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki            }
378b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki            return mMainActivityChecker.test(activity, userId);
379b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        }
380b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki
381b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        @Override
382b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        List<ResolveInfo> injectGetMainActivities(@NonNull String packageName, int userId) {
383b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki            final PackageInfo pi = mContext.injectGetActivitiesWithMetadata(
384b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                    packageName, userId);
385b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki            if (pi == null || pi.activities == null) {
386b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                return null;
387b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki            }
388b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki            final ArrayList<ResolveInfo> ret = new ArrayList<>(pi.activities.length);
389b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki            for (int i = 0; i < pi.activities.length; i++) {
390b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                if (!mEnabledActivityChecker.test(pi.activities[i].getComponentName(), userId)) {
391b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                    continue;
392b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                }
393b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                final ResolveInfo ri = new ResolveInfo();
394b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                ri.activityInfo = pi.activities[i];
395b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                ret.add(ri);
396b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki            }
397b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki
398b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki            return ret;
399b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        }
400b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki
401b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        @Override
402b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        ComponentName injectGetDefaultMainActivity(@NonNull String packageName, int userId) {
403b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki            return mMainActivityFetcher.apply(packageName, userId);
40451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
40551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
40651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
4072d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        ComponentName injectGetPinConfirmationActivity(@NonNull String launcherPackageName,
4087f7372ae2abeecb564d426ec3efbfa039c797885Sunny Goyal                int launcherUserId, int requestType) {
4092d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            return mPinConfirmActivityFetcher.apply(launcherPackageName, launcherUserId);
4102d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        }
4112d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki
4122d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        @Override
413ee6b6e4a1861336f8db52d8c93dbf32ee9615cfaMakoto Onuki        boolean injectIsActivityEnabledAndExported(ComponentName activity, @UserIdInt int userId) {
414ee6b6e4a1861336f8db52d8c93dbf32ee9615cfaMakoto Onuki            return mEnabledActivityChecker.test(activity, userId);
415ee6b6e4a1861336f8db52d8c93dbf32ee9615cfaMakoto Onuki        }
416ee6b6e4a1861336f8db52d8c93dbf32ee9615cfaMakoto Onuki
417ee6b6e4a1861336f8db52d8c93dbf32ee9615cfaMakoto Onuki        @Override
41851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        XmlResourceParser injectXmlMetaData(ActivityInfo activityInfo, String key) {
41951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            return mContext.injectXmlMetaData(activityInfo, key);
42051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
42151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
42251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
423157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        void injectPostToHandler(Runnable r) {
424a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki            runOnHandler(r);
42551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
42651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
42751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
428085a05cd864252314bcf5c339017a16b68105204Makoto Onuki        void injectRunOnNewThread(Runnable r) {
429085a05cd864252314bcf5c339017a16b68105204Makoto Onuki            runOnHandler(r);
430085a05cd864252314bcf5c339017a16b68105204Makoto Onuki        }
431085a05cd864252314bcf5c339017a16b68105204Makoto Onuki
432085a05cd864252314bcf5c339017a16b68105204Makoto Onuki        @Override
43351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        void injectEnforceCallingPermission(String permission, String message) {
43451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            if (!mCallerPermissions.contains(permission)) {
43551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                throw new SecurityException("Missing permission: " + permission);
43651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            }
43751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
43851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
43951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
440b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        boolean injectIsSafeModeEnabled() {
441b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki            return mSafeMode;
442b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        }
443b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki
444b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        @Override
4453366328245621fa6e8fd764a4d3c2f073774d096Makoto Onuki        String injectBuildFingerprint() {
4463366328245621fa6e8fd764a4d3c2f073774d096Makoto Onuki            return mInjectedBuildFingerprint;
4473366328245621fa6e8fd764a4d3c2f073774d096Makoto Onuki        }
4483366328245621fa6e8fd764a4d3c2f073774d096Makoto Onuki
4493366328245621fa6e8fd764a4d3c2f073774d096Makoto Onuki        @Override
45087a563e0707bb7e2be034c195e9827dfe3451cfdSunny Goyal        void injectSendIntentSender(IntentSender intent, Intent extras) {
4512d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            mContext.sendIntentSender(intent);
4522d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        }
4532d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki
4542d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        @Override
455a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki        void wtf(String message, Throwable th) {
45651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            // During tests, WTF is fatal.
457a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki            fail(message + "  exception: " + th + "\n" + Log.getStackTraceString(th));
458a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki        }
45951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
46051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
46151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    /** ShortcutManager with injection override methods. */
46251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected class ShortcutManagerTestable extends ShortcutManager {
46351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        public ShortcutManagerTestable(Context context, ShortcutServiceTestable service) {
46451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            super(context, service);
46551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
46651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
46751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
46851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        protected int injectMyUserId() {
46951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            return UserHandle.getUserId(mInjectedCallingUid);
47051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
47151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
47251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
47351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        public boolean setDynamicShortcuts(@NonNull List<ShortcutInfo> shortcutInfoList) {
47451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            // Note to simulate the binder RPC, we need to clone the incoming arguments.
47551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            // Otherwise bad things will happen because they're mutable.
47651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            return super.setDynamicShortcuts(cloneShortcutList(shortcutInfoList));
47751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
47851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
47951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
48051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        public boolean addDynamicShortcuts(@NonNull List<ShortcutInfo> shortcutInfoList) {
48151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            // Note to simulate the binder RPC, we need to clone the incoming arguments.
48251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            return super.addDynamicShortcuts(cloneShortcutList(shortcutInfoList));
48351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
48451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
48551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
48651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        public boolean updateShortcuts(List<ShortcutInfo> shortcutInfoList) {
48751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            // Note to simulate the binder RPC, we need to clone the incoming arguments.
48851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            return super.updateShortcuts(cloneShortcutList(shortcutInfoList));
48951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
49051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
49151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
49251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected class LauncherAppImplTestable extends LauncherAppsImpl {
49351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final ServiceContext mContext;
49451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
49551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        public LauncherAppImplTestable(ServiceContext context) {
49651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            super(context);
49751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mContext = context;
49851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
49951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
50051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
50151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        public void verifyCallingPackage(String callingPackage) {
50251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            // SKIP
50351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
50451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
50551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
50651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        void postToPackageMonitorHandler(Runnable r) {
507a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki            runOnHandler(r);
50851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
50951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
51051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
51151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        int injectBinderCallingUid() {
51251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            return mInjectedCallingUid;
51351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
51451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
51551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
51651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        long injectClearCallingIdentity() {
51751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            final int prevCallingUid = mInjectedCallingUid;
51851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mInjectedCallingUid = Process.SYSTEM_UID;
51951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            return prevCallingUid;
52051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
52151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
52251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
52351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        void injectRestoreCallingIdentity(long token) {
52451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mInjectedCallingUid = (int) token;
52551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
52651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
52751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
52851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected class LauncherAppsTestable extends LauncherApps {
52951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        public LauncherAppsTestable(Context context, ILauncherApps service) {
53051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            super(context, service);
53151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
53251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
53351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
53451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public static class ShortcutActivity extends Activity {
53551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
53651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
53751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public static class ShortcutActivity2 extends Activity {
53851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
53951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
54051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public static class ShortcutActivity3 extends Activity {
54151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
54251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
543a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki    protected Looper mLooper;
544a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki    protected Handler mHandler;
545a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki
54651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected ServiceContext mServiceContext;
54751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected ClientContext mClientContext;
54851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
54951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected ShortcutServiceTestable mService;
55051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected ShortcutManagerTestable mManager;
55151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected ShortcutServiceInternal mInternal;
55251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
55351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected LauncherAppImplTestable mLauncherAppImpl;
55451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
55551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    // LauncherApps has per-instace state, so we need a differnt instance for each launcher.
55651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected final Map<Pair<Integer, String>, LauncherAppsTestable>
55751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mLauncherAppsMap = new HashMap<>();
55851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected LauncherAppsTestable mLauncherApps; // Current one
55951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
56051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected File mInjectedFilePathRoot;
56151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
562b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki    protected boolean mSafeMode;
563b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki
56451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected long mInjectedCurrentTimeMillis;
565475c36539da9687d75447adb9054c98ce03c754aMakoto Onuki    protected long mDeepSleepTime; // Used to calculate "uptimeMillis".
56651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
56751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected boolean mInjectedIsLowRamDevice;
56851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
569157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    protected Locale mInjectedLocale = Locale.ENGLISH;
570157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
57151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected int mInjectedCallingUid;
57251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected String mInjectedClientPackage;
57351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
57451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected Map<String, PackageInfo> mInjectedPackages;
57551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
57651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected Set<PackageWithUser> mUninstalledPackages;
57782fb2eb057032bb7f38f547fb3667c7bf2547517Makoto Onuki    protected Set<PackageWithUser> mDisabledPackages;
57866e4a2b801fe0ff2ee1db5e0578a3e7cb6e1f6d6Makoto Onuki    protected Set<PackageWithUser> mEphemeralPackages;
5793366328245621fa6e8fd764a4d3c2f073774d096Makoto Onuki    protected Set<String> mSystemPackages;
58051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
58151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected PackageManager mMockPackageManager;
58251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected PackageManagerInternal mMockPackageManagerInternal;
58351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected UserManager mMockUserManager;
584ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki    protected UsageStatsManagerInternal mMockUsageStatsManagerInternal;
585ea11db15bd0cfe6ecbc44dd80a988ddf0e8c1ce7Makoto Onuki    protected ActivityManagerInternal mMockActivityManagerInternal;
58651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
58751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static final String CALLING_PACKAGE_1 = "com.android.test.1";
58851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static final int CALLING_UID_1 = 10001;
58951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
59051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static final String CALLING_PACKAGE_2 = "com.android.test.2";
59151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static final int CALLING_UID_2 = 10002;
59251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
59351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static final String CALLING_PACKAGE_3 = "com.android.test.3";
59451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static final int CALLING_UID_3 = 10003;
59551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
59651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static final String CALLING_PACKAGE_4 = "com.android.test.4";
59751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static final int CALLING_UID_4 = 10004;
59851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
59951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static final String LAUNCHER_1 = "com.android.launcher.1";
60051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static final int LAUNCHER_UID_1 = 10011;
60151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
60251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static final String LAUNCHER_2 = "com.android.launcher.2";
60351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static final int LAUNCHER_UID_2 = 10012;
60451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
60551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static final String LAUNCHER_3 = "com.android.launcher.3";
60651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static final int LAUNCHER_UID_3 = 10013;
60751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
60851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static final String LAUNCHER_4 = "com.android.launcher.4";
60951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static final int LAUNCHER_UID_4 = 10014;
61051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
61151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static final int USER_0 = UserHandle.USER_SYSTEM;
61251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static final int USER_10 = 10;
61351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static final int USER_11 = 11;
614de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki    protected static final int USER_P0 = 20; // profile of user 0 (MANAGED_PROFILE *not* set)
615de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki    protected static final int USER_P1 = 21; // another profile of user 0 (MANAGED_PROFILE set)
61651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
61751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static final UserHandle HANDLE_USER_0 = UserHandle.of(USER_0);
61851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static final UserHandle HANDLE_USER_10 = UserHandle.of(USER_10);
61951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static final UserHandle HANDLE_USER_11 = UserHandle.of(USER_11);
62051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static final UserHandle HANDLE_USER_P0 = UserHandle.of(USER_P0);
621de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki    protected static final UserHandle HANDLE_USER_P1 = UserHandle.of(USER_P1);
62251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
62351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static final UserInfo USER_INFO_0 = withProfileGroupId(
62451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            new UserInfo(USER_0, "user0",
6252d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki                    UserInfo.FLAG_ADMIN | UserInfo.FLAG_PRIMARY | UserInfo.FLAG_INITIALIZED), 0);
62651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
62751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static final UserInfo USER_INFO_10 =
62851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            new UserInfo(USER_10, "user10", UserInfo.FLAG_INITIALIZED);
62951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
63051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static final UserInfo USER_INFO_11 =
63151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            new UserInfo(USER_11, "user11", UserInfo.FLAG_INITIALIZED);
63251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
633aecbd037514af1bff0f5ca50932241776d6c5fc3Makoto Onuki    /*
634aecbd037514af1bff0f5ca50932241776d6c5fc3Makoto Onuki     * Cheat: USER_P0 is a sub profile of USER_0, but it doesn't have the MANAGED_PROFILE flag set.
635aecbd037514af1bff0f5ca50932241776d6c5fc3Makoto Onuki     * Due to a change made to LauncherApps (b/34340531), work profile apps a no longer able
636aecbd037514af1bff0f5ca50932241776d6c5fc3Makoto Onuki     * to see the main profile, which would break tons of unit tests.  We avoid it by not setting
637aecbd037514af1bff0f5ca50932241776d6c5fc3Makoto Onuki     * MANAGED_PROFILE for P0.
638aecbd037514af1bff0f5ca50932241776d6c5fc3Makoto Onuki     * We cover this negative case in CTS. (i.e. CTS has tests to make sure maanged profile
639aecbd037514af1bff0f5ca50932241776d6c5fc3Makoto Onuki     * can't access main profile's shortcuts.)
640aecbd037514af1bff0f5ca50932241776d6c5fc3Makoto Onuki     */
64151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static final UserInfo USER_INFO_P0 = withProfileGroupId(
642aecbd037514af1bff0f5ca50932241776d6c5fc3Makoto Onuki            new UserInfo(USER_P0, "userP0", UserInfo.FLAG_INITIALIZED), 0);
64351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
644de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki    protected static final UserInfo USER_INFO_P1 = withProfileGroupId(
645de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki            new UserInfo(USER_P1, "userP1",
646de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki                    UserInfo.FLAG_INITIALIZED | UserInfo.FLAG_MANAGED_PROFILE), 0);
647de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki
64851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected BiPredicate<String, Integer> mDefaultLauncherChecker =
64951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            (callingPackage, userId) ->
65051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            LAUNCHER_1.equals(callingPackage) || LAUNCHER_2.equals(callingPackage)
65151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            || LAUNCHER_3.equals(callingPackage) || LAUNCHER_4.equals(callingPackage);
65251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
6532d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki    private final Map<Integer, ComponentName> mDefaultLauncher = new ArrayMap<>();
6542d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki
655b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki    protected BiPredicate<ComponentName, Integer> mMainActivityChecker =
656b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki            (activity, userId) -> true;
657b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki
658b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki    protected BiFunction<String, Integer, ComponentName> mMainActivityFetcher =
659b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki            (packageName, userId) -> new ComponentName(packageName, MAIN_ACTIVITY_CLASS);
660b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki
6612d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki    protected BiFunction<String, Integer, ComponentName> mPinConfirmActivityFetcher =
6622d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            (packageName, userId) -> new ComponentName(packageName, PIN_CONFIRM_ACTIVITY_CLASS);
6632d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki
664b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki    protected BiPredicate<ComponentName, Integer> mEnabledActivityChecker
665b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki            = (activity, userId) -> true; // all activities are enabled.
666b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki
66751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static final long START_TIME = 1440000000101L;
66851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
66951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static final long INTERVAL = 10000;
67051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
67151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static final int MAX_SHORTCUTS = 10;
67251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
67351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static final int MAX_UPDATES_PER_INTERVAL = 3;
67451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
67551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static final int MAX_ICON_DIMENSION = 128;
67651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
67751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static final int MAX_ICON_DIMENSION_LOWRAM = 32;
67851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
67951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static final ShortcutQuery QUERY_ALL = new ShortcutQuery();
68051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
68151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected final ArrayList<String> mCallerPermissions = new ArrayList<>();
68251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
68351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected final HashMap<String, LinkedHashMap<ComponentName, Integer>> mActivityMetadataResId
68451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            = new HashMap<>();
68551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
686a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki    protected final Map<Integer, UserInfo> mUserInfos = new HashMap<>();
687a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki    protected final Map<Integer, Boolean> mRunningUsers = new HashMap<>();
688a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki    protected final Map<Integer, Boolean> mUnlockedUsers = new HashMap<>();
689a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki
6900b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki    protected static final String PACKAGE_SYSTEM_LAUNCHER = "com.android.systemlauncher";
6910b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki    protected static final String PACKAGE_SYSTEM_LAUNCHER_NAME = "systemlauncher_name";
6920b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki    protected static final int PACKAGE_SYSTEM_LAUNCHER_PRIORITY = 0;
6930b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki
6940b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki    protected static final String PACKAGE_FALLBACK_LAUNCHER = "com.android.settings";
6950b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki    protected static final String PACKAGE_FALLBACK_LAUNCHER_NAME = "fallback";
6960b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki    protected static final int PACKAGE_FALLBACK_LAUNCHER_PRIORITY = -999;
6970b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki
6983366328245621fa6e8fd764a4d3c2f073774d096Makoto Onuki    protected String mInjectedBuildFingerprint = "build1";
6993366328245621fa6e8fd764a4d3c2f073774d096Makoto Onuki
70051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    static {
70151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        QUERY_ALL.setQueryFlags(
7024d6b87ffdf06df3303239130ced685bc1a3fae50Makoto Onuki                ShortcutQuery.FLAG_GET_ALL_KINDS);
70351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
70451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
70551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    @Override
70651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected void setUp() throws Exception {
70751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        super.setUp();
70851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
709a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki        mLooper = Looper.getMainLooper();
710a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki        mHandler = new Handler(mLooper);
711a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki
71251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mServiceContext = spy(new ServiceContext());
71351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mClientContext = new ClientContext();
71451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
71551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mMockPackageManager = mock(PackageManager.class);
71651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mMockPackageManagerInternal = mock(PackageManagerInternal.class);
71751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mMockUserManager = mock(UserManager.class);
718ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki        mMockUsageStatsManagerInternal = mock(UsageStatsManagerInternal.class);
719ea11db15bd0cfe6ecbc44dd80a988ddf0e8c1ce7Makoto Onuki        mMockActivityManagerInternal = mock(ActivityManagerInternal.class);
720ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki
721ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki        LocalServices.removeServiceForTest(PackageManagerInternal.class);
722ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki        LocalServices.addService(PackageManagerInternal.class, mMockPackageManagerInternal);
723ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki        LocalServices.removeServiceForTest(UsageStatsManagerInternal.class);
724ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki        LocalServices.addService(UsageStatsManagerInternal.class, mMockUsageStatsManagerInternal);
725ea11db15bd0cfe6ecbc44dd80a988ddf0e8c1ce7Makoto Onuki        LocalServices.removeServiceForTest(ActivityManagerInternal.class);
726ea11db15bd0cfe6ecbc44dd80a988ddf0e8c1ce7Makoto Onuki        LocalServices.addService(ActivityManagerInternal.class, mMockActivityManagerInternal);
72751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
72851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Prepare injection values.
72951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
73051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis = START_TIME;
73151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
73251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedPackages = new HashMap<>();
73351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        addPackage(CALLING_PACKAGE_1, CALLING_UID_1, 1);
73451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        addPackage(CALLING_PACKAGE_2, CALLING_UID_2, 2);
73551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        addPackage(CALLING_PACKAGE_3, CALLING_UID_3, 3);
73651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        addPackage(CALLING_PACKAGE_4, CALLING_UID_4, 10);
73751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        addPackage(LAUNCHER_1, LAUNCHER_UID_1, 4);
73851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        addPackage(LAUNCHER_2, LAUNCHER_UID_2, 5);
73951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        addPackage(LAUNCHER_3, LAUNCHER_UID_3, 6);
74051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        addPackage(LAUNCHER_4, LAUNCHER_UID_4, 10);
74151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
74251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // CALLING_PACKAGE_3 / LAUNCHER_3 are not backup target.
74351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        updatePackageInfo(CALLING_PACKAGE_3,
74451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                pi -> pi.applicationInfo.flags &= ~ApplicationInfo.FLAG_ALLOW_BACKUP);
74551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        updatePackageInfo(LAUNCHER_3,
74651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                pi -> pi.applicationInfo.flags &= ~ApplicationInfo.FLAG_ALLOW_BACKUP);
74751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
74851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mUninstalledPackages = new HashSet<>();
74982fb2eb057032bb7f38f547fb3667c7bf2547517Makoto Onuki        mDisabledPackages = new HashSet<>();
7503366328245621fa6e8fd764a4d3c2f073774d096Makoto Onuki        mSystemPackages = new HashSet<>();
75166e4a2b801fe0ff2ee1db5e0578a3e7cb6e1f6d6Makoto Onuki        mEphemeralPackages = new HashSet<>();
75251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
75351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedFilePathRoot = new File(getTestContext().getCacheDir(), "test-files");
75451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
75551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        deleteAllSavedFiles();
75651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
75751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Set up users.
758a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki        when(mMockUserManager.getUserInfo(anyInt())).thenAnswer(new AnswerWithSystemCheck<>(
759a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki                inv -> mUserInfos.get((Integer) inv.getArguments()[0])));
760a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki
761a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki        mUserInfos.put(USER_0, USER_INFO_0);
762a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki        mUserInfos.put(USER_10, USER_INFO_10);
763a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki        mUserInfos.put(USER_11, USER_INFO_11);
764a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki        mUserInfos.put(USER_P0, USER_INFO_P0);
765de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki        mUserInfos.put(USER_P1, USER_INFO_P1);
766a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki
767a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki        // Set up isUserRunning and isUserUnlocked.
768a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki        when(mMockUserManager.isUserRunning(anyInt())).thenAnswer(new AnswerWithSystemCheck<>(
7699c850012cacf0af4a392294566a8c7c897dc8771Makoto Onuki                        inv -> b(mRunningUsers.get((Integer) inv.getArguments()[0]))));
7709c850012cacf0af4a392294566a8c7c897dc8771Makoto Onuki
7719c850012cacf0af4a392294566a8c7c897dc8771Makoto Onuki        when(mMockUserManager.isUserUnlocked(anyInt()))
7729c850012cacf0af4a392294566a8c7c897dc8771Makoto Onuki                .thenAnswer(new AnswerWithSystemCheck<>(inv -> {
7739c850012cacf0af4a392294566a8c7c897dc8771Makoto Onuki                    final int userId = (Integer) inv.getArguments()[0];
7749c850012cacf0af4a392294566a8c7c897dc8771Makoto Onuki                    return b(mRunningUsers.get(userId)) && b(mUnlockedUsers.get(userId));
7759c850012cacf0af4a392294566a8c7c897dc8771Makoto Onuki                }));
7769c850012cacf0af4a392294566a8c7c897dc8771Makoto Onuki        // isUserUnlockingOrUnlocked() return the same value as isUserUnlocked().
7779c850012cacf0af4a392294566a8c7c897dc8771Makoto Onuki        when(mMockUserManager.isUserUnlockingOrUnlocked(anyInt()))
7789c850012cacf0af4a392294566a8c7c897dc8771Makoto Onuki                .thenAnswer(new AnswerWithSystemCheck<>(inv -> {
7799c850012cacf0af4a392294566a8c7c897dc8771Makoto Onuki                    final int userId = (Integer) inv.getArguments()[0];
7809c850012cacf0af4a392294566a8c7c897dc8771Makoto Onuki                    return b(mRunningUsers.get(userId)) && b(mUnlockedUsers.get(userId));
7819c850012cacf0af4a392294566a8c7c897dc8771Makoto Onuki                }));
7829c850012cacf0af4a392294566a8c7c897dc8771Makoto Onuki
7832d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        when(mMockUserManager.getProfileParent(anyInt()))
7842d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki                .thenAnswer(new AnswerWithSystemCheck<>(inv -> {
7852d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki                    final int userId = (Integer) inv.getArguments()[0];
7862d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki                    final UserInfo ui = mUserInfos.get(userId);
7872d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki                    assertNotNull(ui);
7882d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki                    if (ui.profileGroupId == UserInfo.NO_PROFILE_GROUP_ID) {
7892d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki                        return null;
7902d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki                    }
7912d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki                    final UserInfo parent = mUserInfos.get(ui.profileGroupId);
7922d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki                    assertNotNull(parent);
7932d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki                    return parent;
7942d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki                }));
795de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki        when(mMockUserManager.isManagedProfile(anyInt()))
796de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki                .thenAnswer(new AnswerWithSystemCheck<>(inv -> {
797de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki                    final int userId = (Integer) inv.getArguments()[0];
798de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki                    final UserInfo ui = mUserInfos.get(userId);
799de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki                    assertNotNull(ui);
800de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki                    return ui.isManagedProfile();
801de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki                }));
8022d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki
80333525d2f1a8116820f58fc90941cb53bcba54805Makoto Onuki        when(mMockActivityManagerInternal.getUidProcessState(anyInt())).thenReturn(
80433525d2f1a8116820f58fc90941cb53bcba54805Makoto Onuki                ActivityManager.PROCESS_STATE_CACHED_EMPTY);
80533525d2f1a8116820f58fc90941cb53bcba54805Makoto Onuki
8069c850012cacf0af4a392294566a8c7c897dc8771Makoto Onuki        // User 0 and P0 are always running
807a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki        mRunningUsers.put(USER_0, true);
808a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki        mRunningUsers.put(USER_10, false);
809a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki        mRunningUsers.put(USER_11, false);
8109c850012cacf0af4a392294566a8c7c897dc8771Makoto Onuki        mRunningUsers.put(USER_P0, true);
811de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki        mRunningUsers.put(USER_P1, true);
812a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki
813a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki        // Unlock all users by default.
814a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki        mUnlockedUsers.put(USER_0, true);
815a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki        mUnlockedUsers.put(USER_10, true);
816a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki        mUnlockedUsers.put(USER_11, true);
817a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki        mUnlockedUsers.put(USER_P0, true);
818de3c16c8057b61bb3cc2e0c3d5603730f5841c51Makoto Onuki        mUnlockedUsers.put(USER_P1, true);
819a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki
820a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki        // Set up resources
821157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        setUpAppResources();
822157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
823157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        // Start the service.
82451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        initService();
82551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        setCaller(CALLING_PACKAGE_1);
826248a0ef3aa119f92858a2bb95d20595824b8d07bMakoto Onuki
827248a0ef3aa119f92858a2bb95d20595824b8d07bMakoto Onuki        if (ENABLE_DUMP) {
828248a0ef3aa119f92858a2bb95d20595824b8d07bMakoto Onuki            Log.d(TAG, "setUp done");
829248a0ef3aa119f92858a2bb95d20595824b8d07bMakoto Onuki        }
83051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
83151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
8329c850012cacf0af4a392294566a8c7c897dc8771Makoto Onuki    private static boolean b(Boolean value) {
8339c850012cacf0af4a392294566a8c7c897dc8771Makoto Onuki        return (value != null && value);
8349c850012cacf0af4a392294566a8c7c897dc8771Makoto Onuki    }
8359c850012cacf0af4a392294566a8c7c897dc8771Makoto Onuki
83651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    /**
83751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki     * Returns a boolean but also checks if the current UID is SYSTEM_UID.
83851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki     */
839a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki    protected class AnswerWithSystemCheck<T> implements Answer<T> {
840a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki        private final Function<InvocationOnMock, T> mChecker;
84151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
842a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki        public AnswerWithSystemCheck(Function<InvocationOnMock, T> checker) {
843a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki            mChecker = checker;
84451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
84551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
84651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        @Override
847a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki        public T answer(InvocationOnMock invocation) throws Throwable {
848a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki            assertEquals("Must be called on SYSTEM UID.",
84951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                    Process.SYSTEM_UID, mInjectedCallingUid);
850a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki            return mChecker.apply(invocation);
85151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
85251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
85351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
854157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    protected void setUpAppResources() throws Exception {
855157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        setUpAppResources(/* offset = */ 0);
856157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    }
857157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
858157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    protected void setUpAppResources(int ressIdOffset) throws Exception {
859157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        // ressIdOffset is used to adjust resource IDs to emulate the case where an updated app
860157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        // has resource IDs changed.
861157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
862157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        doAnswer(pmInvocation -> {
863157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki            assertEquals(Process.SYSTEM_UID, mInjectedCallingUid);
864157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
865157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki            final String packageName = (String) pmInvocation.getArguments()[0];
866157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki            final int userId = (Integer) pmInvocation.getArguments()[1];
867157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
868157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki            final Resources res = mock(Resources.class);
869157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
870157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki            doAnswer(resInvocation -> {
871157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                final int argResId = (Integer) resInvocation.getArguments()[0];
872157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
873157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                return "string-" + packageName + "-user:" + userId + "-res:" + argResId
874157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                        + "/" + mInjectedLocale;
875157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki            }).when(res).getString(anyInt());
876157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
877157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki            doAnswer(resInvocation -> {
878157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                final int resId = (Integer) resInvocation.getArguments()[0];
879157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
880157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                // Always use the "string" resource type.  The type doesn't matter during the test.
881157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                return packageName + ":string/r" + resId;
882157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki            }).when(res).getResourceName(anyInt());
883157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
884157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki            doAnswer(resInvocation -> {
885157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                final String argResName = (String) resInvocation.getArguments()[0];
886157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                final String argType = (String) resInvocation.getArguments()[1];
887157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                final String argPackageName = (String) resInvocation.getArguments()[2];
888157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
889157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                // See the above code.  getResourceName() will just use "r" + res ID as the entry
890157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                // name.
891157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                String entryName = argResName;
892157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                if (entryName.contains("/")) {
893157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                    entryName = ShortcutInfo.getResourceEntryName(entryName);
894157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                }
895157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                return Integer.parseInt(entryName.substring(1)) + ressIdOffset;
896d0010c5ef12ccf0b5c20e7c12cf86def990b4febMakoto Onuki            }).when(res).getIdentifier(anyStringOrNull(), anyStringOrNull(), anyStringOrNull());
897157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki            return res;
898157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        }).when(mMockPackageManager).getResourcesForApplicationAsUser(anyString(), anyInt());
899157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    }
900157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
90151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static UserInfo withProfileGroupId(UserInfo in, int groupId) {
90251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        in.profileGroupId = groupId;
90351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return in;
90451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
90551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
90651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    @Override
90751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected void tearDown() throws Exception {
90851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        if (DUMP_IN_TEARDOWN) dumpsysOnLogcat("Teardown");
90951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
91051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        shutdownServices();
91151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
91251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        super.tearDown();
91351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
91451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
91551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected Context getTestContext() {
91651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return getInstrumentation().getContext();
91751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
91851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
919a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki    protected ShortcutManager getManager() {
920a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki        return mManager;
921a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki    }
922a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki
92351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected void deleteAllSavedFiles() {
92451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Empty the data directory.
92551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        if (mInjectedFilePathRoot.exists()) {
92651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            Assert.assertTrue("failed to delete dir",
92751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                    FileUtils.deleteContents(mInjectedFilePathRoot));
92851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
92951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedFilePathRoot.mkdirs();
93051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
93151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
93251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    /** (Re-) init the manager and the service. */
93351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected void initService() {
93451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        shutdownServices();
93551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
93651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        LocalServices.removeServiceForTest(ShortcutServiceInternal.class);
93751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
93851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Instantiate targets.
939a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki        mService = new ShortcutServiceTestable(mServiceContext, mLooper);
94051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mManager = new ShortcutManagerTestable(mClientContext, mService);
94151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
94251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInternal = LocalServices.getService(ShortcutServiceInternal.class);
94351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
94451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mLauncherAppImpl = new LauncherAppImplTestable(mServiceContext);
94551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mLauncherApps = null;
94651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mLauncherAppsMap.clear();
94751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
948157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        // Send boot sequence events.
94951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.onBootPhase(SystemService.PHASE_LOCK_SETTINGS_READY);
950157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
951157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        mService.onBootPhase(SystemService.PHASE_BOOT_COMPLETED);
95251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
95351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
95451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected void shutdownServices() {
95551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        if (mService != null) {
95651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            // Flush all the unsaved data from the previous instance.
95751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mService.saveDirtyInfo();
9589e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki
9599e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki            // Make sure everything is consistent.
9609e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki            mService.verifyStates();
96151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
96251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        LocalServices.removeServiceForTest(ShortcutServiceInternal.class);
96351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
96451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService = null;
96551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mManager = null;
96651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInternal = null;
96751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mLauncherAppImpl = null;
96851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mLauncherApps = null;
96951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mLauncherAppsMap.clear();
97051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
97151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
972a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki    protected void runOnHandler(Runnable r) {
973a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki        final long token = mServiceContext.injectClearCallingIdentity();
974a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki        try {
975a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki            r.run();
976a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki        } finally {
977a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki            mServiceContext.injectRestoreCallingIdentity(token);
978a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki        }
979a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki    }
980a2241834a54dc91e2eef858741f1a56a743c27b2Makoto Onuki
98151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected void addPackage(String packageName, int uid, int version) {
98251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        addPackage(packageName, uid, version, packageName);
98351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
98451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
98551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected Signature[] genSignatures(String... signatures) {
98651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final Signature[] sigs = new Signature[signatures.length];
98751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        for (int i = 0; i < signatures.length; i++){
98851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            sigs[i] = new Signature(signatures[i].getBytes());
98951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
99051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return sigs;
99151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
99251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
99351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected PackageInfo genPackage(String packageName, int uid, int version, String... signatures) {
99451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final PackageInfo pi = new PackageInfo();
99551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        pi.packageName = packageName;
99651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        pi.applicationInfo = new ApplicationInfo();
99751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        pi.applicationInfo.uid = uid;
99851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        pi.applicationInfo.flags = ApplicationInfo.FLAG_INSTALLED
99951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                | ApplicationInfo.FLAG_ALLOW_BACKUP;
100051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        pi.versionCode = version;
100151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        pi.applicationInfo.versionCode = version;
100251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        pi.signatures = genSignatures(signatures);
100351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
100451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return pi;
100551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
100651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
100751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected void addPackage(String packageName, int uid, int version, String... signatures) {
100851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedPackages.put(packageName, genPackage(packageName, uid, version, signatures));
100951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
101051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
101151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected void updatePackageInfo(String packageName, Consumer<PackageInfo> c) {
101251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        c.accept(mInjectedPackages.get(packageName));
101351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
101451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
101551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected void updatePackageVersion(String packageName, int increment) {
101651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        updatePackageInfo(packageName, pi -> {
101751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            pi.versionCode += increment;
101851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            pi.applicationInfo.versionCode += increment;
101951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
102051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
102151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
102251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected void updatePackageLastUpdateTime(String packageName, long increment) {
102351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        updatePackageInfo(packageName, pi -> {
102451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            pi.lastUpdateTime += increment;
102551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
102651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
102751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
1028085a05cd864252314bcf5c339017a16b68105204Makoto Onuki    protected void setPackageLastUpdateTime(String packageName, long value) {
1029085a05cd864252314bcf5c339017a16b68105204Makoto Onuki        updatePackageInfo(packageName, pi -> {
1030085a05cd864252314bcf5c339017a16b68105204Makoto Onuki            pi.lastUpdateTime = value;
1031085a05cd864252314bcf5c339017a16b68105204Makoto Onuki        });
1032085a05cd864252314bcf5c339017a16b68105204Makoto Onuki    }
1033085a05cd864252314bcf5c339017a16b68105204Makoto Onuki
103451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected void uninstallPackage(int userId, String packageName) {
103551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        if (ENABLE_DUMP) {
103682fb2eb057032bb7f38f547fb3667c7bf2547517Makoto Onuki            Log.v(TAG, "Uninstall package " + packageName + " / " + userId);
103751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
103851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mUninstalledPackages.add(PackageWithUser.of(userId, packageName));
103951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
104051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
104151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected void installPackage(int userId, String packageName) {
104251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        if (ENABLE_DUMP) {
104351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            Log.v(TAG, "Install package " + packageName + " / " + userId);
104451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
104551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mUninstalledPackages.remove(PackageWithUser.of(userId, packageName));
104651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
104751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
104882fb2eb057032bb7f38f547fb3667c7bf2547517Makoto Onuki    protected void disablePackage(int userId, String packageName) {
104982fb2eb057032bb7f38f547fb3667c7bf2547517Makoto Onuki        if (ENABLE_DUMP) {
105082fb2eb057032bb7f38f547fb3667c7bf2547517Makoto Onuki            Log.v(TAG, "Disable package " + packageName + " / " + userId);
105182fb2eb057032bb7f38f547fb3667c7bf2547517Makoto Onuki        }
105282fb2eb057032bb7f38f547fb3667c7bf2547517Makoto Onuki        mDisabledPackages.add(PackageWithUser.of(userId, packageName));
105382fb2eb057032bb7f38f547fb3667c7bf2547517Makoto Onuki    }
105482fb2eb057032bb7f38f547fb3667c7bf2547517Makoto Onuki
105582fb2eb057032bb7f38f547fb3667c7bf2547517Makoto Onuki    protected void enablePackage(int userId, String packageName) {
105682fb2eb057032bb7f38f547fb3667c7bf2547517Makoto Onuki        if (ENABLE_DUMP) {
105782fb2eb057032bb7f38f547fb3667c7bf2547517Makoto Onuki            Log.v(TAG, "Enable package " + packageName + " / " + userId);
105882fb2eb057032bb7f38f547fb3667c7bf2547517Makoto Onuki        }
105982fb2eb057032bb7f38f547fb3667c7bf2547517Makoto Onuki        mDisabledPackages.remove(PackageWithUser.of(userId, packageName));
106082fb2eb057032bb7f38f547fb3667c7bf2547517Makoto Onuki    }
106182fb2eb057032bb7f38f547fb3667c7bf2547517Makoto Onuki
106251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    PackageInfo getInjectedPackageInfo(String packageName, @UserIdInt int userId,
106351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            boolean getSignatures) {
106451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final PackageInfo pi = mInjectedPackages.get(packageName);
106551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        if (pi == null) return null;
106651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
106751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final PackageInfo ret = new PackageInfo();
106851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ret.packageName = pi.packageName;
106951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ret.versionCode = pi.versionCode;
107051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ret.lastUpdateTime = pi.lastUpdateTime;
107151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
107251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ret.applicationInfo = new ApplicationInfo(pi.applicationInfo);
107351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ret.applicationInfo.uid = UserHandle.getUid(userId, pi.applicationInfo.uid);
107451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ret.applicationInfo.packageName = pi.packageName;
107551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
107651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        if (mUninstalledPackages.contains(PackageWithUser.of(userId, packageName))) {
107751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            ret.applicationInfo.flags &= ~ApplicationInfo.FLAG_INSTALLED;
107851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
107966e4a2b801fe0ff2ee1db5e0578a3e7cb6e1f6d6Makoto Onuki        if (mEphemeralPackages.contains(PackageWithUser.of(userId, packageName))) {
1080be0b8896d1bc385d4c8fb54c21929745935dcbeaTodd Kennedy            ret.applicationInfo.privateFlags |= ApplicationInfo.PRIVATE_FLAG_INSTANT;
108166e4a2b801fe0ff2ee1db5e0578a3e7cb6e1f6d6Makoto Onuki        }
10823366328245621fa6e8fd764a4d3c2f073774d096Makoto Onuki        if (mSystemPackages.contains(packageName)) {
10833366328245621fa6e8fd764a4d3c2f073774d096Makoto Onuki            ret.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
10843366328245621fa6e8fd764a4d3c2f073774d096Makoto Onuki        }
108582fb2eb057032bb7f38f547fb3667c7bf2547517Makoto Onuki        ret.applicationInfo.enabled =
108682fb2eb057032bb7f38f547fb3667c7bf2547517Makoto Onuki                !mDisabledPackages.contains(PackageWithUser.of(userId, packageName));
108751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
108851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        if (getSignatures) {
108951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            ret.signatures = pi.signatures;
109051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
109151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
109251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return ret;
109351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
109451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
109551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected void addApplicationInfo(PackageInfo pi, List<ApplicationInfo> list) {
109651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        if (pi != null && pi.applicationInfo != null) {
109751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            list.add(pi.applicationInfo);
109851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
109951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
110051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
110151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected List<ApplicationInfo> getInstalledApplications(int userId) {
110251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final ArrayList<ApplicationInfo> ret = new ArrayList<>();
110351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
110451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        addApplicationInfo(getInjectedPackageInfo(CALLING_PACKAGE_1, userId, false), ret);
110551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        addApplicationInfo(getInjectedPackageInfo(CALLING_PACKAGE_2, userId, false), ret);
110651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        addApplicationInfo(getInjectedPackageInfo(CALLING_PACKAGE_3, userId, false), ret);
110751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        addApplicationInfo(getInjectedPackageInfo(CALLING_PACKAGE_4, userId, false), ret);
110851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        addApplicationInfo(getInjectedPackageInfo(LAUNCHER_1, userId, false), ret);
110951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        addApplicationInfo(getInjectedPackageInfo(LAUNCHER_2, userId, false), ret);
111051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        addApplicationInfo(getInjectedPackageInfo(LAUNCHER_3, userId, false), ret);
111151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        addApplicationInfo(getInjectedPackageInfo(LAUNCHER_4, userId, false), ret);
111251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
111351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return ret;
111451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
111551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
11166dd9fb7004e888ec1efc4676cd3e4d42b7ac68c9Makoto Onuki    private void addPackageInfo(PackageInfo pi, List<PackageInfo> list) {
11176dd9fb7004e888ec1efc4676cd3e4d42b7ac68c9Makoto Onuki        if (pi != null) {
11186dd9fb7004e888ec1efc4676cd3e4d42b7ac68c9Makoto Onuki            list.add(pi);
11196dd9fb7004e888ec1efc4676cd3e4d42b7ac68c9Makoto Onuki        }
11206dd9fb7004e888ec1efc4676cd3e4d42b7ac68c9Makoto Onuki    }
11216dd9fb7004e888ec1efc4676cd3e4d42b7ac68c9Makoto Onuki
1122ee6b6e4a1861336f8db52d8c93dbf32ee9615cfaMakoto Onuki    private List<PackageInfo> getInstalledPackagesWithUninstalled(int userId) {
11236dd9fb7004e888ec1efc4676cd3e4d42b7ac68c9Makoto Onuki        final ArrayList<PackageInfo> ret = new ArrayList<>();
11246dd9fb7004e888ec1efc4676cd3e4d42b7ac68c9Makoto Onuki
11256dd9fb7004e888ec1efc4676cd3e4d42b7ac68c9Makoto Onuki        addPackageInfo(getInjectedPackageInfo(CALLING_PACKAGE_1, userId, false), ret);
11266dd9fb7004e888ec1efc4676cd3e4d42b7ac68c9Makoto Onuki        addPackageInfo(getInjectedPackageInfo(CALLING_PACKAGE_2, userId, false), ret);
11276dd9fb7004e888ec1efc4676cd3e4d42b7ac68c9Makoto Onuki        addPackageInfo(getInjectedPackageInfo(CALLING_PACKAGE_3, userId, false), ret);
11286dd9fb7004e888ec1efc4676cd3e4d42b7ac68c9Makoto Onuki        addPackageInfo(getInjectedPackageInfo(CALLING_PACKAGE_4, userId, false), ret);
11296dd9fb7004e888ec1efc4676cd3e4d42b7ac68c9Makoto Onuki        addPackageInfo(getInjectedPackageInfo(LAUNCHER_1, userId, false), ret);
11306dd9fb7004e888ec1efc4676cd3e4d42b7ac68c9Makoto Onuki        addPackageInfo(getInjectedPackageInfo(LAUNCHER_2, userId, false), ret);
11316dd9fb7004e888ec1efc4676cd3e4d42b7ac68c9Makoto Onuki        addPackageInfo(getInjectedPackageInfo(LAUNCHER_3, userId, false), ret);
11326dd9fb7004e888ec1efc4676cd3e4d42b7ac68c9Makoto Onuki        addPackageInfo(getInjectedPackageInfo(LAUNCHER_4, userId, false), ret);
11336dd9fb7004e888ec1efc4676cd3e4d42b7ac68c9Makoto Onuki
11346dd9fb7004e888ec1efc4676cd3e4d42b7ac68c9Makoto Onuki        return ret;
11356dd9fb7004e888ec1efc4676cd3e4d42b7ac68c9Makoto Onuki    }
11366dd9fb7004e888ec1efc4676cd3e4d42b7ac68c9Makoto Onuki
113751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected void addManifestShortcutResource(ComponentName activity, int resId) {
113851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final String packageName = activity.getPackageName();
113951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        LinkedHashMap<ComponentName, Integer> map = mActivityMetadataResId.get(packageName);
114051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        if (map == null) {
114151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            map = new LinkedHashMap<>();
114251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mActivityMetadataResId.put(packageName, map);
114351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
114451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        map.put(activity, resId);
114551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
114651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
114751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected PackageInfo injectGetActivitiesWithMetadata(String packageName, @UserIdInt int userId) {
114851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final PackageInfo ret = getInjectedPackageInfo(packageName, userId,
114951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                /* getSignatures=*/ false);
115051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
115151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final HashMap<ComponentName, Integer> activities = mActivityMetadataResId.get(packageName);
115251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        if (activities != null) {
115351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            final ArrayList<ActivityInfo> list = new ArrayList<>();
115451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
115551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            for (ComponentName cn : activities.keySet()) {
115651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                ActivityInfo ai = new ActivityInfo();
115751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                ai.packageName = cn.getPackageName();
115851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                ai.name = cn.getClassName();
115951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                ai.metaData = new Bundle();
116051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                ai.metaData.putInt(ShortcutParser.METADATA_KEY, activities.get(cn));
1161ee6b6e4a1861336f8db52d8c93dbf32ee9615cfaMakoto Onuki                ai.applicationInfo = ret.applicationInfo;
116251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                list.add(ai);
116351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            }
116451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            ret.activities = list.toArray(new ActivityInfo[list.size()]);
116551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
116651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return ret;
116751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
116851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
116951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected XmlResourceParser injectXmlMetaData(ActivityInfo activityInfo, String key) {
117051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        if (!ShortcutParser.METADATA_KEY.equals(key) || activityInfo.metaData == null) {
117151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            return null;
117251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
117351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final int resId = activityInfo.metaData.getInt(key);
117451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return getTestContext().getResources().getXml(resId);
117551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
117651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
117751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    /** Replace the current calling package */
117851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected void setCaller(String packageName, int userId) {
117951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedClientPackage = packageName;
118051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCallingUid =
118151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                Preconditions.checkNotNull(getInjectedPackageInfo(packageName, userId, false),
118251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                        "Unknown package").applicationInfo.uid;
118351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
118451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Set up LauncherApps for this caller.
118551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final Pair<Integer, String> key = Pair.create(userId, packageName);
118651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        if (!mLauncherAppsMap.containsKey(key)) {
118751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mLauncherAppsMap.put(key, new LauncherAppsTestable(mClientContext, mLauncherAppImpl));
118851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
118951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mLauncherApps = mLauncherAppsMap.get(key);
119051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
119151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
119251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected void setCaller(String packageName) {
119351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        setCaller(packageName, UserHandle.USER_SYSTEM);
119451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
119551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
119651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected String getCallingPackage() {
119751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return mInjectedClientPackage;
119851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
119951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
12002d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki    /**
12012d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki     * This controls {@link ShortcutService#hasShortcutHostPermission(String, int)}, but
12022d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki     * not {@link ShortcutService#getDefaultLauncher(int)}.  To control the later, use
12032d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki     * {@link #setDefaultLauncher(int, ComponentName)}.
12042d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki     */
120551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected void setDefaultLauncherChecker(BiPredicate<String, Integer> p) {
120651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mDefaultLauncherChecker = p;
120751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
120851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
12092d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki    /**
12102d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki     * Set the default launcher.  This will update {@link #mDefaultLauncherChecker} set by
12112d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki     * {@link #setDefaultLauncherChecker} too.
12122d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki     */
12132d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki    protected void setDefaultLauncher(int userId, ComponentName launcherActivity) {
12142d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        mDefaultLauncher.put(userId, launcherActivity);
12152d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki
12162d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        final BiPredicate<String, Integer> oldChecker = mDefaultLauncherChecker;
12172d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        mDefaultLauncherChecker = (checkPackageName, checkUserId) -> {
12182d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            if ((checkUserId == userId) && (launcherActivity !=  null)) {
12192d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki                return launcherActivity.getPackageName().equals(checkPackageName);
12202d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            }
12212d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki            return oldChecker.test(checkPackageName, checkUserId);
12222d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki        };
12232d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki    }
12242d895c3efd625e09e9f2cc4d0c7131b34f52f154Makoto Onuki
122551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected void runWithCaller(String packageName, int userId, Runnable r) {
122651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final String previousPackage = mInjectedClientPackage;
122751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final int previousUserId = UserHandle.getUserId(mInjectedCallingUid);
122851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
122951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        setCaller(packageName, userId);
123051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
123151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        r.run();
123251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
123351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        setCaller(previousPackage, previousUserId);
123451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
123551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
1236157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    protected void runWithSystemUid(Runnable r) {
1237157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        final int origUid = mInjectedCallingUid;
1238157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        mInjectedCallingUid = Process.SYSTEM_UID;
1239157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        r.run();
1240157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        mInjectedCallingUid = origUid;
1241157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    }
1242157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
1243157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    protected void lookupAndFillInResourceNames(ShortcutInfo si) {
1244157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        runWithSystemUid(() -> si.lookupAndFillInResourceNames(
1245157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                mService.injectGetResourcesForApplicationAsUser(si.getPackage(), si.getUserId())));
1246157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    }
1247157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
124851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected int getCallingUserId() {
124951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return UserHandle.getUserId(mInjectedCallingUid);
125051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
125151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
125251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected UserHandle getCallingUser() {
125351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return UserHandle.of(getCallingUserId());
125451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
125551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
125651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    /** For debugging */
125751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected void dumpsysOnLogcat() {
125851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        dumpsysOnLogcat("");
125951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
126051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
126151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected void dumpsysOnLogcat(String message) {
126251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        dumpsysOnLogcat(message, false);
126351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
126451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
126551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected void dumpsysOnLogcat(String message, boolean force) {
126651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        if (force || !ENABLE_DUMP) return;
126751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
126851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        Log.v(TAG, "Dumping ShortcutService: " + message);
126976269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        for (String line : dumpsys(null).split("\n")) {
127051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            Log.v(TAG, line);
127151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
127251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
127351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
127476269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki    protected String dumpCheckin() {
127576269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        return dumpsys(new String[]{"--checkin"});
127676269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki    }
127776269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki
127876269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki    private String dumpsys(String[] args) {
127976269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        final ArrayList<String> origPermissions = new ArrayList<>(mCallerPermissions);
128076269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        mCallerPermissions.add(android.Manifest.permission.DUMP);
128176269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        try {
128276269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki            final ByteArrayOutputStream out = new ByteArrayOutputStream();
128376269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki            final PrintWriter pw = new PrintWriter(out);
1284c4361e34ad6fbc1bab34271ece668ebf79232a64Makoto Onuki            mService.dumpNoCheck(/* fd */ null, pw, args);
128576269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki            pw.close();
128676269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki
128776269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki            return out.toString();
128876269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        } finally {
128976269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki            mCallerPermissions.clear();
129076269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki            mCallerPermissions.addAll(origPermissions);
129176269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        }
129276269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki    }
129376269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki
129451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    /**
129551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki     * For debugging, dump arbitrary file on logcat.
129651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki     */
129751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected void dumpFileOnLogcat(String path) {
129851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        dumpFileOnLogcat(path, "");
129951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
130051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
130151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected void dumpFileOnLogcat(String path, String message) {
130251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        if (!ENABLE_DUMP) return;
130351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
130451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        Log.v(TAG, "Dumping file: " + path + " " + message);
130551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final StringBuilder sb = new StringBuilder();
130651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        try (BufferedReader br = new BufferedReader(new FileReader(path))) {
130751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            String line;
130851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            while ((line = br.readLine()) != null) {
130951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                Log.v(TAG, line);
131051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            }
131151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        } catch (Exception e) {
131251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            Log.e(TAG, "Couldn't read file", e);
131351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            fail("Exception " + e);
131451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
131551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
131651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
131751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    /**
131851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki     * For debugging, dump the main state file on logcat.
131951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki     */
132051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected void dumpBaseStateFile() {
132151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.saveDirtyInfo();
132251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        dumpFileOnLogcat(mInjectedFilePathRoot.getAbsolutePath()
132351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                + "/system/" + ShortcutService.FILENAME_BASE_STATE);
132451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
132551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
132651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    /**
132751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki     * For debugging, dump per-user state file on logcat.
132851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki     */
132951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected void dumpUserFile(int userId) {
133051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        dumpUserFile(userId, "");
133151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
133251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
133351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected void dumpUserFile(int userId, String message) {
133451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.saveDirtyInfo();
133551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        dumpFileOnLogcat(mInjectedFilePathRoot.getAbsolutePath()
133651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                + "/user-" + userId
133751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                + "/" + ShortcutService.FILENAME_USER_PACKAGES, message);
133851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
133951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
134051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    /**
1341a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki     * Make a shortcut with an ID only.
1342a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki     */
1343a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki    protected ShortcutInfo makeShortcutIdOnly(String id) {
1344a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki        return new ShortcutInfo.Builder(mClientContext, id).build();
1345a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki    }
1346a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki
1347a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki    /**
134851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki     * Make a shortcut with an ID.
134951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki     */
135051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected ShortcutInfo makeShortcut(String id) {
135151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return makeShortcut(
135251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                id, "Title-" + id, /* activity =*/ null, /* icon =*/ null,
135399302b55c6a960c9078ad2c84ae9be3296bd32f3Makoto Onuki                makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0);
135451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
135551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
1356a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki    @Deprecated // Title was renamed to short label.
135751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected ShortcutInfo makeShortcutWithTitle(String id, String title) {
135851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return makeShortcut(
135951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                id, title, /* activity =*/ null, /* icon =*/ null,
136099302b55c6a960c9078ad2c84ae9be3296bd32f3Makoto Onuki                makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0);
136151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
136251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
1363a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki    protected ShortcutInfo makeShortcutWithShortLabel(String id, String shortLabel) {
1364a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki        return makeShortcut(
1365a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki                id, shortLabel, /* activity =*/ null, /* icon =*/ null,
136699302b55c6a960c9078ad2c84ae9be3296bd32f3Makoto Onuki                makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0);
1367a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki    }
1368a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki
136951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    /**
137051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki     * Make a shortcut with an ID and timestamp.
137151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki     */
137251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected ShortcutInfo makeShortcutWithTimestamp(String id, long timestamp) {
137351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final ShortcutInfo s = makeShortcut(
137451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                id, "Title-" + id, /* activity =*/ null, /* icon =*/ null,
137599302b55c6a960c9078ad2c84ae9be3296bd32f3Makoto Onuki                makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0);
137651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        s.setTimestamp(timestamp);
137751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return s;
137851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
137951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
138051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    /**
138151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki     * Make a shortcut with an ID, a timestamp and an activity component
138251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki     */
138351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected ShortcutInfo makeShortcutWithTimestampWithActivity(String id, long timestamp,
138451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            ComponentName activity) {
138551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final ShortcutInfo s = makeShortcut(
138651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                id, "Title-" + id, activity, /* icon =*/ null,
138799302b55c6a960c9078ad2c84ae9be3296bd32f3Makoto Onuki                makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0);
138851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        s.setTimestamp(timestamp);
138951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return s;
139051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
139151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
139251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    /**
139351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki     * Make a shortcut with an ID and icon.
139451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki     */
139551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected ShortcutInfo makeShortcutWithIcon(String id, Icon icon) {
139651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return makeShortcut(
139751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                id, "Title-" + id, /* activity =*/ null, icon,
139899302b55c6a960c9078ad2c84ae9be3296bd32f3Makoto Onuki                makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0);
139951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
140051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
140151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected ShortcutInfo makePackageShortcut(String packageName, String id) {
140251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        String origCaller = getCallingPackage();
140351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
140451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        setCaller(packageName);
140551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo s = makeShortcut(
140651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                id, "Title-" + id, /* activity =*/ null, /* icon =*/ null,
140799302b55c6a960c9078ad2c84ae9be3296bd32f3Makoto Onuki                makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0);
140851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        setCaller(origCaller); // restore the caller
140951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
141051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return s;
141151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
141251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
141351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    /**
141451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki     * Make multiple shortcuts with IDs.
141551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki     */
141651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected List<ShortcutInfo> makeShortcuts(String... ids) {
141751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final ArrayList<ShortcutInfo> ret = new ArrayList();
141851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        for (String id : ids) {
141951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            ret.add(makeShortcut(id));
142051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
142151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return ret;
142251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
142351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
142451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected ShortcutInfo.Builder makeShortcutBuilder() {
142551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return new ShortcutInfo.Builder(mClientContext);
142651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
142751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
142851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected ShortcutInfo makeShortcutWithActivity(String id, ComponentName activity) {
142951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return makeShortcut(
143051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                id, "Title-" + id, activity, /* icon =*/ null,
143199302b55c6a960c9078ad2c84ae9be3296bd32f3Makoto Onuki                makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0);
143251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
143351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
1434b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki    protected ShortcutInfo makeShortcutWithIntent(String id, Intent intent) {
1435b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        return makeShortcut(
1436b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki                id, "Title-" + id, /* activity =*/ null, /* icon =*/ null,
143799302b55c6a960c9078ad2c84ae9be3296bd32f3Makoto Onuki                intent, /* rank =*/ 0);
1438b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki    }
1439b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
144051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected ShortcutInfo makeShortcutWithActivityAndTitle(String id, ComponentName activity,
144151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            String title) {
144251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return makeShortcut(
144351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                id, title, activity, /* icon =*/ null,
144499302b55c6a960c9078ad2c84ae9be3296bd32f3Makoto Onuki                makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0);
144551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
144651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
144751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected ShortcutInfo makeShortcutWithActivityAndRank(String id, ComponentName activity,
144851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            int rank) {
144951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return makeShortcut(
145051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                id, "Title-" + id, activity, /* icon =*/ null,
145199302b55c6a960c9078ad2c84ae9be3296bd32f3Makoto Onuki                makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), rank);
145251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
145351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
145451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    /**
145551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki     * Make a shortcut with details.
145651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki     */
145751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected ShortcutInfo makeShortcut(String id, String title, ComponentName activity,
145899302b55c6a960c9078ad2c84ae9be3296bd32f3Makoto Onuki            Icon icon, Intent intent, int rank) {
1459b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        final ShortcutInfo.Builder  b = new ShortcutInfo.Builder(mClientContext, id)
1460255461f676f09db9be3876c156d571f4e08981eeMakoto Onuki                .setActivity(new ComponentName(mClientContext.getPackageName(), "main"))
1461b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki                .setShortLabel(title)
146299302b55c6a960c9078ad2c84ae9be3296bd32f3Makoto Onuki                .setRank(rank)
146399302b55c6a960c9078ad2c84ae9be3296bd32f3Makoto Onuki                .setIntent(intent);
146451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        if (icon != null) {
146551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            b.setIcon(icon);
146651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
146751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        if (activity != null) {
146851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            b.setActivity(activity);
146951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
147051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final ShortcutInfo s = b.build();
147151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
147251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        s.setTimestamp(mInjectedCurrentTimeMillis); // HACK
147351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
147451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return s;
147551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
147651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
1477440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki    protected ShortcutInfo makeShortcutWithIntents(String id, Intent... intents) {
1478440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        return makeShortcut(
1479440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                id, "Title-" + id, /* activity =*/ null, /* icon =*/ null,
1480440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                intents, /* rank =*/ 0);
1481440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki    }
1482440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki
1483440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki    /**
1484440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki     * Make a shortcut with details.
1485440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki     */
1486440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki    protected ShortcutInfo makeShortcut(String id, String title, ComponentName activity,
1487440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki            Icon icon, Intent[] intents, int rank) {
1488440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        final ShortcutInfo.Builder  b = new ShortcutInfo.Builder(mClientContext, id)
1489255461f676f09db9be3876c156d571f4e08981eeMakoto Onuki                .setActivity(new ComponentName(mClientContext.getPackageName(), "main"))
1490440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                .setShortLabel(title)
1491440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                .setRank(rank)
1492440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                .setIntents(intents);
1493440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        if (icon != null) {
1494440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki            b.setIcon(icon);
1495440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        }
1496440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        if (activity != null) {
1497440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki            b.setActivity(activity);
1498440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        }
1499440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        final ShortcutInfo s = b.build();
1500440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki
1501440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        s.setTimestamp(mInjectedCurrentTimeMillis); // HACK
1502440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki
1503440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        return s;
1504440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki    }
1505440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki
150651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    /**
1507b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki     * Make a shortcut with details.
1508b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki     */
1509b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki    protected ShortcutInfo makeShortcutWithExtras(String id, Intent intent,
1510b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki            PersistableBundle extras) {
1511b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        final ShortcutInfo.Builder  b = new ShortcutInfo.Builder(mClientContext, id)
1512255461f676f09db9be3876c156d571f4e08981eeMakoto Onuki                .setActivity(new ComponentName(mClientContext.getPackageName(), "main"))
1513b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki                .setShortLabel("title-" + id)
1514b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki                .setExtras(extras)
1515b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki                .setIntent(intent);
1516b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        final ShortcutInfo s = b.build();
1517b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1518b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        s.setTimestamp(mInjectedCurrentTimeMillis); // HACK
1519b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1520b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        return s;
1521b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki    }
1522b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1523b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki    /**
152451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki     * Make an intent.
152551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki     */
152651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected Intent makeIntent(String action, Class<?> clazz, Object... bundleKeysAndValues) {
152751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final Intent intent = new Intent(action);
152851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        intent.setComponent(makeComponent(clazz));
152951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        intent.replaceExtras(makeBundle(bundleKeysAndValues));
153051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return intent;
153151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
153251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
153351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    /**
153451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki     * Make an component name, with the client context.
153551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki     */
153651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    @NonNull
153751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected ComponentName makeComponent(Class<?> clazz) {
153851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return new ComponentName(mClientContext, clazz);
153951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
154051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
154151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    @NonNull
154251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected ShortcutInfo findById(List<ShortcutInfo> list, String id) {
154351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        for (ShortcutInfo s : list) {
154451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            if (s.getId().equals(id)) {
154551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                return s;
154651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            }
154751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
154851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        fail("Shortcut with id " + id + " not found");
154951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return null;
155051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
155151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
155251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected void assertSystem() {
155351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("Caller must be system", Process.SYSTEM_UID, mInjectedCallingUid);
155451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
155551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
155651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected void assertResetTimes(long expectedLastResetTime, long expectedNextResetTime) {
155751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(expectedLastResetTime, mService.getLastResetTimeLocked());
155851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(expectedNextResetTime, mService.getNextResetTimeLocked());
155951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
156051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
156151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public static List<ShortcutInfo> assertAllNotHaveIcon(
156251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            List<ShortcutInfo> actualShortcuts) {
156351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        for (ShortcutInfo s : actualShortcuts) {
156451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertNull("ID " + s.getId(), s.getIcon());
156551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
156651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return actualShortcuts;
156751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
156851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
156951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    @NonNull
157051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected List<ShortcutInfo> assertAllHaveFlags(@NonNull List<ShortcutInfo> actualShortcuts,
157151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            int shortcutFlags) {
157251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        for (ShortcutInfo s : actualShortcuts) {
157351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertTrue("ID " + s.getId() + " doesn't have flags " + shortcutFlags,
157451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                    s.hasFlags(shortcutFlags));
157551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
157651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return actualShortcuts;
157751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
157851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
157951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected ShortcutInfo getPackageShortcut(String packageName, String shortcutId, int userId) {
158051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return mService.getPackageShortcutForTest(packageName, shortcutId, userId);
158151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
158251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
158351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected void assertShortcutExists(String packageName, String shortcutId, int userId) {
158451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(getPackageShortcut(packageName, shortcutId, userId) != null);
158551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
158651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
158751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected void assertShortcutNotExists(String packageName, String shortcutId, int userId) {
158851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(getPackageShortcut(packageName, shortcutId, userId) == null);
158951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
159051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
1591440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki    protected Intent[] launchShortcutAndGetIntentsInner(Runnable shortcutStarter,
159251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            @NonNull String packageName, @NonNull String shortcutId, int userId) {
1593440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        reset(mMockActivityManagerInternal);
1594440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        shortcutStarter.run();
159551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
1596440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        final ArgumentCaptor<Intent[]> intentsCaptor = ArgumentCaptor.forClass(Intent[].class);
1597440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        verify(mMockActivityManagerInternal).startActivitiesAsPackage(
1598440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                eq(packageName),
1599440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                eq(userId),
1600440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                intentsCaptor.capture(),
1601d0010c5ef12ccf0b5c20e7c12cf86def990b4febMakoto Onuki                anyOrNull(Bundle.class));
1602440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        return intentsCaptor.getValue();
160351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
160451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
1605440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki    protected Intent[] launchShortcutAndGetIntents(
1606440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki            @NonNull String packageName, @NonNull String shortcutId, int userId) {
1607440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        return launchShortcutAndGetIntentsInner(
1608440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                () -> {
1609440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                    mLauncherApps.startShortcut(packageName, shortcutId, null, null,
1610440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                            UserHandle.of(userId));
1611440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                }, packageName, shortcutId, userId
1612440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        );
1613440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki    }
1614440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki
1615440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki    protected Intent launchShortcutAndGetIntent(
161651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            @NonNull String packageName, @NonNull String shortcutId, int userId) {
1617440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        final Intent[] intents = launchShortcutAndGetIntents(packageName, shortcutId, userId);
1618440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        assertEquals(1, intents.length);
1619440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        return intents[0];
1620440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki    }
162151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
1622440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki    protected Intent[] launchShortcutAndGetIntents_withShortcutInfo(
1623440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki            @NonNull String packageName, @NonNull String shortcutId, int userId) {
1624440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        return launchShortcutAndGetIntentsInner(
1625440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                () -> {
1626440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                    mLauncherApps.startShortcut(
1627440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                            getShortcutInfoAsLauncher(packageName, shortcutId, userId), null, null);
1628440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                }, packageName, shortcutId, userId
1629440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        );
1630440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki    }
163151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
1632440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki    protected Intent launchShortcutAndGetIntent_withShortcutInfo(
1633440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki            @NonNull String packageName, @NonNull String shortcutId, int userId) {
1634440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        final Intent[] intents = launchShortcutAndGetIntents_withShortcutInfo(
1635440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                packageName, shortcutId, userId);
1636440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        assertEquals(1, intents.length);
1637440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        return intents[0];
163851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
163951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
164051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected void assertShortcutLaunchable(@NonNull String packageName, @NonNull String shortcutId,
164151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            int userId) {
164251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertNotNull(launchShortcutAndGetIntent(packageName, shortcutId, userId));
164351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertNotNull(launchShortcutAndGetIntent_withShortcutInfo(packageName, shortcutId, userId));
164451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
164551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
1646440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki    protected void assertShortcutNotLaunched(@NonNull String packageName,
1647440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki            @NonNull String shortcutId, int userId) {
1648440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        reset(mMockActivityManagerInternal);
1649440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        try {
1650440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki            mLauncherApps.startShortcut(packageName, shortcutId, null, null,
1651440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                    UserHandle.of(userId));
1652440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki            fail("ActivityNotFoundException was not thrown");
1653440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        } catch (ActivityNotFoundException expected) {
1654440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        }
1655440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        // This shouldn't have been called.
1656440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        verify(mMockActivityManagerInternal, times(0)).startActivitiesAsPackage(
1657440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                anyString(),
1658440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                anyInt(),
1659440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                any(Intent[].class),
1660d0010c5ef12ccf0b5c20e7c12cf86def990b4febMakoto Onuki                anyOrNull(Bundle.class));
1661440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki    }
1662440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki
1663440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki    protected void assertStartShortcutThrowsException(@NonNull String packageName,
166483f6d2da372de339dc563d6a7786be3facc52e76Makoto Onuki            @NonNull String shortcutId, int userId, Class<?> expectedException) {
166583f6d2da372de339dc563d6a7786be3facc52e76Makoto Onuki        Exception thrown = null;
166651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        try {
1667d6880797f72e1e397e18c6e709c0125f795c7d2eMakoto Onuki            mLauncherApps.startShortcut(packageName, shortcutId, null, null,
166851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                    UserHandle.of(userId));
166983f6d2da372de339dc563d6a7786be3facc52e76Makoto Onuki        } catch (Exception e) {
167083f6d2da372de339dc563d6a7786be3facc52e76Makoto Onuki            thrown = e;
167151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
167283f6d2da372de339dc563d6a7786be3facc52e76Makoto Onuki        assertNotNull("Exception was not thrown", thrown);
167383f6d2da372de339dc563d6a7786be3facc52e76Makoto Onuki        assertEquals("Exception type different", expectedException, thrown.getClass());
167451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
167551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
167651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected void assertBitmapDirectories(int userId, String... expectedDirectories) {
167751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final Set<String> expected = hashSet(set(expectedDirectories));
167851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
167951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final Set<String> actual = new HashSet<>();
168051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
168151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final File[] files = mService.getUserBitmapFilePath(userId).listFiles();
168251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        if (files != null) {
168351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            for (File child : files) {
168451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                if (child.isDirectory()) {
168551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                    actual.add(child.getName());
168651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                }
168751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            }
168851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
168951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
169051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(expected, actual);
169151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
169251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
169351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected void assertBitmapFiles(int userId, String packageName, String... expectedFiles) {
169451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final Set<String> expected = hashSet(set(expectedFiles));
169551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
169651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final Set<String> actual = new HashSet<>();
169751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
169851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final File[] files = new File(mService.getUserBitmapFilePath(userId), packageName)
169951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .listFiles();
170051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        if (files != null) {
170151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            for (File child : files) {
170251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                if (child.isFile()) {
170351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                    actual.add(child.getName());
170451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                }
170551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            }
170651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
170751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
170851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(expected, actual);
170951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
171051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
171151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected String getBitmapFilename(int userId, String packageName, String shortcutId) {
171251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final ShortcutInfo si = mService.getPackageShortcutForTest(packageName, shortcutId, userId);
171351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        if (si == null) {
171451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            return null;
171551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
1716475c36539da9687d75447adb9054c98ce03c754aMakoto Onuki        mService.waitForBitmapSavesForTest();
171751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return new File(si.getBitmapPath()).getName();
171851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
171951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
1720475c36539da9687d75447adb9054c98ce03c754aMakoto Onuki    protected String getBitmapAbsPath(int userId, String packageName, String shortcutId) {
1721475c36539da9687d75447adb9054c98ce03c754aMakoto Onuki        final ShortcutInfo si = mService.getPackageShortcutForTest(packageName, shortcutId, userId);
1722475c36539da9687d75447adb9054c98ce03c754aMakoto Onuki        if (si == null) {
1723475c36539da9687d75447adb9054c98ce03c754aMakoto Onuki            return null;
1724475c36539da9687d75447adb9054c98ce03c754aMakoto Onuki        }
1725475c36539da9687d75447adb9054c98ce03c754aMakoto Onuki        mService.waitForBitmapSavesForTest();
1726475c36539da9687d75447adb9054c98ce03c754aMakoto Onuki        return new File(si.getBitmapPath()).getAbsolutePath();
1727475c36539da9687d75447adb9054c98ce03c754aMakoto Onuki    }
1728475c36539da9687d75447adb9054c98ce03c754aMakoto Onuki
1729f3ba2e04be20d33fee989e782ba1966322e7e263Makoto Onuki    /**
1730f3ba2e04be20d33fee989e782ba1966322e7e263Makoto Onuki     * @return all shortcuts stored internally for the caller.  This reflects the *internal* view
1731f3ba2e04be20d33fee989e782ba1966322e7e263Makoto Onuki     * of shortcuts, which may be different from what {@link #getCallerVisibleShortcuts} would
1732f3ba2e04be20d33fee989e782ba1966322e7e263Makoto Onuki     * return, because getCallerVisibleShortcuts() will get shortcuts from the proper "front door"
1733f3ba2e04be20d33fee989e782ba1966322e7e263Makoto Onuki     * which performs some extra checks, like {@link ShortcutPackage#onRestored}.
1734f3ba2e04be20d33fee989e782ba1966322e7e263Makoto Onuki     */
173551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected List<ShortcutInfo> getCallerShortcuts() {
173651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final ShortcutPackage p = mService.getPackageShortcutForTest(
173751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                getCallingPackage(), getCallingUserId());
173851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return p == null ? null : p.getAllShortcutsForTest();
173951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
174051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
1741f3ba2e04be20d33fee989e782ba1966322e7e263Makoto Onuki    /**
1742f3ba2e04be20d33fee989e782ba1966322e7e263Makoto Onuki     * @return all shortcuts owned by caller that are actually visible via ShortcutManager.
1743f3ba2e04be20d33fee989e782ba1966322e7e263Makoto Onuki     * See also {@link #getCallerShortcuts}.
1744f3ba2e04be20d33fee989e782ba1966322e7e263Makoto Onuki     */
1745f3ba2e04be20d33fee989e782ba1966322e7e263Makoto Onuki    protected List<ShortcutInfo> getCallerVisibleShortcuts() {
1746f3ba2e04be20d33fee989e782ba1966322e7e263Makoto Onuki        final ArrayList<ShortcutInfo> ret = new ArrayList<>();
1747f3ba2e04be20d33fee989e782ba1966322e7e263Makoto Onuki        ret.addAll(mManager.getDynamicShortcuts());
1748f3ba2e04be20d33fee989e782ba1966322e7e263Makoto Onuki        ret.addAll(mManager.getPinnedShortcuts());
1749f3ba2e04be20d33fee989e782ba1966322e7e263Makoto Onuki        ret.addAll(mManager.getManifestShortcuts());
1750f3ba2e04be20d33fee989e782ba1966322e7e263Makoto Onuki        return ret;
1751f3ba2e04be20d33fee989e782ba1966322e7e263Makoto Onuki    }
1752f3ba2e04be20d33fee989e782ba1966322e7e263Makoto Onuki
175351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected ShortcutInfo getCallerShortcut(String shortcutId) {
175451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return getPackageShortcut(getCallingPackage(), shortcutId, getCallingUserId());
175551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
175651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
175751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected List<ShortcutInfo> getLauncherShortcuts(String launcher, int userId, int queryFlags) {
175851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final List<ShortcutInfo>[] ret = new List[1];
175951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(launcher, userId, () -> {
176051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            final ShortcutQuery q = new ShortcutQuery();
176151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            q.setQueryFlags(queryFlags);
176251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            ret[0] = mLauncherApps.getShortcuts(q, UserHandle.of(userId));
176351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
176451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return ret[0];
176551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
176651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
176751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected List<ShortcutInfo> getLauncherPinnedShortcuts(String launcher, int userId) {
176851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return getLauncherShortcuts(launcher, userId, ShortcutQuery.FLAG_GET_PINNED);
176951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
177051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
1771a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki    protected List<ShortcutInfo> getShortcutAsLauncher(int targetUserId) {
1772a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki        final ShortcutQuery q = new ShortcutQuery();
1773a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki        q.setQueryFlags(ShortcutQuery.FLAG_MATCH_DYNAMIC | ShortcutQuery.FLAG_MATCH_DYNAMIC
1774a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki                | ShortcutQuery.FLAG_MATCH_PINNED);
1775a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki        return mLauncherApps.getShortcuts(q, UserHandle.of(targetUserId));
1776a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki    }
1777a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki
177851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected ShortcutInfo getShortcutInfoAsLauncher(String packageName, String shortcutId,
177951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            int userId) {
178051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final List<ShortcutInfo> infoList =
178151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                mLauncherApps.getShortcutInfo(packageName, list(shortcutId),
178251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                        UserHandle.of(userId));
178351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("No shortcutInfo found (or too many of them)", 1, infoList.size());
178451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return infoList.get(0);
178551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
178651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
1787ee6b6e4a1861336f8db52d8c93dbf32ee9615cfaMakoto Onuki    protected Intent genPackageAddIntent(String packageName, int userId) {
1788ee6b6e4a1861336f8db52d8c93dbf32ee9615cfaMakoto Onuki        installPackage(userId, packageName);
1789ee6b6e4a1861336f8db52d8c93dbf32ee9615cfaMakoto Onuki
179051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        Intent i = new Intent(Intent.ACTION_PACKAGE_ADDED);
1791ee6b6e4a1861336f8db52d8c93dbf32ee9615cfaMakoto Onuki        i.setData(Uri.parse("package:" + packageName));
179251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        i.putExtra(Intent.EXTRA_USER_HANDLE, userId);
179351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return i;
179451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
179551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
179651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected Intent genPackageDeleteIntent(String pakcageName, int userId) {
1797ee6b6e4a1861336f8db52d8c93dbf32ee9615cfaMakoto Onuki        uninstallPackage(userId, pakcageName);
1798ee6b6e4a1861336f8db52d8c93dbf32ee9615cfaMakoto Onuki
179951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        Intent i = new Intent(Intent.ACTION_PACKAGE_REMOVED);
180051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        i.setData(Uri.parse("package:" + pakcageName));
180151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        i.putExtra(Intent.EXTRA_USER_HANDLE, userId);
180251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return i;
180351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
180451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
180551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected Intent genPackageUpdateIntent(String pakcageName, int userId) {
1806ee6b6e4a1861336f8db52d8c93dbf32ee9615cfaMakoto Onuki        installPackage(userId, pakcageName);
1807ee6b6e4a1861336f8db52d8c93dbf32ee9615cfaMakoto Onuki
180851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        Intent i = new Intent(Intent.ACTION_PACKAGE_ADDED);
180951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        i.setData(Uri.parse("package:" + pakcageName));
181051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        i.putExtra(Intent.EXTRA_USER_HANDLE, userId);
181151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        i.putExtra(Intent.EXTRA_REPLACING, true);
181251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return i;
181351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
181451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
1815b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki    protected Intent genPackageChangedIntent(String pakcageName, int userId) {
1816b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        Intent i = new Intent(Intent.ACTION_PACKAGE_CHANGED);
1817b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        i.setData(Uri.parse("package:" + pakcageName));
1818b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        i.putExtra(Intent.EXTRA_USER_HANDLE, userId);
1819b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        return i;
1820b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki    }
1821b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki
182251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected Intent genPackageDataClear(String packageName, int userId) {
182351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        Intent i = new Intent(Intent.ACTION_PACKAGE_DATA_CLEARED);
182451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        i.setData(Uri.parse("package:" + packageName));
182551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        i.putExtra(Intent.EXTRA_USER_HANDLE, userId);
182651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return i;
182751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
182851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
182951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected void assertExistsAndShadow(ShortcutPackageItem spi) {
183051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertNotNull(spi);
183151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(spi.getPackageInfo().isShadow());
183251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
183351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
183451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected File makeFile(File baseDirectory, String... paths) {
183551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        File ret = baseDirectory;
183651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
183751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        for (String path : paths) {
183851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            ret = new File(ret, path);
183951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
184051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
184151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return ret;
184251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
184351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
184451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected boolean bitmapDirectoryExists(String packageName, int userId) {
1845475c36539da9687d75447adb9054c98ce03c754aMakoto Onuki        mService.waitForBitmapSavesForTest();
184651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final File path = new File(mService.getUserBitmapFilePath(userId), packageName);
184751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return path.isDirectory();
184851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
184951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static ShortcutQuery buildQuery(long changedSince,
185051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            String packageName, ComponentName componentName,
185151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            /* @ShortcutQuery.QueryFlags */ int flags) {
185251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return buildQuery(changedSince, packageName, null, componentName, flags);
185351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
185451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
185551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static ShortcutQuery buildQuery(long changedSince,
185651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            String packageName, List<String> shortcutIds, ComponentName componentName,
185751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            /* @ShortcutQuery.QueryFlags */ int flags) {
185851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final ShortcutQuery q = new ShortcutQuery();
185951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        q.setChangedSince(changedSince);
186051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        q.setPackage(packageName);
186151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        q.setShortcutIds(shortcutIds);
186251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        q.setActivity(componentName);
186351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        q.setQueryFlags(flags);
186451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return q;
186551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
186651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
186751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static ShortcutQuery buildAllQuery(String packageName) {
186851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final ShortcutQuery q = new ShortcutQuery();
186951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        q.setPackage(packageName);
18704d6b87ffdf06df3303239130ced685bc1a3fae50Makoto Onuki        q.setQueryFlags(ShortcutQuery.FLAG_GET_ALL_KINDS);
187151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return q;
187251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
187351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
187451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected static ShortcutQuery buildPinnedQuery(String packageName) {
187551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final ShortcutQuery q = new ShortcutQuery();
187651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        q.setPackage(packageName);
187751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        q.setQueryFlags(ShortcutQuery.FLAG_GET_PINNED);
187851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        return q;
187951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
188051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
18814d6b87ffdf06df3303239130ced685bc1a3fae50Makoto Onuki    protected static ShortcutQuery buildQueryWithFlags(int queryFlags) {
18824d6b87ffdf06df3303239130ced685bc1a3fae50Makoto Onuki        final ShortcutQuery q = new ShortcutQuery();
18834d6b87ffdf06df3303239130ced685bc1a3fae50Makoto Onuki        q.setQueryFlags(queryFlags);
18844d6b87ffdf06df3303239130ced685bc1a3fae50Makoto Onuki        return q;
18854d6b87ffdf06df3303239130ced685bc1a3fae50Makoto Onuki    }
18864d6b87ffdf06df3303239130ced685bc1a3fae50Makoto Onuki
188751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected void backupAndRestore() {
188851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        int prevUid = mInjectedCallingUid;
188951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
189051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCallingUid = Process.SYSTEM_UID; // Only system can call it.
189151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
189251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        dumpsysOnLogcat("Before backup");
189351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
189451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final byte[] payload =  mService.getBackupPayload(USER_0);
189551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        if (ENABLE_DUMP) {
189651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            final String xml = new String(payload);
189751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            Log.v(TAG, "Backup payload:");
189851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            for (String line : xml.split("\n")) {
189951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                Log.v(TAG, line);
190051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            }
190151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
190251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
190351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Before doing anything else, uninstall all packages.
190451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        for (int userId : list(USER_0, USER_P0)) {
190551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            for (String pkg : list(CALLING_PACKAGE_1, CALLING_PACKAGE_2, CALLING_PACKAGE_3,
190651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                    LAUNCHER_1, LAUNCHER_2, LAUNCHER_3)) {
190751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                uninstallPackage(userId, pkg);
190851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            }
190951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        }
191051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
191151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        shutdownServices();
191251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
191351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        deleteAllSavedFiles();
191451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
191551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        initService();
191651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.applyRestore(payload, USER_0);
191751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
191851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // handleUnlockUser will perform the gone package check, but it shouldn't remove
191951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // shadow information.
192051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.handleUnlockUser(USER_0);
192151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
192251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        dumpsysOnLogcat("After restore");
192351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
192451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCallingUid = prevUid;
192551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
192651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
192751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    protected void prepareCrossProfileDataSet() {
19289c850012cacf0af4a392294566a8c7c897dc8771Makoto Onuki        mRunningUsers.put(USER_10, true); // this test needs user 10.
19299c850012cacf0af4a392294566a8c7c897dc8771Makoto Onuki
193051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
193151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertTrue(mManager.setDynamicShortcuts(list(
193251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                    makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"),
193351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                    makeShortcut("s4"), makeShortcut("s5"), makeShortcut("s6"))));
193451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
193551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
193651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertTrue(mManager.setDynamicShortcuts(list(
193751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                    makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"),
193851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                    makeShortcut("s4"), makeShortcut("s5"), makeShortcut("s6"))));
193951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
194051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
194151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertTrue(mManager.setDynamicShortcuts(list(
194251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                    makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"),
194351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                    makeShortcut("s4"), makeShortcut("s5"), makeShortcut("s6"))));
194451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
194551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
194651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertTrue(mManager.setDynamicShortcuts(list()));
194751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
194851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
194951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertTrue(mManager.setDynamicShortcuts(list(
195051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                    makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"),
195151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                    makeShortcut("s4"), makeShortcut("s5"), makeShortcut("s6"))));
195251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
195351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
195451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertTrue(mManager.setDynamicShortcuts(list(
195551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                    makeShortcut("x1"), makeShortcut("x2"), makeShortcut("x3"),
195651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                    makeShortcut("x4"), makeShortcut("x5"), makeShortcut("x6"))));
195751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
195851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
195951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(LAUNCHER_1, USER_0, () -> {
196051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s1"), HANDLE_USER_0);
196151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("s1", "s2"), HANDLE_USER_0);
196251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mLauncherApps.pinShortcuts(CALLING_PACKAGE_3, list("s1", "s2", "s3"), HANDLE_USER_0);
196351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
196451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s1", "s4"), HANDLE_USER_P0);
196551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
196651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(LAUNCHER_2, USER_0, () -> {
196751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s2"), HANDLE_USER_0);
196851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("s2", "s3"), HANDLE_USER_0);
196951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mLauncherApps.pinShortcuts(CALLING_PACKAGE_3, list("s2", "s3", "s4"), HANDLE_USER_0);
197051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
197151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s2", "s5"), HANDLE_USER_P0);
197251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
1973f3ba2e04be20d33fee989e782ba1966322e7e263Makoto Onuki
1974f3ba2e04be20d33fee989e782ba1966322e7e263Makoto Onuki        // Note LAUNCHER_3 has allowBackup=false.
197551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(LAUNCHER_3, USER_0, () -> {
197651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s3"), HANDLE_USER_0);
197751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("s3", "s4"), HANDLE_USER_0);
197851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mLauncherApps.pinShortcuts(CALLING_PACKAGE_3, list("s3", "s4", "s5"), HANDLE_USER_0);
197951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
198051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s3", "s6"), HANDLE_USER_P0);
198151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
198251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(LAUNCHER_4, USER_0, () -> {
198351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list(), HANDLE_USER_0);
198451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list(), HANDLE_USER_0);
198551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mLauncherApps.pinShortcuts(CALLING_PACKAGE_3, list(), HANDLE_USER_0);
198651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mLauncherApps.pinShortcuts(CALLING_PACKAGE_4, list(), HANDLE_USER_0);
198751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
198851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
198951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Launcher on a managed profile is referring ot user 0!
199051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(LAUNCHER_1, USER_P0, () -> {
199151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s3", "s4"), HANDLE_USER_0);
199251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("s3", "s4", "s5"), HANDLE_USER_0);
199351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mLauncherApps.pinShortcuts(CALLING_PACKAGE_3, list("s3", "s4", "s5", "s6"),
199451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                    HANDLE_USER_0);
199551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
199651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s4", "s1"), HANDLE_USER_P0);
199751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
199851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(LAUNCHER_1, USER_10, () -> {
199951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("x4", "x5"), HANDLE_USER_10);
200051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("x4", "x5", "x6"), HANDLE_USER_10);
200151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mLauncherApps.pinShortcuts(CALLING_PACKAGE_3, list("x4", "x5", "x6", "x1"),
200251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                    HANDLE_USER_10);
200351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
200451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
200551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Then remove some dynamic shortcuts.
200651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
200751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertTrue(mManager.setDynamicShortcuts(list(
200851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                    makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
200951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
201051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
201151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertTrue(mManager.setDynamicShortcuts(list(
201251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                    makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
201351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
201451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
201551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertTrue(mManager.setDynamicShortcuts(list(
201651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                    makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
201751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
201851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
201951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertTrue(mManager.setDynamicShortcuts(list()));
202051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
202151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
202251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertTrue(mManager.setDynamicShortcuts(list(
202351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                    makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3"))));
202451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
202551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
202651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertTrue(mManager.setDynamicShortcuts(list(
202751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                    makeShortcut("x1"), makeShortcut("x2"), makeShortcut("x3"))));
202851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
202951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
2030b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
2031b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki    public static List<ShortcutInfo> assertAllHaveIconResId(
2032b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki            List<ShortcutInfo> actualShortcuts) {
2033b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        for (ShortcutInfo s : actualShortcuts) {
2034b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki            assertTrue("ID " + s.getId() + " not have icon res ID", s.hasIconResource());
2035b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki            assertFalse("ID " + s.getId() + " shouldn't have icon FD", s.hasIconFile());
2036b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        }
2037b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        return actualShortcuts;
2038b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki    }
2039b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
2040b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki    public static List<ShortcutInfo> assertAllHaveIconFile(
2041b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki            List<ShortcutInfo> actualShortcuts) {
2042b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        for (ShortcutInfo s : actualShortcuts) {
2043b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki            assertFalse("ID " + s.getId() + " shouldn't have icon res ID", s.hasIconResource());
2044b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki            assertTrue("ID " + s.getId() + " not have icon FD", s.hasIconFile());
2045b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        }
2046b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        return actualShortcuts;
2047b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki    }
2048b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
2049b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki    public static List<ShortcutInfo> assertAllHaveIcon(
2050b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki            List<ShortcutInfo> actualShortcuts) {
2051b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        for (ShortcutInfo s : actualShortcuts) {
2052a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki            assertTrue("ID " + s.getId() + " has no icon ",
2053a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki                    s.hasIconFile() || s.hasIconResource() || s.getIcon() != null);
2054b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        }
2055b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        return actualShortcuts;
2056b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki    }
2057b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
2058b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki    public static List<ShortcutInfo> assertAllStringsResolved(
2059b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki            List<ShortcutInfo> actualShortcuts) {
2060b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        for (ShortcutInfo s : actualShortcuts) {
2061b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki            assertTrue("ID " + s.getId(), s.hasStringResourcesResolved());
2062b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        }
2063b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        return actualShortcuts;
2064b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki    }
206576269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki
206676269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki    public String readTestAsset(String assetPath) throws IOException {
206776269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        final StringBuilder sb = new StringBuilder();
206876269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        try (BufferedReader br = new BufferedReader(
206976269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki                new InputStreamReader(
207076269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki                        getTestContext().getResources().getAssets().open(assetPath)))) {
207176269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki            String line;
207276269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki            while ((line = br.readLine()) != null) {
207376269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki                sb.append(line);
207476269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki                sb.append(System.lineSeparator());
207576269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki            }
207676269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        }
207776269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        return sb.toString();
207876269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki    }
20790b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki
20800b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki    protected void prepareGetHomeActivitiesAsUser(ComponentName preferred,
20810b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki            List<ResolveInfo> candidates, int userId) {
20820b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki        doAnswer(inv -> {
20830b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki            ((List) inv.getArguments()[0]).addAll(candidates);
20840b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki            return preferred;
20850b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki        }).when(mMockPackageManagerInternal).getHomeActivitiesAsUser(any(List.class), eq(userId));
20860b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki    }
20870b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki
20880b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki    protected static ComponentName cn(String packageName, String name) {
20890b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki        return new ComponentName(packageName, name);
20900b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki    }
20910b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki
20920b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki    protected static ResolveInfo ri(String packageName, String name, boolean isSystem, int priority) {
20930b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki        final ResolveInfo ri = new ResolveInfo();
20940b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki        ri.activityInfo = new ActivityInfo();
20950b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki        ri.activityInfo.applicationInfo = new ApplicationInfo();
20960b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki
20970b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki        ri.activityInfo.packageName = packageName;
20980b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki        ri.activityInfo.name = name;
20990b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki        if (isSystem) {
21000b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki            ri.activityInfo.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
21010b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki        }
21020b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki        ri.priority = priority;
21030b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki        return ri;
21040b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki    }
21050b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki
21060b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki    protected static ResolveInfo getSystemLauncher() {
21070b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki        return ri(PACKAGE_SYSTEM_LAUNCHER, PACKAGE_SYSTEM_LAUNCHER_NAME, true,
21080b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki                PACKAGE_SYSTEM_LAUNCHER_PRIORITY);
21090b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki    }
21100b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki
21110b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki    protected static ResolveInfo getFallbackLauncher() {
21120b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki        return ri(PACKAGE_FALLBACK_LAUNCHER, PACKAGE_FALLBACK_LAUNCHER_NAME, true,
21130b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki                PACKAGE_FALLBACK_LAUNCHER_PRIORITY);
21140b9d1db5c1aab9017daf05abd0ba0f4de2c7192dMakoto Onuki    }
2115a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki
2116a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki    protected void makeCallerForeground() {
2117a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki        try {
2118a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki            mService.mUidObserver.onUidStateChanged(
21198025580449081ddd21f449f8719bc87d1cc9fc7bSudheer Shanka                    mInjectedCallingUid, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0);
2120a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki        } catch (RemoteException e) {
2121a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki            e.rethrowAsRuntimeException();
2122a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki        }
2123a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki    }
2124a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki
2125a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki    protected void makeCallerBackground() {
2126a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki        try {
2127a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki            mService.mUidObserver.onUidStateChanged(
21288025580449081ddd21f449f8719bc87d1cc9fc7bSudheer Shanka                    mInjectedCallingUid, ActivityManager.PROCESS_STATE_TOP_SLEEPING, 0);
2129a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki        } catch (RemoteException e) {
2130a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki            e.rethrowAsRuntimeException();
2131a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki        }
2132a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki    }
2133a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki
2134a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki    protected void publishManifestShortcutsAsCaller(int resId) {
2135a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki        addManifestShortcutResource(
2136a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki                new ComponentName(getCallingPackage(), ShortcutActivity.class.getName()),
2137a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki                resId);
2138a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki        updatePackageVersion(getCallingPackage(), 1);
2139a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki        mService.mPackageMonitor.onReceive(getTestContext(),
2140a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki                genPackageAddIntent(getCallingPackage(), getCallingUserId()));
2141a01f4f03e920277a48369b06983c728a73b8dcd4Makoto Onuki    }
214251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki}
2143