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