1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package com.android.server.pm;
17
18import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.set;
19
20import android.app.Activity;
21import android.content.ComponentName;
22import android.content.pm.ActivityInfo;
23import android.content.pm.ApplicationInfo;
24import android.content.pm.PackageInfo;
25import android.content.pm.ShortcutServiceInternal;
26import android.content.res.XmlResourceParser;
27import android.os.Looper;
28import android.test.suitebuilder.annotation.SmallTest;
29
30import com.android.server.LocalServices;
31
32import java.util.List;
33import java.util.Set;
34
35/**
36 * Unit tests for all the IPackageManager related methods in {@link ShortcutService}.
37 *
38 * All the tests here actually talks to the real IPackageManager, so we can't test complicated
39 * cases.  Instead we just make sure they all work reasonably without at least crashing.
40 */
41@SmallTest
42public class ShortcutManagerTest5 extends BaseShortcutManagerTest {
43    private ShortcutService mShortcutService;
44
45    private String mMyPackage;
46    private int mMyUserId;
47
48    public static class ShortcutEnabled extends Activity {
49    }
50
51    public static class ShortcutDisabled extends Activity {
52    }
53
54    @Override
55    protected void setUp() throws Exception {
56        super.setUp();
57
58        LocalServices.removeServiceForTest(ShortcutServiceInternal.class);
59        mShortcutService = new ShortcutService(getTestContext(), Looper.getMainLooper(),
60                /* onyForPackageManagerApis */ true);
61
62        mMyPackage = getTestContext().getPackageName();
63        mMyUserId = android.os.Process.myUserHandle().getIdentifier();
64    }
65
66    public void testGetPackageUid() {
67        assertTrue(mShortcutService.injectGetPackageUid(
68                mMyPackage, mMyUserId) != 0);
69
70        assertEquals(-1, mShortcutService.injectGetPackageUid(
71                "no.such.package", mMyUserId));
72    }
73
74    public void testGetPackageInfo() {
75        PackageInfo pi = mShortcutService.getPackageInfo(
76                mMyPackage, mMyUserId, /*signature*/ false);
77        assertEquals(mMyPackage, pi.packageName);
78        assertNull(pi.signatures);
79
80        pi = mShortcutService.getPackageInfo(
81                mMyPackage, mMyUserId, /*signature*/ true);
82        assertEquals(mMyPackage, pi.packageName);
83        assertNotNull(pi.signatures);
84
85        pi = mShortcutService.getPackageInfo(
86                "no.such.package", mMyUserId, /*signature*/ true);
87        assertNull(pi);
88    }
89
90    public void testGetApplicationInfo() {
91        ApplicationInfo ai = mShortcutService.getApplicationInfo(
92                mMyPackage, mMyUserId);
93        assertEquals(mMyPackage, ai.packageName);
94
95        ai = mShortcutService.getApplicationInfo(
96                "no.such.package", mMyUserId);
97        assertNull(ai);
98    }
99
100    public void testGetActivityInfoWithMetadata() {
101        // Disabled activity
102        ActivityInfo ai = mShortcutService.getActivityInfoWithMetadata(
103                new ComponentName(mMyPackage, "ShortcutDisabled"), mMyUserId);
104        assertNull(ai);
105
106        // Nonexistent
107        ai = mShortcutService.getActivityInfoWithMetadata(
108                new ComponentName("no.such.package", "ShortcutDisabled"), mMyUserId);
109        assertNull(ai);
110
111        // Existent, with no metadata.
112        ai = mShortcutService.getActivityInfoWithMetadata(
113                new ComponentName(mMyPackage, "a.ShortcutEnabled"), mMyUserId);
114        assertEquals(mMyPackage, ai.packageName);
115        assertEquals("a.ShortcutEnabled", ai.name);
116        assertNull(ai.loadXmlMetaData(getTestContext().getPackageManager(),
117                "android.app.shortcuts"));
118
119        // Existent, with a shortcut metadata.
120        ai = mShortcutService.getActivityInfoWithMetadata(
121                new ComponentName(mMyPackage, "a.Shortcut1"), mMyUserId);
122        assertEquals(mMyPackage, ai.packageName);
123        assertEquals("a.Shortcut1", ai.name);
124        XmlResourceParser meta = ai.loadXmlMetaData(getTestContext().getPackageManager(),
125                "android.app.shortcuts");
126        assertNotNull(meta);
127        meta.close();
128    }
129
130    public void testGetInstalledPackages() {
131        List<PackageInfo> apks = mShortcutService.getInstalledPackages(mMyUserId);
132
133        Set<String> expectedPackages = set("com.android.settings", mMyPackage);
134        for (PackageInfo pi : apks) {
135            expectedPackages.remove(pi.packageName);
136        }
137        assertEquals(set(), expectedPackages);
138    }
139
140    public void testGetDefaultMainActivity() {
141        ComponentName cn = mShortcutService.injectGetDefaultMainActivity(
142                "com.android.settings", mMyUserId);
143
144        assertEquals(
145                ComponentName.unflattenFromString("com.android.settings/.Settings"),
146                cn);
147
148        // This package has no main activity.
149        assertNull(mShortcutService.injectGetDefaultMainActivity(
150                mMyPackage, mMyUserId));
151
152        // Nonexistent.
153        assertNull(mShortcutService.injectGetDefaultMainActivity(
154                "no.such.package", mMyUserId));
155    }
156
157    public void testIsMainActivity() {
158        assertTrue(mShortcutService.injectIsMainActivity(
159                ComponentName.unflattenFromString("com.android.settings/.Settings"), mMyUserId));
160        assertFalse(mShortcutService.injectIsMainActivity(
161                ComponentName.unflattenFromString("com.android.settings/.xxx"), mMyUserId));
162        assertFalse(mShortcutService.injectIsMainActivity(
163                ComponentName.unflattenFromString("no.such.package/.xxx"), mMyUserId));
164
165        assertFalse(mShortcutService.injectIsMainActivity(
166                new ComponentName(mMyPackage, "a.DisabledMain"), mMyUserId));
167        assertFalse(mShortcutService.injectIsMainActivity(
168                new ComponentName(mMyPackage, "a.UnexportedMain"), mMyUserId));
169
170    }
171
172    public void testGetMainActivities() {
173        assertEquals(1, mShortcutService.injectGetMainActivities(
174                "com.android.settings", mMyUserId).size());
175
176        // This APK has no main activities.
177        assertEquals(0, mShortcutService.injectGetMainActivities(
178                mMyPackage, mMyUserId).size());
179    }
180
181    public void testIsActivityEnabledAndExported() {
182        assertTrue(mShortcutService.injectIsActivityEnabledAndExported(
183                ComponentName.unflattenFromString("com.android.settings/.Settings"), mMyUserId));
184        assertFalse(mShortcutService.injectIsActivityEnabledAndExported(
185                ComponentName.unflattenFromString("com.android.settings/.xxx"), mMyUserId));
186        assertFalse(mShortcutService.injectIsActivityEnabledAndExported(
187                ComponentName.unflattenFromString("no.such.package/.xxx"), mMyUserId));
188
189        assertTrue(mShortcutService.injectIsActivityEnabledAndExported(
190                new ComponentName(mMyPackage, "com.android.server.pm.ShortcutTestActivity"),
191                mMyUserId));
192
193        assertTrue(mShortcutService.injectIsActivityEnabledAndExported(
194                new ComponentName(mMyPackage, "a.ShortcutEnabled"), mMyUserId));
195
196        assertFalse(mShortcutService.injectIsActivityEnabledAndExported(
197                new ComponentName(mMyPackage, "a.ShortcutDisabled"), mMyUserId));
198        assertFalse(mShortcutService.injectIsActivityEnabledAndExported(
199                new ComponentName(mMyPackage, "a.ShortcutUnexported"), mMyUserId));
200
201    }
202}
203