ContextImpl.java revision 399cccb85749e02f6d3e12d1d2846310e7cbfdf1
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.app;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport com.android.internal.policy.PolicyManager;
202269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackbornimport com.android.internal.util.XmlUtils;
2175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport com.google.android.collect.Maps;
2275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
2375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport org.xmlpull.v1.XmlPullParserException;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.BroadcastReceiver;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentResolver;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContextWrapper;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IContentProvider;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IntentFilter;
331ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.content.IIntentReceiver;
341ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.content.IntentSender;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ReceiverCallNotAllowedException;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ServiceConnection;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.SharedPreferences;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ActivityInfo;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ApplicationInfo;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ComponentInfo;
4149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackbornimport android.content.pm.FeatureInfo;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.IPackageDataObserver;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.IPackageDeleteObserver;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.IPackageInstallObserver;
458946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapuimport android.content.pm.IPackageMoveObserver;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.IPackageManager;
4775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.content.pm.IPackageStatsObserver;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.InstrumentationInfo;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageInfo;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PermissionGroupInfo;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PermissionInfo;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ProviderInfo;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ResolveInfo;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ServiceInfo;
56117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapuimport android.content.pm.PackageParser.Package;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.AssetManager;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.XmlResourceParser;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.sqlite.SQLiteDatabase;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.sqlite.SQLiteDatabase.CursorFactory;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Bitmap;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.hardware.SensorManager;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.location.ILocationManager;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.location.LocationManager;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.AudioManager;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.ConnectivityManager;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.IConnectivityManager;
70c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriffimport android.net.ThrottleManager;
71c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriffimport android.net.IThrottleManager;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.wifi.IWifiManager;
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.wifi.WifiManager;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle;
77f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnorimport android.os.DropBoxManager;
78539d3c475f44b1499499a8b70375a192545cf113Oscar Montemayorimport android.os.Environment;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.FileUtils;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IPowerManager;
8375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.Looper;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.PowerManager;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process;
8675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.RemoteException;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager;
88539d3c475f44b1499499a8b70375a192545cf113Oscar Montemayorimport android.os.StatFs;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Vibrator;
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.FileUtils.FileStatus;
91b104340496e3a531e26c8f428c808eca0e039f50San Mehatimport android.os.storage.StorageManager;
92117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapuimport android.provider.Settings;
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.TelephonyManager;
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.ClipboardManager;
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AndroidRuntimeException;
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ContextThemeWrapper;
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.LayoutInflater;
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManagerImpl;
10075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.view.accessibility.AccessibilityManager;
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.InputMethodManager;
102603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintanaimport android.accounts.AccountManager;
103603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintanaimport android.accounts.IAccountManager;
10487bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackbornimport android.app.admin.DevicePolicyManager;
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
106f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnorimport com.android.internal.os.IDropBoxManagerService;
107952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream;
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileNotFoundException;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream;
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream;
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.ref.WeakReference;
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap;
11775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport java.util.HashSet;
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Iterator;
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List;
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map;
121105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Projectimport java.util.Set;
12275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport java.util.WeakHashMap;
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map.Entry;
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass ReceiverRestrictedContext extends ContextWrapper {
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ReceiverRestrictedContext(Context base) {
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(base);
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return registerReceiver(receiver, filter, null, null);
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String broadcastPermission, Handler scheduler) {
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new ReceiverCallNotAllowedException(
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "IntentReceiver components are not allowed to register to receive intents");
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //ex.fillInStackTrace();
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //Log.e("IntentReceiver", ex.getMessage(), ex);
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //return mContext.registerReceiver(receiver, filter, broadcastPermission,
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //        scheduler);
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean bindService(Intent service, ServiceConnection conn, int flags) {
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new ReceiverCallNotAllowedException(
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "IntentReceiver components are not allowed to bind to services");
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //ex.fillInStackTrace();
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //Log.e("IntentReceiver", ex.getMessage(), ex);
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //return mContext.bindService(service, interfaceName, conn, flags);
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
1572155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn * Common implementation of Context API, which provides the base
1582155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn * context object for Activity and other application components.
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
1602155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackbornclass ContextImpl extends Context {
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static String TAG = "ApplicationContext";
162569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima    private final static boolean DEBUG = false;
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static boolean DEBUG_ICONS = false;
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final Object sSync = new Object();
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static AlarmManager sAlarmManager;
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static PowerManager sPowerManager;
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static ConnectivityManager sConnectivityManager;
169c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff    private static ThrottleManager sThrottleManager;
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static WifiManager sWifiManager;
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static LocationManager sLocationManager;
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final HashMap<File, SharedPreferencesImpl> sSharedPrefs =
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            new HashMap<File, SharedPreferencesImpl>();
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private AudioManager mAudioManager;
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ ActivityThread.PackageInfo mPackageInfo;
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Resources mResources;
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ ActivityThread mMainThread;
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Context mOuterContext;
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IBinder mActivityToken = null;
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ApplicationContentResolver mContentResolver;
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mThemeResource = 0;
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Resources.Theme mTheme = null;
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private PackageManager mPackageManager;
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private NotificationManager mNotificationManager = null;
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ActivityManager mActivityManager = null;
1878cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn    private WallpaperManager mWallpaperManager = null;
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Context mReceiverRestrictedContext = null;
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private SearchManager mSearchManager = null;
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private SensorManager mSensorManager = null;
191c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat    private StorageManager mStorageManager = null;
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Vibrator mVibrator = null;
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private LayoutInflater mLayoutInflater = null;
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private StatusBarManager mStatusBarManager = null;
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private TelephonyManager mTelephonyManager = null;
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ClipboardManager mClipboardManager = null;
197870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy    private boolean mRestricted;
198e00a31155b95686eecc6e1999e904472f8f300caFred Quintana    private AccountManager mAccountManager; // protected by mSync
199f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor    private DropBoxManager mDropBoxManager = null;
200d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    private DevicePolicyManager mDevicePolicyManager = null;
20153332883543868fb83e111a07306368b7772b340Tobias Haamel    private UiModeManager mUiModeManager = null;
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Object mSync = new Object();
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File mDatabasesDir;
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File mPreferencesDir;
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File mFilesDir;
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File mCacheDir;
209e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    private File mExternalFilesDir;
210e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    private File mExternalCacheDir;
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static long sInstanceCount = 0;
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String[] EMPTY_FILE_LIST = {};
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21682fe564267f276151063b2aa0d26075c3210d75fCarl Shapiro    // For debug only
21782fe564267f276151063b2aa0d26075c3210d75fCarl Shapiro    /*
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void finalize() throws Throwable {
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.finalize();
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        --sInstanceCount;
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22382fe564267f276151063b2aa0d26075c3210d75fCarl Shapiro    */
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static long getInstanceCount() {
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sInstanceCount;
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public AssetManager getAssets() {
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mResources.getAssets();
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Resources getResources() {
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mResources;
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PackageManager getPackageManager() {
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageManager != null) {
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageManager;
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IPackageManager pm = ActivityThread.getPackageManager();
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pm != null) {
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Doesn't matter if we make more than one instance.
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return (mPackageManager = new ApplicationPackageManager(this, pm));
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ContentResolver getContentResolver() {
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mContentResolver;
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Looper getMainLooper() {
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mMainThread.getLooper();
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Context getApplicationContext() {
266eb9e9ec06167b0caa459f2fb3f3fae094bb8d8f7Christopher Tate        return (mPackageInfo != null) ?
267eb9e9ec06167b0caa459f2fb3f3fae094bb8d8f7Christopher Tate                mPackageInfo.getApplication() : mMainThread.getApplication();
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setTheme(int resid) {
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mThemeResource = resid;
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Resources.Theme getTheme() {
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mTheme == null) {
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mThemeResource == 0) {
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mThemeResource = com.android.internal.R.style.Theme;
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTheme = mResources.newTheme();
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTheme.applyStyle(mThemeResource, true);
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mTheme;
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ClassLoader getClassLoader() {
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPackageInfo != null ?
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPackageInfo.getClassLoader() : ClassLoader.getSystemClassLoader();
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getPackageName() {
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageInfo.getPackageName();
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("Not supported in system context");
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3025c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn    public ApplicationInfo getApplicationInfo() {
3035c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        if (mPackageInfo != null) {
3045c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn            return mPackageInfo.getApplicationInfo();
3055c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        }
3065c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        throw new RuntimeException("Not supported in system context");
3075c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn    }
3085c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn
3095c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn    @Override
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getPackageResourcePath() {
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageInfo.getResDir();
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("Not supported in system context");
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getPackageCodePath() {
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageInfo.getAppDir();
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("Not supported in system context");
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static File makeBackupFile(File prefsFile) {
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new File(prefsFile.getPath() + ".bak");
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32923ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato    public File getSharedPrefsFile(String name) {
33023ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato        return makeFilename(getPreferencesDir(), name + ".xml");
33123ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato    }
33223ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public SharedPreferences getSharedPreferences(String name, int mode) {
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SharedPreferencesImpl sp;
33623ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato        File f = getSharedPrefsFile(name);
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (sSharedPrefs) {
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sp = sSharedPrefs.get(f);
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sp != null && !sp.hasFileChanged()) {
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //Log.i(TAG, "Returning existing prefs " + name + ": " + sp);
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return sp;
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileInputStream str = null;
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File backup = makeBackupFile(f);
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (backup.exists()) {
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            f.delete();
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            backup.renameTo(f);
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Debugging
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (f.exists() && !f.canRead()) {
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Attempt to read preferences file " + f + " without permission");
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Map map = null;
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (f.exists() && f.canRead()) {
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str = new FileInputStream(f);
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                map = XmlUtils.readMapXml(str);
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str.close();
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (org.xmlpull.v1.XmlPullParserException e) {
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, "getSharedPreferences", e);
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (FileNotFoundException e) {
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, "getSharedPreferences", e);
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (IOException e) {
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, "getSharedPreferences", e);
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (sSharedPrefs) {
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sp != null) {
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //Log.i(TAG, "Updating existing prefs " + name + " " + sp + ": " + map);
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sp.replace(map);
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sp = sSharedPrefs.get(f);
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (sp == null) {
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sp = new SharedPreferencesImpl(f, mode, map);
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sSharedPrefs.put(f, sp);
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return sp;
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File getPreferencesDir() {
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mPreferencesDir == null) {
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPreferencesDir = new File(getDataDirFile(), "shared_prefs");
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPreferencesDir;
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public FileInputStream openFileInput(String name)
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws FileNotFoundException {
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File f = makeFilename(getFilesDir(), name);
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new FileInputStream(f);
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public FileOutputStream openFileOutput(String name, int mode)
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws FileNotFoundException {
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean append = (mode&MODE_APPEND) != 0;
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File f = makeFilename(getFilesDir(), name);
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            FileOutputStream fos = new FileOutputStream(f, append);
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setFilePermissionsFromMode(f.getPath(), mode, 0);
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return fos;
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (FileNotFoundException e) {
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File parent = f.getParentFile();
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        parent.mkdir();
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileUtils.setPermissions(
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            parent.getPath(),
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            -1, -1);
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileOutputStream fos = new FileOutputStream(f, append);
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setFilePermissionsFromMode(f.getPath(), mode, 0);
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return fos;
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean deleteFile(String name) {
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File f = makeFilename(getFilesDir(), name);
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return f.delete();
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getFilesDir() {
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mFilesDir == null) {
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mFilesDir = new File(getDataDirFile(), "files");
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mFilesDir.exists()) {
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if(!mFilesDir.mkdirs()) {
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Unable to create files directory");
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                FileUtils.setPermissions(
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mFilesDir.getPath(),
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        -1, -1);
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mFilesDir;
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
453e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    public File getExternalFilesDir(String type) {
454e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        synchronized (mSync) {
455e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (mExternalFilesDir == null) {
456e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                mExternalFilesDir = Environment.getExternalStorageAppFilesDirectory(
457e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                        getPackageName());
458e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
459e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (!mExternalFilesDir.exists()) {
460e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                try {
461e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    (new File(Environment.getExternalStorageAndroidDataDir(),
462e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                            ".nomedia")).createNewFile();
463e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                } catch (IOException e) {
464e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
465e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                if (!mExternalFilesDir.mkdirs()) {
466e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    Log.w(TAG, "Unable to create external files directory");
467e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    return null;
468e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
469e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
470e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (type == null) {
471e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                return mExternalFilesDir;
472e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
473e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            File dir = new File(mExternalFilesDir, type);
474e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (!dir.exists()) {
475e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                if (!dir.mkdirs()) {
476e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    Log.w(TAG, "Unable to create external media directory " + dir);
477e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    return null;
478e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
479e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
480e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            return dir;
481e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        }
482e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    }
483e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn
484e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    @Override
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getCacheDir() {
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mCacheDir == null) {
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCacheDir = new File(getDataDirFile(), "cache");
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mCacheDir.exists()) {
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if(!mCacheDir.mkdirs()) {
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Unable to create cache directory");
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                FileUtils.setPermissions(
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mCacheDir.getPath(),
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        -1, -1);
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCacheDir;
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
504e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    @Override
505e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    public File getExternalCacheDir() {
506e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        synchronized (mSync) {
507e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (mExternalCacheDir == null) {
508e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                mExternalCacheDir = Environment.getExternalStorageAppCacheDirectory(
509e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                        getPackageName());
510e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
511e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (!mExternalCacheDir.exists()) {
512e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                try {
513e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    (new File(Environment.getExternalStorageAndroidDataDir(),
514e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                            ".nomedia")).createNewFile();
515e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                } catch (IOException e) {
516e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
517e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                if (!mExternalCacheDir.mkdirs()) {
518e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    Log.w(TAG, "Unable to create external cache directory");
519e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    return null;
520e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
521e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
522e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            return mExternalCacheDir;
523e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        }
524e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    }
525e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getFileStreamPath(String name) {
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return makeFilename(getFilesDir(), name);
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String[] fileList() {
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String[] list = getFilesDir().list();
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (list != null) ? list : EMPTY_FILE_LIST;
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory) {
539a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        File f = validateFilePath(name, true);
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(f, factory);
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setFilePermissionsFromMode(f.getPath(), mode, 0);
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return db;
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean deleteDatabase(String name) {
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
548a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            File f = validateFilePath(name, false);
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return f.delete();
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getDatabasePath(String name) {
557a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        return validateFilePath(name, false);
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String[] databaseList() {
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String[] list = getDatabasesDir().list();
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (list != null) ? list : EMPTY_FILE_LIST;
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File getDatabasesDir() {
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mDatabasesDir == null) {
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDatabasesDir = new File(getDataDirFile(), "databases");
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mDatabasesDir.getPath().equals("databases")) {
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDatabasesDir = new File("/data/system");
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mDatabasesDir;
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Drawable getWallpaper() {
5814c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        return getWallpaperManager().getDrawable();
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5858cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn    public Drawable peekWallpaper() {
5864c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        return getWallpaperManager().peekDrawable();
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getWallpaperDesiredMinimumWidth() {
5918cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        return getWallpaperManager().getDesiredMinimumWidth();
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getWallpaperDesiredMinimumHeight() {
5968cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        return getWallpaperManager().getDesiredMinimumHeight();
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setWallpaper(Bitmap bitmap) throws IOException  {
6014c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        getWallpaperManager().setBitmap(bitmap);
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setWallpaper(InputStream data) throws IOException {
6064c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        getWallpaperManager().setStream(data);
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void clearWallpaper() throws IOException {
6118cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        getWallpaperManager().clear();
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startActivity(Intent intent) {
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new AndroidRuntimeException(
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Calling startActivity() from outside of an Activity "
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " context requires the FLAG_ACTIVITY_NEW_TASK flag."
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " Is this really what you want?");
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread.getInstrumentation().execStartActivity(
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            getOuterContext(), mMainThread.getApplicationThread(), null, null, intent, -1);
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
627fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    public void startIntentSender(IntentSender intent,
628fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
629fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            throws IntentSender.SendIntentException {
630fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn        try {
631fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            String resolvedType = null;
632fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            if (fillInIntent != null) {
633fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                resolvedType = fillInIntent.resolveTypeIfNeeded(getContentResolver());
634fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            }
635fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            int result = ActivityManagerNative.getDefault()
636fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                .startActivityIntentSender(mMainThread.getApplicationThread(), intent,
637fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                        fillInIntent, resolvedType, null, null,
638fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                        0, flagsMask, flagsValues);
639fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            if (result == IActivityManager.START_CANCELED) {
640fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                throw new IntentSender.SendIntentException();
641fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            }
642fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            Instrumentation.checkStartActivityResult(result, null);
643fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn        } catch (RemoteException e) {
644fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn        }
645fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    }
646fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn
647fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    @Override
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendBroadcast(Intent intent) {
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, null,
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Activity.RESULT_OK, null, null, null, false, false);
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendBroadcast(Intent intent, String receiverPermission) {
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, null,
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Activity.RESULT_OK, null, null, receiverPermission, false, false);
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendOrderedBroadcast(Intent intent,
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String receiverPermission) {
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, null,
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Activity.RESULT_OK, null, null, receiverPermission, true, false);
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendOrderedBroadcast(Intent intent,
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String receiverPermission, BroadcastReceiver resultReceiver,
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Handler scheduler, int initialCode, String initialData,
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Bundle initialExtras) {
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IIntentReceiver rd = null;
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resultReceiver != null) {
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mPackageInfo != null) {
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (scheduler == null) {
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scheduler = mMainThread.getHandler();
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                rd = mPackageInfo.getReceiverDispatcher(
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    resultReceiver, getOuterContext(), scheduler,
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getInstrumentation(), false);
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (scheduler == null) {
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scheduler = mMainThread.getHandler();
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                rd = new ActivityThread.PackageInfo.ReceiverDispatcher(
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver();
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, rd,
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                initialCode, initialData, initialExtras, receiverPermission,
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                true, false);
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendStickyBroadcast(Intent intent) {
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, null,
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Activity.RESULT_OK, null, null, null, false, true);
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
725efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn    public void sendStickyOrderedBroadcast(Intent intent,
726efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            BroadcastReceiver resultReceiver,
727efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            Handler scheduler, int initialCode, String initialData,
728efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            Bundle initialExtras) {
729efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        IIntentReceiver rd = null;
730efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        if (resultReceiver != null) {
731efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            if (mPackageInfo != null) {
732efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                if (scheduler == null) {
733efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                    scheduler = mMainThread.getHandler();
734efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                }
735efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                rd = mPackageInfo.getReceiverDispatcher(
736efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                    resultReceiver, getOuterContext(), scheduler,
737efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                    mMainThread.getInstrumentation(), false);
738efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            } else {
739efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                if (scheduler == null) {
740efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                    scheduler = mMainThread.getHandler();
741efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                }
742efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                rd = new ActivityThread.PackageInfo.ReceiverDispatcher(
743efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                        resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver();
744efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            }
745efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        }
746efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
747efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        try {
748efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            ActivityManagerNative.getDefault().broadcastIntent(
749efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                mMainThread.getApplicationThread(), intent, resolvedType, rd,
750efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                initialCode, initialData, initialExtras, null,
751efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                true, true);
752efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        } catch (RemoteException e) {
753efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        }
754efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn    }
755efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn
756efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn    @Override
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeStickyBroadcast(Intent intent) {
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resolvedType != null) {
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            intent = new Intent(intent);
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            intent.setDataAndType(intent.getData(), resolvedType);
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().unbroadcastIntent(
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent);
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return registerReceiver(receiver, filter, null, null);
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String broadcastPermission, Handler scheduler) {
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return registerReceiverInternal(receiver, filter, broadcastPermission,
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                scheduler, getOuterContext());
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Intent registerReceiverInternal(BroadcastReceiver receiver,
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IntentFilter filter, String broadcastPermission,
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Handler scheduler, Context context) {
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IIntentReceiver rd = null;
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (receiver != null) {
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mPackageInfo != null && context != null) {
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (scheduler == null) {
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scheduler = mMainThread.getHandler();
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                rd = mPackageInfo.getReceiverDispatcher(
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    receiver, context, scheduler,
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getInstrumentation(), true);
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (scheduler == null) {
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scheduler = mMainThread.getHandler();
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                rd = new ActivityThread.PackageInfo.ReceiverDispatcher(
799399cccb85749e02f6d3e12d1d2846310e7cbfdf1Dianne Hackborn                        receiver, context, scheduler, null, true).getIIntentReceiver();
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().registerReceiver(
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getApplicationThread(),
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    rd, filter, broadcastPermission);
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void unregisterReceiver(BroadcastReceiver receiver) {
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IIntentReceiver rd = mPackageInfo.forgetReceiverDispatcher(
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getOuterContext(), receiver);
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityManagerNative.getDefault().unregisterReceiver(rd);
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("Not supported in system context");
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ComponentName startService(Intent service) {
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ComponentName cn = ActivityManagerNative.getDefault().startService(
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), service,
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                service.resolveTypeIfNeeded(getContentResolver()));
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (cn != null && cn.getPackageName().equals("!")) {
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SecurityException(
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Not allowed to start service " + service
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " without permission " + cn.getClassName());
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return cn;
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean stopService(Intent service) {
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int res = ActivityManagerNative.getDefault().stopService(
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), service,
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                service.resolveTypeIfNeeded(getContentResolver()));
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (res < 0) {
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SecurityException(
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Not allowed to stop service " + service);
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return res != 0;
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean bindService(Intent service, ServiceConnection conn,
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) {
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IServiceConnection sd;
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sd = mPackageInfo.getServiceDispatcher(conn, getOuterContext(),
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getHandler(), flags);
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("Not supported in system context");
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int res = ActivityManagerNative.getDefault().bindService(
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), getActivityToken(),
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                service, service.resolveTypeIfNeeded(getContentResolver()),
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sd, flags);
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (res < 0) {
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SecurityException(
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Not allowed to bind to service " + service);
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return res != 0;
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void unbindService(ServiceConnection conn) {
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IServiceConnection sd = mPackageInfo.forgetServiceDispatcher(
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getOuterContext(), conn);
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityManagerNative.getDefault().unbindService(sd);
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("Not supported in system context");
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean startInstrumentation(ComponentName className,
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String profileFile, Bundle arguments) {
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().startInstrumentation(
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    className, profileFile, 0, arguments, null);
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // System has crashed, nothing we can do.
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Object getSystemService(String name) {
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (WINDOW_SERVICE.equals(name)) {
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return WindowManagerImpl.getDefault();
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (LAYOUT_INFLATER_SERVICE.equals(name)) {
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mSync) {
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                LayoutInflater inflater = mLayoutInflater;
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (inflater != null) {
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return inflater;
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLayoutInflater = inflater =
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    PolicyManager.makeNewLayoutInflater(getOuterContext());
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return inflater;
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (ACTIVITY_SERVICE.equals(name)) {
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getActivityManager();
9258cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        } else if (INPUT_METHOD_SERVICE.equals(name)) {
9268cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn            return InputMethodManager.getInstance(this);
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (ALARM_SERVICE.equals(name)) {
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getAlarmManager();
929603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana        } else if (ACCOUNT_SERVICE.equals(name)) {
930603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana            return getAccountManager();
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (POWER_SERVICE.equals(name)) {
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getPowerManager();
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (CONNECTIVITY_SERVICE.equals(name)) {
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getConnectivityManager();
935c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff        } else if (THROTTLE_SERVICE.equals(name)) {
936c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff            return getThrottleManager();
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (WIFI_SERVICE.equals(name)) {
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getWifiManager();
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (NOTIFICATION_SERVICE.equals(name)) {
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getNotificationManager();
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (KEYGUARD_SERVICE.equals(name)) {
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new KeyguardManager();
94375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        } else if (ACCESSIBILITY_SERVICE.equals(name)) {
94475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            return AccessibilityManager.getInstance(this);
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (LOCATION_SERVICE.equals(name)) {
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getLocationManager();
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (SEARCH_SERVICE.equals(name)) {
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getSearchManager();
9498cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        } else if (SENSOR_SERVICE.equals(name)) {
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getSensorManager();
951c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat        } else if (STORAGE_SERVICE.equals(name)) {
952c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat            return getStorageManager();
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (VIBRATOR_SERVICE.equals(name)) {
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getVibrator();
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (STATUS_BAR_SERVICE.equals(name)) {
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mSync) {
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mStatusBarManager == null) {
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mStatusBarManager = new StatusBarManager(getOuterContext());
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mStatusBarManager;
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (AUDIO_SERVICE.equals(name)) {
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getAudioManager();
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (TELEPHONY_SERVICE.equals(name)) {
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getTelephonyManager();
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (CLIPBOARD_SERVICE.equals(name)) {
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getClipboardManager();
9688cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        } else if (WALLPAPER_SERVICE.equals(name)) {
9698cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn            return getWallpaperManager();
970952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor        } else if (DROPBOX_SERVICE.equals(name)) {
971f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor            return getDropBoxManager();
972d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn        } else if (DEVICE_POLICY_SERVICE.equals(name)) {
973d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn            return getDevicePolicyManager();
97469fb574e294ed07404d515a66fccd046e974d32fTobias Haamel        } else if (UI_MODE_SERVICE.equals(name)) {
97553332883543868fb83e111a07306368b7772b340Tobias Haamel            return getUiModeManager();
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
981603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana    private AccountManager getAccountManager() {
982e00a31155b95686eecc6e1999e904472f8f300caFred Quintana        synchronized (mSync) {
983e00a31155b95686eecc6e1999e904472f8f300caFred Quintana            if (mAccountManager == null) {
984603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana                IBinder b = ServiceManager.getService(ACCOUNT_SERVICE);
985603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana                IAccountManager service = IAccountManager.Stub.asInterface(b);
986e00a31155b95686eecc6e1999e904472f8f300caFred Quintana                mAccountManager = new AccountManager(this, service);
987603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana            }
988e00a31155b95686eecc6e1999e904472f8f300caFred Quintana            return mAccountManager;
989603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana        }
990603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana    }
991603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ActivityManager getActivityManager() {
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mActivityManager == null) {
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mActivityManager = new ActivityManager(getOuterContext(),
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mMainThread.getHandler());
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mActivityManager;
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private AlarmManager getAlarmManager() {
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (sSync) {
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sAlarmManager == null) {
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                IBinder b = ServiceManager.getService(ALARM_SERVICE);
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                IAlarmManager service = IAlarmManager.Stub.asInterface(b);
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sAlarmManager = new AlarmManager(service);
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sAlarmManager;
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private PowerManager getPowerManager() {
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (sSync) {
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sPowerManager == null) {
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                IBinder b = ServiceManager.getService(POWER_SERVICE);
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                IPowerManager service = IPowerManager.Stub.asInterface(b);
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sPowerManager = new PowerManager(service, mMainThread.getHandler());
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sPowerManager;
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ConnectivityManager getConnectivityManager()
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (sSync) {
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sConnectivityManager == null) {
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                IBinder b = ServiceManager.getService(CONNECTIVITY_SERVICE);
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                IConnectivityManager service = IConnectivityManager.Stub.asInterface(b);
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sConnectivityManager = new ConnectivityManager(service);
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sConnectivityManager;
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1036c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff    private ThrottleManager getThrottleManager()
1037c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff    {
1038c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff        synchronized (sSync) {
1039c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff            if (sThrottleManager == null) {
1040c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff                IBinder b = ServiceManager.getService(THROTTLE_SERVICE);
1041c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff                IThrottleManager service = IThrottleManager.Stub.asInterface(b);
1042c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff                sThrottleManager = new ThrottleManager(service);
1043c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff            }
1044c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff        }
1045c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff        return sThrottleManager;
1046c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff    }
1047c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private WifiManager getWifiManager()
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (sSync) {
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sWifiManager == null) {
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                IBinder b = ServiceManager.getService(WIFI_SERVICE);
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                IWifiManager service = IWifiManager.Stub.asInterface(b);
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sWifiManager = new WifiManager(service, mMainThread.getHandler());
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sWifiManager;
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10608cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn    private NotificationManager getNotificationManager() {
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mNotificationManager == null) {
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mNotificationManager = new NotificationManager(
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        new ContextThemeWrapper(getOuterContext(), com.android.internal.R.style.Theme_Dialog),
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mMainThread.getHandler());
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mNotificationManager;
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10718cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn    private WallpaperManager getWallpaperManager() {
10728cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        synchronized (mSync) {
10738cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn            if (mWallpaperManager == null) {
10748cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn                mWallpaperManager = new WallpaperManager(getOuterContext(),
10758cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn                        mMainThread.getHandler());
10768cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn            }
10778cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        }
10788cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        return mWallpaperManager;
10798cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn    }
10808cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private TelephonyManager getTelephonyManager() {
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mTelephonyManager == null) {
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTelephonyManager = new TelephonyManager(getOuterContext());
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mTelephonyManager;
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ClipboardManager getClipboardManager() {
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mClipboardManager == null) {
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mClipboardManager = new ClipboardManager(getOuterContext(),
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mMainThread.getHandler());
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mClipboardManager;
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private LocationManager getLocationManager() {
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (sSync) {
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sLocationManager == null) {
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                IBinder b = ServiceManager.getService(LOCATION_SERVICE);
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ILocationManager service = ILocationManager.Stub.asInterface(b);
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sLocationManager = new LocationManager(service);
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sLocationManager;
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private SearchManager getSearchManager() {
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mSearchManager == null) {
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSearchManager = new SearchManager(getOuterContext(), mMainThread.getHandler());
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mSearchManager;
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private SensorManager getSensorManager() {
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mSensorManager == null) {
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSensorManager = new SensorManager(mMainThread.getHandler().getLooper());
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mSensorManager;
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1129c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat    private StorageManager getStorageManager() {
1130c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat        synchronized (mSync) {
1131c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat            if (mStorageManager == null) {
1132c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat                try {
1133c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat                    mStorageManager = new StorageManager(mMainThread.getHandler().getLooper());
1134c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat                } catch (RemoteException rex) {
1135c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat                    Log.e(TAG, "Failed to create StorageManager", rex);
1136c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat                    mStorageManager = null;
1137c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat                }
1138c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat            }
1139c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat        }
1140c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat        return mStorageManager;
1141c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat    }
1142c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Vibrator getVibrator() {
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mVibrator == null) {
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mVibrator = new Vibrator();
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mVibrator;
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1151952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private AudioManager getAudioManager()
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAudioManager == null) {
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAudioManager = new AudioManager(this);
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mAudioManager;
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1160f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor    private DropBoxManager getDropBoxManager() {
1161952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor        synchronized (mSync) {
1162f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor            if (mDropBoxManager == null) {
1163952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor                IBinder b = ServiceManager.getService(DROPBOX_SERVICE);
1164f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor                IDropBoxManagerService service = IDropBoxManagerService.Stub.asInterface(b);
1165f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor                mDropBoxManager = new DropBoxManager(service);
1166952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor            }
1167952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor        }
1168f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        return mDropBoxManager;
1169952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor    }
1170952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor
1171d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    private DevicePolicyManager getDevicePolicyManager() {
1172d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn        synchronized (mSync) {
1173d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn            if (mDevicePolicyManager == null) {
117421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                mDevicePolicyManager = DevicePolicyManager.create(this,
1175d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn                        mMainThread.getHandler());
1176d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn            }
1177d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn        }
1178d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn        return mDevicePolicyManager;
1179d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    }
1180d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn
118153332883543868fb83e111a07306368b7772b340Tobias Haamel    private UiModeManager getUiModeManager() {
118253332883543868fb83e111a07306368b7772b340Tobias Haamel        synchronized (mSync) {
118353332883543868fb83e111a07306368b7772b340Tobias Haamel            if (mUiModeManager == null) {
118453332883543868fb83e111a07306368b7772b340Tobias Haamel                mUiModeManager = new UiModeManager();
118553332883543868fb83e111a07306368b7772b340Tobias Haamel            }
118653332883543868fb83e111a07306368b7772b340Tobias Haamel        }
118753332883543868fb83e111a07306368b7772b340Tobias Haamel        return mUiModeManager;
118853332883543868fb83e111a07306368b7772b340Tobias Haamel    }
118953332883543868fb83e111a07306368b7772b340Tobias Haamel
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkPermission(String permission, int pid, int uid) {
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (permission == null) {
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException("permission is null");
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!Process.supportsProcesses()) {
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PackageManager.PERMISSION_GRANTED;
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().checkPermission(
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    permission, pid, uid);
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PackageManager.PERMISSION_DENIED;
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkCallingPermission(String permission) {
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (permission == null) {
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException("permission is null");
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!Process.supportsProcesses()) {
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PackageManager.PERMISSION_GRANTED;
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pid = Binder.getCallingPid();
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pid != Process.myPid()) {
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return checkPermission(permission, pid,
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Binder.getCallingUid());
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return PackageManager.PERMISSION_DENIED;
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkCallingOrSelfPermission(String permission) {
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (permission == null) {
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException("permission is null");
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return checkPermission(permission, Binder.getCallingPid(),
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid());
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void enforce(
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String permission, int resultOfCheck,
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean selfToo, int uid, String message) {
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resultOfCheck != PackageManager.PERMISSION_GRANTED) {
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SecurityException(
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (message != null ? (message + ": ") : "") +
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (selfToo
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     ? "Neither user " + uid + " nor current process has "
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     : "User " + uid + " does not have ") +
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    permission +
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ".");
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforcePermission(
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String permission, int pid, int uid, String message) {
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforce(permission,
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                checkPermission(permission, pid, uid),
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false,
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                uid,
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                message);
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingPermission(String permission, String message) {
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforce(permission,
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                checkCallingPermission(permission),
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false,
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid(),
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                message);
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingOrSelfPermission(
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String permission, String message) {
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforce(permission,
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                checkCallingOrSelfPermission(permission),
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                true,
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid(),
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                message);
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void grantUriPermission(String toPackage, Uri uri, int modeFlags) {
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         try {
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().grantUriPermission(
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getApplicationThread(), toPackage, uri,
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    modeFlags);
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void revokeUriPermission(Uri uri, int modeFlags) {
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         try {
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().revokeUriPermission(
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getApplicationThread(), uri,
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    modeFlags);
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkUriPermission(Uri uri, int pid, int uid, int modeFlags) {
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!Process.supportsProcesses()) {
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PackageManager.PERMISSION_GRANTED;
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().checkUriPermission(
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uri, pid, uid, modeFlags);
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PackageManager.PERMISSION_DENIED;
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkCallingUriPermission(Uri uri, int modeFlags) {
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!Process.supportsProcesses()) {
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PackageManager.PERMISSION_GRANTED;
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pid = Binder.getCallingPid();
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pid != Process.myPid()) {
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return checkUriPermission(uri, pid,
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Binder.getCallingUid(), modeFlags);
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return PackageManager.PERMISSION_DENIED;
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkCallingOrSelfUriPermission(Uri uri, int modeFlags) {
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return checkUriPermission(uri, Binder.getCallingPid(),
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid(), modeFlags);
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkUriPermission(Uri uri, String readPermission,
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String writePermission, int pid, int uid, int modeFlags) {
1329569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima        if (DEBUG) {
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.i("foo", "checkUriPermission: uri=" + uri + "readPermission="
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + readPermission + " writePermission=" + writePermission
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " pid=" + pid + " uid=" + uid + " mode" + modeFlags);
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((modeFlags&Intent.FLAG_GRANT_READ_URI_PERMISSION) != 0) {
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (readPermission == null
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    || checkPermission(readPermission, pid, uid)
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    == PackageManager.PERMISSION_GRANTED) {
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return PackageManager.PERMISSION_GRANTED;
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((modeFlags&Intent.FLAG_GRANT_WRITE_URI_PERMISSION) != 0) {
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (writePermission == null
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    || checkPermission(writePermission, pid, uid)
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    == PackageManager.PERMISSION_GRANTED) {
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return PackageManager.PERMISSION_GRANTED;
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return uri != null ? checkUriPermission(uri, pid, uid, modeFlags)
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                : PackageManager.PERMISSION_DENIED;
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String uriModeFlagToString(int uriModeFlags) {
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (uriModeFlags) {
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Intent.FLAG_GRANT_READ_URI_PERMISSION |
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Intent.FLAG_GRANT_WRITE_URI_PERMISSION:
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "read and write";
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Intent.FLAG_GRANT_READ_URI_PERMISSION:
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "read";
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Intent.FLAG_GRANT_WRITE_URI_PERMISSION:
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "write";
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new IllegalArgumentException(
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "Unknown permission mode flags: " + uriModeFlags);
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void enforceForUri(
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int modeFlags, int resultOfCheck, boolean selfToo,
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int uid, Uri uri, String message) {
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resultOfCheck != PackageManager.PERMISSION_GRANTED) {
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SecurityException(
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (message != null ? (message + ": ") : "") +
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (selfToo
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     ? "Neither user " + uid + " nor current process has "
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     : "User " + uid + " does not have ") +
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uriModeFlagToString(modeFlags) +
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    " permission on " +
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uri +
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ".");
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceUriPermission(
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri uri, int pid, int uid, int modeFlags, String message) {
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceForUri(
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                modeFlags, checkUriPermission(uri, pid, uid, modeFlags),
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false, uid, uri, message);
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingUriPermission(
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri uri, int modeFlags, String message) {
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceForUri(
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                modeFlags, checkCallingUriPermission(uri, modeFlags),
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false, Binder.getCallingUid(), uri, message);
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingOrSelfUriPermission(
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri uri, int modeFlags, String message) {
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceForUri(
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                modeFlags,
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                checkCallingOrSelfUriPermission(uri, modeFlags), true,
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid(), uri, message);
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceUriPermission(
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri uri, String readPermission, String writePermission,
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int pid, int uid, int modeFlags, String message) {
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceForUri(modeFlags,
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      checkUriPermission(
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                              uri, readPermission, writePermission, pid, uid,
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                              modeFlags),
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      false,
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      uid,
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      uri,
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      message);
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Context createPackageContext(String packageName, int flags)
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws PackageManager.NameNotFoundException {
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (packageName.equals("system") || packageName.equals("android")) {
14212155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn            return new ContextImpl(mMainThread.getSystemContext());
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ActivityThread.PackageInfo pi =
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMainThread.getPackageInfo(packageName, flags);
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pi != null) {
14272155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn            ContextImpl c = new ContextImpl();
1428870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy            c.mRestricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED;
1429ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima            c.init(pi, null, mMainThread, mResources);
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (c.mResources != null) {
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return c;
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Should be a better exception.
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new PackageManager.NameNotFoundException(
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "Application package " + packageName + " not found");
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1440870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy    @Override
1441870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy    public boolean isRestricted() {
1442870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy        return mRestricted;
1443870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy    }
1444870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File getDataDirFile() {
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageInfo.getDataDirFile();
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("Not supported in system context");
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getDir(String name, int mode) {
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        name = "app_" + name;
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File file = makeFilename(getDataDirFile(), name);
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!file.exists()) {
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            file.mkdir();
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setFilePermissionsFromMode(file.getPath(), mode,
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH);
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return file;
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14642155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn    static ContextImpl createSystemContext(ActivityThread mainThread) {
14652155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn        ContextImpl context = new ContextImpl();
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        context.init(Resources.getSystem(), mainThread);
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return context;
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14702155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn    ContextImpl() {
147182fe564267f276151063b2aa0d26075c3210d75fCarl Shapiro        // For debug only
147282fe564267f276151063b2aa0d26075c3210d75fCarl Shapiro        //++sInstanceCount;
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOuterContext = this;
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new ApplicationContext from an existing one.  The new one
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * works and operates the same as the one it is copying.
14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context Existing application context.
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14822155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn    public ContextImpl(ContextImpl context) {
14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ++sInstanceCount;
14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPackageInfo = context.mPackageInfo;
14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResources = context.mResources;
14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread = context.mMainThread;
14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContentResolver = context.mContentResolver;
14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOuterContext = this;
14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void init(ActivityThread.PackageInfo packageInfo,
14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IBinder activityToken, ActivityThread mainThread) {
1493ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima        init(packageInfo, activityToken, mainThread, null);
1494ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima    }
1495ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima
1496ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima    final void init(ActivityThread.PackageInfo packageInfo,
1497ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima                IBinder activityToken, ActivityThread mainThread,
1498ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima                Resources container) {
14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPackageInfo = packageInfo;
15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResources = mPackageInfo.getResources(mainThread);
1501ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima
1502559a78753165f20d5973b958791056154baecc43Dianne Hackborn        if (mResources != null && container != null
1503559a78753165f20d5973b958791056154baecc43Dianne Hackborn                && container.getCompatibilityInfo().applicationScale !=
1504559a78753165f20d5973b958791056154baecc43Dianne Hackborn                        mResources.getCompatibilityInfo().applicationScale) {
1505ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima            if (DEBUG) {
1506ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima                Log.d(TAG, "loaded context has different scaling. Using container's" +
1507ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima                        " compatiblity info:" + container.getDisplayMetrics());
1508ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima            }
1509ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima            mResources = mainThread.getTopLevelResources(
1510ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima                    mPackageInfo.getResDir(), container.getCompatibilityInfo().copy());
1511ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima        }
15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread = mainThread;
15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContentResolver = new ApplicationContentResolver(this, mainThread);
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setActivityToken(activityToken);
15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void init(Resources resources, ActivityThread mainThread) {
15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPackageInfo = null;
15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResources = resources;
15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread = mainThread;
15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContentResolver = new ApplicationContentResolver(this, mainThread);
15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void scheduleFinalCleanup(String who, String what) {
15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread.scheduleContextCleanup(this, who, what);
15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performFinalCleanup(String who, String what) {
15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //Log.i(TAG, "Cleanup up context: " + this);
15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPackageInfo.removeContextRegistrations(getOuterContext(), who, what);
15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Context getReceiverRestrictedContext() {
15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mReceiverRestrictedContext != null) {
15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mReceiverRestrictedContext;
15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mReceiverRestrictedContext = new ReceiverRestrictedContext(getOuterContext());
15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void setActivityToken(IBinder token) {
15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mActivityToken = token;
15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void setOuterContext(Context context) {
15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOuterContext = context;
15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Context getOuterContext() {
15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mOuterContext;
15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final IBinder getActivityToken() {
15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mActivityToken;
15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static void setFilePermissionsFromMode(String name, int mode,
15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int extraPermissions) {
15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int perms = FileUtils.S_IRUSR|FileUtils.S_IWUSR
15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            |FileUtils.S_IRGRP|FileUtils.S_IWGRP
15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            |extraPermissions;
15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mode&MODE_WORLD_READABLE) != 0) {
15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            perms |= FileUtils.S_IROTH;
15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mode&MODE_WORLD_WRITEABLE) != 0) {
15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            perms |= FileUtils.S_IWOTH;
15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1568569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima        if (DEBUG) {
15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.i(TAG, "File " + name + ": mode=0x" + Integer.toHexString(mode)
15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                  + ", perms=0x" + Integer.toHexString(perms));
15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileUtils.setPermissions(name, perms, -1, -1);
15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1575a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor    private File validateFilePath(String name, boolean createDirectory) {
1576a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        File dir;
1577a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        File f;
1578a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor
1579a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        if (name.charAt(0) == File.separatorChar) {
1580a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            String dirPath = name.substring(0, name.lastIndexOf(File.separatorChar));
1581a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            dir = new File(dirPath);
1582a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            name = name.substring(name.lastIndexOf(File.separatorChar));
1583a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            f = new File(dir, name);
1584a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        } else {
1585a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            dir = getDatabasesDir();
1586a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            f = makeFilename(dir, name);
1587a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        }
1588a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor
1589a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        if (createDirectory && !dir.isDirectory() && dir.mkdir()) {
1590a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            FileUtils.setPermissions(dir.getPath(),
1591a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor                FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
1592a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor                -1, -1);
1593a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        }
1594a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor
1595a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        return f;
1596a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor    }
1597a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor
15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File makeFilename(File base, String name) {
15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (name.indexOf(File.separatorChar) < 0) {
16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new File(base, name);
16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new IllegalArgumentException(
1603a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor                "File " + name + " contains a path separator");
16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final class ApplicationContentResolver extends ContentResolver {
16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ApplicationContentResolver(Context context,
16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                          ActivityThread mainThread)
16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        {
16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(context);
16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMainThread = mainThread;
16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        protected IContentProvider acquireProvider(Context context, String name)
16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        {
16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mMainThread.acquireProvider(context, name);
16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean releaseProvider(IContentProvider provider)
16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        {
16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mMainThread.releaseProvider(provider);
16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final ActivityThread mMainThread;
16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/
16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final class ApplicationPackageManager extends PackageManager {
16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PackageInfo getPackageInfo(String packageName, int flags)
16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throws NameNotFoundException {
16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PackageInfo pi = mPM.getPackageInfo(packageName, flags);
16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pi != null) {
16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return pi;
16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new NameNotFoundException(packageName);
16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1654eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda        @Override
1655470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn        public String[] currentToCanonicalPackageNames(String[] names) {
1656470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn            try {
1657470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn                return mPM.currentToCanonicalPackageNames(names);
1658470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn            } catch (RemoteException e) {
1659470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn                throw new RuntimeException("Package manager has died", e);
1660470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn            }
1661470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn        }
1662470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn
1663470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn        @Override
1664470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn        public String[] canonicalToCurrentPackageNames(String[] names) {
1665470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn            try {
1666470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn                return mPM.canonicalToCurrentPackageNames(names);
1667470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn            } catch (RemoteException e) {
1668470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn                throw new RuntimeException("Package manager has died", e);
1669470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn            }
1670470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn        }
1671470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn
1672470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn        @Override
1673eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda        public Intent getLaunchIntentForPackage(String packageName) {
16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // First see if the package has an INFO activity; the existence of
16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // such an activity is implied to be the desired front-door for the
16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // overall package (such as if it has multiple launcher entries).
1677eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda            Intent intentToResolve = new Intent(Intent.ACTION_MAIN);
1678eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda            intentToResolve.addCategory(Intent.CATEGORY_INFO);
1679c14b9ccdf13163cae5ce5d21bcf377010b37594bDianne Hackborn            intentToResolve.setPackage(packageName);
1680c14b9ccdf13163cae5ce5d21bcf377010b37594bDianne Hackborn            ResolveInfo resolveInfo = resolveActivity(intentToResolve, 0);
1681eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda
16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Otherwise, try to find a main launcher activity.
1683eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda            if (resolveInfo == null) {
1684eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda                // reuse the intent instance
1685eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda                intentToResolve.removeCategory(Intent.CATEGORY_INFO);
1686eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda                intentToResolve.addCategory(Intent.CATEGORY_LAUNCHER);
1687c14b9ccdf13163cae5ce5d21bcf377010b37594bDianne Hackborn                intentToResolve.setPackage(packageName);
1688c14b9ccdf13163cae5ce5d21bcf377010b37594bDianne Hackborn                resolveInfo = resolveActivity(intentToResolve, 0);
1689eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda            }
1690eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda            if (resolveInfo == null) {
1691eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda                return null;
1692eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda            }
16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Intent intent = new Intent(Intent.ACTION_MAIN);
1694eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda            intent.setClassName(packageName, resolveInfo.activityInfo.name);
16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
1696eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda            return intent;
16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1698eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda
16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int[] getPackageGids(String packageName)
17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws NameNotFoundException {
17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int[] gids = mPM.getPackageGids(packageName);
17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (gids == null || gids.length > 0) {
17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return gids;
17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new NameNotFoundException(packageName);
17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PermissionInfo getPermissionInfo(String name, int flags)
17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws NameNotFoundException {
17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PermissionInfo pi = mPM.getPermissionInfo(name, flags);
17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pi != null) {
17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return pi;
17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new NameNotFoundException(name);
17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public List<PermissionInfo> queryPermissionsByGroup(String group, int flags)
17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throws NameNotFoundException {
17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                List<PermissionInfo> pi = mPM.queryPermissionsByGroup(group, flags);
17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pi != null) {
17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return pi;
17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new NameNotFoundException(group);
17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PermissionGroupInfo getPermissionGroupInfo(String name,
17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int flags) throws NameNotFoundException {
17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PermissionGroupInfo pgi = mPM.getPermissionGroupInfo(name, flags);
17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pgi != null) {
17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return pgi;
17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new NameNotFoundException(name);
17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public List<PermissionGroupInfo> getAllPermissionGroups(int flags) {
17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.getAllPermissionGroups(flags);
17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ApplicationInfo getApplicationInfo(String packageName, int flags)
17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws NameNotFoundException {
17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ApplicationInfo ai = mPM.getApplicationInfo(packageName, flags);
17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ai != null) {
17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return ai;
17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new NameNotFoundException(packageName);
17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ActivityInfo getActivityInfo(ComponentName className, int flags)
17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws NameNotFoundException {
17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityInfo ai = mPM.getActivityInfo(className, flags);
17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ai != null) {
17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return ai;
17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new NameNotFoundException(className.toString());
17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ActivityInfo getReceiverInfo(ComponentName className, int flags)
18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws NameNotFoundException {
18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityInfo ai = mPM.getReceiverInfo(className, flags);
18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ai != null) {
18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return ai;
18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new NameNotFoundException(className.toString());
18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ServiceInfo getServiceInfo(ComponentName className, int flags)
18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws NameNotFoundException {
18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ServiceInfo si = mPM.getServiceInfo(className, flags);
18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (si != null) {
18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return si;
18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new NameNotFoundException(className.toString());
18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String[] getSystemSharedLibraryNames() {
18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             try {
18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 return mPM.getSystemSharedLibraryNames();
18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             } catch (RemoteException e) {
18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 throw new RuntimeException("Package manager has died", e);
18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             }
18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
183849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn        public FeatureInfo[] getSystemAvailableFeatures() {
183949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn            try {
184049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                return mPM.getSystemAvailableFeatures();
184149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn            } catch (RemoteException e) {
184249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                throw new RuntimeException("Package manager has died", e);
184349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn            }
184449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn        }
184549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn
184649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn        @Override
1847039c68e75606e837cf021815a0210836724574adDianne Hackborn        public boolean hasSystemFeature(String name) {
1848039c68e75606e837cf021815a0210836724574adDianne Hackborn            try {
1849039c68e75606e837cf021815a0210836724574adDianne Hackborn                return mPM.hasSystemFeature(name);
1850039c68e75606e837cf021815a0210836724574adDianne Hackborn            } catch (RemoteException e) {
1851039c68e75606e837cf021815a0210836724574adDianne Hackborn                throw new RuntimeException("Package manager has died", e);
1852039c68e75606e837cf021815a0210836724574adDianne Hackborn            }
1853039c68e75606e837cf021815a0210836724574adDianne Hackborn        }
1854039c68e75606e837cf021815a0210836724574adDianne Hackborn
1855039c68e75606e837cf021815a0210836724574adDianne Hackborn        @Override
18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int checkPermission(String permName, String pkgName) {
18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.checkPermission(permName, pkgName);
18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean addPermission(PermissionInfo info) {
18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.addPermission(info);
18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1874d7c096845dee7616095eda0fe9e7aa08f0ba9c20Dianne Hackborn        public boolean addPermissionAsync(PermissionInfo info) {
1875d7c096845dee7616095eda0fe9e7aa08f0ba9c20Dianne Hackborn            try {
1876d7c096845dee7616095eda0fe9e7aa08f0ba9c20Dianne Hackborn                return mPM.addPermissionAsync(info);
1877d7c096845dee7616095eda0fe9e7aa08f0ba9c20Dianne Hackborn            } catch (RemoteException e) {
1878d7c096845dee7616095eda0fe9e7aa08f0ba9c20Dianne Hackborn                throw new RuntimeException("Package manager has died", e);
1879d7c096845dee7616095eda0fe9e7aa08f0ba9c20Dianne Hackborn            }
1880d7c096845dee7616095eda0fe9e7aa08f0ba9c20Dianne Hackborn        }
1881d7c096845dee7616095eda0fe9e7aa08f0ba9c20Dianne Hackborn
1882d7c096845dee7616095eda0fe9e7aa08f0ba9c20Dianne Hackborn        @Override
18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void removePermission(String name) {
18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPM.removePermission(name);
18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int checkSignatures(String pkg1, String pkg2) {
18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.checkSignatures(pkg1, pkg2);
18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1901766cbfe44be3c5013a6a22bd6cd8ad1055a37256Dianne Hackborn        public int checkSignatures(int uid1, int uid2) {
1902766cbfe44be3c5013a6a22bd6cd8ad1055a37256Dianne Hackborn            try {
1903766cbfe44be3c5013a6a22bd6cd8ad1055a37256Dianne Hackborn                return mPM.checkUidSignatures(uid1, uid2);
1904766cbfe44be3c5013a6a22bd6cd8ad1055a37256Dianne Hackborn            } catch (RemoteException e) {
1905766cbfe44be3c5013a6a22bd6cd8ad1055a37256Dianne Hackborn                throw new RuntimeException("Package manager has died", e);
1906766cbfe44be3c5013a6a22bd6cd8ad1055a37256Dianne Hackborn            }
1907766cbfe44be3c5013a6a22bd6cd8ad1055a37256Dianne Hackborn        }
1908766cbfe44be3c5013a6a22bd6cd8ad1055a37256Dianne Hackborn
1909766cbfe44be3c5013a6a22bd6cd8ad1055a37256Dianne Hackborn        @Override
19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String[] getPackagesForUid(int uid) {
19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.getPackagesForUid(uid);
19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String getNameForUid(int uid) {
19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.getNameForUid(uid);
19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getUidForSharedUser(String sharedUserName)
19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throws NameNotFoundException {
19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int uid = mPM.getUidForSharedUser(sharedUserName);
19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if(uid != -1) {
19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return uid;
19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new NameNotFoundException("No shared userid for user:"+sharedUserName);
19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public List<PackageInfo> getInstalledPackages(int flags) {
19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.getInstalledPackages(flags);
19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public List<ApplicationInfo> getInstalledApplications(int flags) {
19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.getInstalledApplications(flags);
19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ResolveInfo resolveActivity(Intent intent, int flags) {
19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.resolveIntent(
19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    intent,
19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    intent.resolveTypeIfNeeded(mContext.getContentResolver()),
19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    flags);
19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public List<ResolveInfo> queryIntentActivities(Intent intent,
19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int flags) {
19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.queryIntentActivities(
19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    intent,
19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    intent.resolveTypeIfNeeded(mContext.getContentResolver()),
19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    flags);
19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public List<ResolveInfo> queryIntentActivityOptions(
19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ComponentName caller, Intent[] specifics, Intent intent,
19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int flags) {
19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final ContentResolver resolver = mContext.getContentResolver();
19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] specificTypes = null;
19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (specifics != null) {
19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int N = specifics.length;
19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Intent sp = specifics[i];
19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (sp != null) {
19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        String t = sp.resolveTypeIfNeeded(resolver);
19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (t != null) {
19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (specificTypes == null) {
19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                specificTypes = new String[N];
20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            specificTypes[i] = t;
20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.queryIntentActivityOptions(caller, specifics,
20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    specificTypes, intent, intent.resolveTypeIfNeeded(resolver),
20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    flags);
20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public List<ResolveInfo> queryBroadcastReceivers(Intent intent, int flags) {
20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.queryIntentReceivers(
20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    intent,
20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    intent.resolveTypeIfNeeded(mContext.getContentResolver()),
20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    flags);
20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ResolveInfo resolveService(Intent intent, int flags) {
20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.resolveService(
20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    intent,
20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    intent.resolveTypeIfNeeded(mContext.getContentResolver()),
20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    flags);
20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public List<ResolveInfo> queryIntentServices(Intent intent, int flags) {
20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.queryIntentServices(
20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    intent,
20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    intent.resolveTypeIfNeeded(mContext.getContentResolver()),
20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    flags);
20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ProviderInfo resolveContentProvider(String name,
20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int flags) {
20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.resolveContentProvider(name, flags);
20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public List<ProviderInfo> queryContentProviders(String processName,
20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int uid, int flags) {
20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.queryContentProviders(processName, uid, flags);
20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public InstrumentationInfo getInstrumentationInfo(
20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ComponentName className, int flags)
20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throws NameNotFoundException {
20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                InstrumentationInfo ii = mPM.getInstrumentationInfo(
20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        className, flags);
20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ii != null) {
20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return ii;
20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new NameNotFoundException(className.toString());
20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public List<InstrumentationInfo> queryInstrumentation(
20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String targetPackage, int flags) {
20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.queryInstrumentation(targetPackage, flags);
20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override public Drawable getDrawable(String packageName, int resid,
21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ApplicationInfo appInfo) {
21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ResourceName name = new ResourceName(packageName, resid);
21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Drawable dr = getCachedIcon(name);
21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (dr != null) {
21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return dr;
21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (appInfo == null) {
21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    appInfo = getApplicationInfo(packageName, 0);
21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (NameNotFoundException e) {
21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Resources r = getResourcesForApplication(appInfo);
21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dr = r.getDrawable(resid);
211611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn                if (false) {
211711ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn                    RuntimeException e = new RuntimeException("here");
211811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn                    e.fillInStackTrace();
211911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn                    Log.w(TAG, "Getting drawable 0x" + Integer.toHexString(resid)
212011ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn                            + " from package " + packageName
212111ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn                            + ": app scale=" + r.getCompatibilityInfo().applicationScale
212211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn                            + ", caller scale=" + mContext.getResources().getCompatibilityInfo().applicationScale,
212311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn                            e);
212411ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn                }
21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_ICONS) Log.v(TAG, "Getting drawable 0x"
21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + Integer.toHexString(resid) + " from " + r
21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + ": " + dr);
21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                putCachedIcon(name, dr);
21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return dr;
21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (NameNotFoundException e) {
21319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w("PackageManager", "Failure retrieving resources for"
21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + appInfo.packageName);
21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RuntimeException e) {
21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If an exception was thrown, fall through to return
21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // default icon.
21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w("PackageManager", "Failure retrieving icon 0x"
21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + Integer.toHexString(resid) + " in package "
21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + packageName, e);
21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override public Drawable getActivityIcon(ComponentName activityName)
21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throws NameNotFoundException {
21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getActivityInfo(activityName, 0).loadIcon(this);
21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override public Drawable getActivityIcon(Intent intent)
21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throws NameNotFoundException {
21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (intent.getComponent() != null) {
21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getActivityIcon(intent.getComponent());
21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ResolveInfo info = resolveActivity(
21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                intent, PackageManager.MATCH_DEFAULT_ONLY);
21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (info != null) {
21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return info.activityInfo.loadIcon(this);
21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new NameNotFoundException(intent.toURI());
21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override public Drawable getDefaultActivityIcon() {
21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return Resources.getSystem().getDrawable(
21659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.drawable.sym_def_app_icon);
21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override public Drawable getApplicationIcon(ApplicationInfo info) {
216907330791116513710d879c45b2f095cd314cbfd0Jeff Brown            return info.loadIcon(this);
21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override public Drawable getApplicationIcon(String packageName)
21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throws NameNotFoundException {
21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getApplicationIcon(getApplicationInfo(packageName, 0));
21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override public Resources getResourcesForActivity(
21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ComponentName activityName) throws NameNotFoundException {
21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getResourcesForApplication(
21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                getActivityInfo(activityName, 0).applicationInfo);
21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override public Resources getResourcesForApplication(
21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ApplicationInfo app) throws NameNotFoundException {
21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (app.packageName.equals("system")) {
21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mContext.mMainThread.getSystemContext().getResources();
21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Resources r = mContext.mMainThread.getTopLevelResources(
21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    app.uid == Process.myUid() ? app.sourceDir
219011ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn                    : app.publicSourceDir, mContext.mPackageInfo);
21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (r != null) {
21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return r;
21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new NameNotFoundException("Unable to open " + app.publicSourceDir);
21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override public Resources getResourcesForApplication(
21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String appPackageName) throws NameNotFoundException {
21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getResourcesForApplication(
22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                getApplicationInfo(appPackageName, 0));
22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mCachedSafeMode = -1;
22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override public boolean isSafeMode() {
22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mCachedSafeMode < 0) {
22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mCachedSafeMode = mPM.isSafeMode() ? 1 : 0;
22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mCachedSafeMode != 0;
22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        static void configurationChanged() {
22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (sSync) {
22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sIconCache.clear();
22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sStringCache.clear();
22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22222155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn        ApplicationPackageManager(ContextImpl context,
22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                IPackageManager pm) {
22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mContext = context;
22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPM = pm;
22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private Drawable getCachedIcon(ResourceName name) {
22299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (sSync) {
22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WeakReference<Drawable> wr = sIconCache.get(name);
22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_ICONS) Log.v(TAG, "Get cached weak drawable ref for "
22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + name + ": " + wr);
22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (wr != null) {   // we have the activity
22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Drawable dr = wr.get();
22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (dr != null) {
22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (DEBUG_ICONS) Log.v(TAG, "Get cached drawable for "
22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + name + ": " + dr);
22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return dr;
22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // our entry has been purged
22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sIconCache.remove(name);
22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
22459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private void establishPackageRemovedReceiver() {
22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // mContext.registerReceiverInternal() winds up acquiring the
22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // main ActivityManagerService.this lock.  If we hold our usual
22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // sSync global lock at the same time, we impose a required ordering
22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // on those two locks, which is not good for deadlock prevention.
22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Use a dedicated lock around initialization of
22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // sPackageRemovedReceiver to avoid this.
22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (sPackageRemovedSync) {
22559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (sPackageRemovedReceiver == null) {
22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sPackageRemovedReceiver = new PackageRemovedReceiver();
22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    IntentFilter filter = new IntentFilter(
22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Intent.ACTION_PACKAGE_REMOVED);
22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    filter.addDataScheme("package");
22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mContext.registerReceiverInternal(sPackageRemovedReceiver,
22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            filter, null, null, null);
226208675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                    // Register for events related to sdcard installation.
226308675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                    IntentFilter sdFilter = new IntentFilter();
2264b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                    sdFilter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE);
226508675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                    mContext.registerReceiverInternal(sPackageRemovedReceiver,
226608675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                            sdFilter, null, null, null);
22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private void putCachedIcon(ResourceName name, Drawable dr) {
22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            establishPackageRemovedReceiver();
22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (sSync) {
22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sIconCache.put(name, new WeakReference<Drawable>(dr));
22769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_ICONS) Log.v(TAG, "Added cached drawable for "
22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + name + ": " + dr);
22789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static final class PackageRemovedReceiver extends BroadcastReceiver {
22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void onReceive(Context context, Intent intent) {
228408675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                String pkgList[] = null;
228508675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                String action = intent.getAction();
228608675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                boolean immediateGc = false;
2287b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                if (Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE.equals(action)) {
228808675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                    pkgList = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);
228908675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                    immediateGc = true;
229008675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                } else {
229108675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                    Uri data = intent.getData();
229208675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                    if (data != null) {
229308675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                        String ssp = data.getSchemeSpecificPart();
229408675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                        if (ssp != null) {
229508675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                            pkgList = new String[] { ssp };
229608675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                        }
229708675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                    }
229808675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                }
229908675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                if (pkgList != null && (pkgList.length > 0)) {
23009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    boolean needCleanup = false;
230108675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                    boolean hasPkgInfo = false;
230208675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                    for (String ssp : pkgList) {
230308675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                        synchronized (sSync) {
230408675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                            Iterator<ResourceName> it = sIconCache.keySet().iterator();
230508675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                            while (it.hasNext()) {
230608675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                                ResourceName nm = it.next();
230708675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                                if (nm.packageName.equals(ssp)) {
230808675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                                    //Log.i(TAG, "Removing cached drawable for " + nm);
230908675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                                    it.remove();
231008675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                                    needCleanup = true;
231108675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                                }
23129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
231308675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                            it = sStringCache.keySet().iterator();
231408675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                            while (it.hasNext()) {
231508675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                                ResourceName nm = it.next();
231608675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                                if (nm.packageName.equals(ssp)) {
231708675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                                    //Log.i(TAG, "Removing cached string for " + nm);
231808675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                                    it.remove();
231908675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                                    needCleanup = true;
232008675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                                }
23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
23229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
232308675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                        if (!hasPkgInfo) {
232408675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                            hasPkgInfo = ActivityThread.currentActivityThread().hasPackageInfo(ssp);
232508675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                        }
23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
232708675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                    if (needCleanup || hasPkgInfo) {
232808675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                        if (immediateGc) {
232908675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                            // Schedule an immediate gc.
233008675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                            Runtime.getRuntime().gc();
233108675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                        } else {
233208675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                            ActivityThread.currentActivityThread().scheduleGcIdler();
233308675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                        }
23349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
23359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static final class ResourceName {
23409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final String packageName;
23419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int iconId;
23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ResourceName(String _packageName, int _iconId) {
23449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                packageName = _packageName;
23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                iconId = _iconId;
23469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ResourceName(ApplicationInfo aInfo, int _iconId) {
23499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                this(aInfo.packageName, _iconId);
23509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ResourceName(ComponentInfo cInfo, int _iconId) {
23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                this(cInfo.applicationInfo.packageName, _iconId);
23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ResourceName(ResolveInfo rInfo, int _iconId) {
23579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                this(rInfo.activityInfo.applicationInfo.packageName, _iconId);
23589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public boolean equals(Object o) {
23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (this == o) return true;
23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (o == null || getClass() != o.getClass()) return false;
23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ResourceName that = (ResourceName) o;
23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (iconId != that.iconId) return false;
23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return !(packageName != null ?
23699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        !packageName.equals(that.packageName) : that.packageName != null);
23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int hashCode() {
23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int result;
23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                result = packageName.hashCode();
23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                result = 31 * result + iconId;
23789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return result;
23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public String toString() {
23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "{ResourceName " + packageName + " / " + iconId + "}";
23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private CharSequence getCachedString(ResourceName name) {
23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (sSync) {
23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WeakReference<CharSequence> wr = sStringCache.get(name);
23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (wr != null) {   // we have the activity
23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    CharSequence cs = wr.get();
23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (cs != null) {
23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return cs;
23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // our entry has been purged
23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sStringCache.remove(name);
23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private void putCachedString(ResourceName name, CharSequence cs) {
24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            establishPackageRemovedReceiver();
24049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (sSync) {
24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sStringCache.put(name, new WeakReference<CharSequence>(cs));
24079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public CharSequence getText(String packageName, int resid,
24129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ApplicationInfo appInfo) {
24139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ResourceName name = new ResourceName(packageName, resid);
24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence text = getCachedString(name);
24159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (text != null) {
24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return text;
24179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (appInfo == null) {
24199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
24209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    appInfo = getApplicationInfo(packageName, 0);
24219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (NameNotFoundException e) {
24229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
24239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
24269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Resources r = getResourcesForApplication(appInfo);
24279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                text = r.getText(resid);
24289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                putCachedString(name, text);
24299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return text;
24309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (NameNotFoundException e) {
24319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w("PackageManager", "Failure retrieving resources for"
24329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + appInfo.packageName);
24339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RuntimeException e) {
24349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If an exception was thrown, fall through to return
24359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // default icon.
24369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w("PackageManager", "Failure retrieving text 0x"
24379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + Integer.toHexString(resid) + " in package "
24389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + packageName, e);
24399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
24419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public XmlResourceParser getXml(String packageName, int resid,
24459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ApplicationInfo appInfo) {
24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (appInfo == null) {
24479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    appInfo = getApplicationInfo(packageName, 0);
24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (NameNotFoundException e) {
24509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
24519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
24549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Resources r = getResourcesForApplication(appInfo);
24559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return r.getXml(resid);
24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RuntimeException e) {
24579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If an exception was thrown, fall through to return
24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // default icon.
24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w("PackageManager", "Failure retrieving xml 0x"
24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + Integer.toHexString(resid) + " in package "
24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + packageName, e);
24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (NameNotFoundException e) {
24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w("PackageManager", "Failure retrieving resources for"
24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + appInfo.packageName);
24659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public CharSequence getApplicationLabel(ApplicationInfo info) {
247107330791116513710d879c45b2f095cd314cbfd0Jeff Brown            return info.loadLabel(this);
24729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
247565e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski        public void installPackage(Uri packageURI, IPackageInstallObserver observer, int flags,
247665e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski                String installerPackageName) {
24779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
247865e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski                mPM.installPackage(packageURI, observer, flags, installerPackageName);
24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Should never happen!
24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
24858946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu        public void movePackage(String packageName, IPackageMoveObserver observer, int flags) {
24868946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu            try {
24878946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu                mPM.movePackage(packageName, observer, flags);
24888946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu            } catch (RemoteException e) {
24898946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu                // Should never happen!
24908946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu            }
24918946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu        }
24928946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu
24938946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu        @Override
249465e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski        public String getInstallerPackageName(String packageName) {
249565e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski            try {
249665e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski                return mPM.getInstallerPackageName(packageName);
249765e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski            } catch (RemoteException e) {
249865e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski                // Should never happen!
249965e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski            }
250065e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski            return null;
250165e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski        }
250265e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski
250365e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski        @Override
25049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void deletePackage(String packageName, IPackageDeleteObserver observer, int flags) {
25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPM.deletePackage(packageName, observer, flags);
25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Should never happen!
25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void clearApplicationUserData(String packageName,
25139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                IPackageDataObserver observer) {
25149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
25159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPM.clearApplicationUserData(packageName, observer);
25169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Should never happen!
25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
25219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void deleteApplicationCacheFiles(String packageName,
25229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                IPackageDataObserver observer) {
25239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
25249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPM.deleteApplicationCacheFiles(packageName, observer);
25259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
25269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Should never happen!
25279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
25309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void freeStorageAndNotify(long idealStorageSize, IPackageDataObserver observer) {
25319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
25329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPM.freeStorageAndNotify(idealStorageSize, observer);
25339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
25349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Should never happen!
25359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25371ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu
25381ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        @Override
2539bc806f65edc33f6eda0f475ac84e5e037a013a90Suchi Amalapurapu        public void freeStorage(long freeStorageSize, IntentSender pi) {
25401ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu            try {
25411ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu                mPM.freeStorage(freeStorageSize, pi);
25421ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu            } catch (RemoteException e) {
25431ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu                // Should never happen!
25441ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu            }
25451ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        }
25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void getPackageSizeInfo(String packageName,
25499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                IPackageStatsObserver observer) {
25509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
25519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPM.getPackageSizeInfo(packageName, observer);
25529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
25539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Should never happen!
25549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
25579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void addPackageToPreferred(String packageName) {
25589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
25599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPM.addPackageToPreferred(packageName);
25609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
25619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Should never happen!
25629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
25669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void removePackageFromPreferred(String packageName) {
25679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
25689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPM.removePackageFromPreferred(packageName);
25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Should never happen!
25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
25759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public List<PackageInfo> getPreferredPackages(int flags) {
25769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
25779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.getPreferredPackages(flags);
25789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
25799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Should never happen!
25809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new ArrayList<PackageInfo>();
25829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
25859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void addPreferredActivity(IntentFilter filter,
25869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int match, ComponentName[] set, ComponentName activity) {
25879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
25889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPM.addPreferredActivity(filter, match, set, activity);
25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Should never happen!
25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
25958dbe612dc60526d635e57257b58627b33a099678Satish Sampath        public void replacePreferredActivity(IntentFilter filter,
25968dbe612dc60526d635e57257b58627b33a099678Satish Sampath                int match, ComponentName[] set, ComponentName activity) {
25978dbe612dc60526d635e57257b58627b33a099678Satish Sampath            try {
25988dbe612dc60526d635e57257b58627b33a099678Satish Sampath                mPM.replacePreferredActivity(filter, match, set, activity);
25998dbe612dc60526d635e57257b58627b33a099678Satish Sampath            } catch (RemoteException e) {
26008dbe612dc60526d635e57257b58627b33a099678Satish Sampath                // Should never happen!
26018dbe612dc60526d635e57257b58627b33a099678Satish Sampath            }
26028dbe612dc60526d635e57257b58627b33a099678Satish Sampath        }
26038dbe612dc60526d635e57257b58627b33a099678Satish Sampath
26048dbe612dc60526d635e57257b58627b33a099678Satish Sampath        @Override
26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void clearPackagePreferredActivities(String packageName) {
26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPM.clearPackagePreferredActivities(packageName);
26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Should never happen!
26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
26149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getPreferredActivities(List<IntentFilter> outFilters,
26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                List<ComponentName> outActivities, String packageName) {
26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
26179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.getPreferredActivities(outFilters, outActivities, packageName);
26189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Should never happen!
26209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return 0;
26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
26259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setComponentEnabledSetting(ComponentName componentName,
26269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int newState, int flags) {
26279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPM.setComponentEnabledSetting(componentName, newState, flags);
26299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
26309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Should never happen!
26319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
26359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getComponentEnabledSetting(ComponentName componentName) {
26369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
26379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.getComponentEnabledSetting(componentName);
26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
26399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Should never happen!
26409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
26429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
26459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setApplicationEnabledSetting(String packageName,
26469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int newState, int flags) {
26479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
26489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPM.setApplicationEnabledSetting(packageName, newState, flags);
26499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
26509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Should never happen!
26519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
26559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getApplicationEnabledSetting(String packageName) {
26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
26579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.getApplicationEnabledSetting(packageName);
26589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
26599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Should never happen!
26609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
26629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26642155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn        private final ContextImpl mContext;
26659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final IPackageManager mPM;
26669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static final Object sSync = new Object();
26689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static final Object sPackageRemovedSync = new Object();
26699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static BroadcastReceiver sPackageRemovedReceiver;
26709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static HashMap<ResourceName, WeakReference<Drawable> > sIconCache
26719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                = new HashMap<ResourceName, WeakReference<Drawable> >();
26729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static HashMap<ResourceName, WeakReference<CharSequence> > sStringCache
26739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                = new HashMap<ResourceName, WeakReference<CharSequence> >();
26749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
26779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
26789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
26799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final class SharedPreferencesImpl implements SharedPreferences {
26819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final File mFile;
26839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final File mBackupFile;
26849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final int mMode;
26859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private Map mMap;
26869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final FileStatus mFileStatus = new FileStatus();
26879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private long mTimestamp;
26889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2689105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        private static final Object mContent = new Object();
2690105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        private WeakHashMap<OnSharedPreferenceChangeListener, Object> mListeners;
26919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SharedPreferencesImpl(
26939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            File file, int mode, Map initialContents) {
26949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mFile = file;
26959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBackupFile = makeBackupFile(file);
26969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMode = mode;
26979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMap = initialContents != null ? initialContents : new HashMap();
26989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (FileUtils.getFileStatus(file.getPath(), mFileStatus)) {
26999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimestamp = mFileStatus.mtime;
27009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2701105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mListeners = new WeakHashMap<OnSharedPreferenceChangeListener, Object>();
27029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean hasFileChanged() {
27059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
27069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!FileUtils.getFileStatus(mFile.getPath(), mFileStatus)) {
27079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return true;
27089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
27099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mTimestamp != mFileStatus.mtime;
27109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void replace(Map newContents) {
27149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (newContents != null) {
27159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                synchronized (this) {
27169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMap = newContents;
27179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
27189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) {
27229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized(this) {
2723105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mListeners.put(listener, mContent);
27249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void unregisterOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) {
27289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized(this) {
27299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mListeners.remove(listener);
27309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<String, ?> getAll() {
27349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized(this) {
27359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //noinspection unchecked
27369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new HashMap(mMap);
27379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String getString(String key, String defValue) {
27419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
27429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String v = (String)mMap.get(key);
27439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return v != null ? v : defValue;
27449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getInt(String key, int defValue) {
27489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
27499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Integer v = (Integer)mMap.get(key);
27509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return v != null ? v : defValue;
27519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long getLong(String key, long defValue) {
27549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
27559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Long v = (Long) mMap.get(key);
27569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return v != null ? v : defValue;
27579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public float getFloat(String key, float defValue) {
27609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
27619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Float v = (Float)mMap.get(key);
27629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return v != null ? v : defValue;
27639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean getBoolean(String key, boolean defValue) {
27669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
27679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Boolean v = (Boolean)mMap.get(key);
27689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return v != null ? v : defValue;
27699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean contains(String key) {
27739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
27749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mMap.containsKey(key);
27759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class EditorImpl implements Editor {
27799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            private final Map<String, Object> mModified = Maps.newHashMap();
27809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            private boolean mClear = false;
27819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Editor putString(String key, String value) {
27839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                synchronized (this) {
27849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mModified.put(key, value);
27859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return this;
27869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
27879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Editor putInt(String key, int value) {
27899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                synchronized (this) {
27909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mModified.put(key, value);
27919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return this;
27929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
27939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Editor putLong(String key, long value) {
27959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                synchronized (this) {
27969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mModified.put(key, value);
27979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return this;
27989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
27999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Editor putFloat(String key, float value) {
28019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                synchronized (this) {
28029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mModified.put(key, value);
28039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return this;
28049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
28059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Editor putBoolean(String key, boolean value) {
28079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                synchronized (this) {
28089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mModified.put(key, value);
28099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return this;
28109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
28119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Editor remove(String key) {
28149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                synchronized (this) {
28159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mModified.put(key, this);
28169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return this;
28179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
28189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Editor clear() {
28219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                synchronized (this) {
28229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mClear = true;
28239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return this;
28249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
28259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public boolean commit() {
28289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean returnValue;
28299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean hasListeners;
28319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                List<String> keysModified = null;
2832105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                Set<OnSharedPreferenceChangeListener> listeners = null;
28339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                synchronized (SharedPreferencesImpl.this) {
28359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    hasListeners = mListeners.size() > 0;
28369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (hasListeners) {
28379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        keysModified = new ArrayList<String>();
2838105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        listeners =
2839105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                                new HashSet<OnSharedPreferenceChangeListener>(mListeners.keySet());
28409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
28419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized (this) {
28439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (mClear) {
28449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mMap.clear();
28459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mClear = false;
28469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
28479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2848105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        for (Entry<String, Object> e : mModified.entrySet()) {
28499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            String k = e.getKey();
28509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Object v = e.getValue();
28519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (v == this) {
28529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                mMap.remove(k);
28539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } else {
28549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                mMap.put(k, v);
28559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
28569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (hasListeners) {
28589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                keysModified.add(k);
28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
28609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
28619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mModified.clear();
28639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
28649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    returnValue = writeFileLocked();
28669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
28679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (hasListeners) {
28699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i = keysModified.size() - 1; i >= 0; i--) {
28709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        final String key = keysModified.get(i);
2871105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        for (OnSharedPreferenceChangeListener listener : listeners) {
2872105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                            if (listener != null) {
2873105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                                listener.onSharedPreferenceChanged(SharedPreferencesImpl.this, key);
2874105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                            }
28759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
28769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
28779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
28789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return returnValue;
28809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Editor edit() {
28849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new EditorImpl();
28859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private FileOutputStream createFileOutputStream(File file) {
28889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            FileOutputStream str = null;
28899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
28909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str = new FileOutputStream(file);
28919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (FileNotFoundException e) {
28929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                File parent = file.getParentFile();
28939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!parent.mkdir()) {
28949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.e(TAG, "Couldn't create directory for SharedPreferences file " + file);
28959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
28969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
28979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                FileUtils.setPermissions(
28989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    parent.getPath(),
28999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
29009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    -1, -1);
29019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
29029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    str = new FileOutputStream(file);
29039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (FileNotFoundException e2) {
29049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.e(TAG, "Couldn't create SharedPreferences file " + file, e2);
29059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
29069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return str;
29089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private boolean writeFileLocked() {
29119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Rename the current file so it may be used as a backup during the next read
29129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mFile.exists()) {
29131afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                if (!mBackupFile.exists()) {
29141afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                    if (!mFile.renameTo(mBackupFile)) {
29151afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                        Log.e(TAG, "Couldn't rename file " + mFile
29161afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                                + " to backup file " + mBackupFile);
29171afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                        return false;
29181afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                    }
29191afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                } else {
29201afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                    mFile.delete();
29219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
29229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Attempt to write the file, delete the backup and return true as atomically as
29259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // possible.  If any exception occurs, delete the new file; next time we will restore
29269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // from the backup.
29279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
29289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                FileOutputStream str = createFileOutputStream(mFile);
29299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str == null) {
29309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
29319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
29329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.writeMapXml(mMap, str);
29339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str.close();
29349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                setFilePermissionsFromMode(mFile.getPath(), mMode, 0);
29359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (FileUtils.getFileStatus(mFile.getPath(), mFileStatus)) {
29369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTimestamp = mFileStatus.mtime;
29379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
29389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
293951bf077883df4f5cc816fbfec6d19eedffc26d70Dianne Hackborn                // Writing was successful, delete the backup file if there is one.
294051bf077883df4f5cc816fbfec6d19eedffc26d70Dianne Hackborn                mBackupFile.delete();
29419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return true;
29429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (XmlPullParserException e) {
29439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, "writeFileLocked: Got exception:", e);
29449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (IOException e) {
29459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, "writeFileLocked: Got exception:", e);
29469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Clean up an unsuccessfully written file
29489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mFile.exists()) {
29499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!mFile.delete()) {
29509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.e(TAG, "Couldn't clean up partially-written file " + mFile);
29519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
29529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
29549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2957