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