ApplicationPackageManager.java revision 880119bf43d738ca632b5d3861eb52d655c1c0fc
1390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick/*
2390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick * Copyright (C) 2010 The Android Open Source Project
3390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick *
4390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick * Licensed under the Apache License, Version 2.0 (the "License");
5390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick * you may not use this file except in compliance with the License.
6390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick * You may obtain a copy of the License at
7390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick *
8390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick *      http://www.apache.org/licenses/LICENSE-2.0
9390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick *
10390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick * Unless required by applicable law or agreed to in writing, software
11390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick * distributed under the License is distributed on an "AS IS" BASIS,
12390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick * See the License for the specific language governing permissions and
14390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick * limitations under the License.
15390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick */
16390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
17390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickpackage android.app;
18390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
19390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.ComponentName;
20390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.ContentResolver;
21390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.Intent;
22390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.IntentFilter;
23390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.IntentSender;
24390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.pm.ActivityInfo;
25390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.pm.ApplicationInfo;
26390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.pm.ComponentInfo;
27390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.pm.FeatureInfo;
28390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.pm.IPackageDataObserver;
29390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.pm.IPackageDeleteObserver;
30390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.pm.IPackageInstallObserver;
31390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.pm.IPackageManager;
32390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.pm.IPackageMoveObserver;
33390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.pm.IPackageStatsObserver;
34390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.pm.InstrumentationInfo;
35390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.pm.PackageInfo;
36390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.pm.PackageManager.NameNotFoundException;
37390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.pm.PackageManager;
38390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.pm.PermissionGroupInfo;
39390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.pm.PermissionInfo;
40390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.pm.ProviderInfo;
41390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.pm.ResolveInfo;
42390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.pm.ServiceInfo;
43390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.res.Resources;
44390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.content.res.XmlResourceParser;
45390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.graphics.drawable.Drawable;
46390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.net.Uri;
47390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.os.Process;
48390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.os.RemoteException;
49390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport android.util.Log;
50390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
51390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport java.lang.ref.WeakReference;
52390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport java.util.ArrayList;
53390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport java.util.HashMap;
54390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport java.util.Iterator;
55390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickimport java.util.List;
56390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
57390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick/*package*/
58390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrickfinal class ApplicationPackageManager extends PackageManager {
59390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    private static final String TAG = "ApplicationPackageManager";
60390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    private final static boolean DEBUG = false;
61390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    private final static boolean DEBUG_ICONS = false;
62390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
63390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
64390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public PackageInfo getPackageInfo(String packageName, int flags)
65390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throws NameNotFoundException {
66390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
67390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            PackageInfo pi = mPM.getPackageInfo(packageName, flags);
68390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (pi != null) {
69390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                return pi;
70390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
71390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
72390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throw new RuntimeException("Package manager has died", e);
73390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
74390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
75390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        throw new NameNotFoundException(packageName);
76390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
77390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
78390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
79390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public String[] currentToCanonicalPackageNames(String[] names) {
80390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
81390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.currentToCanonicalPackageNames(names);
82390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
83390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throw new RuntimeException("Package manager has died", e);
84390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
85390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
86390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
87390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
88390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public String[] canonicalToCurrentPackageNames(String[] names) {
89390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
90390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.canonicalToCurrentPackageNames(names);
91390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
92390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throw new RuntimeException("Package manager has died", e);
93390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
94390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
95390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
96390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
97390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public Intent getLaunchIntentForPackage(String packageName) {
98390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        // First see if the package has an INFO activity; the existence of
99390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        // such an activity is implied to be the desired front-door for the
100390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        // overall package (such as if it has multiple launcher entries).
101390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        Intent intentToResolve = new Intent(Intent.ACTION_MAIN);
102390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        intentToResolve.addCategory(Intent.CATEGORY_INFO);
103390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        intentToResolve.setPackage(packageName);
104390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        ResolveInfo resolveInfo = resolveActivity(intentToResolve, 0);
105390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
106390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        // Otherwise, try to find a main launcher activity.
107390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        if (resolveInfo == null) {
108390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            // reuse the intent instance
109390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            intentToResolve.removeCategory(Intent.CATEGORY_INFO);
110390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            intentToResolve.addCategory(Intent.CATEGORY_LAUNCHER);
111390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            intentToResolve.setPackage(packageName);
112390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            resolveInfo = resolveActivity(intentToResolve, 0);
113390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
114390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        if (resolveInfo == null) {
115390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return null;
116390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
117390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        Intent intent = new Intent(intentToResolve);
118390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        intent.setClassName(resolveInfo.activityInfo.applicationInfo.packageName,
119390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                            resolveInfo.activityInfo.name);
120390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
121390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        return intent;
122390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
123390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
124390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
125390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public int[] getPackageGids(String packageName)
126390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throws NameNotFoundException {
127390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
128390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            int[] gids = mPM.getPackageGids(packageName);
129390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (gids == null || gids.length > 0) {
130390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                return gids;
131390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
132390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
133390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throw new RuntimeException("Package manager has died", e);
134390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
135390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
136390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        throw new NameNotFoundException(packageName);
137390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
138390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
139390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
140390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public PermissionInfo getPermissionInfo(String name, int flags)
141390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throws NameNotFoundException {
142390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
143390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            PermissionInfo pi = mPM.getPermissionInfo(name, flags);
144390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (pi != null) {
145390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                return pi;
146390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
147390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
148390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throw new RuntimeException("Package manager has died", e);
149390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
150390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
151390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        throw new NameNotFoundException(name);
152390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
153390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
154390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
155390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public List<PermissionInfo> queryPermissionsByGroup(String group, int flags)
156390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throws NameNotFoundException {
157390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
158390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            List<PermissionInfo> pi = mPM.queryPermissionsByGroup(group, flags);
159390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (pi != null) {
160390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                return pi;
161390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
162390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
163390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throw new RuntimeException("Package manager has died", e);
164390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
165390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
166390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        throw new NameNotFoundException(group);
167390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
168390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
169390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
170390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public PermissionGroupInfo getPermissionGroupInfo(String name,
171390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                                      int flags) throws NameNotFoundException {
172390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
173390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            PermissionGroupInfo pgi = mPM.getPermissionGroupInfo(name, flags);
174390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (pgi != null) {
175390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                return pgi;
176390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
177390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
178390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throw new RuntimeException("Package manager has died", e);
179390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
180390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
181390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        throw new NameNotFoundException(name);
182390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
183390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
184390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
185390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public List<PermissionGroupInfo> getAllPermissionGroups(int flags) {
186390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
187390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.getAllPermissionGroups(flags);
188390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
189390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throw new RuntimeException("Package manager has died", e);
190390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
191390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
192390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
193390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
194390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public ApplicationInfo getApplicationInfo(String packageName, int flags)
195390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throws NameNotFoundException {
196390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
197390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            ApplicationInfo ai = mPM.getApplicationInfo(packageName, flags);
198390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (ai != null) {
199390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                return ai;
200390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
201390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
202390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throw new RuntimeException("Package manager has died", e);
203390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
204390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
205390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        throw new NameNotFoundException(packageName);
206390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
207390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
208390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
209390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public ActivityInfo getActivityInfo(ComponentName className, int flags)
210390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throws NameNotFoundException {
211390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
212390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            ActivityInfo ai = mPM.getActivityInfo(className, flags);
213390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (ai != null) {
214390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                return ai;
215390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
216390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
217390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throw new RuntimeException("Package manager has died", e);
218390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
219390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
220390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        throw new NameNotFoundException(className.toString());
221390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
222390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
223390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
224390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public ActivityInfo getReceiverInfo(ComponentName className, int flags)
225390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throws NameNotFoundException {
226390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
227390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            ActivityInfo ai = mPM.getReceiverInfo(className, flags);
228390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (ai != null) {
229390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                return ai;
230390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
231390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
232390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throw new RuntimeException("Package manager has died", e);
233390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
234390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
235390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        throw new NameNotFoundException(className.toString());
236390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
237390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
238390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
239390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public ServiceInfo getServiceInfo(ComponentName className, int flags)
240390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throws NameNotFoundException {
241390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
242390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            ServiceInfo si = mPM.getServiceInfo(className, flags);
243390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (si != null) {
244390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                return si;
245390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
246390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
247390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throw new RuntimeException("Package manager has died", e);
248390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
249390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
250390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        throw new NameNotFoundException(className.toString());
251390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
252390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
253390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
254390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public ProviderInfo getProviderInfo(ComponentName className, int flags)
255390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throws NameNotFoundException {
256390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
257390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            ProviderInfo pi = mPM.getProviderInfo(className, flags);
258390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (pi != null) {
259390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                return pi;
260390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
261390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
262390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throw new RuntimeException("Package manager has died", e);
263390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
264390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
265390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        throw new NameNotFoundException(className.toString());
266390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
267390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
268390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
269390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public String[] getSystemSharedLibraryNames() {
270390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
271390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.getSystemSharedLibraryNames();
272390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
273390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throw new RuntimeException("Package manager has died", e);
274390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
275390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
276390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
277390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
278390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public FeatureInfo[] getSystemAvailableFeatures() {
279390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
280390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.getSystemAvailableFeatures();
281390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
282390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throw new RuntimeException("Package manager has died", e);
283390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
284390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
285390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
286390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
287390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public boolean hasSystemFeature(String name) {
288390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
289390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.hasSystemFeature(name);
290390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
291390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throw new RuntimeException("Package manager has died", e);
292390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
293390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
294390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
295390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
296390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public int checkPermission(String permName, String pkgName) {
297390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
298390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.checkPermission(permName, pkgName);
299390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
300390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throw new RuntimeException("Package manager has died", e);
301390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
302390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
303390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
304390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
305390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public boolean addPermission(PermissionInfo info) {
306390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
307390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.addPermission(info);
308390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
309390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throw new RuntimeException("Package manager has died", e);
310390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
311390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
312390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
313390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
314390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public boolean addPermissionAsync(PermissionInfo info) {
315390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
316390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.addPermissionAsync(info);
317390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
318390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throw new RuntimeException("Package manager has died", e);
319390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
320390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
321390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
322390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
323390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public void removePermission(String name) {
324390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
325390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            mPM.removePermission(name);
326390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
327390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throw new RuntimeException("Package manager has died", e);
328390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
329390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
330390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
331390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
332390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public int checkSignatures(String pkg1, String pkg2) {
333390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
334390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.checkSignatures(pkg1, pkg2);
335390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
336390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throw new RuntimeException("Package manager has died", e);
337390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
338390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
339390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
340390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
341390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public int checkSignatures(int uid1, int uid2) {
342390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
343390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.checkUidSignatures(uid1, uid2);
344390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
345390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throw new RuntimeException("Package manager has died", e);
346390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
347390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
348390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
349390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
350390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public String[] getPackagesForUid(int uid) {
351390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
352390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.getPackagesForUid(uid);
353390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
354390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throw new RuntimeException("Package manager has died", e);
355390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
356390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
357390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
358390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
359390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public String getNameForUid(int uid) {
360390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
361390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.getNameForUid(uid);
362390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
363390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throw new RuntimeException("Package manager has died", e);
364390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
365390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
366390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
367390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
368390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public int getUidForSharedUser(String sharedUserName)
369390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throws NameNotFoundException {
370390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
371390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            int uid = mPM.getUidForSharedUser(sharedUserName);
372390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if(uid != -1) {
373390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                return uid;
374390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
375390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
376390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throw new RuntimeException("Package manager has died", e);
377390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
378390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        throw new NameNotFoundException("No shared userid for user:"+sharedUserName);
379390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
380390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
381390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
382390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public List<PackageInfo> getInstalledPackages(int flags) {
383390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
384390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.getInstalledPackages(flags);
385390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
386390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throw new RuntimeException("Package manager has died", e);
387390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
388390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
389390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
390390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
391390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public List<ApplicationInfo> getInstalledApplications(int flags) {
392390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
393390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.getInstalledApplications(flags);
394390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
395390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throw new RuntimeException("Package manager has died", e);
396390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
397390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
398390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
399390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
400390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public ResolveInfo resolveActivity(Intent intent, int flags) {
401390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
402390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.resolveIntent(
403390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                intent,
404390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                intent.resolveTypeIfNeeded(mContext.getContentResolver()),
405390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                flags);
406390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
407390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throw new RuntimeException("Package manager has died", e);
408390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
409390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
410390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
411390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
412390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public List<ResolveInfo> queryIntentActivities(Intent intent,
413390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                                   int flags) {
414390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
415390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.queryIntentActivities(
416390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                intent,
417390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                intent.resolveTypeIfNeeded(mContext.getContentResolver()),
418390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                flags);
419390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
420390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throw new RuntimeException("Package manager has died", e);
421390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
422390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
423390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
424390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
425390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public List<ResolveInfo> queryIntentActivityOptions(
426390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        ComponentName caller, Intent[] specifics, Intent intent,
427390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        int flags) {
428390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        final ContentResolver resolver = mContext.getContentResolver();
429390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
430390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        String[] specificTypes = null;
431390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        if (specifics != null) {
432390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            final int N = specifics.length;
433390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            for (int i=0; i<N; i++) {
434390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                Intent sp = specifics[i];
435390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                if (sp != null) {
436390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                    String t = sp.resolveTypeIfNeeded(resolver);
437390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                    if (t != null) {
438390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                        if (specificTypes == null) {
439390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                            specificTypes = new String[N];
440390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                        }
441390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                        specificTypes[i] = t;
442390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                    }
443390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                }
444390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
445390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
446390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
447390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
448390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.queryIntentActivityOptions(caller, specifics,
449390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                                  specificTypes, intent, intent.resolveTypeIfNeeded(resolver),
450390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                                  flags);
451390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
452390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throw new RuntimeException("Package manager has died", e);
453390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
454390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
455390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
456390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
457390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public List<ResolveInfo> queryBroadcastReceivers(Intent intent, int flags) {
458390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
459390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.queryIntentReceivers(
460390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                intent,
461390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                intent.resolveTypeIfNeeded(mContext.getContentResolver()),
462390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                flags);
463390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
464390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throw new RuntimeException("Package manager has died", e);
465390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
466390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
467390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
468390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
469390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public ResolveInfo resolveService(Intent intent, int flags) {
470390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
471390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.resolveService(
472390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                intent,
473390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                intent.resolveTypeIfNeeded(mContext.getContentResolver()),
474390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                flags);
475390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
476390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throw new RuntimeException("Package manager has died", e);
477390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
478390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
479390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
480390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
481390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public List<ResolveInfo> queryIntentServices(Intent intent, int flags) {
482390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
483390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.queryIntentServices(
484390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                intent,
485390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                intent.resolveTypeIfNeeded(mContext.getContentResolver()),
486390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                flags);
487390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
488390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throw new RuntimeException("Package manager has died", e);
489390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
490390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
491390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
492390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
493390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public ProviderInfo resolveContentProvider(String name,
494390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                               int flags) {
495390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
496390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.resolveContentProvider(name, flags);
497390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
498390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throw new RuntimeException("Package manager has died", e);
499390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
500390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
501390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
502390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
503390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public List<ProviderInfo> queryContentProviders(String processName,
504390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                                    int uid, int flags) {
505390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
506390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.queryContentProviders(processName, uid, flags);
507390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
508390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throw new RuntimeException("Package manager has died", e);
509390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
510390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
511390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
512390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
513390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public InstrumentationInfo getInstrumentationInfo(
514390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        ComponentName className, int flags)
515390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throws NameNotFoundException {
516390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
517390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            InstrumentationInfo ii = mPM.getInstrumentationInfo(
518390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                className, flags);
519390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (ii != null) {
520390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                return ii;
521390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
522390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
523390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throw new RuntimeException("Package manager has died", e);
524390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
525390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
526390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        throw new NameNotFoundException(className.toString());
527390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
528390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
529390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
530390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public List<InstrumentationInfo> queryInstrumentation(
531390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        String targetPackage, int flags) {
532390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
533390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.queryInstrumentation(targetPackage, flags);
534390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
535390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throw new RuntimeException("Package manager has died", e);
536390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
537390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
538390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
539390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override public Drawable getDrawable(String packageName, int resid,
540390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                          ApplicationInfo appInfo) {
541390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        ResourceName name = new ResourceName(packageName, resid);
542390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        Drawable dr = getCachedIcon(name);
543390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        if (dr != null) {
544390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return dr;
545390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
546390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        if (appInfo == null) {
547390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            try {
548390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                appInfo = getApplicationInfo(packageName, 0);
549390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            } catch (NameNotFoundException e) {
550390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                return null;
551390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
552390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
553390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
554390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            Resources r = getResourcesForApplication(appInfo);
555390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            dr = r.getDrawable(resid);
556390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (false) {
557390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                RuntimeException e = new RuntimeException("here");
558390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                e.fillInStackTrace();
559390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                Log.w(TAG, "Getting drawable 0x" + Integer.toHexString(resid)
560390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                      + " from package " + packageName
561390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                      + ": app scale=" + r.getCompatibilityInfo().applicationScale
562390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                      + ", caller scale=" + mContext.getResources().getCompatibilityInfo().applicationScale,
563390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                      e);
564390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
565390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (DEBUG_ICONS) Log.v(TAG, "Getting drawable 0x"
566390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                   + Integer.toHexString(resid) + " from " + r
567390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                   + ": " + dr);
568390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            putCachedIcon(name, dr);
569390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return dr;
570390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (NameNotFoundException e) {
571390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            Log.w("PackageManager", "Failure retrieving resources for"
572390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                  + appInfo.packageName);
573390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RuntimeException e) {
574390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            // If an exception was thrown, fall through to return
575390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            // default icon.
576390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            Log.w("PackageManager", "Failure retrieving icon 0x"
577390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                  + Integer.toHexString(resid) + " in package "
578390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                  + packageName, e);
579390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
580390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        return null;
581390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
582390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
583390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override public Drawable getActivityIcon(ComponentName activityName)
584390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throws NameNotFoundException {
585390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        return getActivityInfo(activityName, 0).loadIcon(this);
586390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
587390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
588390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override public Drawable getActivityIcon(Intent intent)
589390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throws NameNotFoundException {
590390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        if (intent.getComponent() != null) {
591390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return getActivityIcon(intent.getComponent());
592390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
593390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
594390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        ResolveInfo info = resolveActivity(
595390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            intent, PackageManager.MATCH_DEFAULT_ONLY);
596390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        if (info != null) {
597390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return info.activityInfo.loadIcon(this);
598390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
599390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
600390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        throw new NameNotFoundException(intent.toURI());
601390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
602390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
603390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override public Drawable getDefaultActivityIcon() {
604390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        return Resources.getSystem().getDrawable(
605390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            com.android.internal.R.drawable.sym_def_app_icon);
606390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
607390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
608390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override public Drawable getApplicationIcon(ApplicationInfo info) {
609390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        return info.loadIcon(this);
610390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
611390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
612390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override public Drawable getApplicationIcon(String packageName)
613390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throws NameNotFoundException {
614390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        return getApplicationIcon(getApplicationInfo(packageName, 0));
615390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
616390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
617390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
618390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public Drawable getActivityLogo(ComponentName activityName)
619390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throws NameNotFoundException {
620390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        return getActivityInfo(activityName, 0).loadLogo(this);
621390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
622390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
623390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
624390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public Drawable getActivityLogo(Intent intent)
625390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throws NameNotFoundException {
626390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        if (intent.getComponent() != null) {
627390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return getActivityLogo(intent.getComponent());
628390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
629390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
630390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        ResolveInfo info = resolveActivity(
631390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            intent, PackageManager.MATCH_DEFAULT_ONLY);
632390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        if (info != null) {
633390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return info.activityInfo.loadLogo(this);
634390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
635390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
636390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        throw new NameNotFoundException(intent.toUri(0));
637390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
638390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
639390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
640390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public Drawable getApplicationLogo(ApplicationInfo info) {
641390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        return info.loadLogo(this);
642390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
643390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
644390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
645390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public Drawable getApplicationLogo(String packageName)
646390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throws NameNotFoundException {
647390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        return getApplicationLogo(getApplicationInfo(packageName, 0));
648390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
649390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
650390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override public Resources getResourcesForActivity(
651390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        ComponentName activityName) throws NameNotFoundException {
652390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        return getResourcesForApplication(
653390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            getActivityInfo(activityName, 0).applicationInfo);
654390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
655390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
656390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override public Resources getResourcesForApplication(
657390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        ApplicationInfo app) throws NameNotFoundException {
658390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        if (app.packageName.equals("system")) {
659390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mContext.mMainThread.getSystemContext().getResources();
660390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
661390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        Resources r = mContext.mMainThread.getTopLevelResources(
662390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            app.uid == Process.myUid() ? app.sourceDir
663390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            : app.publicSourceDir, mContext.mPackageInfo);
664390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        if (r != null) {
665390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return r;
666390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
667390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        throw new NameNotFoundException("Unable to open " + app.publicSourceDir);
668390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
669390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
670390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override public Resources getResourcesForApplication(
671390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        String appPackageName) throws NameNotFoundException {
672390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        return getResourcesForApplication(
673390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            getApplicationInfo(appPackageName, 0));
674390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
675390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
676390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    int mCachedSafeMode = -1;
677390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override public boolean isSafeMode() {
678390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
679390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (mCachedSafeMode < 0) {
680390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                mCachedSafeMode = mPM.isSafeMode() ? 1 : 0;
681390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
682390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mCachedSafeMode != 0;
683390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
684390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            throw new RuntimeException("Package manager has died", e);
685390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
686390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
687390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
688390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    static void configurationChanged() {
689390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        synchronized (sSync) {
690390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            sIconCache.clear();
691390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            sStringCache.clear();
692390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
693390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
694390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
695390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    ApplicationPackageManager(ContextImpl context,
696390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                              IPackageManager pm) {
697390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        mContext = context;
698390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        mPM = pm;
699390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
700390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
701390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    private Drawable getCachedIcon(ResourceName name) {
702390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        synchronized (sSync) {
703390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            WeakReference<Drawable> wr = sIconCache.get(name);
704390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (DEBUG_ICONS) Log.v(TAG, "Get cached weak drawable ref for "
705390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                   + name + ": " + wr);
706390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (wr != null) {   // we have the activity
707390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                Drawable dr = wr.get();
708390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                if (dr != null) {
709390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                    if (DEBUG_ICONS) Log.v(TAG, "Get cached drawable for "
710390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                           + name + ": " + dr);
711390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                    return dr;
712390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                }
713390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                // our entry has been purged
714390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                sIconCache.remove(name);
715390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
716390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
717390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        return null;
718390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
719390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
720390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    private void putCachedIcon(ResourceName name, Drawable dr) {
721390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        synchronized (sSync) {
722390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            sIconCache.put(name, new WeakReference<Drawable>(dr));
723390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (DEBUG_ICONS) Log.v(TAG, "Added cached drawable for "
724390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                   + name + ": " + dr);
725390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
726390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
727390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
728390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    static final void handlePackageBroadcast(int cmd, String[] pkgList,
729390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                             boolean hasPkgInfo) {
730390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        boolean immediateGc = false;
731390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        if (cmd == IApplicationThread.EXTERNAL_STORAGE_UNAVAILABLE) {
732390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            immediateGc = true;
733390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
734390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        if (pkgList != null && (pkgList.length > 0)) {
735390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            boolean needCleanup = false;
736390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            for (String ssp : pkgList) {
737390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                synchronized (sSync) {
738390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                    if (sIconCache.size() > 0) {
739390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                        Iterator<ResourceName> it = sIconCache.keySet().iterator();
740390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                        while (it.hasNext()) {
741390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                            ResourceName nm = it.next();
742390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                            if (nm.packageName.equals(ssp)) {
743390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                //Log.i(TAG, "Removing cached drawable for " + nm);
744390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                it.remove();
745390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                needCleanup = true;
746390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                            }
747390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                        }
748390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                    }
749390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                    if (sStringCache.size() > 0) {
750390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                        Iterator<ResourceName> it = sStringCache.keySet().iterator();
751390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                        while (it.hasNext()) {
752390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                            ResourceName nm = it.next();
753390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                            if (nm.packageName.equals(ssp)) {
754390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                //Log.i(TAG, "Removing cached string for " + nm);
755390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                it.remove();
756390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                needCleanup = true;
757390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                            }
758390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                        }
759390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                    }
760390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                }
761390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
762390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (needCleanup || hasPkgInfo) {
763390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                if (immediateGc) {
764390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                    // Schedule an immediate gc.
765390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                    Runtime.getRuntime().gc();
766390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                } else {
767390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                    ActivityThread.currentActivityThread().scheduleGcIdler();
768390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                }
769390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
770390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
771390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
772390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
773390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    private static final class ResourceName {
774390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        final String packageName;
775390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        final int iconId;
776390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
777390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        ResourceName(String _packageName, int _iconId) {
778390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            packageName = _packageName;
779390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            iconId = _iconId;
780390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
781390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
782390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        ResourceName(ApplicationInfo aInfo, int _iconId) {
783390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            this(aInfo.packageName, _iconId);
784390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
785390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
786390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        ResourceName(ComponentInfo cInfo, int _iconId) {
787390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            this(cInfo.applicationInfo.packageName, _iconId);
788390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
789390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
790390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        ResourceName(ResolveInfo rInfo, int _iconId) {
791390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            this(rInfo.activityInfo.applicationInfo.packageName, _iconId);
792390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
793390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
794390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        @Override
795390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        public boolean equals(Object o) {
796390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (this == o) return true;
797390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (o == null || getClass() != o.getClass()) return false;
798390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
799390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            ResourceName that = (ResourceName) o;
800390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
801390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (iconId != that.iconId) return false;
802390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return !(packageName != null ?
803390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                     !packageName.equals(that.packageName) : that.packageName != null);
804390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
805390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
806390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
807390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        @Override
808390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        public int hashCode() {
809390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            int result;
810390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            result = packageName.hashCode();
811390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            result = 31 * result + iconId;
812390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return result;
813390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
814390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
815390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        @Override
816390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        public String toString() {
817390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return "{ResourceName " + packageName + " / " + iconId + "}";
818390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
819390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
820390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
821390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    private CharSequence getCachedString(ResourceName name) {
822390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        synchronized (sSync) {
823390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            WeakReference<CharSequence> wr = sStringCache.get(name);
824390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            if (wr != null) {   // we have the activity
825390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                CharSequence cs = wr.get();
826390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                if (cs != null) {
827390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                    return cs;
828390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                }
829390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                // our entry has been purged
830390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                sStringCache.remove(name);
831390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
832390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
833390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        return null;
834390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
835390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
836390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    private void putCachedString(ResourceName name, CharSequence cs) {
837390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        synchronized (sSync) {
838390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            sStringCache.put(name, new WeakReference<CharSequence>(cs));
839390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
840390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
841390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
842390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
843390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public CharSequence getText(String packageName, int resid,
844390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                ApplicationInfo appInfo) {
845390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        ResourceName name = new ResourceName(packageName, resid);
846390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        CharSequence text = getCachedString(name);
847390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        if (text != null) {
848390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return text;
849390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
850390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        if (appInfo == null) {
851390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            try {
852390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                appInfo = getApplicationInfo(packageName, 0);
853390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            } catch (NameNotFoundException e) {
854390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                return null;
855390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
856390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
857390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
858390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            Resources r = getResourcesForApplication(appInfo);
859390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            text = r.getText(resid);
860390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            putCachedString(name, text);
861390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return text;
862390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (NameNotFoundException e) {
863390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            Log.w("PackageManager", "Failure retrieving resources for"
864390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                  + appInfo.packageName);
865390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RuntimeException e) {
866390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            // If an exception was thrown, fall through to return
867390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            // default icon.
868390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            Log.w("PackageManager", "Failure retrieving text 0x"
869390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                  + Integer.toHexString(resid) + " in package "
870390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                  + packageName, e);
871390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
872390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        return null;
873390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
874390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
875390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
876390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public XmlResourceParser getXml(String packageName, int resid,
877390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                    ApplicationInfo appInfo) {
878390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        if (appInfo == null) {
879390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            try {
880390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                appInfo = getApplicationInfo(packageName, 0);
881390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            } catch (NameNotFoundException e) {
882390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                return null;
883390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            }
884390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
885390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
886390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            Resources r = getResourcesForApplication(appInfo);
887390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return r.getXml(resid);
888390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RuntimeException e) {
889390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            // If an exception was thrown, fall through to return
890390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            // default icon.
891390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            Log.w("PackageManager", "Failure retrieving xml 0x"
892390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                  + Integer.toHexString(resid) + " in package "
893390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                  + packageName, e);
894390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (NameNotFoundException e) {
8953fa51e3430e3bf902ae4f2d72dfb956103b6bd2dAlon Albert            Log.w("PackageManager", "Failure retrieving resources for "
896390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                  + appInfo.packageName);
897390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
898390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        return null;
899390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
900390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
901390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
902390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public CharSequence getApplicationLabel(ApplicationInfo info) {
903390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        return info.loadLabel(this);
904390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
905390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
906390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
907390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public void installPackage(Uri packageURI, IPackageInstallObserver observer, int flags,
908390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                               String installerPackageName) {
909390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
910390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            mPM.installPackage(packageURI, observer, flags, installerPackageName);
911390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
912390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            // Should never happen!
913390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
914390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
915390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
916390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
917880119bf43d738ca632b5d3861eb52d655c1c0fcDianne Hackborn    public void setInstallerPackageName(String targetPackage,
918880119bf43d738ca632b5d3861eb52d655c1c0fcDianne Hackborn            String installerPackageName) {
919880119bf43d738ca632b5d3861eb52d655c1c0fcDianne Hackborn        try {
920880119bf43d738ca632b5d3861eb52d655c1c0fcDianne Hackborn            mPM.setInstallerPackageName(targetPackage, installerPackageName);
921880119bf43d738ca632b5d3861eb52d655c1c0fcDianne Hackborn        } catch (RemoteException e) {
922880119bf43d738ca632b5d3861eb52d655c1c0fcDianne Hackborn            // Should never happen!
923880119bf43d738ca632b5d3861eb52d655c1c0fcDianne Hackborn        }
924880119bf43d738ca632b5d3861eb52d655c1c0fcDianne Hackborn    }
925880119bf43d738ca632b5d3861eb52d655c1c0fcDianne Hackborn
926880119bf43d738ca632b5d3861eb52d655c1c0fcDianne Hackborn    @Override
927390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public void movePackage(String packageName, IPackageMoveObserver observer, int flags) {
928390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
929390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            mPM.movePackage(packageName, observer, flags);
930390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
931390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            // Should never happen!
932390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
933390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
934390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
935390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
936390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public String getInstallerPackageName(String packageName) {
937390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
938390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.getInstallerPackageName(packageName);
939390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
940390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            // Should never happen!
941390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
942390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        return null;
943390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
944390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
945390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
946390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public void deletePackage(String packageName, IPackageDeleteObserver observer, int flags) {
947390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
948390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            mPM.deletePackage(packageName, observer, flags);
949390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
950390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            // Should never happen!
951390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
952390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
953390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
954390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public void clearApplicationUserData(String packageName,
955390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                         IPackageDataObserver observer) {
956390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
957390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            mPM.clearApplicationUserData(packageName, observer);
958390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
959390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            // Should never happen!
960390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
961390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
962390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
963390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public void deleteApplicationCacheFiles(String packageName,
964390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                            IPackageDataObserver observer) {
965390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
966390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            mPM.deleteApplicationCacheFiles(packageName, observer);
967390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
968390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            // Should never happen!
969390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
970390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
971390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
972390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public void freeStorageAndNotify(long idealStorageSize, IPackageDataObserver observer) {
973390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
974390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            mPM.freeStorageAndNotify(idealStorageSize, observer);
975390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
976390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            // Should never happen!
977390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
978390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
979390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
980390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
981390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public void freeStorage(long freeStorageSize, IntentSender pi) {
982390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
983390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            mPM.freeStorage(freeStorageSize, pi);
984390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
985390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            // Should never happen!
986390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
987390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
988390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
989390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
990390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public void getPackageSizeInfo(String packageName,
991390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                   IPackageStatsObserver observer) {
992390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
993390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            mPM.getPackageSizeInfo(packageName, observer);
994390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
995390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            // Should never happen!
996390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
997390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
998390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
999390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public void addPackageToPreferred(String packageName) {
1000390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
1001390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            mPM.addPackageToPreferred(packageName);
1002390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
1003390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            // Should never happen!
1004390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1005390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1006390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1007390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
1008390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public void removePackageFromPreferred(String packageName) {
1009390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
1010390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            mPM.removePackageFromPreferred(packageName);
1011390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
1012390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            // Should never happen!
1013390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1014390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1015390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1016390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
1017390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public List<PackageInfo> getPreferredPackages(int flags) {
1018390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
1019390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.getPreferredPackages(flags);
1020390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
1021390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            // Should never happen!
1022390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1023390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        return new ArrayList<PackageInfo>();
1024390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1025390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1026390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
1027390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public void addPreferredActivity(IntentFilter filter,
1028390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                     int match, ComponentName[] set, ComponentName activity) {
1029390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
1030390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            mPM.addPreferredActivity(filter, match, set, activity);
1031390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
1032390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            // Should never happen!
1033390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1034390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1035390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1036390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
1037390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public void replacePreferredActivity(IntentFilter filter,
1038390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                         int match, ComponentName[] set, ComponentName activity) {
1039390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
1040390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            mPM.replacePreferredActivity(filter, match, set, activity);
1041390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
1042390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            // Should never happen!
1043390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1044390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1045390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1046390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
1047390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public void clearPackagePreferredActivities(String packageName) {
1048390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
1049390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            mPM.clearPackagePreferredActivities(packageName);
1050390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
1051390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            // Should never happen!
1052390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1053390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1054390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1055390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
1056390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public int getPreferredActivities(List<IntentFilter> outFilters,
1057390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                      List<ComponentName> outActivities, String packageName) {
1058390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
1059390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.getPreferredActivities(outFilters, outActivities, packageName);
1060390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
1061390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            // Should never happen!
1062390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1063390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        return 0;
1064390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1065390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1066390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
1067390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public void setComponentEnabledSetting(ComponentName componentName,
1068390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                           int newState, int flags) {
1069390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
1070390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            mPM.setComponentEnabledSetting(componentName, newState, flags);
1071390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
1072390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            // Should never happen!
1073390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1074390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1075390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1076390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
1077390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public int getComponentEnabledSetting(ComponentName componentName) {
1078390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
1079390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.getComponentEnabledSetting(componentName);
1080390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
1081390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            // Should never happen!
1082390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1083390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        return PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
1084390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1085390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1086390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
1087390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public void setApplicationEnabledSetting(String packageName,
1088390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick                                             int newState, int flags) {
1089390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
1090390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            mPM.setApplicationEnabledSetting(packageName, newState, flags);
1091390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
1092390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            // Should never happen!
1093390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1094390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1095390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1096390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
1097390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public int getApplicationEnabledSetting(String packageName) {
1098390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
1099390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            return mPM.getApplicationEnabledSetting(packageName);
1100390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
1101390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            // Should never happen!
1102390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1103390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        return PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
1104390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1105390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1106390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    @Override
1107390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    public void setPackageObbPath(String packageName, String path) {
1108390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        try {
1109390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            mPM.setPackageObbPath(packageName, path);
1110390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        } catch (RemoteException e) {
1111390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            // Should never happen!
1112390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick        }
1113390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    }
1114390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1115390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    private final ContextImpl mContext;
1116390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    private final IPackageManager mPM;
1117390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick
1118390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    private static final Object sSync = new Object();
1119390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    private static HashMap<ResourceName, WeakReference<Drawable> > sIconCache
1120390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            = new HashMap<ResourceName, WeakReference<Drawable> >();
1121390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick    private static HashMap<ResourceName, WeakReference<CharSequence> > sStringCache
1122390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick            = new HashMap<ResourceName, WeakReference<CharSequence> >();
1123390dae1a8b8c2da6a24f3246c8c277645bcc75dcBrad Fitzpatrick}
1124