ShortcutManagerTest2.java revision 347a6bd82059bc7581b1dcd229228f622c5cfca1
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;
5176269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onukiimport java.io.IOException;
5276269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onukiimport java.io.PrintWriter;
5376269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onukiimport java.io.StringWriter;
544e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onukiimport java.util.Locale;
554e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki
5651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki/**
5751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki * Tests for ShortcutService and ShortcutManager.
5851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki *
5951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki m FrameworksServicesTests &&
6051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki adb install \
6151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki -r -g ${ANDROID_PRODUCT_OUT}/data/app/FrameworksServicesTests/FrameworksServicesTests.apk &&
6251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki adb shell am instrument -e class com.android.server.pm.ShortcutManagerTest2 \
6351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki -w com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
6451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki */
6551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki@SmallTest
6651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onukipublic class ShortcutManagerTest2 extends BaseShortcutManagerTest {
6751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    // ShortcutInfo tests
6851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
6951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public void testShortcutInfoMissingMandatoryFields() {
70a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki        // Disable throttling.
71a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki        mService.updateConfigurationLocked(
72a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki                ShortcutService.ConfigConstants.KEY_MAX_UPDATES_PER_INTERVAL + "=99999999,"
73a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki                + ShortcutService.ConfigConstants.KEY_MAX_SHORTCUTS + "=99999999"
74a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki        );
75a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki
7651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertExpectException(
7751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                IllegalArgumentException.class,
7851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                "ID must be provided",
7951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                () -> new ShortcutInfo.Builder(getTestContext()).build());
80a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki
81b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        assertExpectException(
82b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                RuntimeException.class,
83b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                "id cannot be empty",
84b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                () -> new ShortcutInfo.Builder(getTestContext(), null));
85a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki
86b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        assertExpectException(
87b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                RuntimeException.class,
88b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                "id cannot be empty",
89b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                () -> new ShortcutInfo.Builder(getTestContext(), ""));
90b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki
91b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        assertExpectException(
92b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                RuntimeException.class,
93b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                "intent cannot be null",
94b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                () -> new ShortcutInfo.Builder(getTestContext(), "id").setIntent(null));
95b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki
96b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        assertExpectException(
97b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                RuntimeException.class,
98b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                "action must be set",
99b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                () -> new ShortcutInfo.Builder(getTestContext(), "id").setIntent(new Intent()));
100b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki
101b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        assertExpectException(
102b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                RuntimeException.class,
103b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                "activity cannot be null",
104b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                () -> new ShortcutInfo.Builder(getTestContext(), "id").setActivity(null));
105b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki
106b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        assertExpectException(
107b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                RuntimeException.class,
108b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                "shortLabel cannot be empty",
109b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                () -> new ShortcutInfo.Builder(getTestContext(), "id").setShortLabel(null));
110b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki
111b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        assertExpectException(
112b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                RuntimeException.class,
113b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                "shortLabel cannot be empty",
114b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                () -> new ShortcutInfo.Builder(getTestContext(), "id").setShortLabel(""));
115b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki
116b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        assertExpectException(
117b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                RuntimeException.class,
118b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                "longLabel cannot be empty",
119b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                () -> new ShortcutInfo.Builder(getTestContext(), "id").setLongLabel(null));
120b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki
121b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        assertExpectException(
122b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                RuntimeException.class,
123b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                "longLabel cannot be empty",
124b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                () -> new ShortcutInfo.Builder(getTestContext(), "id").setLongLabel(""));
125b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki
126b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        assertExpectException(
127b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                RuntimeException.class,
128b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                "disabledMessage cannot be empty",
129b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                () -> new ShortcutInfo.Builder(getTestContext(), "id").setDisabledMessage(null));
130b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki
131b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        assertExpectException(
132b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                RuntimeException.class,
133b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                "disabledMessage cannot be empty",
134b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                () -> new ShortcutInfo.Builder(getTestContext(), "id").setDisabledMessage(""));
135b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki
136b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        assertExpectException(NullPointerException.class, "action must be set",
137b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                () -> new ShortcutInfo.Builder(getTestContext(), "id").setIntent(new Intent()));
138a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki
139a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki        assertExpectException(
140a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki                IllegalArgumentException.class, "Short label must be provided", () -> {
141b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki            ShortcutInfo si = new ShortcutInfo.Builder(getTestContext(), "id")
142a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki                    .setActivity(new ComponentName(getTestContext().getPackageName(), "s"))
143a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki                    .build();
144a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki            assertTrue(getManager().setDynamicShortcuts(list(si)));
145a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki        });
146a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki
14713260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki        // same for add.
14851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertExpectException(
149a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki                IllegalArgumentException.class, "Short label must be provided", () -> {
150b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki            ShortcutInfo si = new ShortcutInfo.Builder(getTestContext(), "id")
151a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki                    .setActivity(new ComponentName(getTestContext().getPackageName(), "s"))
152a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki                    .build();
153a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki            assertTrue(getManager().addDynamicShortcuts(list(si)));
154a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki        });
155a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki
156a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki        assertExpectException(NullPointerException.class, "Intent must be provided", () -> {
157b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki            ShortcutInfo si = new ShortcutInfo.Builder(getTestContext(), "id")
158a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki                    .setActivity(new ComponentName(getTestContext().getPackageName(), "s"))
159a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki                    .setShortLabel("x")
160a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki                    .build();
161a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki            assertTrue(getManager().setDynamicShortcuts(list(si)));
162a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki        });
163a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki
164b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        // same for add.
165a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki        assertExpectException(NullPointerException.class, "Intent must be provided", () -> {
166b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki            ShortcutInfo si = new ShortcutInfo.Builder(getTestContext(), "id")
167a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki                    .setActivity(new ComponentName(getTestContext().getPackageName(), "s"))
168a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki                    .setShortLabel("x")
169a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki                    .build();
170a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki            assertTrue(getManager().addDynamicShortcuts(list(si)));
171a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki        });
172a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki
17351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertExpectException(
174b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                IllegalStateException.class, "does not belong to package", () -> {
175b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki            ShortcutInfo si = new ShortcutInfo.Builder(getTestContext(), "id")
176a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki                    .setActivity(new ComponentName("xxx", "s"))
177a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki                    .build();
178a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki            assertTrue(getManager().setDynamicShortcuts(list(si)));
179a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki        });
180a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki
181b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki        // same for add.
18251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertExpectException(
183b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki                IllegalStateException.class, "does not belong to package", () -> {
184b08790c3b2f3bdb0c2e2f7ff46e4584fb1127769Makoto Onuki            ShortcutInfo si = new ShortcutInfo.Builder(getTestContext(), "id")
185a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki                    .setActivity(new ComponentName("xxx", "s"))
186a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki                    .build();
187a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki            assertTrue(getManager().addDynamicShortcuts(list(si)));
188a1d38b3c95cd6a38ee7336fd90729d3b3be6ae25Makoto Onuki        });
18913260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki
19013260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki        // Now all activities are not main.
19113260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki        mMainActivityChecker = (component, userId) -> false;
19213260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki
19313260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki        assertExpectException(
19413260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki                IllegalStateException.class, "is not main", () -> {
19513260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki                    ShortcutInfo si = new ShortcutInfo.Builder(getTestContext(), "id")
19613260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki                            .setActivity(new ComponentName(getTestContext(), "s"))
19713260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki                            .build();
19813260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki                    assertTrue(getManager().setDynamicShortcuts(list(si)));
19913260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki                });
20013260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki        // For add
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().addDynamicShortcuts(list(si)));
20713260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki                });
20813260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki        // For update
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().updateShortcuts(list(si)));
21513260b6ff0438a02bd0f1c5bbcfb4fef71c82135Makoto Onuki                });
21651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
21751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
21851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public void testShortcutInfoParcel() {
21951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        setCaller(CALLING_PACKAGE_1, USER_10);
22051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo si = parceled(new ShortcutInfo.Builder(mClientContext)
22151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setId("id")
22251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTitle("title")
22351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIntent(makeIntent("action", ShortcutActivity.class))
22451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .build());
22551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(mClientContext.getPackageName(), si.getPackage());
22651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(USER_10, si.getUserId());
22751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(HANDLE_USER_10, si.getUserHandle());
22851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("id", si.getId());
22951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("title", si.getTitle());
23051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("action", si.getIntent().getAction());
23151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
23251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        PersistableBundle pb = new PersistableBundle();
23351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        pb.putInt("k", 1);
23451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
23551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = new ShortcutInfo.Builder(getTestContext())
23651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setId("id")
23751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setActivity(new ComponentName("a", "b"))
23851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIcon(Icon.createWithResource(mClientContext, 123))
23951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTitle("title")
24051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setText("text")
24151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setDisabledMessage("dismes")
24251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
24351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"))
24451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setRank(123)
24551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setExtras(pb)
24651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .build();
24751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.addFlags(ShortcutInfo.FLAG_PINNED);
24851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.setBitmapPath("abc");
24951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.setIconResourceId(456);
25051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
25151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = parceled(si);
25251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
25351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(getTestContext().getPackageName(), si.getPackage());
25451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("id", si.getId());
25551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(new ComponentName("a", "b"), si.getActivity());
25651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getIcon().getResId());
25751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("title", si.getTitle());
25851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("text", si.getText());
25951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("dismes", si.getDisabledMessage());
26051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories());
26151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("action", si.getIntent().getAction());
26251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("val", si.getIntent().getStringExtra("key"));
26351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getRank());
26451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(1, si.getExtras().getInt("k"));
26551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
26651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(ShortcutInfo.FLAG_PINNED, si.getFlags());
26751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("abc", si.getBitmapPath());
26851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(456, si.getIconResourceId());
269157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
270157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(0, si.getTitleResId());
271157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getTitleResName());
272157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(0, si.getTextResId());
273157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getTextResName());
274157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(0, si.getDisabledMessageResourceId());
275157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getDisabledMessageResName());
27651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
27751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
27851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public void testShortcutInfoParcel_resId() {
27951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        setCaller(CALLING_PACKAGE_1, USER_10);
28051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo si;
28151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
28251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        PersistableBundle pb = new PersistableBundle();
28351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        pb.putInt("k", 1);
28451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
28551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = new ShortcutInfo.Builder(getTestContext())
28651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setId("id")
28751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setActivity(new ComponentName("a", "b"))
28851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIcon(Icon.createWithResource(mClientContext, 123))
28951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTitleResId(10)
29051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTextResId(11)
29151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setDisabledMessageResId(12)
29251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
29351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"))
29451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setRank(123)
29551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setExtras(pb)
29651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .build();
29751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.addFlags(ShortcutInfo.FLAG_PINNED);
29851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.setBitmapPath("abc");
29951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.setIconResourceId(456);
30051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
301157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        lookupAndFillInResourceNames(si);
302157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
30351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = parceled(si);
30451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
30551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(getTestContext().getPackageName(), si.getPackage());
30651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("id", si.getId());
30751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(new ComponentName("a", "b"), si.getActivity());
30851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getIcon().getResId());
30951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(10, si.getTitleResId());
310157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("r10", si.getTitleResName());
31151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(11, si.getTextResId());
312157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("r11", si.getTextResName());
31351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(12, si.getDisabledMessageResourceId());
314157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("r12", si.getDisabledMessageResName());
31551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories());
31651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("action", si.getIntent().getAction());
31751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("val", si.getIntent().getStringExtra("key"));
31851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getRank());
31951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(1, si.getExtras().getInt("k"));
32051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
32151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(ShortcutInfo.FLAG_PINNED, si.getFlags());
32251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("abc", si.getBitmapPath());
32351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(456, si.getIconResourceId());
324157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("string/r456", si.getIconResName());
32551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
32651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
32751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public void testShortcutInfoClone() {
32851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        setCaller(CALLING_PACKAGE_1, USER_11);
32951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
33051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        PersistableBundle pb = new PersistableBundle();
33151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        pb.putInt("k", 1);
33251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo sorig = new ShortcutInfo.Builder(mClientContext)
33351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setId("id")
33451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setActivity(new ComponentName("a", "b"))
33551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIcon(Icon.createWithResource(mClientContext, 123))
33651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTitle("title")
33751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setText("text")
33851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setDisabledMessage("dismes")
33951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"))
34051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
34151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setRank(123)
34251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setExtras(pb)
34351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .build();
34451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        sorig.addFlags(ShortcutInfo.FLAG_PINNED);
34551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        sorig.setBitmapPath("abc");
34651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        sorig.setIconResourceId(456);
34751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
348157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        lookupAndFillInResourceNames(sorig);
349157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
35051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo si = sorig.clone(/* clone flags*/ 0);
35151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
35251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(USER_11, si.getUserId());
35351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(HANDLE_USER_11, si.getUserHandle());
35451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(mClientContext.getPackageName(), si.getPackage());
35551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("id", si.getId());
35651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(new ComponentName("a", "b"), si.getActivity());
35751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getIcon().getResId());
35851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("title", si.getTitle());
35951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("text", si.getText());
36051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("dismes", si.getDisabledMessage());
36151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories());
36251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("action", si.getIntent().getAction());
36351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("val", si.getIntent().getStringExtra("key"));
36451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getRank());
36551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(1, si.getExtras().getInt("k"));
36651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
36751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(ShortcutInfo.FLAG_PINNED, si.getFlags());
36851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("abc", si.getBitmapPath());
36951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(456, si.getIconResourceId());
370157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("string/r456", si.getIconResName());
37151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
37251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(ShortcutInfo.CLONE_REMOVE_FOR_CREATOR);
37351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
37451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(mClientContext.getPackageName(), si.getPackage());
37551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("id", si.getId());
37651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(new ComponentName("a", "b"), si.getActivity());
37751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getIcon());
37851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("title", si.getTitle());
37951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("text", si.getText());
38051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("dismes", si.getDisabledMessage());
38151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories());
38251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("action", si.getIntent().getAction());
38351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("val", si.getIntent().getStringExtra("key"));
38451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getRank());
38551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(1, si.getExtras().getInt("k"));
38651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
38751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(ShortcutInfo.FLAG_PINNED, si.getFlags());
38851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getBitmapPath());
38951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
39051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(456, si.getIconResourceId());
391157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getIconResName());
39251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
39351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(ShortcutInfo.CLONE_REMOVE_FOR_LAUNCHER);
39451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
39551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(mClientContext.getPackageName(), si.getPackage());
39651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("id", si.getId());
39751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(new ComponentName("a", "b"), si.getActivity());
39851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getIcon());
39951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("title", si.getTitle());
40051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("text", si.getText());
40151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("dismes", si.getDisabledMessage());
40251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories());
40351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getIntent());
40451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getRank());
40551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(1, si.getExtras().getInt("k"));
40651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
40751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(ShortcutInfo.FLAG_PINNED, si.getFlags());
40851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getBitmapPath());
40951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
41051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(456, si.getIconResourceId());
411157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getIconResName());
41251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
41351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(ShortcutInfo.CLONE_REMOVE_NON_KEY_INFO);
41451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
41551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(mClientContext.getPackageName(), si.getPackage());
41651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("id", si.getId());
4174d6b87ffdf06df3303239130ced685bc1a3fae50Makoto Onuki        assertEquals(new ComponentName("a", "b"), si.getActivity());
41851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getIcon());
41951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getTitle());
42051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getText());
42151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getDisabledMessage());
42251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getCategories());
42351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getIntent());
42451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, si.getRank());
42551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getExtras());
42651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
42751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(ShortcutInfo.FLAG_PINNED | ShortcutInfo.FLAG_KEY_FIELDS_ONLY, si.getFlags());
42851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getBitmapPath());
42951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
43051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(456, si.getIconResourceId());
431157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getIconResName());
43251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
43351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
43451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public void testShortcutInfoClone_resId() {
43551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        setCaller(CALLING_PACKAGE_1, USER_11);
43651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
43751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        PersistableBundle pb = new PersistableBundle();
43851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        pb.putInt("k", 1);
43951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo sorig = new ShortcutInfo.Builder(mClientContext)
44051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setId("id")
44151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setActivity(new ComponentName("a", "b"))
44251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIcon(Icon.createWithResource(mClientContext, 123))
44351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTitleResId(10)
44451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTextResId(11)
44551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setDisabledMessageResId(12)
44651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"))
44751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
44851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setRank(123)
44951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setExtras(pb)
45051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .build();
45151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        sorig.addFlags(ShortcutInfo.FLAG_PINNED);
45251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        sorig.setBitmapPath("abc");
45351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        sorig.setIconResourceId(456);
45451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
455157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        lookupAndFillInResourceNames(sorig);
456157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
45751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo si = sorig.clone(/* clone flags*/ 0);
45851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
45951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(USER_11, si.getUserId());
46051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(HANDLE_USER_11, si.getUserHandle());
46151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(mClientContext.getPackageName(), si.getPackage());
46251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("id", si.getId());
46351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(new ComponentName("a", "b"), si.getActivity());
46451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getIcon().getResId());
46551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(10, si.getTitleResId());
466157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("r10", si.getTitleResName());
46751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(11, si.getTextResId());
468157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("r11", si.getTextResName());
46951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(12, si.getDisabledMessageResourceId());
470157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("r12", si.getDisabledMessageResName());
47151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories());
47251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("action", si.getIntent().getAction());
47351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("val", si.getIntent().getStringExtra("key"));
47451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getRank());
47551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(1, si.getExtras().getInt("k"));
47651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
47751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(ShortcutInfo.FLAG_PINNED, si.getFlags());
47851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("abc", si.getBitmapPath());
47951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(456, si.getIconResourceId());
480157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("string/r456", si.getIconResName());
48151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
48251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(ShortcutInfo.CLONE_REMOVE_FOR_CREATOR);
48351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
48451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(mClientContext.getPackageName(), si.getPackage());
48551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("id", si.getId());
48651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(new ComponentName("a", "b"), si.getActivity());
48751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getIcon());
48851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(10, si.getTitleResId());
489157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getTitleResName());
49051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(11, si.getTextResId());
491157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getTextResName());
49251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(12, si.getDisabledMessageResourceId());
493157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getDisabledMessageResName());
49451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories());
49551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("action", si.getIntent().getAction());
49651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("val", si.getIntent().getStringExtra("key"));
49751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getRank());
49851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(1, si.getExtras().getInt("k"));
49951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
50051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(ShortcutInfo.FLAG_PINNED, si.getFlags());
50151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getBitmapPath());
50251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
50351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(456, si.getIconResourceId());
504157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getIconResName());
50551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
50651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(ShortcutInfo.CLONE_REMOVE_FOR_LAUNCHER);
50751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
50851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(mClientContext.getPackageName(), si.getPackage());
50951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("id", si.getId());
51051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(new ComponentName("a", "b"), si.getActivity());
51151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getIcon());
51251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(10, si.getTitleResId());
513157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getTitleResName());
51451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(11, si.getTextResId());
515157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getTextResName());
51651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(12, si.getDisabledMessageResourceId());
517157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getDisabledMessageResName());
51851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories());
51951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getIntent());
52051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getRank());
52151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(1, si.getExtras().getInt("k"));
52251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
52351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(ShortcutInfo.FLAG_PINNED, si.getFlags());
52451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getBitmapPath());
52551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
52651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(456, si.getIconResourceId());
527157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getIconResName());
52851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
52951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(ShortcutInfo.CLONE_REMOVE_NON_KEY_INFO);
53051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
53151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(mClientContext.getPackageName(), si.getPackage());
53251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("id", si.getId());
5334d6b87ffdf06df3303239130ced685bc1a3fae50Makoto Onuki        assertEquals(new ComponentName("a", "b"), si.getActivity());
53451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getIcon());
53551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, si.getTitleResId());
536157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getTitleResName());
53751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, si.getTextResId());
538157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getTextResName());
53951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, si.getDisabledMessageResourceId());
540157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getDisabledMessageResName());
54151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getCategories());
54251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getIntent());
54351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, si.getRank());
54451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getExtras());
54551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
54651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(ShortcutInfo.FLAG_PINNED | ShortcutInfo.FLAG_KEY_FIELDS_ONLY, si.getFlags());
54751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getBitmapPath());
54851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
54951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(456, si.getIconResourceId());
550157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getIconResName());
55151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
55251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
55351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public void testShortcutInfoClone_minimum() {
55451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        PersistableBundle pb = new PersistableBundle();
55551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        pb.putInt("k", 1);
55651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo sorig = new ShortcutInfo.Builder(getTestContext())
55751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setId("id")
55851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTitle("title")
55951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIntent(makeIntent("action", ShortcutActivity.class))
56051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .build();
56151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo si = sorig.clone(/* clone flags*/ 0);
56251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
56351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(getTestContext().getPackageName(), si.getPackage());
56451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("id", si.getId());
56551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("title", si.getTitle());
56651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("action", si.getIntent().getAction());
56751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getCategories());
56851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
56951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(ShortcutInfo.CLONE_REMOVE_FOR_CREATOR);
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_LAUNCHER);
57851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
57951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(getTestContext().getPackageName(), si.getPackage());
58051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("id", si.getId());
58151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("title", si.getTitle());
58251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getIntent());
58351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getCategories());
58451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
58551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(ShortcutInfo.CLONE_REMOVE_NON_KEY_INFO);
58651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
58751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(getTestContext().getPackageName(), si.getPackage());
58851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("id", si.getId());
58951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getTitle());
59051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getIntent());
59151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getCategories());
59251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
59351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
59451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public void testShortcutInfoCopyNonNullFieldsFrom() throws InterruptedException {
59551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        PersistableBundle pb = new PersistableBundle();
59651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        pb.putInt("k", 1);
59751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo sorig = new ShortcutInfo.Builder(getTestContext())
59851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setId("id")
59951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setActivity(new ComponentName("a", "b"))
60051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIcon(Icon.createWithResource(mClientContext, 123))
60151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTitle("title")
60251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setText("text")
60351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setDisabledMessage("dismes")
60451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"))
60551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
60651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setRank(123)
60751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setExtras(pb)
60851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .build();
60951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        sorig.addFlags(ShortcutInfo.FLAG_PINNED);
61051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        sorig.setBitmapPath("abc");
61151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        sorig.setIconResourceId(456);
61251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
613157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        lookupAndFillInResourceNames(sorig);
614157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
61551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo si;
61651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
61751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
61851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
61951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setActivity(new ComponentName("x", "y")).build());
62051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("text", si.getText());
6219e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        assertEquals(123, si.getRank());
62251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(new ComponentName("x", "y"), si.getActivity());
62351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
62451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
62551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
62651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIcon(Icon.createWithResource(mClientContext, 456)).build());
62751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("text", si.getText());
62851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(456, si.getIcon().getResId());
629157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(0, si.getIconResourceId());
630157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getIconResName());
631157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getBitmapPath());
63251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
63351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
63451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
63551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTitle("xyz").build());
63651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("text", si.getText());
63751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("xyz", si.getTitle());
63851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, si.getTitleResId());
63951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
64051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
64151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
64251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTitleResId(123).build());
64351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("text", si.getText());
64451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getTitle());
64551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getTitleResId());
64651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
64751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
64851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
64951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setText("xxx").build());
65051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getRank());
65151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("xxx", si.getText());
65251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, si.getTextResId());
65351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
65451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
65551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
65651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTextResId(1111).build());
65751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getRank());
65851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getText());
65951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(1111, si.getTextResId());
66051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
66151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
66251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
66351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setDisabledMessage("xxx").build());
66451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getRank());
66551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("xxx", si.getDisabledMessage());
66651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, si.getDisabledMessageResourceId());
66751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
66851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
66951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
67051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setDisabledMessageResId(11111).build());
67151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getRank());
67251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getDisabledMessage());
67351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(11111, si.getDisabledMessageResourceId());
67451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
67551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
67651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
67751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setCategories(set()).build());
67851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("text", si.getText());
67951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(set(), si.getCategories());
68051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
68151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
68251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
68351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setCategories(set("x")).build());
68451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("text", si.getText());
68551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(set("x"), si.getCategories());
68651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
68751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
68851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
68951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIntent(makeIntent("action2", ShortcutActivity.class)).build());
69051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("text", si.getText());
69151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("action2", si.getIntent().getAction());
69251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getIntent().getStringExtra("key"));
69351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
69451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
69551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
69651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIntent(makeIntent("action3", ShortcutActivity.class, "key", "x")).build());
69751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("text", si.getText());
69851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("action3", si.getIntent().getAction());
69951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("x", si.getIntent().getStringExtra("key"));
70051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
70151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
70251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
70351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setRank(999).build());
70451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("text", si.getText());
70551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(999, si.getRank());
70651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
70751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
70851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        PersistableBundle pb2 = new PersistableBundle();
70951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        pb2.putInt("x", 99);
71051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
71151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
71251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
71351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setExtras(pb2).build());
71451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("text", si.getText());
71551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(99, si.getExtras().getInt("x"));
71651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
71751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
71851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public void testShortcutInfoCopyNonNullFieldsFrom_resId() throws InterruptedException {
71951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        PersistableBundle pb = new PersistableBundle();
72051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        pb.putInt("k", 1);
72151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo sorig = new ShortcutInfo.Builder(getTestContext())
72251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setId("id")
72351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setActivity(new ComponentName("a", "b"))
72451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIcon(Icon.createWithResource(mClientContext, 123))
72551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTitleResId(10)
72651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTextResId(11)
72751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setDisabledMessageResId(12)
72851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"))
72951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
73051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setRank(123)
73151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setExtras(pb)
73251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .build();
73351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        sorig.addFlags(ShortcutInfo.FLAG_PINNED);
73451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        sorig.setBitmapPath("abc");
73551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        sorig.setIconResourceId(456);
73651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
73751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo si;
73851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
73951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
74051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
74151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setActivity(new ComponentName("x", "y")).build());
74251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(11, si.getTextResId());
74351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(new ComponentName("x", "y"), si.getActivity());
74451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
74551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
74651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
74751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIcon(Icon.createWithResource(mClientContext, 456)).build());
74851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(11, si.getTextResId());
74951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(456, si.getIcon().getResId());
750157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(0, si.getIconResourceId());
751157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getIconResName());
752157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getBitmapPath());
75351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
75451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
75551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
75651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTitle("xyz").build());
75751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(11, si.getTextResId());
75851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("xyz", si.getTitle());
75951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, si.getTitleResId());
760157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getTitleResName());
76151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
76251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
76351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
76451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTitleResId(123).build());
76551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(11, si.getTextResId());
76651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getTitle());
76751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, 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                .setText("xxx").build());
77351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getRank());
77451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("xxx", si.getText());
77551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, si.getTextResId());
776157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getTextResName());
77751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
77851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
77951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
78051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTextResId(1111).build());
78151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getRank());
78251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getText());
78351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(1111, 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                .setDisabledMessage("xxx").build());
78951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getRank());
79051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("xxx", si.getDisabledMessage());
79151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, si.getDisabledMessageResourceId());
792157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getDisabledMessageResName());
79351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
79451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
79551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
79651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setDisabledMessageResId(11111).build());
79751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(123, si.getRank());
79851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getDisabledMessage());
79951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(11111, 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                .setCategories(set()).build());
80551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(11, si.getTextResId());
80651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(set(), si.getCategories());
80751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
80851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
80951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
81051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setCategories(set("x")).build());
81151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(11, si.getTextResId());
81251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(set("x"), si.getCategories());
81351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
81451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
81551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
81651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIntent(makeIntent("action2", ShortcutActivity.class)).build());
81751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(11, si.getTextResId());
81851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("action2", si.getIntent().getAction());
81951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getIntent().getStringExtra("key"));
82051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
82151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
82251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
82351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIntent(makeIntent("action3", ShortcutActivity.class, "key", "x")).build());
82451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(11, si.getTextResId());
82551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("action3", si.getIntent().getAction());
82651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("x", si.getIntent().getStringExtra("key"));
82751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
82851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
82951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
83051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setRank(999).build());
83151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(11, si.getTextResId());
83251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(999, si.getRank());
83351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
83451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
83551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        PersistableBundle pb2 = new PersistableBundle();
83651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        pb2.putInt("x", 99);
83751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
83851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = sorig.clone(/* flags=*/ 0);
83951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
84051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setExtras(pb2).build());
84151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(11, si.getTextResId());
84251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(99, si.getExtras().getInt("x"));
84351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
84451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
84551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public void testShortcutInfoSaveAndLoad() throws InterruptedException {
84651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        setCaller(CALLING_PACKAGE_1, USER_10);
84751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
84851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final Icon bmp32x32 = Icon.createWithBitmap(BitmapFactory.decodeResource(
84951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                getTestContext().getResources(), R.drawable.black_32x32));
85051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
85151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        PersistableBundle pb = new PersistableBundle();
85251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        pb.putInt("k", 1);
85351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo sorig = new ShortcutInfo.Builder(mClientContext)
85451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setId("id")
85551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setActivity(new ComponentName(mClientContext, ShortcutActivity2.class))
85651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIcon(bmp32x32)
85751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTitle("title")
85851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setText("text")
85951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setDisabledMessage("dismes")
86051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"))
86151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
86251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setRank(123)
86351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setExtras(pb)
86451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .build();
865b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        sorig.setTimestamp(mInjectedCurrentTimeMillis);
86651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
8679e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        ShortcutInfo sorig2 = new ShortcutInfo.Builder(mClientContext)
8689e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setId("id2")
8699e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setTitle("x")
8709e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setActivity(new ComponentName(mClientContext, ShortcutActivity2.class))
8719e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
8729e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setRank(456)
8739e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .build();
874b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        sorig2.setTimestamp(mInjectedCurrentTimeMillis);
8759e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki
8769e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        mManager.addDynamicShortcuts(list(sorig, sorig2));
87751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
878b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        mInjectedCurrentTimeMillis += 1;
879b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        final long now = mInjectedCurrentTimeMillis;
880b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        mInjectedCurrentTimeMillis += 1;
88151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
88251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Save and load.
88351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.saveDirtyInfo();
88451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        initService();
88551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.handleUnlockUser(USER_10);
88651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
88751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo si;
88851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "id", USER_10);
88951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
89051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(USER_10, si.getUserId());
89151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(HANDLE_USER_10, si.getUserHandle());
89251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(CALLING_PACKAGE_1, si.getPackage());
89351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("id", si.getId());
89451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(ShortcutActivity2.class.getName(), si.getActivity().getClassName());
89551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getIcon());
89651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("title", si.getTitle());
89751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("text", si.getText());
89851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("dismes", si.getDisabledMessage());
89951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories());
90051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("action", si.getIntent().getAction());
90151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("val", si.getIntent().getStringExtra("key"));
9029e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        assertEquals(0, si.getRank());
90351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(1, si.getExtras().getInt("k"));
90451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
905157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(ShortcutInfo.FLAG_DYNAMIC | ShortcutInfo.FLAG_HAS_ICON_FILE
906157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                | ShortcutInfo.FLAG_STRINGS_RESOLVED, si.getFlags());
90751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertNotNull(si.getBitmapPath()); // Something should be set.
90851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, si.getIconResourceId());
90951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(si.getLastChangedTimestamp() < now);
9109e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki
9119e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        // Make sure ranks are saved too.  Because of the auto-adjusting, we need two shortcuts
9129e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        // to test it.
9139e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        si = mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "id2", USER_10);
9149e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        assertEquals(1, si.getRank());
91551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
91651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
91751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public void testShortcutInfoSaveAndLoad_resId() throws InterruptedException {
91851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        setCaller(CALLING_PACKAGE_1, USER_10);
91951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
920157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        final Icon res32x32 = Icon.createWithResource(mClientContext, R.drawable.black_32x32);
92151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
92251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        PersistableBundle pb = new PersistableBundle();
92351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        pb.putInt("k", 1);
92451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo sorig = new ShortcutInfo.Builder(mClientContext)
92551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setId("id")
92651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setActivity(new ComponentName(mClientContext, ShortcutActivity2.class))
927157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                .setIcon(res32x32)
92851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTitleResId(10)
92951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTextResId(11)
93051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setDisabledMessageResId(12)
93151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"))
93251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
93351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setRank(123)
93451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setExtras(pb)
93551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .build();
936b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        sorig.setTimestamp(mInjectedCurrentTimeMillis);
93751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
9389e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        ShortcutInfo sorig2 = new ShortcutInfo.Builder(mClientContext)
9399e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setId("id2")
9409e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setTitle("x")
9419e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setActivity(new ComponentName(mClientContext, ShortcutActivity2.class))
9429e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
9439e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setRank(456)
9449e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .build();
945b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        sorig2.setTimestamp(mInjectedCurrentTimeMillis);
9469e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki
9479e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        mManager.addDynamicShortcuts(list(sorig, sorig2));
94851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
949b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        mInjectedCurrentTimeMillis += 1;
950b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        final long now = mInjectedCurrentTimeMillis;
951b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        mInjectedCurrentTimeMillis += 1;
95251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
95351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Save and load.
95451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.saveDirtyInfo();
95551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        initService();
95651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.handleUnlockUser(USER_10);
95751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
95851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo si;
95951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "id", USER_10);
96051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
96151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(USER_10, si.getUserId());
96251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(HANDLE_USER_10, si.getUserHandle());
96351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(CALLING_PACKAGE_1, si.getPackage());
96451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("id", si.getId());
96551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(ShortcutActivity2.class.getName(), si.getActivity().getClassName());
96651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getIcon());
96751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(10, si.getTitleResId());
968157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("r10", si.getTitleResName());
96951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(11, si.getTextResId());
970157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("r11", si.getTextResName());
97151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(12, si.getDisabledMessageResourceId());
972157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("r12", si.getDisabledMessageResName());
97351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories());
97451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("action", si.getIntent().getAction());
97551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("val", si.getIntent().getStringExtra("key"));
9769e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        assertEquals(0, si.getRank());
97751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(1, si.getExtras().getInt("k"));
97851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
979157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(ShortcutInfo.FLAG_DYNAMIC | ShortcutInfo.FLAG_HAS_ICON_RES
980157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                | ShortcutInfo.FLAG_STRINGS_RESOLVED, si.getFlags());
981157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertNull(si.getBitmapPath());
982157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(R.drawable.black_32x32, si.getIconResourceId());
98351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(si.getLastChangedTimestamp() < now);
9849e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki
9859e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        // Make sure ranks are saved too.  Because of the auto-adjusting, we need two shortcuts
9869e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        // to test it.
9879e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        si = mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "id2", USER_10);
9889e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        assertEquals(1, si.getRank());
98951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
99051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
99151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public void testShortcutInfoSaveAndLoad_forBackup() {
99251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        setCaller(CALLING_PACKAGE_1, USER_0);
99351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
99451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final Icon bmp32x32 = Icon.createWithBitmap(BitmapFactory.decodeResource(
99551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                getTestContext().getResources(), R.drawable.black_32x32));
99651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
99751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        PersistableBundle pb = new PersistableBundle();
99851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        pb.putInt("k", 1);
99951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo sorig = new ShortcutInfo.Builder(mClientContext)
100051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setId("id")
100151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setActivity(new ComponentName(mClientContext, ShortcutActivity2.class))
100251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIcon(bmp32x32)
100351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTitle("title")
100451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setText("text")
100551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setDisabledMessage("dismes")
100651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"))
100751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
100851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setRank(123)
100951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setExtras(pb)
101051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .build();
101151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
10129e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        ShortcutInfo sorig2 = new ShortcutInfo.Builder(mClientContext)
10139e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setId("id2")
10149e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setTitle("x")
10159e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setActivity(new ComponentName(mClientContext, ShortcutActivity2.class))
10169e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
10179e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setRank(456)
10189e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .build();
10199e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki
10209e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        mManager.addDynamicShortcuts(list(sorig, sorig2));
102151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
102251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Dynamic shortcuts won't be backed up, so we need to pin it.
102351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        setCaller(LAUNCHER_1, USER_0);
10249e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("id", "id2"), HANDLE_USER_0);
102551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
102651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Do backup & restore.
102751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        backupAndRestore();
102851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
102951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.handleUnlockUser(USER_0); // Load user-0.
103051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
103151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo si;
103251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "id", USER_0);
103351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
103451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(CALLING_PACKAGE_1, si.getPackage());
103551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("id", si.getId());
103651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(ShortcutActivity2.class.getName(), si.getActivity().getClassName());
103751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getIcon());
103851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("title", si.getTitle());
103951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("text", si.getText());
104051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("dismes", si.getDisabledMessage());
104151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories());
104251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("action", si.getIntent().getAction());
104351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("val", si.getIntent().getStringExtra("key"));
10449e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        assertEquals(0, si.getRank());
104551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(1, si.getExtras().getInt("k"));
104651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
1047157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(ShortcutInfo.FLAG_PINNED | ShortcutInfo.FLAG_STRINGS_RESOLVED, si.getFlags());
104851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertNull(si.getBitmapPath()); // No icon.
104951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, si.getIconResourceId());
10509e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki
10519e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        // Note when restored from backup, it's no longer dynamic, so shouldn't have a rank.
10529e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        si = mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "id2", USER_0);
10539e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        assertEquals(0, si.getRank());
105451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
105551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
105651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public void testShortcutInfoSaveAndLoad_forBackup_resId() {
105751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        setCaller(CALLING_PACKAGE_1, USER_0);
105851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
1059157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        final Icon res32x32 = Icon.createWithResource(mClientContext, R.drawable.black_32x32);
106051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
106151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        PersistableBundle pb = new PersistableBundle();
106251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        pb.putInt("k", 1);
106351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo sorig = new ShortcutInfo.Builder(mClientContext)
106451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setId("id")
106551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setActivity(new ComponentName(mClientContext, ShortcutActivity2.class))
1066157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                .setIcon(res32x32)
106751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTitleResId(10)
106851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setTextResId(11)
106951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setDisabledMessageResId(12)
107051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"))
107151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
107251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setRank(123)
107351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .setExtras(pb)
107451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                .build();
107551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
10769e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        ShortcutInfo sorig2 = new ShortcutInfo.Builder(mClientContext)
10779e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setId("id2")
10789e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setTitle("x")
10799e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setActivity(new ComponentName(mClientContext, ShortcutActivity2.class))
10809e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
10819e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .setRank(456)
10829e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki                .build();
10839e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki
10849e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        mManager.addDynamicShortcuts(list(sorig, sorig2));
108551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
108651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Dynamic shortcuts won't be backed up, so we need to pin it.
108751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        setCaller(LAUNCHER_1, USER_0);
10889e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("id", "id2"), HANDLE_USER_0);
108951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
109051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Do backup & restore.
109151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        backupAndRestore();
109251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
109351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.handleUnlockUser(USER_0); // Load user-0.
109451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
109551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        ShortcutInfo si;
109651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        si = mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "id", USER_0);
109751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
109851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(CALLING_PACKAGE_1, si.getPackage());
109951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("id", si.getId());
110051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(ShortcutActivity2.class.getName(), si.getActivity().getClassName());
110151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(null, si.getIcon());
110251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(10, si.getTitleResId());
1103157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("r10", si.getTitleResName());
110451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(11, si.getTextResId());
1105157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("r11", si.getTextResName());
110651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(12, si.getDisabledMessageResourceId());
1107157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("r12", si.getDisabledMessageResName());
110851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories());
110951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("action", si.getIntent().getAction());
111051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals("val", si.getIntent().getStringExtra("key"));
11119e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        assertEquals(0, si.getRank());
111251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(1, si.getExtras().getInt("k"));
111351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
1114157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(ShortcutInfo.FLAG_PINNED | ShortcutInfo.FLAG_STRINGS_RESOLVED, si.getFlags());
111551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertNull(si.getBitmapPath()); // No icon.
111651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, si.getIconResourceId());
1117157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, si.getIconResName());
11189e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki
11199e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        // Note when restored from backup, it's no longer dynamic, so shouldn't have a rank.
11209e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        si = mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "id2", USER_0);
11219e1f5595bd7ffe3af6ca35b3235dfca0ecd07978Makoto Onuki        assertEquals(0, si.getRank());
112251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
112351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
1124b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki    private void checkShortcutInfoSaveAndLoad_intents(Intent intent) {
1125b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(
1126b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki                makeShortcutWithIntent("s1", intent))));
1127b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        initService();
1128b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        mService.handleUnlockUser(USER_0);
1129b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1130b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        assertWith(getCallerShortcuts())
1131b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki                .haveIds("s1")
1132b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki                .forShortcutWithId("s1", si -> {
1133b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki                    assertEquals(intent.getAction(), si.getIntent().getAction());
1134b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki                    assertEquals(intent.getData(), si.getIntent().getData());
1135b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki                    assertEquals(intent.getComponent(), si.getIntent().getComponent());
1136b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki                    assertBundlesEqual(intent.getExtras(), si.getExtras());
1137b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki                });
1138b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki    }
1139b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1140b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki    public void testShortcutInfoSaveAndLoad_intents() {
1141b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        checkShortcutInfoSaveAndLoad_intents(new Intent(Intent.ACTION_VIEW));
1142b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1143b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        mInjectedCurrentTimeMillis += INTERVAL; // reset throttling.
1144b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1145b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        checkShortcutInfoSaveAndLoad_intents(new Intent(Intent.ACTION_MAIN));
1146b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1147b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        mInjectedCurrentTimeMillis += INTERVAL; // reset throttling.
1148b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1149b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        checkShortcutInfoSaveAndLoad_intents(new Intent(Intent.ACTION_VIEW,
1150b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki                Uri.parse("http://www.example.com/")));
1151b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1152b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        mInjectedCurrentTimeMillis += INTERVAL; // reset throttling.
1153b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1154b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        checkShortcutInfoSaveAndLoad_intents(new Intent(Intent.ACTION_MAIN,
1155b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki                Uri.parse("http://www.example.com/")));
1156b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1157b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        mInjectedCurrentTimeMillis += INTERVAL; // reset throttling.
1158b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1159b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        checkShortcutInfoSaveAndLoad_intents(new Intent(Intent.ACTION_VIEW)
1160b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki                .setComponent(new ComponentName("a", "b")));
1161b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1162b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        mInjectedCurrentTimeMillis += INTERVAL; // reset throttling.
1163b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1164b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        checkShortcutInfoSaveAndLoad_intents(new Intent(Intent.ACTION_MAIN)
1165b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki                .setComponent(new ComponentName("a", "b")));
1166b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1167b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        mInjectedCurrentTimeMillis += INTERVAL; // reset throttling.
1168b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1169b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        checkShortcutInfoSaveAndLoad_intents(new Intent(Intent.ACTION_VIEW)
1170b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki                .putExtras(makeBundle("a", "b")));
1171b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1172b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        mInjectedCurrentTimeMillis += INTERVAL; // reset throttling.
1173b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1174b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1175b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        checkShortcutInfoSaveAndLoad_intents(new Intent(Intent.ACTION_MAIN)
1176b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki                .putExtras(makeBundle("a", "b")));
1177b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
1178b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki        mInjectedCurrentTimeMillis += INTERVAL; // reset throttling.
1179b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki    }
1180b5a012fd6f088629746057a3902b5926f9fe8e08Makoto Onuki
118151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public void testThrottling() {
118251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final ShortcutInfo si1 = makeShortcut("shortcut1");
118351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
118451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1)));
118551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(2, mManager.getRemainingCallCount());
118651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
118751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
118851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
118951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1)));
119051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(1, mManager.getRemainingCallCount());
119151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
119251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
119351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
119451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1)));
119551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, mManager.getRemainingCallCount());
119651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
119751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
119851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Reached the max
119951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
120051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
120151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertFalse(mManager.setDynamicShortcuts(list(si1)));
120251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, mManager.getRemainingCallCount());
120351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
120451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
120551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Still throttled
120651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis = START_TIME + INTERVAL - 1;
120751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertFalse(mManager.setDynamicShortcuts(list(si1)));
120851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, mManager.getRemainingCallCount());
120951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
121051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
121151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Now it should work.
121251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
121351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1))); // fail
121451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(2, mManager.getRemainingCallCount());
121551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(START_TIME + INTERVAL * 2, mManager.getRateLimitResetTime());
121651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
121751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
121851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1)));
121951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(1, mManager.getRemainingCallCount());
122051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(START_TIME + INTERVAL * 2, mManager.getRateLimitResetTime());
122151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
122251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
122351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1)));
122451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, mManager.getRemainingCallCount());
122551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(START_TIME + INTERVAL * 2, mManager.getRateLimitResetTime());
122651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
122751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
122851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertFalse(mManager.setDynamicShortcuts(list(si1)));
122951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, mManager.getRemainingCallCount());
123051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(START_TIME + INTERVAL * 2, mManager.getRateLimitResetTime());
123151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
123251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // 4 hours later...
123351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis = START_TIME + 4 * INTERVAL;
123451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1)));
123551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(2, mManager.getRemainingCallCount());
123651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(START_TIME + INTERVAL * 5, mManager.getRateLimitResetTime());
123751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
123851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
123951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1)));
124051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(1, mManager.getRemainingCallCount());
124151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(START_TIME + INTERVAL * 5, mManager.getRateLimitResetTime());
124251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
124351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Make sure getRemainingCallCount() itself gets reset without calling setDynamicShortcuts().
124451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis = START_TIME + 8 * INTERVAL;
124551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(3, mManager.getRemainingCallCount());
124651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(START_TIME + INTERVAL * 9, mManager.getRateLimitResetTime());
124751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
124851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
124951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1)));
125051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(2, mManager.getRemainingCallCount());
125151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(START_TIME + INTERVAL * 9, mManager.getRateLimitResetTime());
125251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
125351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
125451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public void testThrottling_rewind() {
125551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final ShortcutInfo si1 = makeShortcut("shortcut1");
125651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
125751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1)));
125851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(2, mManager.getRemainingCallCount());
125951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
126051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
126151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis = 12345; // Clock reset!
126251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
126351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Since the clock looks invalid, the counter shouldn't have reset.
126451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(2, mManager.getRemainingCallCount());
126551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
126651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
126751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Forward again.  Still haven't reset yet.
126851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis = START_TIME + INTERVAL - 1;
126951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(2, mManager.getRemainingCallCount());
127051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime());
127151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
127251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Now rewind -- this will reset the counters.
127351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis = START_TIME - 100000;
127451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(3, mManager.getRemainingCallCount());
127551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
127651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1)));
127751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(2, mManager.getRemainingCallCount());
127851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
127951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Forward again, should be reset now.
128051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis += INTERVAL;
128151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(3, mManager.getRemainingCallCount());
128251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
128351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
128451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public void testThrottling_perPackage() {
128551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final ShortcutInfo si1 = makeShortcut("shortcut1");
128651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
128751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1)));
128851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(2, mManager.getRemainingCallCount());
128951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
129051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
129151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1)));
129251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(1, mManager.getRemainingCallCount());
129351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
129451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
129551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1)));
129651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, mManager.getRemainingCallCount());
129751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
129851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Reached the max
129951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
130051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
130151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertFalse(mManager.setDynamicShortcuts(list(si1)));
130251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
130351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Try from a different caller.
130451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedClientPackage = CALLING_PACKAGE_2;
130551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCallingUid = CALLING_UID_2;
130651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
130751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Need to create a new one wit the updated package name.
130851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        final ShortcutInfo si2 = makeShortcut("shortcut1");
130951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
131051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(3, mManager.getRemainingCallCount());
131151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
131251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si2)));
131351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(2, mManager.getRemainingCallCount());
131451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
131551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
131651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si2)));
131751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(1, mManager.getRemainingCallCount());
131851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
131951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Back to the original caller, still throttled.
132051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedClientPackage = CALLING_PACKAGE_1;
132151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCallingUid = CALLING_UID_1;
132251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
132351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis = START_TIME + INTERVAL - 1;
132451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, mManager.getRemainingCallCount());
132551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertFalse(mManager.setDynamicShortcuts(list(si1)));
132651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(0, mManager.getRemainingCallCount());
132751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
132851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Now it should work.
132951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
133051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1)));
133151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
133251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
133351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1)));
133451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
133551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
133651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1)));
133751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
133851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
133951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertFalse(mManager.setDynamicShortcuts(list(si1)));
134051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
134151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis = START_TIME + 4 * INTERVAL;
134251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1)));
134351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1)));
134451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si1)));
134551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertFalse(mManager.setDynamicShortcuts(list(si1)));
134651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
134751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedClientPackage = CALLING_PACKAGE_2;
134851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCallingUid = CALLING_UID_2;
134951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
135051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertEquals(3, mManager.getRemainingCallCount());
135151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
135251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si2)));
135351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si2)));
135451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertTrue(mManager.setDynamicShortcuts(list(si2)));
135551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        assertFalse(mManager.setDynamicShortcuts(list(si2)));
135651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
135751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
135851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public void testThrottling_localeChanges() {
135951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        prepareCrossProfileDataSet();
136051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
136151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        dumpsysOnLogcat("Before save & load");
136251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
136351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.saveDirtyInfo();
136451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        initService();
136551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
13664e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki        mInjectedLocale = Locale.CHINA;
13674e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki        mService.mReceiver.onReceive(mServiceContext, new Intent(Intent.ACTION_LOCALE_CHANGED));
136851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
136951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Note at this point only user-0 is loaded, and the counters are reset for this user,
13704e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki        // but it will work for other users too because we check the locale change at any
13714e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki        // API entry point.
137251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
137351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
137451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
137551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
137651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
137751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
137851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
137951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
138051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
138151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
138251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
138351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
138451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
138551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
138651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
138751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
138851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
138951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
139051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
139151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
13924e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki        // Make sure even if we receive ACTION_LOCALE_CHANGED, if the locale hasn't actually
13934e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki        // changed, we don't reset throttling.
13944e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
13954e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki            mManager.updateShortcuts(list());
13964e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki            assertEquals(2, mManager.getRemainingCallCount());
13974e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki        });
13984e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki
13994e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki        mService.mReceiver.onReceive(mServiceContext, new Intent(Intent.ACTION_LOCALE_CHANGED));
14004e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki
14014e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
14024e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki            assertEquals(2, mManager.getRemainingCallCount()); // Still 2.
14034e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki        });
14044e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki
140551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.saveDirtyInfo();
140651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        initService();
140751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
14084e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki        // The locale should be persisted, so it still shouldn't reset throttling.
14094e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki        mService.mReceiver.onReceive(mServiceContext, new Intent(Intent.ACTION_LOCALE_CHANGED));
14104e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki
14114e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
14124e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki            assertEquals(2, mManager.getRemainingCallCount()); // Still 2.
14134e6cef49ef11bbb5bfc0e9f0fb865188492d88b0Makoto Onuki        });
141451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
141551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
141651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public void testThrottling_foreground() throws Exception {
141751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        prepareCrossProfileDataSet();
141851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
141951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        dumpsysOnLogcat("Before save & load");
142051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
142151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.saveDirtyInfo();
142251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        initService();
142351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
142451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // We need to update the current time from time to time, since some of the internal checks
142551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // rely on the time being correctly incremented.
142651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
142751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
142851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // First, all packages have less than 3 (== initial value) remaining calls.
142951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
143051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
143151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
143251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
143351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
143451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
143551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
143651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
143751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
143851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
143951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
144051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
144151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
144251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
144351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
144451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
144551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
144651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
144751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
144851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
144951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
145051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
145151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // State changed, but not foreground, so no resetting.
145251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.mUidObserver.onUidStateChanged(
145351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                CALLING_UID_1, ActivityManager.PROCESS_STATE_TOP_SLEEPING);
145451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
145551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
145651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
145751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
145851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
145951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
146051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
146151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
146251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
146351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
146451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
146551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
146651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
146751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
146851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
146951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
147051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
147151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
147251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
147351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
147451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
147551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // State changed, package1 foreground, reset.
147651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.mUidObserver.onUidStateChanged(
147751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                CALLING_UID_1, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
147851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
147951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
148051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
148151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
148251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
148351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
148451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
148551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
148651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
148751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
148851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
148951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
149051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
149151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
149251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
149351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
149451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
149551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
149651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.mUidObserver.onUidStateChanged(
149751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                CALLING_UID_1, ActivityManager.PROCESS_STATE_TOP_SLEEPING);
149851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
149951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
150051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
150151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Different app comes to foreground briefly, and goes back to background.
150251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Now, make sure package 2's counter is reset, even in this case.
150351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.mUidObserver.onUidStateChanged(
150451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                CALLING_UID_2, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
150551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.mUidObserver.onUidStateChanged(
150651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                CALLING_UID_2, ActivityManager.PROCESS_STATE_TOP_SLEEPING);
150751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
150851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
150951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
151051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
151151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
151251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
151351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
151451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
151551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
151651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
151751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
151851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
151951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
152051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
152151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
152251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
152351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
152451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
152551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
152651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
152751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
152851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
152951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Do the same thing one more time.  This would catch the bug with mixuing up
153051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // the current time and the elapsed time.
153151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
153251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mManager.updateShortcuts(list(makeShortcut("s")));
153351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
153451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
153551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
153651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.mUidObserver.onUidStateChanged(
153751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                CALLING_UID_2, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
153851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.mUidObserver.onUidStateChanged(
153951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                CALLING_UID_2, ActivityManager.PROCESS_STATE_TOP_SLEEPING);
154051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
154151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
154251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
154351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
154451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
154551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
154651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
154751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
154851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
154951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
155051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
155151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
155251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
155351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
155451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
155551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
155651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
155751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
155851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
155951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
156051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mInjectedCurrentTimeMillis++;
156151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
156251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Package 1 on user-10 comes to foreground.
156351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Now, also try calling some APIs and make sure foreground apps don't get throttled.
156451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.mUidObserver.onUidStateChanged(
156551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                UserHandle.getUid(USER_10, CALLING_UID_1),
156651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki                ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
156751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
156851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
1569347a6bd82059bc7581b1dcd229228f622c5cfca1Makoto Onuki            assertFalse(mManager.isRateLimitingActive());
157051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
157151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s")));
1572347a6bd82059bc7581b1dcd229228f622c5cfca1Makoto Onuki
1573347a6bd82059bc7581b1dcd229228f622c5cfca1Makoto Onuki            assertEquals(2, mManager.getRemainingCallCount());
1574347a6bd82059bc7581b1dcd229228f622c5cfca1Makoto Onuki            assertFalse(mManager.isRateLimitingActive());
1575347a6bd82059bc7581b1dcd229228f622c5cfca1Makoto Onuki
157651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s")));
1577347a6bd82059bc7581b1dcd229228f622c5cfca1Makoto Onuki
1578347a6bd82059bc7581b1dcd229228f622c5cfca1Makoto Onuki            assertEquals(1, mManager.getRemainingCallCount());
1579347a6bd82059bc7581b1dcd229228f622c5cfca1Makoto Onuki            assertFalse(mManager.isRateLimitingActive());
1580347a6bd82059bc7581b1dcd229228f622c5cfca1Makoto Onuki
158151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s")));
158251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
158351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(0, mManager.getRemainingCallCount());
1584347a6bd82059bc7581b1dcd229228f622c5cfca1Makoto Onuki            assertTrue(mManager.isRateLimitingActive());
158551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
158651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
158751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
158851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
158951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s")));
159051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s")));
159151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s")));
159251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
159351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(0, mManager.getRemainingCallCount());
1594347a6bd82059bc7581b1dcd229228f622c5cfca1Makoto Onuki            assertTrue(mManager.isRateLimitingActive());
159551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
159651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
159751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
159851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
159951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s")));
160051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s")));
160151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s")));
160251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
160351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(0, mManager.getRemainingCallCount());
1604347a6bd82059bc7581b1dcd229228f622c5cfca1Makoto Onuki            assertTrue(mManager.isRateLimitingActive());
160551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
160651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
160751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
160851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
160951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s")));
161051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s")));
161151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s")));
161251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
161351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(0, mManager.getRemainingCallCount());
1614347a6bd82059bc7581b1dcd229228f622c5cfca1Makoto Onuki            assertTrue(mManager.isRateLimitingActive());
161551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
161651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
161751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
161851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
161951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s")));
162051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s")));
162151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s")));
162251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
162351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(0, mManager.getRemainingCallCount());
1624347a6bd82059bc7581b1dcd229228f622c5cfca1Makoto Onuki            assertTrue(mManager.isRateLimitingActive());
162551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
162651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
162751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
162851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
162951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s")));
163051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s")));
163151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s")));
163251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
163351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount()); // Still 3!
1634347a6bd82059bc7581b1dcd229228f622c5cfca1Makoto Onuki            assertFalse(mManager.isRateLimitingActive());
163551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
163651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
163751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
163851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
163951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    public void testThrottling_resetByInternalCall() throws Exception {
164051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        prepareCrossProfileDataSet();
164151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
164251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        dumpsysOnLogcat("Before save & load");
164351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
164451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mService.saveDirtyInfo();
164551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        initService();
164651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
164751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // First, all packages have less than 3 (== initial value) remaining calls.
164851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
164951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
165051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
165151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
165251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
165351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
165451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
165551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
165651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
165751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
165851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
165951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
166051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
166151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
166251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
166351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
166451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
166551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
166651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
166751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
166851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        // Simulate a call from sys UI.
166951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        mCallerPermissions.add(permission.RESET_SHORTCUT_MANAGER_THROTTLING);
1670d6e1f3bec18167f726ccc20f9bcbc6526dfc78feMakoto Onuki        mManager.onApplicationActive(CALLING_PACKAGE_1, USER_0);
167151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
167251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
167351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
167451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
167551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
167651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
167751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
167851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
167951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
168051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
168151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
168251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
168351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
168451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
168551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
168651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
168751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
168851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
168951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
169051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
1691d6e1f3bec18167f726ccc20f9bcbc6526dfc78feMakoto Onuki        mManager.onApplicationActive(CALLING_PACKAGE_3, USER_0);
169251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
169351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
169451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
169551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
169651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
169751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
169851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
169951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
170051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
170151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
170251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
170351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
170451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
170551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
170651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
170751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
170851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
170951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
171051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
171151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
1712d6e1f3bec18167f726ccc20f9bcbc6526dfc78feMakoto Onuki        mManager.onApplicationActive(CALLING_PACKAGE_1, USER_10);
171351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki
171451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
171551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
171651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
171751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
171851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
171951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
172051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_3, USER_0, () -> {
172151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
172251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
172351ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_4, USER_0, () -> {
172451ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
172551ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
172651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
172751ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
172851ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
172951ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
173051ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki            assertEquals(3, mManager.getRemainingCallCount());
173151ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki        });
173251ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki    }
1733ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki
1734ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki    public void testReportShortcutUsed() {
1735ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki        runWithCaller(CALLING_PACKAGE_1, USER_10, () -> {
1736ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            reset(mMockUsageStatsManagerInternal);
1737ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki
1738ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            // Report with an nonexistent shortcut.
1739ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            mManager.reportShortcutUsed("s1");
1740ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            verify(mMockUsageStatsManagerInternal, times(0)).reportShortcutUsage(
1741ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki                    anyString(), anyString(), anyInt());
1742ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki
1743ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            // Publish s2, but s1 still doesn't exist.
1744ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s2")));
1745ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            mManager.reportShortcutUsed("s1");
1746ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            verify(mMockUsageStatsManagerInternal, times(0)).reportShortcutUsage(
1747ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki                    anyString(), anyString(), anyInt());
1748ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki
1749ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            mManager.reportShortcutUsed("s2");
1750ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            verify(mMockUsageStatsManagerInternal, times(1)).reportShortcutUsage(
1751ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki                    eq(CALLING_PACKAGE_1), eq("s2"), eq(USER_10));
1752ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki
1753ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki        });
1754ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki        runWithCaller(CALLING_PACKAGE_2, USER_10, () -> {
1755ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            // Try with a different package.
1756ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            reset(mMockUsageStatsManagerInternal);
1757ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki
1758ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            // Report with an nonexistent shortcut.
1759ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            mManager.reportShortcutUsed("s2");
1760ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            verify(mMockUsageStatsManagerInternal, times(0)).reportShortcutUsage(
1761ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki                    anyString(), anyString(), anyInt());
1762ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki
1763ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            // Publish s2, but s1 still doesn't exist.
1764ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            mManager.setDynamicShortcuts(list(makeShortcut("s3")));
1765ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            mManager.reportShortcutUsed("s2");
1766ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            verify(mMockUsageStatsManagerInternal, times(0)).reportShortcutUsage(
1767ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki                    anyString(), anyString(), anyInt());
1768ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki
1769ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            mManager.reportShortcutUsed("s3");
1770ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki            verify(mMockUsageStatsManagerInternal, times(1)).reportShortcutUsage(
1771ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki                    eq(CALLING_PACKAGE_2), eq("s3"), eq(USER_10));
1772ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki
1773ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki        });
1774ac042501c816fa9a65aed005060ebdcfc0a0f3b2Makoto Onuki    }
1775157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
1776157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    // Test for a ShortcutInfo method.
1777157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    public void testGetResourcePackageName() {
1778157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, ShortcutInfo.getResourcePackageName(""));
1779157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, ShortcutInfo.getResourcePackageName("abc"));
1780157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("p", ShortcutInfo.getResourcePackageName("p:"));
1781157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("p", ShortcutInfo.getResourcePackageName("p:xx"));
1782157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("pac", ShortcutInfo.getResourcePackageName("pac:"));
1783157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    }
1784157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
1785157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    // Test for a ShortcutInfo method.
1786157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    public void testGetResourceTypeName() {
1787157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, ShortcutInfo.getResourceTypeName(""));
1788157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, ShortcutInfo.getResourceTypeName(":"));
1789157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, ShortcutInfo.getResourceTypeName("/"));
1790157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, ShortcutInfo.getResourceTypeName("/:"));
1791157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("a", ShortcutInfo.getResourceTypeName(":a/"));
1792157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("type", ShortcutInfo.getResourceTypeName("xxx:type/yyy"));
1793157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    }
1794157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
1795157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    // Test for a ShortcutInfo method.
1796157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    public void testGetResourceTypeAndEntryName() {
1797157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, ShortcutInfo.getResourceTypeAndEntryName(""));
1798157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, ShortcutInfo.getResourceTypeAndEntryName("abc"));
1799157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("", ShortcutInfo.getResourceTypeAndEntryName("p:"));
1800157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("x", ShortcutInfo.getResourceTypeAndEntryName(":x"));
1801157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("x", ShortcutInfo.getResourceTypeAndEntryName("p:x"));
1802157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("xyz", ShortcutInfo.getResourceTypeAndEntryName("pac:xyz"));
1803157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    }
1804157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
1805157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    // Test for a ShortcutInfo method.
1806157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    public void testGetResourceEntryName() {
1807157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, ShortcutInfo.getResourceEntryName(""));
1808157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(null, ShortcutInfo.getResourceEntryName("ab:"));
1809157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("", ShortcutInfo.getResourceEntryName("/"));
1810157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("abc", ShortcutInfo.getResourceEntryName("/abc"));
1811157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("abc", ShortcutInfo.getResourceEntryName("xyz/abc"));
1812157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    }
1813157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
1814157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    // Test for a ShortcutInfo method.
1815157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    public void testLookUpResourceName_systemResources() {
1816157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        // For android system resources, lookUpResourceName will simply return the value as a
1817157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        // string, regardless of "withType".
1818157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        final Resources res = getTestContext().getResources();
1819157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
1820157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("" + android.R.string.cancel, ShortcutInfo.lookUpResourceName(res,
1821157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                android.R.string.cancel, true, getTestContext().getPackageName()));
1822157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("" + android.R.drawable.alert_dark_frame, ShortcutInfo.lookUpResourceName(res,
1823157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                android.R.drawable.alert_dark_frame, true, getTestContext().getPackageName()));
1824157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("" + android.R.string.cancel, ShortcutInfo.lookUpResourceName(res,
1825157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                android.R.string.cancel, false, getTestContext().getPackageName()));
1826157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    }
1827157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
1828157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    public void testLookUpResourceName_appResources() {
1829157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        final Resources res = getTestContext().getResources();
1830157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
1831157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("shortcut_text1", ShortcutInfo.lookUpResourceName(res,
1832157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                R.string.shortcut_text1, false, getTestContext().getPackageName()));
1833157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("string/shortcut_text1", ShortcutInfo.lookUpResourceName(res,
1834157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                R.string.shortcut_text1, true, getTestContext().getPackageName()));
1835157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
1836157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("black_16x64", ShortcutInfo.lookUpResourceName(res,
1837157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                R.drawable.black_16x64, false, getTestContext().getPackageName()));
1838157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals("drawable/black_16x64", ShortcutInfo.lookUpResourceName(res,
1839157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                R.drawable.black_16x64, true, getTestContext().getPackageName()));
1840157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    }
1841157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
1842157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    // Test for a ShortcutInfo method.
1843157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    public void testLookUpResourceId_systemResources() {
1844157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        final Resources res = getTestContext().getResources();
1845157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
1846157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(android.R.string.cancel, ShortcutInfo.lookUpResourceId(res,
1847157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                "" + android.R.string.cancel, null,
1848157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                getTestContext().getPackageName()));
1849157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(android.R.drawable.alert_dark_frame, ShortcutInfo.lookUpResourceId(res,
1850157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                "" + android.R.drawable.alert_dark_frame, null,
1851157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                getTestContext().getPackageName()));
1852157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    }
1853157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
1854157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    // Test for a ShortcutInfo method.
1855157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    public void testLookUpResourceId_appResources() {
1856157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        final Resources res = getTestContext().getResources();
1857157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
1858157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(R.string.shortcut_text1,
1859157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                ShortcutInfo.lookUpResourceId(res, "shortcut_text1", "string",
1860157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                        getTestContext().getPackageName()));
1861157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
1862157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(R.string.shortcut_text1,
1863157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                ShortcutInfo.lookUpResourceId(res, "string/shortcut_text1", null,
1864157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                        getTestContext().getPackageName()));
1865157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
1866157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(R.drawable.black_16x64,
1867157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                ShortcutInfo.lookUpResourceId(res, "black_16x64", "drawable",
1868157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                        getTestContext().getPackageName()));
1869157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki
1870157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki        assertEquals(R.drawable.black_16x64,
1871157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                ShortcutInfo.lookUpResourceId(res, "drawable/black_16x64", null,
1872157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki                        getTestContext().getPackageName()));
1873157b1628fd84dc3ef0355fddd8d281618f94d33eMakoto Onuki    }
187476269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki
187576269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki    public void testDumpCheckin() throws IOException {
187676269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        prepareCrossProfileDataSet();
187776269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki
187876269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        // prepareCrossProfileDataSet() doesn't set any icons, so do set here.
187976269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        final Icon res32x32 = Icon.createWithResource(getTestContext(), R.drawable.black_32x32);
188076269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        final Icon res64x64 = Icon.createWithResource(getTestContext(), R.drawable.black_64x64);
188176269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        final Icon bmp32x32 = Icon.createWithBitmap(BitmapFactory.decodeResource(
188276269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki                getTestContext().getResources(), R.drawable.black_32x32));
188376269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        final Icon bmp64x64 = Icon.createWithBitmap(BitmapFactory.decodeResource(
188476269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki                getTestContext().getResources(), R.drawable.black_64x64));
188576269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki
188676269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        runWithCaller(CALLING_PACKAGE_2, USER_0, () -> {
188776269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki            assertTrue(mManager.setDynamicShortcuts(list(
188876269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki                    makeShortcutWithIcon("res32x32", res32x32),
188976269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki                    makeShortcutWithIcon("res64x64", res64x64),
189076269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki                    makeShortcutWithIcon("bmp32x32", bmp32x32),
189176269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki                    makeShortcutWithIcon("bmp64x64", bmp64x64))));
189276269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        });
189376269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        // We can't predict the compressed bitmap sizes, so get the real sizes here.
189476269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        final long bitmapTotal =
189576269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki                new File(getPackageShortcut(CALLING_PACKAGE_2, "bmp32x32", USER_0)
189676269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki                        .getBitmapPath()).length() +
189776269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki                new File(getPackageShortcut(CALLING_PACKAGE_2, "bmp64x64", USER_0)
189876269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki                        .getBitmapPath()).length();
189976269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki
190076269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        // Read the expected output and inject the bitmap size.
190176269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        final String expected = readTestAsset("shortcut/dumpsys_expected.txt")
190276269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki                .replace("***BITMAP_SIZE***", String.valueOf(bitmapTotal));
190376269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki
190476269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        assertEquals(expected, dumpCheckin());
190576269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki    }
190676269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki
190776269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki    public void testDumpsysNoPermission() {
190876269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        assertExpectException(SecurityException.class, "android.permission.DUMP",
190976269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki                () -> mService.dump(null, new PrintWriter(new StringWriter()), null));
191076269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki
191176269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        // System can call it without the permission.
191276269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        runWithSystemUid(() -> {
191376269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki            mService.dump(null, new PrintWriter(new StringWriter()), null);
191476269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki        });
191576269928e677725e2d9b28e2e3aa79961a60a1d0Makoto Onuki    }
191651ab2b3fd04e24e0ca98afd1c1832d84f3a9e62cMakoto Onuki}
1917