ContactsMockPackageManager.java revision 72e3003a810fb4793a1513d17a40f8ab83d7d0af
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; 2272e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikovimport android.os.Binder; 2372e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikovimport android.test.mock.MockPackageManager; 2472e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov 2572e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikovimport java.util.HashMap; 2672e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikovimport java.util.List; 2772e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov 2872e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov/** 2972e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov * Mock {@link PackageManager} that knows about a specific set of packages 3072e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov * to help test security models. Because {@link Binder#getCallingUid()} 3172e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov * can't be mocked, you'll have to find your mock-UID manually using your 3272e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov * {@link Context#getPackageName()}. 3372e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov */ 3472e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikovpublic class ContactsMockPackageManager extends MockPackageManager { 3572e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov private final HashMap<Integer, String> mForward = new HashMap<Integer, String>(); 3672e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov private final HashMap<String, Integer> mReverse = new HashMap<String, Integer>(); 3772e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov private List<PackageInfo> mPackages; 3872e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov 3972e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov public ContactsMockPackageManager() { 4072e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov } 4172e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov 4272e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov /** 4372e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov * Add a UID-to-package mapping, which is then stored internally. 4472e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov */ 4572e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov public void addPackage(int packageUid, String packageName) { 4672e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov mForward.put(packageUid, packageName); 4772e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov mReverse.put(packageName, packageUid); 4872e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov } 4972e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov 5072e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov @Override 5172e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov public String getNameForUid(int uid) { 5272e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov return "name-for-uid"; 5372e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov } 5472e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov 5572e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov @Override 5672e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov public String[] getPackagesForUid(int uid) { 5772e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov if (mPackages != null) { 5872e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov return new String[] { mPackages.get(0).packageName }; 5972e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov } else { 6072e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov return new String[] { ContactsActor.sCallingPackage }; 6172e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov } 6272e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov } 6372e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov 6472e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov @Override 6572e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov public ApplicationInfo getApplicationInfo(String packageName, int flags) { 6672e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov ApplicationInfo info = new ApplicationInfo(); 6772e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov Integer uid = mReverse.get(packageName); 6872e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov info.uid = (uid != null) ? uid : -1; 6972e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov return info; 7072e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov } 7172e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov 7272e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov public void setInstalledPackages(List<PackageInfo> packages) { 7372e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov this.mPackages = packages; 7472e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov } 7572e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov 7672e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov @Override 7772e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov public List<PackageInfo> getInstalledPackages(int flags) { 7872e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov return mPackages; 7972e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov } 8072e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov 8172e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov @Override 8272e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov public PackageInfo getPackageInfo(String packageName, int flags) throws NameNotFoundException { 8372e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov for (PackageInfo info : mPackages) { 8472e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov if (info.packageName.equals(packageName)) { 8572e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov return info; 8672e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov } 8772e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov } 8872e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov throw new NameNotFoundException(); 8972e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov } 9072e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov} 91