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 */
16package com.android.providers.contacts;
17
18import android.content.Context;
19import android.content.pm.ApplicationInfo;
20import android.content.pm.PackageInfo;
21import android.content.pm.PackageManager;
22import android.content.pm.ProviderInfo;
23import android.content.res.Resources;
24import android.os.Binder;
25import android.test.mock.MockPackageManager;
26
27import com.google.android.collect.Lists;
28
29import java.util.HashMap;
30import java.util.List;
31
32/**
33 * Mock {@link PackageManager} that knows about a specific set of packages
34 * to help test security models. Because {@link Binder#getCallingUid()}
35 * can't be mocked, you'll have to find your mock-UID manually using your
36 * {@link Context#getPackageName()}.
37 */
38public class ContactsMockPackageManager extends MockPackageManager {
39    private final HashMap<Integer, String> mForward = new HashMap<Integer, String>();
40    private final HashMap<String, Integer> mReverse = new HashMap<String, Integer>();
41    private List<PackageInfo> mPackages;
42
43    public ContactsMockPackageManager() {
44    }
45
46    /**
47     * Add a UID-to-package mapping, which is then stored internally.
48     */
49    public void addPackage(int packageUid, String packageName) {
50        mForward.put(packageUid, packageName);
51        mReverse.put(packageName, packageUid);
52    }
53
54    @Override
55    public String getNameForUid(int uid) {
56        return "name-for-uid";
57    }
58
59    @Override
60    public String[] getPackagesForUid(int uid) {
61        if (mPackages != null) {
62            return new String[] { mPackages.get(0).packageName };
63        } else {
64            return new String[] { ContactsActor.sCallingPackage };
65        }
66    }
67
68    @Override
69    public ApplicationInfo getApplicationInfo(String packageName, int flags) {
70        ApplicationInfo info = new ApplicationInfo();
71        Integer uid = mReverse.get(packageName);
72        info.uid = (uid != null) ? uid : -1;
73        return info;
74    }
75
76    public void setInstalledPackages(List<PackageInfo> packages) {
77        this.mPackages = packages;
78    }
79
80    @Override
81    public List<PackageInfo> getInstalledPackages(int flags) {
82        return mPackages;
83    }
84
85    @Override
86    public PackageInfo getPackageInfo(String packageName, int flags) throws NameNotFoundException {
87        for (PackageInfo info : mPackages) {
88            if (info.packageName.equals(packageName)) {
89                return info;
90            }
91        }
92        throw new NameNotFoundException();
93    }
94
95    @Override
96    public Resources getResourcesForApplication(String appPackageName) {
97        return new ContactsMockResources();
98    }
99
100    @Override
101    public List<ProviderInfo> queryContentProviders(String processName, int uid, int flags) {
102        final List<ProviderInfo> ret = Lists.newArrayList();
103        if (mPackages == null) return ret;
104        for (PackageInfo packageInfo : mPackages) {
105            if (packageInfo.providers == null) continue;
106            for (ProviderInfo providerInfo : packageInfo.providers) {
107                ret.add(providerInfo);
108            }
109        }
110        return ret;
111    }
112}
113