ContactsMockPackageManager.java revision 0bf6b318e3c994294d4a885f57906debd4a0e64e
172e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov/*
272e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov * Copyright (C) 2010 The Android Open Source Project
372e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov *
472e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov * Licensed under the Apache License, Version 2.0 (the "License");
572e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov * you may not use this file except in compliance with the License.
672e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov * You may obtain a copy of the License at
772e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov *
872e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov *      http://www.apache.org/licenses/LICENSE-2.0
972e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov *
1072e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov * Unless required by applicable law or agreed to in writing, software
1172e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov * distributed under the License is distributed on an "AS IS" BASIS,
1272e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1372e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov * See the License for the specific language governing permissions and
1472e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov * limitations under the License.
1572e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov */
1672e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikovpackage com.android.providers.contacts;
1772e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov
1872e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikovimport android.content.Context;
1972e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikovimport android.content.pm.ApplicationInfo;
2072e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikovimport android.content.pm.PackageInfo;
2172e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikovimport android.content.pm.PackageManager;
22e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikovimport android.content.res.Resources;
2372e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikovimport android.os.Binder;
2472e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikovimport android.test.mock.MockPackageManager;
2572e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov
2672e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikovimport java.util.HashMap;
2772e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikovimport java.util.List;
2872e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov
2972e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov/**
3072e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov * Mock {@link PackageManager} that knows about a specific set of packages
3172e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov * to help test security models. Because {@link Binder#getCallingUid()}
3272e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov * can't be mocked, you'll have to find your mock-UID manually using your
3372e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov * {@link Context#getPackageName()}.
3472e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov */
3572e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikovpublic class ContactsMockPackageManager extends MockPackageManager {
3672e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov    private final HashMap<Integer, String> mForward = new HashMap<Integer, String>();
3772e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov    private final HashMap<String, Integer> mReverse = new HashMap<String, Integer>();
3872e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov    private List<PackageInfo> mPackages;
3972e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov
4072e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov    public ContactsMockPackageManager() {
4172e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov    }
4272e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov
4372e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov    /**
4472e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov     * Add a UID-to-package mapping, which is then stored internally.
4572e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov     */
4672e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov    public void addPackage(int packageUid, String packageName) {
4772e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov        mForward.put(packageUid, packageName);
4872e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov        mReverse.put(packageName, packageUid);
4972e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov    }
5072e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov
5172e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov    @Override
5272e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov    public String getNameForUid(int uid) {
5372e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov        return "name-for-uid";
5472e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov    }
5572e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov
5672e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov    @Override
5772e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov    public String[] getPackagesForUid(int uid) {
5872e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov        if (mPackages != null) {
5972e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov            return new String[] { mPackages.get(0).packageName };
6072e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov        } else {
6172e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov            return new String[] { ContactsActor.sCallingPackage };
6272e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov        }
6372e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov    }
6472e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov
6572e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov    @Override
6672e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov    public ApplicationInfo getApplicationInfo(String packageName, int flags) {
6772e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov        ApplicationInfo info = new ApplicationInfo();
6872e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov        Integer uid = mReverse.get(packageName);
6972e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov        info.uid = (uid != null) ? uid : -1;
7072e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov        return info;
7172e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov    }
7272e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov
7372e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov    public void setInstalledPackages(List<PackageInfo> packages) {
7472e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov        this.mPackages = packages;
7572e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov    }
7672e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov
7772e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov    @Override
7872e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov    public List<PackageInfo> getInstalledPackages(int flags) {
7972e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov        return mPackages;
8072e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov    }
8172e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov
8272e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov    @Override
8372e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov    public PackageInfo getPackageInfo(String packageName, int flags) throws NameNotFoundException {
8472e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov        for (PackageInfo info : mPackages) {
8572e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov            if (info.packageName.equals(packageName)) {
8672e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov                return info;
8772e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov            }
8872e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov        }
8972e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov        throw new NameNotFoundException();
9072e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov    }
91e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov
92e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov    @Override
93e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov    public Resources getResourcesForApplication(String appPackageName) {
940bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann        return new ContactsMockResources();
95e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov    }
9672e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov}
97