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
18b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onukiimport static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertBundlesEqual;
1951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertExpectException;
20b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onukiimport static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertWith;
2151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.list;
22b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onukiimport static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.makeBundle;
2351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.parceled;
2451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.set;
2551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
26ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onukiimport static org.mockito.Matchers.anyInt;
27ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onukiimport static org.mockito.Matchers.anyString;
28ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onukiimport static org.mockito.Matchers.eq;
29ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onukiimport static org.mockito.Mockito.reset;
30ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onukiimport static org.mockito.Mockito.times;
31ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onukiimport static org.mockito.Mockito.verify;
32ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki
3351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.Manifest.permission;
3451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.app.ActivityManager;
3551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.content.ComponentName;
3651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.content.Intent;
3751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.content.pm.ShortcutInfo;
38157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onukiimport android.content.res.Resources;
3951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.graphics.BitmapFactory;
4051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.graphics.drawable.Icon;
41b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onukiimport android.net.Uri;
4251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.os.PersistableBundle;
4351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.os.UserHandle;
4451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.test.MoreAsserts;
4551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport android.test.suitebuilder.annotation.SmallTest;
4651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
4751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukiimport com.android.frameworks.servicestests.R;
48b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onukiimport com.android.server.pm.ShortcutService.ConfigConstants;
4951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
5076269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onukiimport java.io.File;
510eed441c0cf3bd03b8ac780e62fbeae5d7fcac4bMakoto Onukiimport java.io.FileWriter;
5276269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onukiimport java.io.IOException;
5376269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onukiimport java.io.PrintWriter;
5476269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onukiimport java.io.StringWriter;
550eed441c0cf3bd03b8ac780e62fbeae5d7fcac4bMakoto Onukiimport java.io.Writer;
564e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onukiimport java.util.Locale;
574e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki
5851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki/**
5951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki * Tests for ShortcutService and ShortcutManager.
6051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki *
6151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki m FrameworksServicesTests &&
6251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki adb install \
6351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki -r -g ${ANDROID_PRODUCT_OUT}/data/app/FrameworksServicesTests/FrameworksServicesTests.apk &&
6451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki adb shell am instrument -e class com.android.server.pm.ShortcutManagerTest2 \
6551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki -w com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
6651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki */
6751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki@SmallTest
6851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukipublic class ShortcutManagerTest2 extends BaseShortcutManagerTest {
6951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    // ShortcutInfo tests
7051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
7151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public void testShortcutInfoMissingMandatoryFields() {
72a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki        // Disable throttling.
73a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki        mService.updateConfigurationLocked(
74a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki                ShortcutService.ConfigConstants.KEY_MAX_UPDATES_PER_INTERVAL + "=99999999,"
75a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki                + ShortcutService.ConfigConstants.KEY_MAX_SHORTCUTS + "=99999999"
76a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki        );
77a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki
7851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertExpectException(
7951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                IllegalArgumentException.class,
8051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                "ID must be provided",
8151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                () -> new ShortcutInfo.Builder(getTestContext()).build());
82a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki
83b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        assertExpectException(
84b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                RuntimeException.class,
85b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                "id cannot be empty",
86b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                () -> new ShortcutInfo.Builder(getTestContext(), null));
87a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki
88b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        assertExpectException(
89b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                RuntimeException.class,
90b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                "id cannot be empty",
91b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                () -> new ShortcutInfo.Builder(getTestContext(), ""));
92b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki
93b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        assertExpectException(
94b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                RuntimeException.class,
95440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                "intents cannot contain null",
96b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                () -> new ShortcutInfo.Builder(getTestContext(), "id").setIntent(null));
97b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki
98b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        assertExpectException(
99b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                RuntimeException.class,
100b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                "action must be set",
101b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                () -> new ShortcutInfo.Builder(getTestContext(), "id").setIntent(new Intent()));
102b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki
103b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        assertExpectException(
104b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                RuntimeException.class,
1050eed441c0cf3bd03b8ac780e62fbeae5d7fcac4bMakoto Onuki                "action must be set",
1060eed441c0cf3bd03b8ac780e62fbeae5d7fcac4bMakoto Onuki                () -> new ShortcutInfo.Builder(getTestContext(), "id")
1070eed441c0cf3bd03b8ac780e62fbeae5d7fcac4bMakoto Onuki                        .setIntents(new Intent[]{new Intent("action"), new Intent()}));
1080eed441c0cf3bd03b8ac780e62fbeae5d7fcac4bMakoto Onuki
1090eed441c0cf3bd03b8ac780e62fbeae5d7fcac4bMakoto Onuki        assertExpectException(
1100eed441c0cf3bd03b8ac780e62fbeae5d7fcac4bMakoto Onuki                RuntimeException.class,
111b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                "activity cannot be null",
112b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                () -> new ShortcutInfo.Builder(getTestContext(), "id").setActivity(null));
113b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki
114b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        assertExpectException(
115b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                RuntimeException.class,
116b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                "shortLabel cannot be empty",
117b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                () -> new ShortcutInfo.Builder(getTestContext(), "id").setShortLabel(null));
118b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki
119b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        assertExpectException(
120b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                RuntimeException.class,
121b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                "shortLabel cannot be empty",
122b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                () -> new ShortcutInfo.Builder(getTestContext(), "id").setShortLabel(""));
123b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki
124b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        assertExpectException(
125b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                RuntimeException.class,
126b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                "longLabel cannot be empty",
127b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                () -> new ShortcutInfo.Builder(getTestContext(), "id").setLongLabel(null));
128b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki
129b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        assertExpectException(
130b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                RuntimeException.class,
131b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                "longLabel cannot be empty",
132b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                () -> new ShortcutInfo.Builder(getTestContext(), "id").setLongLabel(""));
133b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki
134b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        assertExpectException(
135b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                RuntimeException.class,
136b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                "disabledMessage cannot be empty",
137b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                () -> new ShortcutInfo.Builder(getTestContext(), "id").setDisabledMessage(null));
138b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki
139b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        assertExpectException(
140b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                RuntimeException.class,
141b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                "disabledMessage cannot be empty",
142b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                () -> new ShortcutInfo.Builder(getTestContext(), "id").setDisabledMessage(""));
143b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki
144b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        assertExpectException(NullPointerException.class, "action must be set",
145b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                () -> new ShortcutInfo.Builder(getTestContext(), "id").setIntent(new Intent()));
146a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki
147a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki        assertExpectException(
148a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki                IllegalArgumentException.class, "Short label must be provided", () -> {
149b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki            ShortcutInfo si = new ShortcutInfo.Builder(getTestContext(), "id")
150a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki                    .setActivity(new ComponentName(getTestContext().getPackageName(), "s"))
151a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki                    .build();
152a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki            assertTrue(getManager().setDynamicShortcuts(list(si)));
153a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki        });
154a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki
15513260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki        // same for add.
15651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertExpectException(
157a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki                IllegalArgumentException.class, "Short label must be provided", () -> {
158b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki            ShortcutInfo si = new ShortcutInfo.Builder(getTestContext(), "id")
159a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki                    .setActivity(new ComponentName(getTestContext().getPackageName(), "s"))
160a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki                    .build();
161a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki            assertTrue(getManager().addDynamicShortcuts(list(si)));
162a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki        });
163a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki
164a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki        assertExpectException(NullPointerException.class, "Intent must be provided", () -> {
165b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki            ShortcutInfo si = new ShortcutInfo.Builder(getTestContext(), "id")
166a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki                    .setActivity(new ComponentName(getTestContext().getPackageName(), "s"))
167a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki                    .setShortLabel("x")
168a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki                    .build();
169a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki            assertTrue(getManager().setDynamicShortcuts(list(si)));
170a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki        });
171a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki
172b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        // same for add.
173a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki        assertExpectException(NullPointerException.class, "Intent must be provided", () -> {
174b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki            ShortcutInfo si = new ShortcutInfo.Builder(getTestContext(), "id")
175a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki                    .setActivity(new ComponentName(getTestContext().getPackageName(), "s"))
176a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki                    .setShortLabel("x")
177a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki                    .build();
178a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki            assertTrue(getManager().addDynamicShortcuts(list(si)));
179a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki        });
180a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki
18151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertExpectException(
182b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                IllegalStateException.class, "does not belong to package", () -> {
183b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki            ShortcutInfo si = new ShortcutInfo.Builder(getTestContext(), "id")
184a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki                    .setActivity(new ComponentName("xxx", "s"))
185a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki                    .build();
186a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki            assertTrue(getManager().setDynamicShortcuts(list(si)));
187a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki        });
188a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki
189b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        // same for add.
19051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertExpectException(
191b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                IllegalStateException.class, "does not belong to package", () -> {
192b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki            ShortcutInfo si = new ShortcutInfo.Builder(getTestContext(), "id")
193a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki                    .setActivity(new ComponentName("xxx", "s"))
194a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki                    .build();
195a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki            assertTrue(getManager().addDynamicShortcuts(list(si)));
196a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki        });
19713260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki
19813260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki        // Now all activities are not main.
19913260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki        mMainActivityChecker = (component, userId) -> false;
20013260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki
20113260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki        assertExpectException(
20213260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki                IllegalStateException.class, "is not main", () -> {
20313260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki                    ShortcutInfo si = new ShortcutInfo.Builder(getTestContext(), "id")
20413260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki                            .setActivity(new ComponentName(getTestContext(), "s"))
20513260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki                            .build();
20613260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki                    assertTrue(getManager().setDynamicShortcuts(list(si)));
20713260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki                });
20813260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki        // For add
20913260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki        assertExpectException(
21013260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki                IllegalStateException.class, "is not main", () -> {
21113260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki                    ShortcutInfo si = new ShortcutInfo.Builder(getTestContext(), "id")
21213260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki                            .setActivity(new ComponentName(getTestContext(), "s"))
21313260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki                            .build();
21413260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki                    assertTrue(getManager().addDynamicShortcuts(list(si)));
21513260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki                });
21613260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki        // For update
21713260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki        assertExpectException(
21813260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki                IllegalStateException.class, "is not main", () -> {
21913260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki                    ShortcutInfo si = new ShortcutInfo.Builder(getTestContext(), "id")
22013260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki                            .setActivity(new ComponentName(getTestContext(), "s"))
22113260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki                            .build();
22213260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki                    assertTrue(getManager().updateShortcuts(list(si)));
22313260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki                });
22451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
22551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
22651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public void testShortcutInfoParcel() {
22751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        setCaller(CALLING_PACKAGE_1, USER_10);
22851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo si = parceled(new ShortcutInfo.Builder(mClientContext)
22951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setId("id")
23051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTitle("title")
23151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIntent(makeIntent("action", ShortcutActivity.class))
23251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .build());
23351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(mClientContext.getPackageName(), si.getPackage());
23451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(USER_10, si.getUserId());
23551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(HANDLE_USER_10, si.getUserHandle());
23651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("id", si.getId());
23751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("title", si.getTitle());
23851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("action", si.getIntent().getAction());
23951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
24051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        PersistableBundle pb = new PersistableBundle();
24151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        pb.putInt("k", 1);
24251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
24351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = new ShortcutInfo.Builder(getTestContext())
24451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setId("id")
24551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setActivity(new ComponentName("a", "b"))
24651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIcon(Icon.createWithResource(mClientContext, 123))
24751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTitle("title")
24851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setText("text")
24951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setDisabledMessage("dismes")
25051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
25151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"))
25251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setRank(123)
25351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setExtras(pb)
25451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .build();
25551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.addFlags(ShortcutInfo.FLAG_PINNED);
25651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.setBitmapPath("abc");
25751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.setIconResourceId(456);
25851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
25951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = parceled(si);
26051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
26151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(getTestContext().getPackageName(), si.getPackage());
26251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("id", si.getId());
26351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(new ComponentName("a", "b"), si.getActivity());
26451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getIcon().getResId());
26551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("title", si.getTitle());
26651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("text", si.getText());
26751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("dismes", si.getDisabledMessage());
26851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories());
26951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("action", si.getIntent().getAction());
27051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("val", si.getIntent().getStringExtra("key"));
27151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getRank());
27251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(1, si.getExtras().getInt("k"));
27351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
27451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(ShortcutInfo.FLAG_PINNED, si.getFlags());
27551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("abc", si.getBitmapPath());
27651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(456, si.getIconResourceId());
277157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
278157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(0, si.getTitleResId());
279157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getTitleResName());
280157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(0, si.getTextResId());
281157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getTextResName());
282157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(0, si.getDisabledMessageResourceId());
283157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getDisabledMessageResName());
28451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
28551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
28651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public void testShortcutInfoParcel_resId() {
28751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        setCaller(CALLING_PACKAGE_1, USER_10);
28851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo si;
28951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
29051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        PersistableBundle pb = new PersistableBundle();
29151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        pb.putInt("k", 1);
29251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
29351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = new ShortcutInfo.Builder(getTestContext())
29451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setId("id")
29551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setActivity(new ComponentName("a", "b"))
29651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIcon(Icon.createWithResource(mClientContext, 123))
29751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTitleResId(10)
29851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTextResId(11)
29951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setDisabledMessageResId(12)
30051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
30151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"))
30251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setRank(123)
30351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setExtras(pb)
30451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .build();
30551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.addFlags(ShortcutInfo.FLAG_PINNED);
30651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.setBitmapPath("abc");
30751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.setIconResourceId(456);
30851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
309157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        lookupAndFillInResourceNames(si);
310157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
31151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = parceled(si);
31251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
31351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(getTestContext().getPackageName(), si.getPackage());
31451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("id", si.getId());
31551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(new ComponentName("a", "b"), si.getActivity());
31651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getIcon().getResId());
31751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(10, si.getTitleResId());
318157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("r10", si.getTitleResName());
31951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(11, si.getTextResId());
320157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("r11", si.getTextResName());
32151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(12, si.getDisabledMessageResourceId());
322157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("r12", si.getDisabledMessageResName());
32351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories());
32451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("action", si.getIntent().getAction());
32551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("val", si.getIntent().getStringExtra("key"));
32651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getRank());
32751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(1, si.getExtras().getInt("k"));
32851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
32951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(ShortcutInfo.FLAG_PINNED, si.getFlags());
33051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("abc", si.getBitmapPath());
33151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(456, si.getIconResourceId());
332157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("string/r456", si.getIconResName());
33351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
33451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
33551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public void testShortcutInfoClone() {
33651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        setCaller(CALLING_PACKAGE_1, USER_11);
33751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
33851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        PersistableBundle pb = new PersistableBundle();
33951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        pb.putInt("k", 1);
34051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo sorig = new ShortcutInfo.Builder(mClientContext)
34151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setId("id")
34251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setActivity(new ComponentName("a", "b"))
34351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIcon(Icon.createWithResource(mClientContext, 123))
34451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTitle("title")
34551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setText("text")
34651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setDisabledMessage("dismes")
34751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"))
34851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
34951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setRank(123)
35051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setExtras(pb)
35151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .build();
35251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        sorig.addFlags(ShortcutInfo.FLAG_PINNED);
35351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        sorig.setBitmapPath("abc");
35451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        sorig.setIconResourceId(456);
35551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
356157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        lookupAndFillInResourceNames(sorig);
357157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
35851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo si = sorig.clone(/* clone flags*/ 0);
35951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
36051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(USER_11, si.getUserId());
36151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(HANDLE_USER_11, si.getUserHandle());
36251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(mClientContext.getPackageName(), si.getPackage());
36351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("id", si.getId());
36451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(new ComponentName("a", "b"), si.getActivity());
36551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getIcon().getResId());
36651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("title", si.getTitle());
36751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("text", si.getText());
36851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("dismes", si.getDisabledMessage());
36951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories());
37051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("action", si.getIntent().getAction());
37151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("val", si.getIntent().getStringExtra("key"));
37251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getRank());
37351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(1, si.getExtras().getInt("k"));
37451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
37551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(ShortcutInfo.FLAG_PINNED, si.getFlags());
37651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("abc", si.getBitmapPath());
37751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(456, si.getIconResourceId());
378157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("string/r456", si.getIconResName());
37951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
38051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(ShortcutInfo.CLONE_REMOVE_FOR_CREATOR);
38151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
38251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(mClientContext.getPackageName(), si.getPackage());
38351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("id", si.getId());
38451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(new ComponentName("a", "b"), si.getActivity());
38551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getIcon());
38651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("title", si.getTitle());
38751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("text", si.getText());
38851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("dismes", si.getDisabledMessage());
38951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories());
39051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("action", si.getIntent().getAction());
39151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("val", si.getIntent().getStringExtra("key"));
39251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getRank());
39351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(1, si.getExtras().getInt("k"));
39451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
39551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(ShortcutInfo.FLAG_PINNED, si.getFlags());
39651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getBitmapPath());
39751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
39851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(456, si.getIconResourceId());
399157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getIconResName());
40051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
40151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(ShortcutInfo.CLONE_REMOVE_FOR_LAUNCHER);
40251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
40351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(mClientContext.getPackageName(), si.getPackage());
40451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("id", si.getId());
40551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(new ComponentName("a", "b"), si.getActivity());
40651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getIcon());
40751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("title", si.getTitle());
40851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("text", si.getText());
40951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("dismes", si.getDisabledMessage());
41051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories());
41151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getIntent());
41251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getRank());
41351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(1, si.getExtras().getInt("k"));
41451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
41551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(ShortcutInfo.FLAG_PINNED, si.getFlags());
41651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getBitmapPath());
41751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
41851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(456, si.getIconResourceId());
419157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getIconResName());
42051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
42151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(ShortcutInfo.CLONE_REMOVE_NON_KEY_INFO);
42251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
42351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(mClientContext.getPackageName(), si.getPackage());
42451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("id", si.getId());
4254d6b87ffdf06df3303239130ced685bc1a3fae50Makoto Onuki        assertEquals(new ComponentName("a", "b"), si.getActivity());
42651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getIcon());
42751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getTitle());
42851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getText());
42951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getDisabledMessage());
43051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getCategories());
43151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getIntent());
43251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, si.getRank());
43351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getExtras());
43451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
43551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(ShortcutInfo.FLAG_PINNED | ShortcutInfo.FLAG_KEY_FIELDS_ONLY, si.getFlags());
43651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getBitmapPath());
43751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
43851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(456, si.getIconResourceId());
439157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getIconResName());
44051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
44151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
44251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public void testShortcutInfoClone_resId() {
44351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        setCaller(CALLING_PACKAGE_1, USER_11);
44451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
44551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        PersistableBundle pb = new PersistableBundle();
44651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        pb.putInt("k", 1);
44751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo sorig = new ShortcutInfo.Builder(mClientContext)
44851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setId("id")
44951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setActivity(new ComponentName("a", "b"))
45051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIcon(Icon.createWithResource(mClientContext, 123))
45151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTitleResId(10)
45251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTextResId(11)
45351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setDisabledMessageResId(12)
45451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"))
45551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
45651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setRank(123)
45751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setExtras(pb)
45851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .build();
45951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        sorig.addFlags(ShortcutInfo.FLAG_PINNED);
46051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        sorig.setBitmapPath("abc");
46151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        sorig.setIconResourceId(456);
46251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
463157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        lookupAndFillInResourceNames(sorig);
464157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
46551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo si = sorig.clone(/* clone flags*/ 0);
46651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
46751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(USER_11, si.getUserId());
46851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(HANDLE_USER_11, si.getUserHandle());
46951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(mClientContext.getPackageName(), si.getPackage());
47051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("id", si.getId());
47151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(new ComponentName("a", "b"), si.getActivity());
47251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getIcon().getResId());
47351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(10, si.getTitleResId());
474157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("r10", si.getTitleResName());
47551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(11, si.getTextResId());
476157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("r11", si.getTextResName());
47751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(12, si.getDisabledMessageResourceId());
478157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("r12", si.getDisabledMessageResName());
47951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories());
48051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("action", si.getIntent().getAction());
48151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("val", si.getIntent().getStringExtra("key"));
48251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getRank());
48351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(1, si.getExtras().getInt("k"));
48451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
48551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(ShortcutInfo.FLAG_PINNED, si.getFlags());
48651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("abc", si.getBitmapPath());
48751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(456, si.getIconResourceId());
488157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("string/r456", si.getIconResName());
48951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
49051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(ShortcutInfo.CLONE_REMOVE_FOR_CREATOR);
49151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
49251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(mClientContext.getPackageName(), si.getPackage());
49351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("id", si.getId());
49451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(new ComponentName("a", "b"), si.getActivity());
49551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getIcon());
49651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(10, si.getTitleResId());
497157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getTitleResName());
49851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(11, si.getTextResId());
499157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getTextResName());
50051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(12, si.getDisabledMessageResourceId());
501157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getDisabledMessageResName());
50251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories());
50351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("action", si.getIntent().getAction());
50451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("val", si.getIntent().getStringExtra("key"));
50551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getRank());
50651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(1, si.getExtras().getInt("k"));
50751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
50851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(ShortcutInfo.FLAG_PINNED, si.getFlags());
50951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getBitmapPath());
51051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
51151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(456, si.getIconResourceId());
512157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getIconResName());
51351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
51451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(ShortcutInfo.CLONE_REMOVE_FOR_LAUNCHER);
51551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
51651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(mClientContext.getPackageName(), si.getPackage());
51751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("id", si.getId());
51851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(new ComponentName("a", "b"), si.getActivity());
51951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getIcon());
52051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(10, si.getTitleResId());
521157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getTitleResName());
52251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(11, si.getTextResId());
523157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getTextResName());
52451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(12, si.getDisabledMessageResourceId());
525157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getDisabledMessageResName());
52651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories());
52751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getIntent());
52851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getRank());
52951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(1, si.getExtras().getInt("k"));
53051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
53151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(ShortcutInfo.FLAG_PINNED, si.getFlags());
53251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getBitmapPath());
53351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
53451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(456, si.getIconResourceId());
535157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getIconResName());
53651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
53751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(ShortcutInfo.CLONE_REMOVE_NON_KEY_INFO);
53851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
53951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(mClientContext.getPackageName(), si.getPackage());
54051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("id", si.getId());
5414d6b87ffdf06df3303239130ced685bc1a3fae50Makoto Onuki        assertEquals(new ComponentName("a", "b"), si.getActivity());
54251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getIcon());
54351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, si.getTitleResId());
544157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getTitleResName());
54551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, si.getTextResId());
546157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getTextResName());
54751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, si.getDisabledMessageResourceId());
548157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getDisabledMessageResName());
54951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getCategories());
55051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getIntent());
55151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, si.getRank());
55251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getExtras());
55351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
55451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(ShortcutInfo.FLAG_PINNED | ShortcutInfo.FLAG_KEY_FIELDS_ONLY, si.getFlags());
55551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getBitmapPath());
55651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
55751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(456, si.getIconResourceId());
558157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getIconResName());
55951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
56051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
56151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public void testShortcutInfoClone_minimum() {
56251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        PersistableBundle pb = new PersistableBundle();
56351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        pb.putInt("k", 1);
56451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo sorig = new ShortcutInfo.Builder(getTestContext())
56551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setId("id")
56651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTitle("title")
56751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIntent(makeIntent("action", ShortcutActivity.class))
56851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .build();
56951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo si = sorig.clone(/* clone flags*/ 0);
57051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
57151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(getTestContext().getPackageName(), si.getPackage());
57251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("id", si.getId());
57351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("title", si.getTitle());
57451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("action", si.getIntent().getAction());
57551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getCategories());
57651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
57751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(ShortcutInfo.CLONE_REMOVE_FOR_CREATOR);
57851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
57951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(getTestContext().getPackageName(), si.getPackage());
58051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("id", si.getId());
58151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("title", si.getTitle());
58251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("action", si.getIntent().getAction());
58351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getCategories());
58451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
58551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(ShortcutInfo.CLONE_REMOVE_FOR_LAUNCHER);
58651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
58751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(getTestContext().getPackageName(), si.getPackage());
58851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("id", si.getId());
58951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("title", si.getTitle());
59051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getIntent());
59151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getCategories());
59251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
59351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(ShortcutInfo.CLONE_REMOVE_NON_KEY_INFO);
59451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
59551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(getTestContext().getPackageName(), si.getPackage());
59651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("id", si.getId());
59751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getTitle());
59851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getIntent());
59951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getCategories());
60051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
60151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
60251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public void testShortcutInfoCopyNonNullFieldsFrom() throws InterruptedException {
60351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        PersistableBundle pb = new PersistableBundle();
60451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        pb.putInt("k", 1);
60551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo sorig = new ShortcutInfo.Builder(getTestContext())
60651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setId("id")
60751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setActivity(new ComponentName("a", "b"))
60851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIcon(Icon.createWithResource(mClientContext, 123))
60951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTitle("title")
61051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setText("text")
61151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setDisabledMessage("dismes")
61251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"))
61351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
61451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setRank(123)
61551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setExtras(pb)
61651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .build();
61751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        sorig.addFlags(ShortcutInfo.FLAG_PINNED);
61851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        sorig.setBitmapPath("abc");
61951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        sorig.setIconResourceId(456);
62051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
621157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        lookupAndFillInResourceNames(sorig);
622157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
62351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo si;
62451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
62551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
62651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
62751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setActivity(new ComponentName("x", "y")).build());
62851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("text", si.getText());
6299e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        assertEquals(123, si.getRank());
63051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(new ComponentName("x", "y"), si.getActivity());
63151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
63251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
63351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
63451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIcon(Icon.createWithResource(mClientContext, 456)).build());
63551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("text", si.getText());
63651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(456, si.getIcon().getResId());
637157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(0, si.getIconResourceId());
638157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getIconResName());
639157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getBitmapPath());
64051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
64151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
64251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
64351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTitle("xyz").build());
64451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("text", si.getText());
64551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("xyz", si.getTitle());
64651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, si.getTitleResId());
64751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
64851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
64951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
65051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTitleResId(123).build());
65151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("text", si.getText());
65251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getTitle());
65351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getTitleResId());
65451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
65551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
65651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
65751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setText("xxx").build());
65851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getRank());
65951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("xxx", si.getText());
66051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, si.getTextResId());
66151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
66251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
66351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
66451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTextResId(1111).build());
66551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getRank());
66651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getText());
66751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(1111, si.getTextResId());
66851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
66951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
67051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
67151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setDisabledMessage("xxx").build());
67251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getRank());
67351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("xxx", si.getDisabledMessage());
67451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, si.getDisabledMessageResourceId());
67551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
67651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
67751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
67851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setDisabledMessageResId(11111).build());
67951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getRank());
68051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getDisabledMessage());
68151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(11111, si.getDisabledMessageResourceId());
68251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
68351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
68451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
68551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setCategories(set()).build());
68651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("text", si.getText());
68751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(set(), si.getCategories());
68851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
68951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
69051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
69151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setCategories(set("x")).build());
69251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("text", si.getText());
69351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(set("x"), si.getCategories());
69451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
69551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
69651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
69751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIntent(makeIntent("action2", ShortcutActivity.class)).build());
69851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("text", si.getText());
69951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("action2", si.getIntent().getAction());
70051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getIntent().getStringExtra("key"));
70151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
70251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
70351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
70451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIntent(makeIntent("action3", ShortcutActivity.class, "key", "x")).build());
70551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("text", si.getText());
70651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("action3", si.getIntent().getAction());
70751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("x", si.getIntent().getStringExtra("key"));
70851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
70951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
71051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
71151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setRank(999).build());
71251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("text", si.getText());
71351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(999, si.getRank());
71451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
71551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
71651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        PersistableBundle pb2 = new PersistableBundle();
71751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        pb2.putInt("x", 99);
71851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
71951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
72051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
72151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setExtras(pb2).build());
72251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("text", si.getText());
72351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(99, si.getExtras().getInt("x"));
72451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
72551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
72651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public void testShortcutInfoCopyNonNullFieldsFrom_resId() throws InterruptedException {
72751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        PersistableBundle pb = new PersistableBundle();
72851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        pb.putInt("k", 1);
72951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo sorig = new ShortcutInfo.Builder(getTestContext())
73051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setId("id")
73151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setActivity(new ComponentName("a", "b"))
73251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIcon(Icon.createWithResource(mClientContext, 123))
73351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTitleResId(10)
73451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTextResId(11)
73551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setDisabledMessageResId(12)
73651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"))
73751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
73851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setRank(123)
73951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setExtras(pb)
74051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .build();
74151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        sorig.addFlags(ShortcutInfo.FLAG_PINNED);
74251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        sorig.setBitmapPath("abc");
74351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        sorig.setIconResourceId(456);
74451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
74551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo si;
74651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
74751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
74851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
74951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setActivity(new ComponentName("x", "y")).build());
75051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(11, si.getTextResId());
75151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(new ComponentName("x", "y"), si.getActivity());
75251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
75351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
75451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
75551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIcon(Icon.createWithResource(mClientContext, 456)).build());
75651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(11, si.getTextResId());
75751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(456, si.getIcon().getResId());
758157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(0, si.getIconResourceId());
759157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getIconResName());
760157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getBitmapPath());
76151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
76251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
76351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
76451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTitle("xyz").build());
76551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(11, si.getTextResId());
76651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("xyz", si.getTitle());
76751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, si.getTitleResId());
768157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getTitleResName());
76951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
77051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
77151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
77251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTitleResId(123).build());
77351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(11, si.getTextResId());
77451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getTitle());
77551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getTitleResId());
776157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getTitleResName());
77751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
77851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
77951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
78051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setText("xxx").build());
78151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getRank());
78251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("xxx", si.getText());
78351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, si.getTextResId());
784157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getTextResName());
78551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
78651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
78751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
78851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTextResId(1111).build());
78951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getRank());
79051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getText());
79151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(1111, si.getTextResId());
792157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getTextResName());
79351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
79451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
79551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
79651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setDisabledMessage("xxx").build());
79751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getRank());
79851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("xxx", si.getDisabledMessage());
79951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, si.getDisabledMessageResourceId());
800157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getDisabledMessageResName());
80151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
80251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
80351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
80451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setDisabledMessageResId(11111).build());
80551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getRank());
80651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getDisabledMessage());
80751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(11111, si.getDisabledMessageResourceId());
808157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getDisabledMessageResName());
80951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
81051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
81151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
81251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setCategories(set()).build());
81351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(11, si.getTextResId());
81451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(set(), si.getCategories());
81551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
81651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
81751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
81851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setCategories(set("x")).build());
81951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(11, si.getTextResId());
82051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(set("x"), si.getCategories());
82151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
82251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
82351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
82451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIntent(makeIntent("action2", ShortcutActivity.class)).build());
82551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(11, si.getTextResId());
82651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("action2", si.getIntent().getAction());
82751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getIntent().getStringExtra("key"));
82851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
82951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
83051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
83151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIntent(makeIntent("action3", ShortcutActivity.class, "key", "x")).build());
83251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(11, si.getTextResId());
83351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("action3", si.getIntent().getAction());
83451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("x", si.getIntent().getStringExtra("key"));
83551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
83651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
83751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
83851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setRank(999).build());
83951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(11, si.getTextResId());
84051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(999, si.getRank());
84151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
84251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
84351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        PersistableBundle pb2 = new PersistableBundle();
84451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        pb2.putInt("x", 99);
84551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
84651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
84751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
84851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setExtras(pb2).build());
84951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(11, si.getTextResId());
85051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(99, si.getExtras().getInt("x"));
85151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
85251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
85351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public void testShortcutInfoSaveAndLoad() throws InterruptedException {
8549c850012cacf0af4a392294566a8c7c897dc8771Makoto Onuki        mRunningUsers.put(USER_10, true);
8559c850012cacf0af4a392294566a8c7c897dc8771Makoto Onuki
85651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        setCaller(CALLING_PACKAGE_1, USER_10);
85751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
85851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final Icon bmp32x32 = Icon.createWithBitmap(BitmapFactory.decodeResource(
85951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                getTestContext().getResources(), R.drawable.black_32x32));
86051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
86151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        PersistableBundle pb = new PersistableBundle();
86251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        pb.putInt("k", 1);
86351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo sorig = new ShortcutInfo.Builder(mClientContext)
86451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setId("id")
86551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setActivity(new ComponentName(mClientContext, ShortcutActivity2.class))
86651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIcon(bmp32x32)
86751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTitle("title")
86851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setText("text")
86951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setDisabledMessage("dismes")
87051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"))
87151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
87251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setRank(123)
87351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setExtras(pb)
87451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .build();
875b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        sorig.setTimestamp(mInjectedCurrentTimeMillis);
87651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
8779e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        ShortcutInfo sorig2 = new ShortcutInfo.Builder(mClientContext)
8789e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setId("id2")
8799e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setTitle("x")
8809e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setActivity(new ComponentName(mClientContext, ShortcutActivity2.class))
8819e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
8829e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setRank(456)
8839e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .build();
884b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        sorig2.setTimestamp(mInjectedCurrentTimeMillis);
8859e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki
8869e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        mManager.addDynamicShortcuts(list(sorig, sorig2));
88751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
888b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        mInjectedCurrentTimeMillis += 1;
889b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        final long now = mInjectedCurrentTimeMillis;
890b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        mInjectedCurrentTimeMillis += 1;
89151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
892440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        dumpsysOnLogcat("before save");
893440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki
89451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Save and load.
89551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.saveDirtyInfo();
89651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        initService();
89751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.handleUnlockUser(USER_10);
89851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
899440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        dumpUserFile(USER_10);
900440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        dumpsysOnLogcat("after load");
901440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki
90251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo si;
90351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "id", USER_10);
90451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
90551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(USER_10, si.getUserId());
90651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(HANDLE_USER_10, si.getUserHandle());
90751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(CALLING_PACKAGE_1, si.getPackage());
90851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("id", si.getId());
90951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(ShortcutActivity2.class.getName(), si.getActivity().getClassName());
91051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getIcon());
91151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("title", si.getTitle());
91251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("text", si.getText());
91351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("dismes", si.getDisabledMessage());
91451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories());
91551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("action", si.getIntent().getAction());
91651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("val", si.getIntent().getStringExtra("key"));
9179e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        assertEquals(0, si.getRank());
91851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(1, si.getExtras().getInt("k"));
91951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
920157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(ShortcutInfo.FLAG_DYNAMIC | ShortcutInfo.FLAG_HAS_ICON_FILE
921157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                | ShortcutInfo.FLAG_STRINGS_RESOLVED, si.getFlags());
92251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertNotNull(si.getBitmapPath()); // Something should be set.
92351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, si.getIconResourceId());
92451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(si.getLastChangedTimestamp() < now);
9259e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki
9269e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        // Make sure ranks are saved too.  Because of the auto-adjusting, we need two shortcuts
9279e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        // to test it.
9289e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        si = mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "id2", USER_10);
9299e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        assertEquals(1, si.getRank());
930440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki
931440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        dumpUserFile(USER_10);
93251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
93351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
93451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public void testShortcutInfoSaveAndLoad_resId() throws InterruptedException {
9359c850012cacf0af4a392294566a8c7c897dc8771Makoto Onuki        mRunningUsers.put(USER_10, true);
9369c850012cacf0af4a392294566a8c7c897dc8771Makoto Onuki
93751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        setCaller(CALLING_PACKAGE_1, USER_10);
93851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
939157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        final Icon res32x32 = Icon.createWithResource(mClientContext, R.drawable.black_32x32);
94051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
94151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        PersistableBundle pb = new PersistableBundle();
94251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        pb.putInt("k", 1);
94351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo sorig = new ShortcutInfo.Builder(mClientContext)
94451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setId("id")
94551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setActivity(new ComponentName(mClientContext, ShortcutActivity2.class))
946157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                .setIcon(res32x32)
94751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTitleResId(10)
94851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTextResId(11)
94951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setDisabledMessageResId(12)
95051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"))
95151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
95251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setRank(123)
95351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setExtras(pb)
95451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .build();
955b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        sorig.setTimestamp(mInjectedCurrentTimeMillis);
95651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
9579e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        ShortcutInfo sorig2 = new ShortcutInfo.Builder(mClientContext)
9589e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setId("id2")
9599e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setTitle("x")
9609e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setActivity(new ComponentName(mClientContext, ShortcutActivity2.class))
9619e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
9629e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setRank(456)
9639e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .build();
964b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        sorig2.setTimestamp(mInjectedCurrentTimeMillis);
9659e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki
9669e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        mManager.addDynamicShortcuts(list(sorig, sorig2));
96751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
968b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        mInjectedCurrentTimeMillis += 1;
969b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        final long now = mInjectedCurrentTimeMillis;
970b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        mInjectedCurrentTimeMillis += 1;
97151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
97251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Save and load.
97351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.saveDirtyInfo();
97451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        initService();
97551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.handleUnlockUser(USER_10);
97651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
97751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo si;
97851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "id", USER_10);
97951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
98051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(USER_10, si.getUserId());
98151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(HANDLE_USER_10, si.getUserHandle());
98251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(CALLING_PACKAGE_1, si.getPackage());
98351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("id", si.getId());
98451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(ShortcutActivity2.class.getName(), si.getActivity().getClassName());
98551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getIcon());
98651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(10, si.getTitleResId());
987157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("r10", si.getTitleResName());
98851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(11, si.getTextResId());
989157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("r11", si.getTextResName());
99051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(12, si.getDisabledMessageResourceId());
991157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("r12", si.getDisabledMessageResName());
99251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories());
99351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("action", si.getIntent().getAction());
99451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("val", si.getIntent().getStringExtra("key"));
9959e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        assertEquals(0, si.getRank());
99651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(1, si.getExtras().getInt("k"));
99751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
998157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(ShortcutInfo.FLAG_DYNAMIC | ShortcutInfo.FLAG_HAS_ICON_RES
999157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                | ShortcutInfo.FLAG_STRINGS_RESOLVED, si.getFlags());
1000157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertNull(si.getBitmapPath());
1001157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(R.drawable.black_32x32, si.getIconResourceId());
100251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(si.getLastChangedTimestamp() < now);
10039e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki
10049e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        // Make sure ranks are saved too.  Because of the auto-adjusting, we need two shortcuts
10059e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        // to test it.
10069e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        si = mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "id2", USER_10);
10079e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        assertEquals(1, si.getRank());
100851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
100951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
101051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public void testShortcutInfoSaveAndLoad_forBackup() {
101151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        setCaller(CALLING_PACKAGE_1, USER_0);
101251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
101351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final Icon bmp32x32 = Icon.createWithBitmap(BitmapFactory.decodeResource(
101451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                getTestContext().getResources(), R.drawable.black_32x32));
101551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
101651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        PersistableBundle pb = new PersistableBundle();
101751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        pb.putInt("k", 1);
101851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo sorig = new ShortcutInfo.Builder(mClientContext)
101951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setId("id")
102051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setActivity(new ComponentName(mClientContext, ShortcutActivity2.class))
102151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIcon(bmp32x32)
102251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTitle("title")
102351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setText("text")
102451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setDisabledMessage("dismes")
102551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"))
102651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
102751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setRank(123)
102851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setExtras(pb)
102951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .build();
103051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
10319e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        ShortcutInfo sorig2 = new ShortcutInfo.Builder(mClientContext)
10329e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setId("id2")
10339e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setTitle("x")
10349e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setActivity(new ComponentName(mClientContext, ShortcutActivity2.class))
10359e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
10369e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setRank(456)
10379e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .build();
10389e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki
10399e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        mManager.addDynamicShortcuts(list(sorig, sorig2));
104051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
104151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Dynamic shortcuts won't be backed up, so we need to pin it.
104251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        setCaller(LAUNCHER_1, USER_0);
10439e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("id", "id2"), HANDLE_USER_0);
104451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
104551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Do backup & restore.
104651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        backupAndRestore();
104751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
104851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.handleUnlockUser(USER_0); // Load user-0.
104951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
105051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo si;
105151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "id", USER_0);
105251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
105351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(CALLING_PACKAGE_1, si.getPackage());
105451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("id", si.getId());
105551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(ShortcutActivity2.class.getName(), si.getActivity().getClassName());
105651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getIcon());
105751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("title", si.getTitle());
105851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("text", si.getText());
105951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("dismes", si.getDisabledMessage());
106051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories());
106151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("action", si.getIntent().getAction());
106251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("val", si.getIntent().getStringExtra("key"));
10639e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        assertEquals(0, si.getRank());
106451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(1, si.getExtras().getInt("k"));
106551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
1066157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(ShortcutInfo.FLAG_PINNED | ShortcutInfo.FLAG_STRINGS_RESOLVED, si.getFlags());
106751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertNull(si.getBitmapPath()); // No icon.
106851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, si.getIconResourceId());
10699e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki
10709e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        // Note when restored from backup, it's no longer dynamic, so shouldn't have a rank.
10719e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        si = mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "id2", USER_0);
10729e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        assertEquals(0, si.getRank());
107351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
107451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
107551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public void testShortcutInfoSaveAndLoad_forBackup_resId() {
107651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        setCaller(CALLING_PACKAGE_1, USER_0);
107751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
1078157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        final Icon res32x32 = Icon.createWithResource(mClientContext, R.drawable.black_32x32);
107951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
108051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        PersistableBundle pb = new PersistableBundle();
108151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        pb.putInt("k", 1);
108251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo sorig = new ShortcutInfo.Builder(mClientContext)
108351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setId("id")
108451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setActivity(new ComponentName(mClientContext, ShortcutActivity2.class))
1085157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                .setIcon(res32x32)
108651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTitleResId(10)
108751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTextResId(11)
108851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setDisabledMessageResId(12)
108951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"))
109051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
109151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setRank(123)
109251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setExtras(pb)
109351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .build();
109451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
10959e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        ShortcutInfo sorig2 = new ShortcutInfo.Builder(mClientContext)
10969e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setId("id2")
10979e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setTitle("x")
10989e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setActivity(new ComponentName(mClientContext, ShortcutActivity2.class))
10999e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
11009e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setRank(456)
11019e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .build();
11029e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki
11039e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        mManager.addDynamicShortcuts(list(sorig, sorig2));
110451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
110551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Dynamic shortcuts won't be backed up, so we need to pin it.
110651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        setCaller(LAUNCHER_1, USER_0);
11079e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("id", "id2"), HANDLE_USER_0);
110851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
110951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Do backup & restore.
111051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        backupAndRestore();
111151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
111251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.handleUnlockUser(USER_0); // Load user-0.
111351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
111451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo si;
111551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "id", USER_0);
111651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
111751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(CALLING_PACKAGE_1, si.getPackage());
111851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("id", si.getId());
111951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(ShortcutActivity2.class.getName(), si.getActivity().getClassName());
112051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getIcon());
112151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(10, si.getTitleResId());
1122157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("r10", si.getTitleResName());
112351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(11, si.getTextResId());
1124157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("r11", si.getTextResName());
112551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(12, si.getDisabledMessageResourceId());
1126157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("r12", si.getDisabledMessageResName());
112751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories());
112851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("action", si.getIntent().getAction());
112951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("val", si.getIntent().getStringExtra("key"));
11309e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        assertEquals(0, si.getRank());
113151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(1, si.getExtras().getInt("k"));
113251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
1133157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(ShortcutInfo.FLAG_PINNED | ShortcutInfo.FLAG_STRINGS_RESOLVED, si.getFlags());
113451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertNull(si.getBitmapPath()); // No icon.
113551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, si.getIconResourceId());
1136157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getIconResName());
11379e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki
11389e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        // Note when restored from backup, it's no longer dynamic, so shouldn't have a rank.
11399e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        si = mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "id2", USER_0);
11409e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        assertEquals(0, si.getRank());
114151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
114251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
1143b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki    private void checkShortcutInfoSaveAndLoad_intents(Intent intent) {
1144b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(
1145b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki                makeShortcutWithIntent("s1", intent))));
1146b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        initService();
1147b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        mService.handleUnlockUser(USER_0);
1148b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1149b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        assertWith(getCallerShortcuts())
1150b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki                .haveIds("s1")
1151b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki                .forShortcutWithId("s1", si -> {
1152b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki                    assertEquals(intent.getAction(), si.getIntent().getAction());
1153b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki                    assertEquals(intent.getData(), si.getIntent().getData());
1154b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki                    assertEquals(intent.getComponent(), si.getIntent().getComponent());
1155440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                    assertBundlesEqual(intent.getExtras(), si.getIntent().getExtras());
1156440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                });
1157440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki    }
1158440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki
1159440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki    private void checkShortcutInfoSaveAndLoad_intents(Intent... intents) {
1160440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(
1161440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                makeShortcutWithIntents("s1", intents))));
1162440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        initService();
1163440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        mService.handleUnlockUser(USER_0);
1164440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki
1165440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        assertWith(getCallerShortcuts())
1166440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                .haveIds("s1")
1167440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                .forShortcutWithId("s1", si -> {
1168440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki
1169440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                    final Intent[] actual = si.getIntents();
1170440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                    assertEquals(intents.length, actual.length);
1171440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki
1172440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                    for (int i = 0; i < intents.length; i++) {
1173440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                        assertEquals(intents[i].getAction(), actual[i].getAction());
1174440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                        assertEquals(intents[i].getData(), actual[i].getData());
1175440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                        assertEquals(intents[i].getComponent(), actual[i].getComponent());
1176440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                        assertEquals(intents[i].getFlags(), actual[i].getFlags());
1177440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                        assertBundlesEqual(intents[i].getExtras(), actual[i].getExtras());
1178440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                    }
1179b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki                });
1180b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki    }
1181b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1182b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki    public void testShortcutInfoSaveAndLoad_intents() {
1183b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        checkShortcutInfoSaveAndLoad_intents(new Intent(Intent.ACTION_VIEW));
1184b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1185b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        mInjectedCurrentTimeMillis += INTERVAL; // reset throttling.
1186b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1187b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        checkShortcutInfoSaveAndLoad_intents(new Intent(Intent.ACTION_MAIN));
1188b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1189b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        mInjectedCurrentTimeMillis += INTERVAL; // reset throttling.
1190b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1191b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        checkShortcutInfoSaveAndLoad_intents(new Intent(Intent.ACTION_VIEW,
1192b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki                Uri.parse("http://www.example.com/")));
1193b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1194b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        mInjectedCurrentTimeMillis += INTERVAL; // reset throttling.
1195b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1196b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        checkShortcutInfoSaveAndLoad_intents(new Intent(Intent.ACTION_MAIN,
1197b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki                Uri.parse("http://www.example.com/")));
1198b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1199b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        mInjectedCurrentTimeMillis += INTERVAL; // reset throttling.
1200b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1201b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        checkShortcutInfoSaveAndLoad_intents(new Intent(Intent.ACTION_VIEW)
1202b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki                .setComponent(new ComponentName("a", "b")));
1203b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1204b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        mInjectedCurrentTimeMillis += INTERVAL; // reset throttling.
1205b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1206b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        checkShortcutInfoSaveAndLoad_intents(new Intent(Intent.ACTION_MAIN)
1207b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki                .setComponent(new ComponentName("a", "b")));
1208b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1209b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        mInjectedCurrentTimeMillis += INTERVAL; // reset throttling.
1210b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1211b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        checkShortcutInfoSaveAndLoad_intents(new Intent(Intent.ACTION_VIEW)
1212b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki                .putExtras(makeBundle("a", "b")));
1213b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1214b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        mInjectedCurrentTimeMillis += INTERVAL; // reset throttling.
1215b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1216b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1217b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        checkShortcutInfoSaveAndLoad_intents(new Intent(Intent.ACTION_MAIN)
1218b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki                .putExtras(makeBundle("a", "b")));
1219b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1220b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        mInjectedCurrentTimeMillis += INTERVAL; // reset throttling.
1221440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki
1222440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        // Multi-intents
1223440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        checkShortcutInfoSaveAndLoad_intents(
1224440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                new Intent(Intent.ACTION_MAIN).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK),
1225440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                new Intent(Intent.ACTION_VIEW).setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT)
1226440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        );
1227440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki
1228440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        checkShortcutInfoSaveAndLoad_intents(
1229440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                new Intent(Intent.ACTION_MAIN).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
1230440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                        .setComponent(new ComponentName("a", "b")),
1231440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                new Intent(Intent.ACTION_VIEW)
1232440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                        .setComponent(new ComponentName("a", "b"))
1233440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                );
1234440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki
1235440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki        checkShortcutInfoSaveAndLoad_intents(
1236440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                new Intent(Intent.ACTION_MAIN)
1237440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                        .setComponent(new ComponentName("a", "b")),
1238440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                new Intent(Intent.ACTION_VIEW).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
1239440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                        .setComponent(new ComponentName("a", "b")),
1240440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                new Intent("xyz").setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK
1241440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                        | Intent.FILL_IN_COMPONENT)
1242440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                        .setComponent(new ComponentName("a", "b")).putExtras(
1243440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                        makeBundle("xx", "yy"))
1244440a1ea8e2204ecb171e0187318beb2f08f6012cMakoto Onuki                );
1245b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki    }
1246b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
124751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public void testThrottling() {
124851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final ShortcutInfo si1 = makeShortcut("shortcut1");
124951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
125051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1)));
125151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(2, mManager.getRemainingCallCount());
125251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
125351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
125451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
125551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1)));
125651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(1, mManager.getRemainingCallCount());
125751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
125851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
125951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
126051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1)));
126151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, mManager.getRemainingCallCount());
126251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
126351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
126451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Reached the max
126551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
126651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
126751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertFalse(mManager.setDynamicShortcuts(list(si1)));
126851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, mManager.getRemainingCallCount());
126951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
127051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
127151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Still throttled
127251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis = START_TIME + INTERVAL - 1;
127351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertFalse(mManager.setDynamicShortcuts(list(si1)));
127451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, mManager.getRemainingCallCount());
127551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
127651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
127751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Now it should work.
127851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
127951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1))); // fail
128051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(2, mManager.getRemainingCallCount());
128151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(START_TIME + INTERVAL * 2, mManager.getRateLimitResetTime());
128251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
128351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
128451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1)));
128551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(1, mManager.getRemainingCallCount());
128651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(START_TIME + INTERVAL * 2, mManager.getRateLimitResetTime());
128751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
128851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
128951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1)));
129051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, mManager.getRemainingCallCount());
129151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(START_TIME + INTERVAL * 2, mManager.getRateLimitResetTime());
129251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
129351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
129451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertFalse(mManager.setDynamicShortcuts(list(si1)));
129551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, mManager.getRemainingCallCount());
129651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(START_TIME + INTERVAL * 2, mManager.getRateLimitResetTime());
129751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
129851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // 4 hours later...
129951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis = START_TIME + 4 * INTERVAL;
130051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1)));
130151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(2, mManager.getRemainingCallCount());
130251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(START_TIME + INTERVAL * 5, mManager.getRateLimitResetTime());
130351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
130451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
130551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1)));
130651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(1, mManager.getRemainingCallCount());
130751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(START_TIME + INTERVAL * 5, mManager.getRateLimitResetTime());
130851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
130951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Make sure getRemainingCallCount() itself gets reset without calling setDynamicShortcuts().
131051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis = START_TIME + 8 * INTERVAL;
131151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(3, mManager.getRemainingCallCount());
131251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(START_TIME + INTERVAL * 9, mManager.getRateLimitResetTime());
131351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
131451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
131551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1)));
131651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(2, mManager.getRemainingCallCount());
131751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(START_TIME + INTERVAL * 9, mManager.getRateLimitResetTime());
131851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
131951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
132051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public void testThrottling_rewind() {
132151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final ShortcutInfo si1 = makeShortcut("shortcut1");
132251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
132351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1)));
132451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(2, mManager.getRemainingCallCount());
132551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
132651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
132751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis = 12345; // Clock reset!
132851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
132951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Since the clock looks invalid, the counter shouldn't have reset.
133051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(2, mManager.getRemainingCallCount());
133151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
133251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
133351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Forward again.  Still haven't reset yet.
133451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis = START_TIME + INTERVAL - 1;
133551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(2, mManager.getRemainingCallCount());
133651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
133751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
133851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Now rewind -- this will reset the counters.
133951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis = START_TIME - 100000;
134051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(3, mManager.getRemainingCallCount());
134151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
134251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1)));
134351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(2, mManager.getRemainingCallCount());
134451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
134551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Forward again, should be reset now.
134651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis += INTERVAL;
134751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(3, mManager.getRemainingCallCount());
134851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
134951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
135051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public void testThrottling_perPackage() {
135151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final ShortcutInfo si1 = makeShortcut("shortcut1");
135251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
135351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1)));
135451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(2, mManager.getRemainingCallCount());
135551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
135651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
135751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1)));
135851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(1, mManager.getRemainingCallCount());
135951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
136051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
136151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1)));
136251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, mManager.getRemainingCallCount());
136351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
136451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Reached the max
136551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
136651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
136751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertFalse(mManager.setDynamicShortcuts(list(si1)));
136851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
136951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Try from a different caller.
137051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedClientPackage = CALLING_PACKAGE_2;
137151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCallingUid = CALLING_UID_2;
137251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
137351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Need to create a new one wit the updated package name.
137451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final ShortcutInfo si2 = makeShortcut("shortcut1");
137551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
137651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(3, mManager.getRemainingCallCount());
137751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
137851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si2)));
137951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(2, mManager.getRemainingCallCount());
138051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
138151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
138251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si2)));
138351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(1, mManager.getRemainingCallCount());
138451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
138551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Back to the original caller, still throttled.
138651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedClientPackage = CALLING_PACKAGE_1;
138751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCallingUid = CALLING_UID_1;
138851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
138951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis = START_TIME + INTERVAL - 1;
139051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, mManager.getRemainingCallCount());
139151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertFalse(mManager.setDynamicShortcuts(list(si1)));
139251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, mManager.getRemainingCallCount());
139351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
139451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Now it should work.
139551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
139651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1)));
139751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
139851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
139951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1)));
140051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
140151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
140251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1)));
140351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
140451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
140551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertFalse(mManager.setDynamicShortcuts(list(si1)));
140651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
140751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis = START_TIME + 4 * INTERVAL;
140851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1)));
140951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1)));
141051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1)));
141151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertFalse(mManager.setDynamicShortcuts(list(si1)));
141251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
141351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedClientPackage = CALLING_PACKAGE_2;
141451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCallingUid = CALLING_UID_2;
141551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
141651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(3, mManager.getRemainingCallCount());
141751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
141851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si2)));
141951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si2)));
142051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si2)));
142151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertFalse(mManager.setDynamicShortcuts(list(si2)));
142251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
142351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
142451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public void testThrottling_localeChanges() {
142551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        prepareCrossProfileDataSet();
142651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
142751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        dumpsysOnLogcat("Before save & load");
142851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
142951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.saveDirtyInfo();
143051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        initService();
143151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
14324e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki        mInjectedLocale = Locale.CHINA;
14334e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki        mService.mReceiver.onReceive(mServiceContext, new Intent(Intent.ACTION_LOCALE_CHANGED));
143451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
143551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Note at this point only user-0 is loaded, and the counters are reset for this user,
14364e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki        // but it will work for other users too because we check the locale change at any
14374e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki        // API entry point.
143851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
143951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
144051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
144151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
144251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
144351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
144451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
144551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
144651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
144751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
144851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
144951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
145051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
145151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
145251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
145351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
145451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
145551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
145651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
145751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
14584e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki        // Make sure even if we receive ACTION_LOCALE_CHANGED, if the locale hasn't actually
14594e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki        // changed, we don't reset throttling.
14604e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
14614e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki            mManager.updateShortcuts(list());
14624e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki            assertEquals(2, mManager.getRemainingCallCount());
14634e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki        });
14644e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki
14654e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki        mService.mReceiver.onReceive(mServiceContext, new Intent(Intent.ACTION_LOCALE_CHANGED));
14664e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki
14674e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
14684e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki            assertEquals(2, mManager.getRemainingCallCount()); // Still 2.
14694e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki        });
14704e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki
147151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.saveDirtyInfo();
147251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        initService();
147351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
14744e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki        // The locale should be persisted, so it still shouldn't reset throttling.
14754e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki        mService.mReceiver.onReceive(mServiceContext, new Intent(Intent.ACTION_LOCALE_CHANGED));
14764e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki
14774e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
14784e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki            assertEquals(2, mManager.getRemainingCallCount()); // Still 2.
14794e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki        });
148051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
148151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
148251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public void testThrottling_foreground() throws Exception {
148351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        prepareCrossProfileDataSet();
148451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
148551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        dumpsysOnLogcat("Before save & load");
148651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
148751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.saveDirtyInfo();
148851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        initService();
148951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
149051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // We need to update the current time from time to time, since some of the internal checks
149151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // rely on the time being correctly incremented.
149251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
149351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
149451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // First, all packages have less than 3 (== initial value) remaining calls.
149551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
149651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
149751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
149851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
149951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
150051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
150151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
150251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
150351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
150451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
150551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
150651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
150751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
150851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
150951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
151051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
151151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
151251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
151351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
151451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
151551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
151651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
151751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // State changed, but not foreground, so no resetting.
151851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.mUidObserver.onUidStateChanged(
151951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                CALLING_UID_1, ActivityManager.PROCESS_STATE_TOP_SLEEPING);
152051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
152151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
152251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
152351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
152451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
152551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
152651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
152751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
152851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
152951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
153051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
153151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
153251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
153351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
153451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
153551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
153651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
153751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
153851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
153951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
154051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
154151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // State changed, package1 foreground, reset.
154251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.mUidObserver.onUidStateChanged(
154351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                CALLING_UID_1, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
154451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
154551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
154651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
154751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
154851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
154951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
155051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
155151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
155251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
155351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
155451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
155551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
155651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
155751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
155851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
155951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
156051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
156151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
156251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.mUidObserver.onUidStateChanged(
156351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                CALLING_UID_1, ActivityManager.PROCESS_STATE_TOP_SLEEPING);
156451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
156551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
156651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
156751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Different app comes to foreground briefly, and goes back to background.
156851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Now, make sure package 2's counter is reset, even in this case.
156951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.mUidObserver.onUidStateChanged(
157051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                CALLING_UID_2, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
157151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.mUidObserver.onUidStateChanged(
157251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                CALLING_UID_2, ActivityManager.PROCESS_STATE_TOP_SLEEPING);
157351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
157451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
157551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
157651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
157751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
157851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
157951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
158051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
158151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
158251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
158351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
158451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
158551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
158651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
158751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
158851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
158951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
159051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
159151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
159251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
159351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
159451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
159551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Do the same thing one more time.  This would catch the bug with mixuing up
159651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // the current time and the elapsed time.
159751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
159851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mManager.updateShortcuts(list(makeShortcut("s")));
159951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
160051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
160151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
160251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.mUidObserver.onUidStateChanged(
160351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                CALLING_UID_2, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
160451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.mUidObserver.onUidStateChanged(
160551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                CALLING_UID_2, ActivityManager.PROCESS_STATE_TOP_SLEEPING);
160651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
160751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
160851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
160951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
161051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
161151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
161251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
161351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
161451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
161551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
161651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
161751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
161851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
161951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
162051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
162151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
162251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
162351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
162451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
162551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
162651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
162751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
162851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Package 1 on user-10 comes to foreground.
162951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Now, also try calling some APIs and make sure foreground apps don't get throttled.
163051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.mUidObserver.onUidStateChanged(
163151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                UserHandle.getUid(USER_10, CALLING_UID_1),
163251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
163351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
163451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
1635347a6bd82059bc7581b1dcd229228f622c5cfca1Makoto Onuki            assertFalse(mManager.isRateLimitingActive());
163651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
163751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s")));
1638347a6bd82059bc7581b1dcd229228f622c5cfca1Makoto Onuki
1639347a6bd82059bc7581b1dcd229228f622c5cfca1Makoto Onuki            assertEquals(2, mManager.getRemainingCallCount());
1640347a6bd82059bc7581b1dcd229228f622c5cfca1Makoto Onuki            assertFalse(mManager.isRateLimitingActive());
1641347a6bd82059bc7581b1dcd229228f622c5cfca1Makoto Onuki
164251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s")));
1643347a6bd82059bc7581b1dcd229228f622c5cfca1Makoto Onuki
1644347a6bd82059bc7581b1dcd229228f622c5cfca1Makoto Onuki            assertEquals(1, mManager.getRemainingCallCount());
1645347a6bd82059bc7581b1dcd229228f622c5cfca1Makoto Onuki            assertFalse(mManager.isRateLimitingActive());
1646347a6bd82059bc7581b1dcd229228f622c5cfca1Makoto Onuki
164751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s")));
164851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
164951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(0, mManager.getRemainingCallCount());
1650347a6bd82059bc7581b1dcd229228f622c5cfca1Makoto Onuki            assertTrue(mManager.isRateLimitingActive());
165151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
165251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
165351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
165451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
165551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s")));
165651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s")));
165751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s")));
165851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
165951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(0, mManager.getRemainingCallCount());
1660347a6bd82059bc7581b1dcd229228f622c5cfca1Makoto Onuki            assertTrue(mManager.isRateLimitingActive());
166151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
166251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
166351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
166451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
166551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s")));
166651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s")));
166751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s")));
166851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
166951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(0, mManager.getRemainingCallCount());
1670347a6bd82059bc7581b1dcd229228f622c5cfca1Makoto Onuki            assertTrue(mManager.isRateLimitingActive());
167151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
167251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
167351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
167451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
167551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s")));
167651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s")));
167751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s")));
167851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
167951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(0, mManager.getRemainingCallCount());
1680347a6bd82059bc7581b1dcd229228f622c5cfca1Makoto Onuki            assertTrue(mManager.isRateLimitingActive());
168151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
168251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
168351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
168451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
168551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s")));
168651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s")));
168751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s")));
168851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
168951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(0, mManager.getRemainingCallCount());
1690347a6bd82059bc7581b1dcd229228f622c5cfca1Makoto Onuki            assertTrue(mManager.isRateLimitingActive());
169151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
169251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
169351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
169451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
169551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s")));
169651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s")));
169751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s")));
169851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
169951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount()); // Still 3!
1700347a6bd82059bc7581b1dcd229228f622c5cfca1Makoto Onuki            assertFalse(mManager.isRateLimitingActive());
170151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
170251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
170351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
170451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
170551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public void testThrottling_resetByInternalCall() throws Exception {
170651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        prepareCrossProfileDataSet();
170751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
170851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        dumpsysOnLogcat("Before save & load");
170951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
171051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.saveDirtyInfo();
171151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        initService();
171251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
171351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // First, all packages have less than 3 (== initial value) remaining calls.
171451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
171551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
171651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
171751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
171851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
171951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
172051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
172151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
172251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
172351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
172451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
172551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
172651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
172751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
172851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
172951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
173051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
173151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
173251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
173351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
173451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Simulate a call from sys UI.
173551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mCallerPermissions.add(permission.RESET_SHORTCUT_MANAGER_THROTTLING);
1736d6e1f3bec18167f726ccc20f9bcbc6526dfc78feMakoto Onuki        mManager.onApplicationActive(CALLING_PACKAGE_1, USER_0);
173751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
173851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
173951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
174051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
174151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
174251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
174351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
174451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
174551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
174651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
174751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
174851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
174951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
175051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
175151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
175251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
175351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
175451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
175551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
175651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
1757d6e1f3bec18167f726ccc20f9bcbc6526dfc78feMakoto Onuki        mManager.onApplicationActive(CALLING_PACKAGE_3, USER_0);
175851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
175951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
176051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
176151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
176251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
176351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
176451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
176551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
176651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
176751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
176851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
176951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
177051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
177151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
177251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
177351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
177451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
177551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
177651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
177751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
1778d6e1f3bec18167f726ccc20f9bcbc6526dfc78feMakoto Onuki        mManager.onApplicationActive(CALLING_PACKAGE_1, USER_10);
177951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
178051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
178151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
178251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
178351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
178451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
178551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
178651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
178751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
178851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
178951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
179051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
179151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
179251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
179351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
179451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
179551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
179651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
179751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
179851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
1799ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki
1800ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki    public void testReportShortcutUsed() {
18019c850012cacf0af4a392294566a8c7c897dc8771Makoto Onuki        mRunningUsers.put(USER_10, true);
18029c850012cacf0af4a392294566a8c7c897dc8771Makoto Onuki
1803ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
1804ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            reset(mMockUsageStatsManagerInternal);
1805ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki
1806ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            // Report with an nonexistent shortcut.
1807ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            mManager.reportShortcutUsed("s1");
1808ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            verify(mMockUsageStatsManagerInternal, times(0)).reportShortcutUsage(
1809ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki                    anyString(), anyString(), anyInt());
1810ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki
1811ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            // Publish s2, but s1 still doesn't exist.
1812ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s2")));
1813ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            mManager.reportShortcutUsed("s1");
1814ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            verify(mMockUsageStatsManagerInternal, times(0)).reportShortcutUsage(
1815ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki                    anyString(), anyString(), anyInt());
1816ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki
1817ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            mManager.reportShortcutUsed("s2");
1818ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            verify(mMockUsageStatsManagerInternal, times(1)).reportShortcutUsage(
1819ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki                    eq(CALLING_PACKAGE_1), eq("s2"), eq(USER_10));
1820ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki
1821ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki        });
1822ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki        runWithCaller(CALLING_PACKAGE_2, USER_10, () -> {
1823ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            // Try with a different package.
1824ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            reset(mMockUsageStatsManagerInternal);
1825ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki
1826ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            // Report with an nonexistent shortcut.
1827ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            mManager.reportShortcutUsed("s2");
1828ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            verify(mMockUsageStatsManagerInternal, times(0)).reportShortcutUsage(
1829ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki                    anyString(), anyString(), anyInt());
1830ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki
1831ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            // Publish s2, but s1 still doesn't exist.
1832ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s3")));
1833ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            mManager.reportShortcutUsed("s2");
1834ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            verify(mMockUsageStatsManagerInternal, times(0)).reportShortcutUsage(
1835ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki                    anyString(), anyString(), anyInt());
1836ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki
1837ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            mManager.reportShortcutUsed("s3");
1838ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            verify(mMockUsageStatsManagerInternal, times(1)).reportShortcutUsage(
1839ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki                    eq(CALLING_PACKAGE_2), eq("s3"), eq(USER_10));
1840ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki
1841ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki        });
1842ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki    }
1843157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
1844157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    // Test for a ShortcutInfo method.
1845157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    public void testGetResourcePackageName() {
1846157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, ShortcutInfo.getResourcePackageName(""));
1847157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, ShortcutInfo.getResourcePackageName("abc"));
1848157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("p", ShortcutInfo.getResourcePackageName("p:"));
1849157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("p", ShortcutInfo.getResourcePackageName("p:xx"));
1850157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("pac", ShortcutInfo.getResourcePackageName("pac:"));
1851157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    }
1852157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
1853157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    // Test for a ShortcutInfo method.
1854157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    public void testGetResourceTypeName() {
1855157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, ShortcutInfo.getResourceTypeName(""));
1856157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, ShortcutInfo.getResourceTypeName(":"));
1857157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, ShortcutInfo.getResourceTypeName("/"));
1858157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, ShortcutInfo.getResourceTypeName("/:"));
1859157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("a", ShortcutInfo.getResourceTypeName(":a/"));
1860157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("type", ShortcutInfo.getResourceTypeName("xxx:type/yyy"));
1861157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    }
1862157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
1863157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    // Test for a ShortcutInfo method.
1864157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    public void testGetResourceTypeAndEntryName() {
1865157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, ShortcutInfo.getResourceTypeAndEntryName(""));
1866157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, ShortcutInfo.getResourceTypeAndEntryName("abc"));
1867157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("", ShortcutInfo.getResourceTypeAndEntryName("p:"));
1868157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("x", ShortcutInfo.getResourceTypeAndEntryName(":x"));
1869157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("x", ShortcutInfo.getResourceTypeAndEntryName("p:x"));
1870157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("xyz", ShortcutInfo.getResourceTypeAndEntryName("pac:xyz"));
1871157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    }
1872157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
1873157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    // Test for a ShortcutInfo method.
1874157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    public void testGetResourceEntryName() {
1875157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, ShortcutInfo.getResourceEntryName(""));
1876157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, ShortcutInfo.getResourceEntryName("ab:"));
1877157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("", ShortcutInfo.getResourceEntryName("/"));
1878157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("abc", ShortcutInfo.getResourceEntryName("/abc"));
1879157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("abc", ShortcutInfo.getResourceEntryName("xyz/abc"));
1880157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    }
1881157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
1882157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    // Test for a ShortcutInfo method.
1883157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    public void testLookUpResourceName_systemResources() {
1884157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        // For android system resources, lookUpResourceName will simply return the value as a
1885157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        // string, regardless of "withType".
1886157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        final Resources res = getTestContext().getResources();
1887157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
1888157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("" + android.R.string.cancel, ShortcutInfo.lookUpResourceName(res,
1889157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                android.R.string.cancel, true, getTestContext().getPackageName()));
1890157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("" + android.R.drawable.alert_dark_frame, ShortcutInfo.lookUpResourceName(res,
1891157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                android.R.drawable.alert_dark_frame, true, getTestContext().getPackageName()));
1892157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("" + android.R.string.cancel, ShortcutInfo.lookUpResourceName(res,
1893157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                android.R.string.cancel, false, getTestContext().getPackageName()));
1894157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    }
1895157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
1896157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    public void testLookUpResourceName_appResources() {
1897157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        final Resources res = getTestContext().getResources();
1898157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
1899157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("shortcut_text1", ShortcutInfo.lookUpResourceName(res,
1900157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                R.string.shortcut_text1, false, getTestContext().getPackageName()));
1901157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("string/shortcut_text1", ShortcutInfo.lookUpResourceName(res,
1902157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                R.string.shortcut_text1, true, getTestContext().getPackageName()));
1903157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
1904157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("black_16x64", ShortcutInfo.lookUpResourceName(res,
1905157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                R.drawable.black_16x64, false, getTestContext().getPackageName()));
1906157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("drawable/black_16x64", ShortcutInfo.lookUpResourceName(res,
1907157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                R.drawable.black_16x64, true, getTestContext().getPackageName()));
1908157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    }
1909157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
1910157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    // Test for a ShortcutInfo method.
1911157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    public void testLookUpResourceId_systemResources() {
1912157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        final Resources res = getTestContext().getResources();
1913157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
1914157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(android.R.string.cancel, ShortcutInfo.lookUpResourceId(res,
1915157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                "" + android.R.string.cancel, null,
1916157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                getTestContext().getPackageName()));
1917157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(android.R.drawable.alert_dark_frame, ShortcutInfo.lookUpResourceId(res,
1918157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                "" + android.R.drawable.alert_dark_frame, null,
1919157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                getTestContext().getPackageName()));
1920157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    }
1921157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
1922157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    // Test for a ShortcutInfo method.
1923157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    public void testLookUpResourceId_appResources() {
1924157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        final Resources res = getTestContext().getResources();
1925157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
1926157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(R.string.shortcut_text1,
1927157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                ShortcutInfo.lookUpResourceId(res, "shortcut_text1", "string",
1928157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                        getTestContext().getPackageName()));
1929157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
1930157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(R.string.shortcut_text1,
1931157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                ShortcutInfo.lookUpResourceId(res, "string/shortcut_text1", null,
1932157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                        getTestContext().getPackageName()));
1933157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
1934157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(R.drawable.black_16x64,
1935157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                ShortcutInfo.lookUpResourceId(res, "black_16x64", "drawable",
1936157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                        getTestContext().getPackageName()));
1937157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
1938157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(R.drawable.black_16x64,
1939157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                ShortcutInfo.lookUpResourceId(res, "drawable/black_16x64", null,
1940157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                        getTestContext().getPackageName()));
1941157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    }
194276269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki
194376269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki    public void testDumpCheckin() throws IOException {
194476269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        prepareCrossProfileDataSet();
194576269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki
194676269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        // prepareCrossProfileDataSet() doesn't set any icons, so do set here.
194776269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        final Icon res32x32 = Icon.createWithResource(getTestContext(), R.drawable.black_32x32);
194876269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        final Icon res64x64 = Icon.createWithResource(getTestContext(), R.drawable.black_64x64);
194976269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        final Icon bmp32x32 = Icon.createWithBitmap(BitmapFactory.decodeResource(
195076269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki                getTestContext().getResources(), R.drawable.black_32x32));
195176269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        final Icon bmp64x64 = Icon.createWithBitmap(BitmapFactory.decodeResource(
195276269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki                getTestContext().getResources(), R.drawable.black_64x64));
195376269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki
195476269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
195576269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki            assertTrue(mManager.setDynamicShortcuts(list(
195676269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki                    makeShortcutWithIcon("res32x32", res32x32),
195776269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki                    makeShortcutWithIcon("res64x64", res64x64),
195876269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki                    makeShortcutWithIcon("bmp32x32", bmp32x32),
195976269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki                    makeShortcutWithIcon("bmp64x64", bmp64x64))));
196076269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        });
196176269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        // We can't predict the compressed bitmap sizes, so get the real sizes here.
196276269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        final long bitmapTotal =
196376269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki                new File(getPackageShortcut(CALLING_PACKAGE_2, "bmp32x32", USER_0)
196476269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki                        .getBitmapPath()).length() +
196576269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki                new File(getPackageShortcut(CALLING_PACKAGE_2, "bmp64x64", USER_0)
196676269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki                        .getBitmapPath()).length();
196776269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki
196876269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        // Read the expected output and inject the bitmap size.
196976269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        final String expected = readTestAsset("shortcut/dumpsys_expected.txt")
197076269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki                .replace("***BITMAP_SIZE***", String.valueOf(bitmapTotal));
197176269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki
197276269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        assertEquals(expected, dumpCheckin());
197376269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki    }
197476269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki
197576269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki    public void testDumpsysNoPermission() {
197676269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        assertExpectException(SecurityException.class, "android.permission.DUMP",
197776269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki                () -> mService.dump(null, new PrintWriter(new StringWriter()), null));
197876269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki
197976269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        // System can call it without the permission.
198076269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        runWithSystemUid(() -> {
198176269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki            mService.dump(null, new PrintWriter(new StringWriter()), null);
198276269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        });
198376269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki    }
19840eed441c0cf3bd03b8ac780e62fbeae5d7fcac4bMakoto Onuki
19850eed441c0cf3bd03b8ac780e62fbeae5d7fcac4bMakoto Onuki    /**
19860eed441c0cf3bd03b8ac780e62fbeae5d7fcac4bMakoto Onuki     * Make sure the legacy file format that only supported a single intent per shortcut
19870eed441c0cf3bd03b8ac780e62fbeae5d7fcac4bMakoto Onuki     * can still be read.
19880eed441c0cf3bd03b8ac780e62fbeae5d7fcac4bMakoto Onuki     */
19890eed441c0cf3bd03b8ac780e62fbeae5d7fcac4bMakoto Onuki    public void testLoadLegacySavedFile() throws Exception {
19900eed441c0cf3bd03b8ac780e62fbeae5d7fcac4bMakoto Onuki        final File path = mService.getUserFile(USER_0);
19910eed441c0cf3bd03b8ac780e62fbeae5d7fcac4bMakoto Onuki        path.getParentFile().mkdirs();
19920eed441c0cf3bd03b8ac780e62fbeae5d7fcac4bMakoto Onuki        try (Writer w = new FileWriter(path)) {
19930eed441c0cf3bd03b8ac780e62fbeae5d7fcac4bMakoto Onuki            w.write(readTestAsset("shortcut/shortcut_legacy_file.xml"));
19940eed441c0cf3bd03b8ac780e62fbeae5d7fcac4bMakoto Onuki        };
19950eed441c0cf3bd03b8ac780e62fbeae5d7fcac4bMakoto Onuki        initService();
19960eed441c0cf3bd03b8ac780e62fbeae5d7fcac4bMakoto Onuki        mService.handleUnlockUser(USER_0);
19970eed441c0cf3bd03b8ac780e62fbeae5d7fcac4bMakoto Onuki
19980eed441c0cf3bd03b8ac780e62fbeae5d7fcac4bMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
19990eed441c0cf3bd03b8ac780e62fbeae5d7fcac4bMakoto Onuki            assertWith(getCallerShortcuts())
20000eed441c0cf3bd03b8ac780e62fbeae5d7fcac4bMakoto Onuki                    .haveIds("manifest-shortcut-storage")
20010eed441c0cf3bd03b8ac780e62fbeae5d7fcac4bMakoto Onuki                    .forShortcutWithId("manifest-shortcut-storage", si -> {
20020eed441c0cf3bd03b8ac780e62fbeae5d7fcac4bMakoto Onuki                        assertEquals("android.settings.INTERNAL_STORAGE_SETTINGS",
20030eed441c0cf3bd03b8ac780e62fbeae5d7fcac4bMakoto Onuki                                si.getIntent().getAction());
20040eed441c0cf3bd03b8ac780e62fbeae5d7fcac4bMakoto Onuki                        assertEquals(12345, si.getIntent().getIntExtra("key", 0));
20050eed441c0cf3bd03b8ac780e62fbeae5d7fcac4bMakoto Onuki                    });
20060eed441c0cf3bd03b8ac780e62fbeae5d7fcac4bMakoto Onuki        });
20070eed441c0cf3bd03b8ac780e62fbeae5d7fcac4bMakoto Onuki    }
20081e1732399a48c9521eea7a117f1f0e87ca64d2abMakoto Onuki
20091e1732399a48c9521eea7a117f1f0e87ca64d2abMakoto Onuki    public void testIsUserUnlocked() {
20101e1732399a48c9521eea7a117f1f0e87ca64d2abMakoto Onuki        mRunningUsers.clear();
20111e1732399a48c9521eea7a117f1f0e87ca64d2abMakoto Onuki        mUnlockedUsers.clear();
20121e1732399a48c9521eea7a117f1f0e87ca64d2abMakoto Onuki
20131e1732399a48c9521eea7a117f1f0e87ca64d2abMakoto Onuki        assertFalse(mService.isUserUnlockedL(USER_0));
20141e1732399a48c9521eea7a117f1f0e87ca64d2abMakoto Onuki        assertFalse(mService.isUserUnlockedL(USER_10));
20151e1732399a48c9521eea7a117f1f0e87ca64d2abMakoto Onuki
20161e1732399a48c9521eea7a117f1f0e87ca64d2abMakoto Onuki        // Start user 0, still locked.
20171e1732399a48c9521eea7a117f1f0e87ca64d2abMakoto Onuki        mRunningUsers.put(USER_0, true);
20181e1732399a48c9521eea7a117f1f0e87ca64d2abMakoto Onuki        assertFalse(mService.isUserUnlockedL(USER_0));
20191e1732399a48c9521eea7a117f1f0e87ca64d2abMakoto Onuki        assertFalse(mService.isUserUnlockedL(USER_10));
20201e1732399a48c9521eea7a117f1f0e87ca64d2abMakoto Onuki
20211e1732399a48c9521eea7a117f1f0e87ca64d2abMakoto Onuki        // Unlock user.
20221e1732399a48c9521eea7a117f1f0e87ca64d2abMakoto Onuki        mUnlockedUsers.put(USER_0, true);
20231e1732399a48c9521eea7a117f1f0e87ca64d2abMakoto Onuki        assertTrue(mService.isUserUnlockedL(USER_0));
20241e1732399a48c9521eea7a117f1f0e87ca64d2abMakoto Onuki        assertFalse(mService.isUserUnlockedL(USER_10));
20251e1732399a48c9521eea7a117f1f0e87ca64d2abMakoto Onuki
20261e1732399a48c9521eea7a117f1f0e87ca64d2abMakoto Onuki        // Clear again.
20271e1732399a48c9521eea7a117f1f0e87ca64d2abMakoto Onuki        mRunningUsers.clear();
20281e1732399a48c9521eea7a117f1f0e87ca64d2abMakoto Onuki        mUnlockedUsers.clear();
20291e1732399a48c9521eea7a117f1f0e87ca64d2abMakoto Onuki
20301e1732399a48c9521eea7a117f1f0e87ca64d2abMakoto Onuki        // Directly call the lifecycle event.  Now also locked.
20311e1732399a48c9521eea7a117f1f0e87ca64d2abMakoto Onuki        mService.handleUnlockUser(USER_0);
20321e1732399a48c9521eea7a117f1f0e87ca64d2abMakoto Onuki        assertTrue(mService.isUserUnlockedL(USER_0));
20331e1732399a48c9521eea7a117f1f0e87ca64d2abMakoto Onuki        assertFalse(mService.isUserUnlockedL(USER_10));
20341e1732399a48c9521eea7a117f1f0e87ca64d2abMakoto Onuki
20351e1732399a48c9521eea7a117f1f0e87ca64d2abMakoto Onuki        // Directly call the stop lifecycle event.  Goes back to the initial state.
20361e1732399a48c9521eea7a117f1f0e87ca64d2abMakoto Onuki        mService.handleCleanupUser(USER_0);
20371e1732399a48c9521eea7a117f1f0e87ca64d2abMakoto Onuki        assertFalse(mService.isUserUnlockedL(USER_0));
20381e1732399a48c9521eea7a117f1f0e87ca64d2abMakoto Onuki        assertFalse(mService.isUserUnlockedL(USER_10));
20391e1732399a48c9521eea7a117f1f0e87ca64d2abMakoto Onuki    }
204051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki}
2041