1 /*
2  * Copyright (C) 2010 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.providers.contacts;
17 
18 import android.content.Context;
19 import android.content.Intent;
20 import android.content.pm.ApplicationInfo;
21 import android.content.pm.PackageInfo;
22 import android.content.pm.PackageManager;
23 import android.content.pm.ProviderInfo;
24 import android.content.pm.ResolveInfo;
25 import android.content.res.Resources;
26 import android.os.Binder;
27 import android.test.mock.MockPackageManager;
28 
29 import java.util.ArrayList;
30 import java.util.HashMap;
31 import java.util.List;
32 
33 /**
34  * Mock {@link PackageManager} that knows about a specific set of packages
35  * to help test security models. Because {@link Binder#getCallingUid()}
36  * can't be mocked, you'll have to find your mock-UID manually using your
37  * {@link Context#getPackageName()}.
38  */
39 public class ContactsMockPackageManager extends MockPackageManager {
40 
41     private final Context mRealContext;
42 
43     private final HashMap<Integer, String> mForward = new HashMap<Integer, String>();
44     private final HashMap<String, Integer> mReverse = new HashMap<String, Integer>();
45     private List<PackageInfo> mPackages;
46 
ContactsMockPackageManager(Context realContext)47     public ContactsMockPackageManager(Context realContext) {
48         mRealContext = realContext;
49     }
50 
51     /**
52      * Add a UID-to-package mapping, which is then stored internally.
53      */
addPackage(int packageUid, String packageName)54     public void addPackage(int packageUid, String packageName) {
55         mForward.put(packageUid, packageName);
56         mReverse.put(packageName, packageUid);
57     }
58 
removePackage(int packageUid)59     public void removePackage(int packageUid) {
60         final String packageName = mForward.remove(packageUid);
61         if (packageName != null) {
62             mReverse.remove(packageName);
63         }
64     }
65 
66     @Override
getNameForUid(int uid)67     public String getNameForUid(int uid) {
68         return "name-for-uid";
69     }
70 
71     @Override
getPackagesForUid(int uid)72     public String[] getPackagesForUid(int uid) {
73         final String packageName = mForward.get(uid);
74         if (packageName != null) {
75             return new String[] {packageName};
76         } else if (mPackages != null) {
77             return new String[] { mPackages.get(0).packageName };
78         } else {
79             return new String[] {};
80         }
81     }
82 
83     @Override
getApplicationInfo(String packageName, int flags)84     public ApplicationInfo getApplicationInfo(String packageName, int flags)
85             throws NameNotFoundException {
86         ApplicationInfo info = new ApplicationInfo();
87         Integer uid = mReverse.get(packageName);
88         if (uid == null) {
89             throw new NameNotFoundException();
90         }
91         info.uid = (uid != null) ? uid : -1;
92         info.flags = ApplicationInfo.FLAG_INSTALLED;
93         return info;
94     }
95 
setInstalledPackages(List<PackageInfo> packages)96     public void setInstalledPackages(List<PackageInfo> packages) {
97         this.mPackages = packages;
98     }
99 
100     @Override
getInstalledPackages(int flags)101     public List<PackageInfo> getInstalledPackages(int flags) {
102         return mPackages;
103     }
104 
105     @Override
getPackageInfo(String packageName, int flags)106     public PackageInfo getPackageInfo(String packageName, int flags) throws NameNotFoundException {
107         for (PackageInfo info : mPackages) {
108             if (info.packageName.equals(packageName)) {
109                 return info;
110             }
111         }
112         throw new NameNotFoundException();
113     }
114 
115     @Override
queryBroadcastReceivers(Intent intent, int flags)116     public List<ResolveInfo> queryBroadcastReceivers(Intent intent, int flags) {
117         return new ArrayList<ResolveInfo>();
118     }
119 
120     @Override
getResourcesForApplication(String appPackageName)121     public Resources getResourcesForApplication(String appPackageName) {
122         if (mRealContext.getPackageName().equals(appPackageName)) {
123             return mRealContext.getResources();
124         }
125         return new ContactsMockResources();
126     }
127 
128     @Override
queryContentProviders(String processName, int uid, int flags, String metaDataKey)129     public List<ProviderInfo> queryContentProviders(String processName, int uid, int flags,
130             String metaDataKey) {
131         final List<ProviderInfo> ret = new ArrayList<>();
132         final List<PackageInfo> packages = getInstalledPackages(flags);
133         if (packages == null) {
134             return ret;
135         }
136         for (PackageInfo pkg : packages) {
137             if (pkg.providers == null) {
138                 continue;
139             }
140             for (ProviderInfo proi : pkg.providers) {
141                 if (metaDataKey == null) {
142                     ret.add(proi);
143                 } else {
144                     if (proi.metaData != null && proi.metaData.containsKey(metaDataKey)) {
145                         ret.add(proi);
146                     }
147                 }
148             }
149         }
150         return ret;
151     }
152 }
153