summaryrefslogtreecommitdiff
path: root/services/robotests/src/com/android/server/testing/shadows/ShadowApplicationPackageManager.java
blob: aea36e555ad7b55949c508957a3b8180e7d45dda (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.server.testing.shadows;

import static android.content.pm.PackageManager.NameNotFoundException;

import android.app.ApplicationPackageManager;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.ResolveInfo;
import android.os.UserHandle;
import android.util.ArrayMap;

import org.robolectric.annotation.Implements;
import org.robolectric.annotation.Resetter;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Extends {@link org.robolectric.shadows.ShadowApplicationPackageManager} to return the correct
 * package in user-specific invocations.
 */
@Implements(value = ApplicationPackageManager.class)
public class ShadowApplicationPackageManager
        extends org.robolectric.shadows.ShadowApplicationPackageManager {
    private static final Map<String, PackageInfo> sPackageInfos = new ArrayMap<>();
    private static final List<PackageInfo> sInstalledPackages = new ArrayList<>();
    private static final Map<String, Integer> sPackageUids = new ArrayMap<>();
    private static final Map<Integer, Map<String, Integer>> sUserPackageUids = new ArrayMap<>();

    /**
     * Registers the package {@code packageName} to be returned when invoking {@link
     * ApplicationPackageManager#getPackageInfoAsUser(String, int, int)} and {@link
     * ApplicationPackageManager#getInstalledPackagesAsUser(int, int)}.
     */
    public static void addInstalledPackage(String packageName, PackageInfo packageInfo) {
        sPackageInfos.put(packageName, packageInfo);
        sInstalledPackages.add(packageInfo);
    }

    /**
     * Sets the package uid {@code packageUid} for the package {@code packageName} to be returned
     * when invoking {@link ApplicationPackageManager#getPackageUidAsUser(String, int, int)}.
     */
    public static void setPackageUid(String packageName, int packageUid) {
        sPackageUids.put(packageName, packageUid);
    }

    /**
     * Sets the package uid {@code packageUid} for the package {@code packageName} to be returned
     * when invoking {@link ApplicationPackageManager#getPackageUidAsUser(String, int, int)}.
     */
    public static void setPackageUidAsUser(String packageName, int packageUid, int userId) {
        final Map<String, Integer> userPackageUids =
                sUserPackageUids.containsKey(userId)
                        ? sUserPackageUids.get(userId)
                        : new HashMap<>();
        userPackageUids.put(packageName, packageUid);
        sUserPackageUids.put(userId, userPackageUids);
    }

    @Override
    protected PackageInfo getPackageInfoAsUser(String packageName, int flags, int userId)
            throws NameNotFoundException {
        if (!sPackageInfos.containsKey(packageName)) {
            throw new NameNotFoundException(packageName);
        }
        return sPackageInfos.get(packageName);
    }

    @Override
    protected List<PackageInfo> getInstalledPackagesAsUser(int flags, int userId) {
        return sInstalledPackages;
    }

    @Override
    protected int getPackageUidAsUser(String packageName, int flags, int userId)
            throws NameNotFoundException {
        if (sUserPackageUids.containsKey(userId)
                && sUserPackageUids.get(userId).containsKey(packageName)) {
            return sUserPackageUids.get(userId).get(packageName);
        }
        if (!sPackageUids.containsKey(packageName)) {
            throw new NameNotFoundException(packageName);
        }
        return sPackageUids.get(packageName);
    }

    @Override
    protected List<ResolveInfo> queryBroadcastReceiversAsUser(
            Intent intent, int flags, UserHandle userHandle) {
        // Currently does not handle multi-user.
        return queryBroadcastReceivers(intent, flags);
    }

    /** Clear package state. */
    @Resetter
    public static void reset() {
        sPackageInfos.clear();
        sInstalledPackages.clear();
        org.robolectric.shadows.ShadowApplicationPackageManager.reset();
    }
}