1 /*
2  * Copyright (C) 2018 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  */
16 package com.android.car.settings.testutils;
17 
18 import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED;
19 
20 import android.annotation.NonNull;
21 import android.annotation.UserIdInt;
22 import android.app.ApplicationPackageManager;
23 import android.content.ComponentName;
24 import android.content.IntentFilter;
25 import android.content.pm.ApplicationInfo;
26 import android.content.pm.IPackageDataObserver;
27 import android.content.pm.ModuleInfo;
28 import android.content.pm.PackageManager;
29 import android.content.pm.ProviderInfo;
30 import android.content.pm.ResolveInfo;
31 import android.content.res.Resources;
32 import android.graphics.drawable.Drawable;
33 import android.os.UserHandle;
34 import android.util.Pair;
35 
36 import org.robolectric.annotation.Implementation;
37 import org.robolectric.annotation.Implements;
38 import org.robolectric.annotation.Resetter;
39 
40 import java.util.Collections;
41 import java.util.HashMap;
42 import java.util.LinkedHashMap;
43 import java.util.List;
44 import java.util.Map;
45 
46 /** Shadow of ApplicationPackageManager that allows the getting of content providers per user. */
47 @Implements(value = ApplicationPackageManager.class)
48 public class ShadowApplicationPackageManager extends
49         org.robolectric.shadows.ShadowApplicationPackageManager {
50 
51     private static Resources sResources = null;
52     private static PackageManager sPackageManager;
53 
54     private final Map<Integer, String> mUserIdToDefaultBrowserMap = new HashMap<>();
55     private final Map<String, ComponentName> mPkgToDefaultActivityMap = new HashMap<>();
56     private final Map<String, IntentFilter> mPkgToDefaultActivityIntentFilterMap = new HashMap<>();
57     private final Map<IntentFilter, ComponentName> mPreferredActivities = new LinkedHashMap<>();
58     private final Map<Pair<String, Integer>, Integer> mPkgAndUserIdToIntentVerificationStatusMap =
59             new HashMap<>();
60     private List<ResolveInfo> mHomeActivities = Collections.emptyList();
61     private ComponentName mDefaultHomeActivity;
62     private String mPermissionControllerPackageName;
63 
64     @Resetter
reset()65     public static void reset() {
66         sResources = null;
67         sPackageManager = null;
68     }
69 
70     @Implementation
71     @NonNull
getInstalledModules(@ackageManager.ModuleInfoFlags int flags)72     protected List<ModuleInfo> getInstalledModules(@PackageManager.ModuleInfoFlags int flags) {
73         return Collections.emptyList();
74     }
75 
76     @Implementation
getUserBadgedIcon(Drawable icon, UserHandle user)77     protected Drawable getUserBadgedIcon(Drawable icon, UserHandle user) {
78         return icon;
79     }
80 
81     @Override
82     @Implementation
resolveContentProviderAsUser(String name, int flags, @UserIdInt int userId)83     protected ProviderInfo resolveContentProviderAsUser(String name, int flags,
84             @UserIdInt int userId) {
85         return resolveContentProvider(name, flags);
86     }
87 
88     @Implementation
getPackageUidAsUser(String packageName, int flags, int userId)89     protected int getPackageUidAsUser(String packageName, int flags, int userId)
90             throws PackageManager.NameNotFoundException {
91         return 0;
92     }
93 
94     @Implementation
deleteApplicationCacheFiles(String packageName, IPackageDataObserver observer)95     protected void deleteApplicationCacheFiles(String packageName, IPackageDataObserver observer) {
96         sPackageManager.deleteApplicationCacheFiles(packageName, observer);
97     }
98 
99     @Implementation
getResourcesForApplication(String appPackageName)100     protected Resources getResourcesForApplication(String appPackageName)
101             throws PackageManager.NameNotFoundException {
102         return sResources;
103     }
104 
105     @Implementation
getInstalledApplicationsAsUser(int flags, int userId)106     protected List<ApplicationInfo> getInstalledApplicationsAsUser(int flags, int userId) {
107         return getInstalledApplications(flags);
108     }
109 
110     @Implementation
getApplicationInfoAsUser(String packageName, int flags, int userId)111     protected ApplicationInfo getApplicationInfoAsUser(String packageName, int flags, int userId)
112             throws PackageManager.NameNotFoundException {
113         return getApplicationInfo(packageName, flags);
114     }
115 
116     @Implementation
117     @Override
getHomeActivities(List<ResolveInfo> outActivities)118     protected ComponentName getHomeActivities(List<ResolveInfo> outActivities) {
119         outActivities.addAll(mHomeActivities);
120         return mDefaultHomeActivity;
121     }
122 
123     @Implementation
124     @Override
clearPackagePreferredActivities(String packageName)125     protected void clearPackagePreferredActivities(String packageName) {
126         mPreferredActivities.clear();
127     }
128 
129     @Implementation
130     @Override
getPreferredActivities(List<IntentFilter> outFilters, List<ComponentName> outActivities, String packageName)131     public int getPreferredActivities(List<IntentFilter> outFilters,
132             List<ComponentName> outActivities, String packageName) {
133         for (IntentFilter filter : mPreferredActivities.keySet()) {
134             ComponentName name = mPreferredActivities.get(filter);
135             // If packageName is null, match everything, else filter by packageName.
136             if (packageName == null) {
137                 outFilters.add(filter);
138                 outActivities.add(name);
139             } else if (name.getPackageName().equals(packageName)) {
140                 outFilters.add(filter);
141                 outActivities.add(name);
142             }
143         }
144         return 0;
145     }
146 
147     @Implementation
148     @Override
addPreferredActivity(IntentFilter filter, int match, ComponentName[] set, ComponentName activity)149     public void addPreferredActivity(IntentFilter filter, int match, ComponentName[] set,
150             ComponentName activity) {
151         mPreferredActivities.put(filter, activity);
152     }
153 
154     @Implementation
155     @Override
getDefaultBrowserPackageNameAsUser(int userId)156     protected String getDefaultBrowserPackageNameAsUser(int userId) {
157         return mUserIdToDefaultBrowserMap.getOrDefault(userId, null);
158     }
159 
160     @Implementation
161     @Override
setDefaultBrowserPackageNameAsUser(String packageName, int userId)162     protected boolean setDefaultBrowserPackageNameAsUser(String packageName, int userId) {
163         mUserIdToDefaultBrowserMap.put(userId, packageName);
164         return true;
165     }
166 
167     @Implementation
168     @Override
getIntentVerificationStatusAsUser(String packageName, int userId)169     protected int getIntentVerificationStatusAsUser(String packageName, int userId) {
170         Pair<String, Integer> key = new Pair<>(packageName, userId);
171         return mPkgAndUserIdToIntentVerificationStatusMap.getOrDefault(key,
172                 INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED);
173     }
174 
175     @Implementation
176     @Override
updateIntentVerificationStatusAsUser(String packageName, int status, int userId)177     protected boolean updateIntentVerificationStatusAsUser(String packageName, int status,
178             int userId) {
179         Pair<String, Integer> key = new Pair<>(packageName, userId);
180         mPkgAndUserIdToIntentVerificationStatusMap.put(key, status);
181         return true;
182     }
183 
184     @Implementation
getPermissionControllerPackageName()185     protected String getPermissionControllerPackageName() {
186         return mPermissionControllerPackageName;
187     }
188 
setPermissionControllerPackageName(String packageName)189     public void setPermissionControllerPackageName(String packageName) {
190         mPermissionControllerPackageName = packageName;
191     }
192 
setHomeActivities(List<ResolveInfo> homeActivities)193     public void setHomeActivities(List<ResolveInfo> homeActivities) {
194         mHomeActivities = homeActivities;
195     }
196 
setDefaultHomeActivity(ComponentName defaultHomeActivity)197     public void setDefaultHomeActivity(ComponentName defaultHomeActivity) {
198         mDefaultHomeActivity = defaultHomeActivity;
199     }
200 
setResources(Resources resources)201     public static void setResources(Resources resources) {
202         sResources = resources;
203     }
204 
setPackageManager(PackageManager packageManager)205     public static void setPackageManager(PackageManager packageManager) {
206         sPackageManager = packageManager;
207     }
208 }
209