ContextImpl.java revision 170e548ac839b268beee208e95fc497b34fde1ba
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;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.AssetManager;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.XmlResourceParser;
5974f170f9468d3cf6d7d0ef453320141a3e63571bVasu Noriimport android.database.DatabaseErrorHandler;
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;
65a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.location.CountryDetector;
66a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.location.ICountryDetector;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.location.ILocationManager;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.location.LocationManager;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.AudioManager;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.ConnectivityManager;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.IConnectivityManager;
72c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriffimport android.net.ThrottleManager;
73c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriffimport android.net.IThrottleManager;
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.wifi.IWifiManager;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.wifi.WifiManager;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder;
78c63806d852a550d82bbe6cadff8a2139d78ed559Adam Powellimport android.os.Build;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle;
80f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnorimport android.os.DropBoxManager;
81539d3c475f44b1499499a8b70375a192545cf113Oscar Montemayorimport android.os.Environment;
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.FileUtils;
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IPowerManager;
8675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.Looper;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.PowerManager;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process;
8975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.RemoteException;
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Vibrator;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.FileUtils.FileStatus;
93b104340496e3a531e26c8f428c808eca0e039f50San Mehatimport android.os.storage.StorageManager;
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.TelephonyManager;
959f53119b72e6da865bcd53173d3dacd1eba01aeeDianne Hackbornimport android.content.ClipboardManager;
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AndroidRuntimeException;
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ContextThemeWrapper;
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.LayoutInflater;
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManagerImpl;
10175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.view.accessibility.AccessibilityManager;
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.InputMethodManager;
103603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintanaimport android.accounts.AccountManager;
104603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintanaimport android.accounts.IAccountManager;
10587bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackbornimport android.app.admin.DevicePolicyManager;
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;
121333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrickimport java.util.Map.Entry;
122105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Projectimport java.util.Set;
12375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport java.util.WeakHashMap;
124333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrickimport java.util.concurrent.CountDownLatch;
125333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrickimport java.util.concurrent.ExecutorService;
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass ReceiverRestrictedContext extends ContextWrapper {
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ReceiverRestrictedContext(Context base) {
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(base);
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return registerReceiver(receiver, filter, null, null);
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String broadcastPermission, Handler scheduler) {
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new ReceiverCallNotAllowedException(
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "IntentReceiver components are not allowed to register to receive intents");
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //ex.fillInStackTrace();
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //Log.e("IntentReceiver", ex.getMessage(), ex);
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //return mContext.registerReceiver(receiver, filter, broadcastPermission,
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //        scheduler);
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean bindService(Intent service, ServiceConnection conn, int flags) {
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new ReceiverCallNotAllowedException(
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "IntentReceiver components are not allowed to bind to services");
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //ex.fillInStackTrace();
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //Log.e("IntentReceiver", ex.getMessage(), ex);
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //return mContext.bindService(service, interfaceName, conn, flags);
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
1592155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn * Common implementation of Context API, which provides the base
1602155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn * context object for Activity and other application components.
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
1622155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackbornclass ContextImpl extends Context {
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static String TAG = "ApplicationContext";
164569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima    private final static boolean DEBUG = false;
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static boolean DEBUG_ICONS = false;
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final Object sSync = new Object();
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static AlarmManager sAlarmManager;
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static PowerManager sPowerManager;
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static ConnectivityManager sConnectivityManager;
171c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff    private static ThrottleManager sThrottleManager;
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static WifiManager sWifiManager;
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static LocationManager sLocationManager;
174a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao    private static CountryDetector sCountryDetector;
175333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick    private static final HashMap<String, SharedPreferencesImpl> sSharedPrefs =
176333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            new HashMap<String, SharedPreferencesImpl>();
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private AudioManager mAudioManager;
17901e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn    /*package*/ LoadedApk mPackageInfo;
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Resources mResources;
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ ActivityThread mMainThread;
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Context mOuterContext;
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IBinder mActivityToken = null;
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ApplicationContentResolver mContentResolver;
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mThemeResource = 0;
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Resources.Theme mTheme = null;
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private PackageManager mPackageManager;
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private NotificationManager mNotificationManager = null;
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ActivityManager mActivityManager = null;
1908cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn    private WallpaperManager mWallpaperManager = null;
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Context mReceiverRestrictedContext = null;
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private SearchManager mSearchManager = null;
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private SensorManager mSensorManager = null;
194c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat    private StorageManager mStorageManager = null;
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Vibrator mVibrator = null;
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private LayoutInflater mLayoutInflater = null;
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private StatusBarManager mStatusBarManager = null;
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private TelephonyManager mTelephonyManager = null;
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ClipboardManager mClipboardManager = null;
200870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy    private boolean mRestricted;
201e00a31155b95686eecc6e1999e904472f8f300caFred Quintana    private AccountManager mAccountManager; // protected by mSync
202f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor    private DropBoxManager mDropBoxManager = null;
203d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    private DevicePolicyManager mDevicePolicyManager = null;
20453332883543868fb83e111a07306368b7772b340Tobias Haamel    private UiModeManager mUiModeManager = null;
205a2709360665f77ed8bebccb2df86f08e8c83a701Steve Howard    private DownloadManager mDownloadManager = null;
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Object mSync = new Object();
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File mDatabasesDir;
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File mPreferencesDir;
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File mFilesDir;
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File mCacheDir;
213e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    private File mExternalFilesDir;
214e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    private File mExternalCacheDir;
2155f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String[] EMPTY_FILE_LIST = {};
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public AssetManager getAssets() {
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mResources.getAssets();
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Resources getResources() {
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mResources;
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PackageManager getPackageManager() {
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageManager != null) {
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageManager;
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IPackageManager pm = ActivityThread.getPackageManager();
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pm != null) {
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Doesn't matter if we make more than one instance.
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return (mPackageManager = new ApplicationPackageManager(this, pm));
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ContentResolver getContentResolver() {
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mContentResolver;
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Looper getMainLooper() {
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mMainThread.getLooper();
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2525f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Context getApplicationContext() {
255eb9e9ec06167b0caa459f2fb3f3fae094bb8d8f7Christopher Tate        return (mPackageInfo != null) ?
256eb9e9ec06167b0caa459f2fb3f3fae094bb8d8f7Christopher Tate                mPackageInfo.getApplication() : mMainThread.getApplication();
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2585f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setTheme(int resid) {
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mThemeResource = resid;
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2635f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Resources.Theme getTheme() {
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mTheme == null) {
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mThemeResource == 0) {
268170e548ac839b268beee208e95fc497b34fde1baJoe Onorato                final Context outerContext = getOuterContext();
269170e548ac839b268beee208e95fc497b34fde1baJoe Onorato                mThemeResource = (outerContext.getApplicationInfo().targetSdkVersion
270170e548ac839b268beee208e95fc497b34fde1baJoe Onorato                        >= Build.VERSION_CODES.HONEYCOMB)
271170e548ac839b268beee208e95fc497b34fde1baJoe Onorato                                ? com.android.internal.R.style.Theme_Holo
272170e548ac839b268beee208e95fc497b34fde1baJoe Onorato                                : com.android.internal.R.style.Theme;
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTheme = mResources.newTheme();
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTheme.applyStyle(mThemeResource, true);
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mTheme;
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ClassLoader getClassLoader() {
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPackageInfo != null ?
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPackageInfo.getClassLoader() : ClassLoader.getSystemClassLoader();
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getPackageName() {
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageInfo.getPackageName();
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("Not supported in system context");
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2955c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn    public ApplicationInfo getApplicationInfo() {
2965c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        if (mPackageInfo != null) {
2975c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn            return mPackageInfo.getApplicationInfo();
2985c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        }
2995c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        throw new RuntimeException("Not supported in system context");
3005c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn    }
3015c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn
3025c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn    @Override
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getPackageResourcePath() {
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageInfo.getResDir();
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("Not supported in system context");
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getPackageCodePath() {
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageInfo.getAppDir();
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("Not supported in system context");
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3175f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static File makeBackupFile(File prefsFile) {
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new File(prefsFile.getPath() + ".bak");
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32223ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato    public File getSharedPrefsFile(String name) {
32323ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato        return makeFilename(getPreferencesDir(), name + ".xml");
32423ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato    }
32523ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public SharedPreferences getSharedPreferences(String name, int mode) {
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SharedPreferencesImpl sp;
3296194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick        File prefsFile;
3306194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick        boolean needInitialLoad = false;
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (sSharedPrefs) {
332333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            sp = sSharedPrefs.get(name);
3336194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            if (sp != null && !sp.hasFileChangedUnexpectedly()) {
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return sp;
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3366194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            prefsFile = getSharedPrefsFile(name);
3376194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            if (sp == null) {
3386194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                sp = new SharedPreferencesImpl(prefsFile, mode, null);
3396194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                sSharedPrefs.put(name, sp);
3406194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                needInitialLoad = true;
3416194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            }
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3446194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick        synchronized (sp) {
3456194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            if (needInitialLoad && sp.isLoaded()) {
3466194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                // lost the race to load; another thread handled it
3476194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                return sp;
3486194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            }
3496194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            File backup = makeBackupFile(prefsFile);
3506194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            if (backup.exists()) {
3516194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                prefsFile.delete();
3526194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                backup.renameTo(prefsFile);
3536194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            }
3545f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
3556194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            // Debugging
3566194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            if (prefsFile.exists() && !prefsFile.canRead()) {
3576194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                Log.w(TAG, "Attempt to read preferences file " + prefsFile + " without permission");
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3606194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            Map map = null;
3616194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            if (prefsFile.exists() && prefsFile.canRead()) {
3626194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                try {
3636194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                    FileInputStream str = new FileInputStream(prefsFile);
3646194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                    map = XmlUtils.readMapXml(str);
3656194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                    str.close();
3666194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                } catch (org.xmlpull.v1.XmlPullParserException e) {
3676194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                    Log.w(TAG, "getSharedPreferences", e);
3686194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                } catch (FileNotFoundException e) {
3696194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                    Log.w(TAG, "getSharedPreferences", e);
3706194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                } catch (IOException e) {
3716194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                    Log.w(TAG, "getSharedPreferences", e);
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3746194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            sp.replace(map);
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3766194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick        return sp;
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File getPreferencesDir() {
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mPreferencesDir == null) {
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPreferencesDir = new File(getDataDirFile(), "shared_prefs");
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPreferencesDir;
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public FileInputStream openFileInput(String name)
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws FileNotFoundException {
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File f = makeFilename(getFilesDir(), name);
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new FileInputStream(f);
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public FileOutputStream openFileOutput(String name, int mode)
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws FileNotFoundException {
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean append = (mode&MODE_APPEND) != 0;
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File f = makeFilename(getFilesDir(), name);
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            FileOutputStream fos = new FileOutputStream(f, append);
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setFilePermissionsFromMode(f.getPath(), mode, 0);
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return fos;
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (FileNotFoundException e) {
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File parent = f.getParentFile();
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        parent.mkdir();
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileUtils.setPermissions(
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            parent.getPath(),
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            -1, -1);
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileOutputStream fos = new FileOutputStream(f, append);
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setFilePermissionsFromMode(f.getPath(), mode, 0);
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return fos;
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean deleteFile(String name) {
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File f = makeFilename(getFilesDir(), name);
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return f.delete();
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getFilesDir() {
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mFilesDir == null) {
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mFilesDir = new File(getDataDirFile(), "files");
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mFilesDir.exists()) {
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if(!mFilesDir.mkdirs()) {
4325f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer                    Log.w(TAG, "Unable to create files directory " + mFilesDir.getPath());
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                FileUtils.setPermissions(
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mFilesDir.getPath(),
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        -1, -1);
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mFilesDir;
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4435f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
445e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    public File getExternalFilesDir(String type) {
446e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        synchronized (mSync) {
447e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (mExternalFilesDir == null) {
448e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                mExternalFilesDir = Environment.getExternalStorageAppFilesDirectory(
449e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                        getPackageName());
450e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
451e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (!mExternalFilesDir.exists()) {
452e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                try {
453e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    (new File(Environment.getExternalStorageAndroidDataDir(),
454e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                            ".nomedia")).createNewFile();
455e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                } catch (IOException e) {
456e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
457e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                if (!mExternalFilesDir.mkdirs()) {
458e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    Log.w(TAG, "Unable to create external files directory");
459e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    return null;
460e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
461e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
462e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (type == null) {
463e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                return mExternalFilesDir;
464e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
465e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            File dir = new File(mExternalFilesDir, type);
466e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (!dir.exists()) {
467e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                if (!dir.mkdirs()) {
468e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    Log.w(TAG, "Unable to create external media directory " + dir);
469e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    return null;
470e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
471e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
472e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            return dir;
473e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        }
474e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    }
4755f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
476e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    @Override
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getCacheDir() {
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mCacheDir == null) {
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCacheDir = new File(getDataDirFile(), "cache");
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mCacheDir.exists()) {
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if(!mCacheDir.mkdirs()) {
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Unable to create cache directory");
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                FileUtils.setPermissions(
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mCacheDir.getPath(),
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        -1, -1);
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCacheDir;
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4955f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
496e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    @Override
497e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    public File getExternalCacheDir() {
498e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        synchronized (mSync) {
499e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (mExternalCacheDir == null) {
500e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                mExternalCacheDir = Environment.getExternalStorageAppCacheDirectory(
501e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                        getPackageName());
502e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
503e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (!mExternalCacheDir.exists()) {
504e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                try {
505e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    (new File(Environment.getExternalStorageAndroidDataDir(),
506e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                            ".nomedia")).createNewFile();
507e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                } catch (IOException e) {
508e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
509e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                if (!mExternalCacheDir.mkdirs()) {
510e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    Log.w(TAG, "Unable to create external cache directory");
511e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    return null;
512e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
513e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
514e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            return mExternalCacheDir;
515e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        }
516e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    }
5175f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getFileStreamPath(String name) {
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return makeFilename(getFilesDir(), name);
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String[] fileList() {
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String[] list = getFilesDir().list();
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (list != null) ? list : EMPTY_FILE_LIST;
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory) {
531a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        File f = validateFilePath(name, true);
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(f, factory);
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setFilePermissionsFromMode(f.getPath(), mode, 0);
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return db;
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
53874f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori    public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory,
53974f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori            DatabaseErrorHandler errorHandler) {
54074f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori        File f = validateFilePath(name, true);
54174f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori        SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(f.getPath(), factory, errorHandler);
54274f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori        setFilePermissionsFromMode(f.getPath(), mode, 0);
54374f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori        return db;
54474f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori    }
54574f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori
54674f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori    @Override
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean deleteDatabase(String name) {
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
549a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            File f = validateFilePath(name, false);
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return f.delete();
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getDatabasePath(String name) {
558a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        return validateFilePath(name, false);
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String[] databaseList() {
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String[] list = getDatabasesDir().list();
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (list != null) ? list : EMPTY_FILE_LIST;
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5675f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File getDatabasesDir() {
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mDatabasesDir == null) {
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDatabasesDir = new File(getDataDirFile(), "databases");
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mDatabasesDir.getPath().equals("databases")) {
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDatabasesDir = new File("/data/system");
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mDatabasesDir;
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5795f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Drawable getWallpaper() {
5824c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        return getWallpaperManager().getDrawable();
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5868cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn    public Drawable peekWallpaper() {
5874c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        return getWallpaperManager().peekDrawable();
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getWallpaperDesiredMinimumWidth() {
5928cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        return getWallpaperManager().getDesiredMinimumWidth();
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getWallpaperDesiredMinimumHeight() {
5978cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        return getWallpaperManager().getDesiredMinimumHeight();
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setWallpaper(Bitmap bitmap) throws IOException  {
6024c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        getWallpaperManager().setBitmap(bitmap);
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setWallpaper(InputStream data) throws IOException {
6074c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        getWallpaperManager().setStream(data);
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void clearWallpaper() throws IOException {
6128cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        getWallpaperManager().clear();
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startActivity(Intent intent) {
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new AndroidRuntimeException(
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Calling startActivity() from outside of an Activity "
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " context requires the FLAG_ACTIVITY_NEW_TASK flag."
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " Is this really what you want?");
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread.getInstrumentation().execStartActivity(
6246e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            getOuterContext(), mMainThread.getApplicationThread(), null,
6256e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            (Activity)null, intent, -1);
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
629fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    public void startIntentSender(IntentSender intent,
630fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
631fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            throws IntentSender.SendIntentException {
632fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn        try {
633fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            String resolvedType = null;
634fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            if (fillInIntent != null) {
635fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                resolvedType = fillInIntent.resolveTypeIfNeeded(getContentResolver());
636fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            }
637fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            int result = ActivityManagerNative.getDefault()
638fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                .startActivityIntentSender(mMainThread.getApplicationThread(), intent,
639fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                        fillInIntent, resolvedType, null, null,
640fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                        0, flagsMask, flagsValues);
641fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            if (result == IActivityManager.START_CANCELED) {
642fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                throw new IntentSender.SendIntentException();
643fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            }
644fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            Instrumentation.checkStartActivityResult(result, null);
645fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn        } catch (RemoteException e) {
646fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn        }
647fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    }
6485f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
649fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    @Override
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendBroadcast(Intent intent) {
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, null,
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Activity.RESULT_OK, null, null, null, false, false);
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendBroadcast(Intent intent, String receiverPermission) {
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, null,
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Activity.RESULT_OK, null, null, receiverPermission, false, false);
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendOrderedBroadcast(Intent intent,
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String receiverPermission) {
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, null,
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Activity.RESULT_OK, null, null, receiverPermission, true, false);
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendOrderedBroadcast(Intent intent,
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String receiverPermission, BroadcastReceiver resultReceiver,
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Handler scheduler, int initialCode, String initialData,
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Bundle initialExtras) {
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IIntentReceiver rd = null;
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resultReceiver != null) {
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mPackageInfo != null) {
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (scheduler == null) {
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scheduler = mMainThread.getHandler();
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                rd = mPackageInfo.getReceiverDispatcher(
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    resultReceiver, getOuterContext(), scheduler,
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getInstrumentation(), false);
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (scheduler == null) {
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scheduler = mMainThread.getHandler();
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
70101e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn                rd = new LoadedApk.ReceiverDispatcher(
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver();
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, rd,
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                initialCode, initialData, initialExtras, receiverPermission,
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                true, false);
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendStickyBroadcast(Intent intent) {
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, null,
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Activity.RESULT_OK, null, null, null, false, true);
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
727efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn    public void sendStickyOrderedBroadcast(Intent intent,
728efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            BroadcastReceiver resultReceiver,
729efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            Handler scheduler, int initialCode, String initialData,
730efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            Bundle initialExtras) {
731efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        IIntentReceiver rd = null;
732efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        if (resultReceiver != null) {
733efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            if (mPackageInfo != null) {
734efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                if (scheduler == null) {
735efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                    scheduler = mMainThread.getHandler();
736efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                }
737efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                rd = mPackageInfo.getReceiverDispatcher(
738efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                    resultReceiver, getOuterContext(), scheduler,
739efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                    mMainThread.getInstrumentation(), false);
740efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            } else {
741efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                if (scheduler == null) {
742efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                    scheduler = mMainThread.getHandler();
743efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                }
74401e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn                rd = new LoadedApk.ReceiverDispatcher(
745efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                        resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver();
746efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            }
747efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        }
748efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
749efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        try {
750efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            ActivityManagerNative.getDefault().broadcastIntent(
751efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                mMainThread.getApplicationThread(), intent, resolvedType, rd,
752efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                initialCode, initialData, initialExtras, null,
753efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                true, true);
754efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        } catch (RemoteException e) {
755efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        }
756efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn    }
757efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn
758efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn    @Override
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeStickyBroadcast(Intent intent) {
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resolvedType != null) {
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            intent = new Intent(intent);
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            intent.setDataAndType(intent.getData(), resolvedType);
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().unbroadcastIntent(
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent);
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return registerReceiver(receiver, filter, null, null);
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String broadcastPermission, Handler scheduler) {
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return registerReceiverInternal(receiver, filter, broadcastPermission,
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                scheduler, getOuterContext());
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Intent registerReceiverInternal(BroadcastReceiver receiver,
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IntentFilter filter, String broadcastPermission,
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Handler scheduler, Context context) {
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IIntentReceiver rd = null;
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (receiver != null) {
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mPackageInfo != null && context != null) {
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (scheduler == null) {
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scheduler = mMainThread.getHandler();
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                rd = mPackageInfo.getReceiverDispatcher(
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    receiver, context, scheduler,
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getInstrumentation(), true);
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (scheduler == null) {
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scheduler = mMainThread.getHandler();
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
80001e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn                rd = new LoadedApk.ReceiverDispatcher(
801399cccb85749e02f6d3e12d1d2846310e7cbfdf1Dianne Hackborn                        receiver, context, scheduler, null, true).getIIntentReceiver();
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().registerReceiver(
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getApplicationThread(),
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    rd, filter, broadcastPermission);
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void unregisterReceiver(BroadcastReceiver receiver) {
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IIntentReceiver rd = mPackageInfo.forgetReceiverDispatcher(
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getOuterContext(), receiver);
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityManagerNative.getDefault().unregisterReceiver(rd);
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("Not supported in system context");
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ComponentName startService(Intent service) {
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ComponentName cn = ActivityManagerNative.getDefault().startService(
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), service,
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                service.resolveTypeIfNeeded(getContentResolver()));
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (cn != null && cn.getPackageName().equals("!")) {
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SecurityException(
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Not allowed to start service " + service
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " without permission " + cn.getClassName());
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return cn;
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean stopService(Intent service) {
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int res = ActivityManagerNative.getDefault().stopService(
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), service,
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                service.resolveTypeIfNeeded(getContentResolver()));
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (res < 0) {
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SecurityException(
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Not allowed to stop service " + service);
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return res != 0;
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean bindService(Intent service, ServiceConnection conn,
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) {
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IServiceConnection sd;
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sd = mPackageInfo.getServiceDispatcher(conn, getOuterContext(),
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getHandler(), flags);
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("Not supported in system context");
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int res = ActivityManagerNative.getDefault().bindService(
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), getActivityToken(),
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                service, service.resolveTypeIfNeeded(getContentResolver()),
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sd, flags);
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (res < 0) {
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SecurityException(
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Not allowed to bind to service " + service);
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return res != 0;
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void unbindService(ServiceConnection conn) {
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IServiceConnection sd = mPackageInfo.forgetServiceDispatcher(
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getOuterContext(), conn);
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityManagerNative.getDefault().unbindService(sd);
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("Not supported in system context");
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean startInstrumentation(ComponentName className,
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String profileFile, Bundle arguments) {
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().startInstrumentation(
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    className, profileFile, 0, arguments, null);
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // System has crashed, nothing we can do.
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Object getSystemService(String name) {
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (WINDOW_SERVICE.equals(name)) {
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return WindowManagerImpl.getDefault();
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (LAYOUT_INFLATER_SERVICE.equals(name)) {
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mSync) {
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                LayoutInflater inflater = mLayoutInflater;
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (inflater != null) {
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return inflater;
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLayoutInflater = inflater =
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    PolicyManager.makeNewLayoutInflater(getOuterContext());
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return inflater;
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (ACTIVITY_SERVICE.equals(name)) {
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getActivityManager();
9278cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        } else if (INPUT_METHOD_SERVICE.equals(name)) {
9288cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn            return InputMethodManager.getInstance(this);
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (ALARM_SERVICE.equals(name)) {
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getAlarmManager();
931603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana        } else if (ACCOUNT_SERVICE.equals(name)) {
932603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana            return getAccountManager();
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (POWER_SERVICE.equals(name)) {
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getPowerManager();
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (CONNECTIVITY_SERVICE.equals(name)) {
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getConnectivityManager();
937c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff        } else if (THROTTLE_SERVICE.equals(name)) {
938c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff            return getThrottleManager();
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (WIFI_SERVICE.equals(name)) {
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getWifiManager();
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (NOTIFICATION_SERVICE.equals(name)) {
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getNotificationManager();
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (KEYGUARD_SERVICE.equals(name)) {
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new KeyguardManager();
94575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        } else if (ACCESSIBILITY_SERVICE.equals(name)) {
94675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            return AccessibilityManager.getInstance(this);
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (LOCATION_SERVICE.equals(name)) {
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getLocationManager();
949a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        } else if (COUNTRY_DETECTOR.equals(name)) {
950a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            return getCountryDetector();
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (SEARCH_SERVICE.equals(name)) {
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getSearchManager();
9538cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        } else if (SENSOR_SERVICE.equals(name)) {
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getSensorManager();
955c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat        } else if (STORAGE_SERVICE.equals(name)) {
956c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat            return getStorageManager();
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (VIBRATOR_SERVICE.equals(name)) {
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getVibrator();
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (STATUS_BAR_SERVICE.equals(name)) {
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mSync) {
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mStatusBarManager == null) {
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mStatusBarManager = new StatusBarManager(getOuterContext());
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mStatusBarManager;
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (AUDIO_SERVICE.equals(name)) {
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getAudioManager();
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (TELEPHONY_SERVICE.equals(name)) {
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getTelephonyManager();
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (CLIPBOARD_SERVICE.equals(name)) {
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getClipboardManager();
9728cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        } else if (WALLPAPER_SERVICE.equals(name)) {
9738cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn            return getWallpaperManager();
974952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor        } else if (DROPBOX_SERVICE.equals(name)) {
975f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor            return getDropBoxManager();
976d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn        } else if (DEVICE_POLICY_SERVICE.equals(name)) {
977d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn            return getDevicePolicyManager();
97869fb574e294ed07404d515a66fccd046e974d32fTobias Haamel        } else if (UI_MODE_SERVICE.equals(name)) {
97953332883543868fb83e111a07306368b7772b340Tobias Haamel            return getUiModeManager();
980a2709360665f77ed8bebccb2df86f08e8c83a701Steve Howard        } else if (DOWNLOAD_SERVICE.equals(name)) {
981a2709360665f77ed8bebccb2df86f08e8c83a701Steve Howard            return getDownloadManager();
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
987603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana    private AccountManager getAccountManager() {
988e00a31155b95686eecc6e1999e904472f8f300caFred Quintana        synchronized (mSync) {
989e00a31155b95686eecc6e1999e904472f8f300caFred Quintana            if (mAccountManager == null) {
990603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana                IBinder b = ServiceManager.getService(ACCOUNT_SERVICE);
991603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana                IAccountManager service = IAccountManager.Stub.asInterface(b);
992e00a31155b95686eecc6e1999e904472f8f300caFred Quintana                mAccountManager = new AccountManager(this, service);
993603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana            }
994e00a31155b95686eecc6e1999e904472f8f300caFred Quintana            return mAccountManager;
995603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana        }
996603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana    }
997603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ActivityManager getActivityManager() {
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mActivityManager == null) {
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mActivityManager = new ActivityManager(getOuterContext(),
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mMainThread.getHandler());
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mActivityManager;
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private AlarmManager getAlarmManager() {
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (sSync) {
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sAlarmManager == null) {
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                IBinder b = ServiceManager.getService(ALARM_SERVICE);
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                IAlarmManager service = IAlarmManager.Stub.asInterface(b);
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sAlarmManager = new AlarmManager(service);
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sAlarmManager;
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private PowerManager getPowerManager() {
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (sSync) {
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sPowerManager == null) {
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                IBinder b = ServiceManager.getService(POWER_SERVICE);
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                IPowerManager service = IPowerManager.Stub.asInterface(b);
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sPowerManager = new PowerManager(service, mMainThread.getHandler());
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sPowerManager;
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ConnectivityManager getConnectivityManager()
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (sSync) {
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sConnectivityManager == null) {
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                IBinder b = ServiceManager.getService(CONNECTIVITY_SERVICE);
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                IConnectivityManager service = IConnectivityManager.Stub.asInterface(b);
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sConnectivityManager = new ConnectivityManager(service);
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sConnectivityManager;
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1042c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff    private ThrottleManager getThrottleManager()
1043c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff    {
1044c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff        synchronized (sSync) {
1045c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff            if (sThrottleManager == null) {
1046c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff                IBinder b = ServiceManager.getService(THROTTLE_SERVICE);
1047c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff                IThrottleManager service = IThrottleManager.Stub.asInterface(b);
1048c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff                sThrottleManager = new ThrottleManager(service);
1049c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff            }
1050c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff        }
1051c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff        return sThrottleManager;
1052c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff    }
1053c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private WifiManager getWifiManager()
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (sSync) {
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sWifiManager == null) {
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                IBinder b = ServiceManager.getService(WIFI_SERVICE);
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                IWifiManager service = IWifiManager.Stub.asInterface(b);
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sWifiManager = new WifiManager(service, mMainThread.getHandler());
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sWifiManager;
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10668cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn    private NotificationManager getNotificationManager() {
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mNotificationManager == null) {
1069c63806d852a550d82bbe6cadff8a2139d78ed559Adam Powell                final Context outerContext = getOuterContext();
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mNotificationManager = new NotificationManager(
1071c63806d852a550d82bbe6cadff8a2139d78ed559Adam Powell                        new ContextThemeWrapper(outerContext,
1072c63806d852a550d82bbe6cadff8a2139d78ed559Adam Powell                                outerContext.getApplicationInfo().targetSdkVersion >=
1073c63806d852a550d82bbe6cadff8a2139d78ed559Adam Powell                                    Build.VERSION_CODES.HONEYCOMB
1074c63806d852a550d82bbe6cadff8a2139d78ed559Adam Powell                                ? com.android.internal.R.style.Theme_Holo_Dialog
1075c63806d852a550d82bbe6cadff8a2139d78ed559Adam Powell                                : com.android.internal.R.style.Theme_Dialog),
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mMainThread.getHandler());
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mNotificationManager;
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10828cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn    private WallpaperManager getWallpaperManager() {
10838cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        synchronized (mSync) {
10848cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn            if (mWallpaperManager == null) {
10858cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn                mWallpaperManager = new WallpaperManager(getOuterContext(),
10868cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn                        mMainThread.getHandler());
10878cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn            }
10888cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        }
10898cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        return mWallpaperManager;
10908cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn    }
10918cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private TelephonyManager getTelephonyManager() {
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mTelephonyManager == null) {
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTelephonyManager = new TelephonyManager(getOuterContext());
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mTelephonyManager;
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ClipboardManager getClipboardManager() {
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mClipboardManager == null) {
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mClipboardManager = new ClipboardManager(getOuterContext(),
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mMainThread.getHandler());
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mClipboardManager;
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private LocationManager getLocationManager() {
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (sSync) {
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sLocationManager == null) {
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                IBinder b = ServiceManager.getService(LOCATION_SERVICE);
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ILocationManager service = ILocationManager.Stub.asInterface(b);
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sLocationManager = new LocationManager(service);
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sLocationManager;
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1122a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao    private CountryDetector getCountryDetector() {
1123a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        synchronized (sSync) {
1124a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            if (sCountryDetector == null) {
1125a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao                IBinder b = ServiceManager.getService(COUNTRY_DETECTOR);
1126a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao                ICountryDetector service = ICountryDetector.Stub.asInterface(b);
1127a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao                sCountryDetector = new CountryDetector(service);
1128a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            }
1129a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        }
1130a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        return sCountryDetector;
1131a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao    }
1132a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private SearchManager getSearchManager() {
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mSearchManager == null) {
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSearchManager = new SearchManager(getOuterContext(), mMainThread.getHandler());
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mSearchManager;
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private SensorManager getSensorManager() {
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mSensorManager == null) {
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSensorManager = new SensorManager(mMainThread.getHandler().getLooper());
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mSensorManager;
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1151c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat    private StorageManager getStorageManager() {
1152c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat        synchronized (mSync) {
1153c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat            if (mStorageManager == null) {
1154c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat                try {
1155c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat                    mStorageManager = new StorageManager(mMainThread.getHandler().getLooper());
1156c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat                } catch (RemoteException rex) {
1157c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat                    Log.e(TAG, "Failed to create StorageManager", rex);
1158c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat                    mStorageManager = null;
1159c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat                }
1160c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat            }
1161c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat        }
1162c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat        return mStorageManager;
1163c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat    }
1164c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Vibrator getVibrator() {
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mVibrator == null) {
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mVibrator = new Vibrator();
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mVibrator;
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1173952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private AudioManager getAudioManager()
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAudioManager == null) {
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAudioManager = new AudioManager(this);
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mAudioManager;
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1182438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    /* package */ static DropBoxManager createDropBoxManager() {
1183438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        IBinder b = ServiceManager.getService(DROPBOX_SERVICE);
1184438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        IDropBoxManagerService service = IDropBoxManagerService.Stub.asInterface(b);
1185438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        return new DropBoxManager(service);
1186438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    }
1187438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
1188f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor    private DropBoxManager getDropBoxManager() {
1189952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor        synchronized (mSync) {
1190f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor            if (mDropBoxManager == null) {
1191438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick                mDropBoxManager = createDropBoxManager();
1192952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor            }
1193952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor        }
1194f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        return mDropBoxManager;
1195952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor    }
1196952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor
1197d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    private DevicePolicyManager getDevicePolicyManager() {
1198d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn        synchronized (mSync) {
1199d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn            if (mDevicePolicyManager == null) {
120021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                mDevicePolicyManager = DevicePolicyManager.create(this,
1201d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn                        mMainThread.getHandler());
1202d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn            }
1203d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn        }
1204d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn        return mDevicePolicyManager;
1205d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    }
1206d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn
120753332883543868fb83e111a07306368b7772b340Tobias Haamel    private UiModeManager getUiModeManager() {
120853332883543868fb83e111a07306368b7772b340Tobias Haamel        synchronized (mSync) {
120953332883543868fb83e111a07306368b7772b340Tobias Haamel            if (mUiModeManager == null) {
121053332883543868fb83e111a07306368b7772b340Tobias Haamel                mUiModeManager = new UiModeManager();
121153332883543868fb83e111a07306368b7772b340Tobias Haamel            }
121253332883543868fb83e111a07306368b7772b340Tobias Haamel        }
121353332883543868fb83e111a07306368b7772b340Tobias Haamel        return mUiModeManager;
121453332883543868fb83e111a07306368b7772b340Tobias Haamel    }
121553332883543868fb83e111a07306368b7772b340Tobias Haamel
1216a2709360665f77ed8bebccb2df86f08e8c83a701Steve Howard    private DownloadManager getDownloadManager() {
1217a2709360665f77ed8bebccb2df86f08e8c83a701Steve Howard        synchronized (mSync) {
1218a2709360665f77ed8bebccb2df86f08e8c83a701Steve Howard            if (mDownloadManager == null) {
1219b8e07a51c1849d6894c5773a3daacedd01294218Steve Howard                mDownloadManager = new DownloadManager(getContentResolver(), getPackageName());
1220a2709360665f77ed8bebccb2df86f08e8c83a701Steve Howard            }
1221a2709360665f77ed8bebccb2df86f08e8c83a701Steve Howard        }
1222a2709360665f77ed8bebccb2df86f08e8c83a701Steve Howard        return mDownloadManager;
1223a2709360665f77ed8bebccb2df86f08e8c83a701Steve Howard    }
1224a2709360665f77ed8bebccb2df86f08e8c83a701Steve Howard
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkPermission(String permission, int pid, int uid) {
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (permission == null) {
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException("permission is null");
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!Process.supportsProcesses()) {
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PackageManager.PERMISSION_GRANTED;
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().checkPermission(
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    permission, pid, uid);
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PackageManager.PERMISSION_DENIED;
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkCallingPermission(String permission) {
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (permission == null) {
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException("permission is null");
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!Process.supportsProcesses()) {
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PackageManager.PERMISSION_GRANTED;
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pid = Binder.getCallingPid();
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pid != Process.myPid()) {
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return checkPermission(permission, pid,
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Binder.getCallingUid());
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return PackageManager.PERMISSION_DENIED;
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkCallingOrSelfPermission(String permission) {
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (permission == null) {
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException("permission is null");
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return checkPermission(permission, Binder.getCallingPid(),
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid());
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void enforce(
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String permission, int resultOfCheck,
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean selfToo, int uid, String message) {
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resultOfCheck != PackageManager.PERMISSION_GRANTED) {
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SecurityException(
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (message != null ? (message + ": ") : "") +
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (selfToo
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     ? "Neither user " + uid + " nor current process has "
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     : "User " + uid + " does not have ") +
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    permission +
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ".");
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforcePermission(
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String permission, int pid, int uid, String message) {
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforce(permission,
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                checkPermission(permission, pid, uid),
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false,
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                uid,
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                message);
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingPermission(String permission, String message) {
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforce(permission,
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                checkCallingPermission(permission),
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false,
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid(),
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                message);
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingOrSelfPermission(
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String permission, String message) {
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforce(permission,
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                checkCallingOrSelfPermission(permission),
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                true,
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid(),
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                message);
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void grantUriPermission(String toPackage, Uri uri, int modeFlags) {
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         try {
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().grantUriPermission(
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getApplicationThread(), toPackage, uri,
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    modeFlags);
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void revokeUriPermission(Uri uri, int modeFlags) {
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         try {
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().revokeUriPermission(
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getApplicationThread(), uri,
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    modeFlags);
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkUriPermission(Uri uri, int pid, int uid, int modeFlags) {
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!Process.supportsProcesses()) {
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PackageManager.PERMISSION_GRANTED;
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().checkUriPermission(
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uri, pid, uid, modeFlags);
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PackageManager.PERMISSION_DENIED;
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkCallingUriPermission(Uri uri, int modeFlags) {
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!Process.supportsProcesses()) {
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PackageManager.PERMISSION_GRANTED;
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pid = Binder.getCallingPid();
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pid != Process.myPid()) {
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return checkUriPermission(uri, pid,
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Binder.getCallingUid(), modeFlags);
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return PackageManager.PERMISSION_DENIED;
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkCallingOrSelfUriPermission(Uri uri, int modeFlags) {
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return checkUriPermission(uri, Binder.getCallingPid(),
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid(), modeFlags);
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkUriPermission(Uri uri, String readPermission,
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String writePermission, int pid, int uid, int modeFlags) {
1364569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima        if (DEBUG) {
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.i("foo", "checkUriPermission: uri=" + uri + "readPermission="
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + readPermission + " writePermission=" + writePermission
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " pid=" + pid + " uid=" + uid + " mode" + modeFlags);
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((modeFlags&Intent.FLAG_GRANT_READ_URI_PERMISSION) != 0) {
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (readPermission == null
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    || checkPermission(readPermission, pid, uid)
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    == PackageManager.PERMISSION_GRANTED) {
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return PackageManager.PERMISSION_GRANTED;
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((modeFlags&Intent.FLAG_GRANT_WRITE_URI_PERMISSION) != 0) {
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (writePermission == null
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    || checkPermission(writePermission, pid, uid)
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    == PackageManager.PERMISSION_GRANTED) {
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return PackageManager.PERMISSION_GRANTED;
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return uri != null ? checkUriPermission(uri, pid, uid, modeFlags)
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                : PackageManager.PERMISSION_DENIED;
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String uriModeFlagToString(int uriModeFlags) {
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (uriModeFlags) {
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Intent.FLAG_GRANT_READ_URI_PERMISSION |
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Intent.FLAG_GRANT_WRITE_URI_PERMISSION:
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "read and write";
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Intent.FLAG_GRANT_READ_URI_PERMISSION:
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "read";
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Intent.FLAG_GRANT_WRITE_URI_PERMISSION:
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "write";
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new IllegalArgumentException(
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "Unknown permission mode flags: " + uriModeFlags);
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void enforceForUri(
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int modeFlags, int resultOfCheck, boolean selfToo,
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int uid, Uri uri, String message) {
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resultOfCheck != PackageManager.PERMISSION_GRANTED) {
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SecurityException(
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (message != null ? (message + ": ") : "") +
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (selfToo
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     ? "Neither user " + uid + " nor current process has "
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     : "User " + uid + " does not have ") +
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uriModeFlagToString(modeFlags) +
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    " permission on " +
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uri +
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ".");
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceUriPermission(
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri uri, int pid, int uid, int modeFlags, String message) {
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceForUri(
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                modeFlags, checkUriPermission(uri, pid, uid, modeFlags),
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false, uid, uri, message);
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingUriPermission(
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri uri, int modeFlags, String message) {
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceForUri(
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                modeFlags, checkCallingUriPermission(uri, modeFlags),
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false, Binder.getCallingUid(), uri, message);
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingOrSelfUriPermission(
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri uri, int modeFlags, String message) {
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceForUri(
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                modeFlags,
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                checkCallingOrSelfUriPermission(uri, modeFlags), true,
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid(), uri, message);
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceUriPermission(
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri uri, String readPermission, String writePermission,
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int pid, int uid, int modeFlags, String message) {
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceForUri(modeFlags,
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      checkUriPermission(
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                              uri, readPermission, writePermission, pid, uid,
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                              modeFlags),
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      false,
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      uid,
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      uri,
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      message);
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Context createPackageContext(String packageName, int flags)
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws PackageManager.NameNotFoundException {
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (packageName.equals("system") || packageName.equals("android")) {
14562155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn            return new ContextImpl(mMainThread.getSystemContext());
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
145901e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn        LoadedApk pi =
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMainThread.getPackageInfo(packageName, flags);
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pi != null) {
14622155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn            ContextImpl c = new ContextImpl();
1463870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy            c.mRestricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED;
1464ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima            c.init(pi, null, mMainThread, mResources);
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (c.mResources != null) {
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return c;
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Should be a better exception.
14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new PackageManager.NameNotFoundException(
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "Application package " + packageName + " not found");
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1475870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy    @Override
1476870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy    public boolean isRestricted() {
1477870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy        return mRestricted;
1478870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy    }
1479870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File getDataDirFile() {
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageInfo.getDataDirFile();
14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("Not supported in system context");
14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getDir(String name, int mode) {
14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        name = "app_" + name;
14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File file = makeFilename(getDataDirFile(), name);
14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!file.exists()) {
14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            file.mkdir();
14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setFilePermissionsFromMode(file.getPath(), mode,
14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH);
14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return file;
14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14992155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn    static ContextImpl createSystemContext(ActivityThread mainThread) {
15002155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn        ContextImpl context = new ContextImpl();
15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        context.init(Resources.getSystem(), mainThread);
15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return context;
15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15052155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn    ContextImpl() {
15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOuterContext = this;
15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new ApplicationContext from an existing one.  The new one
15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * works and operates the same as the one it is copying.
15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context Existing application context.
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15152155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn    public ContextImpl(ContextImpl context) {
15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPackageInfo = context.mPackageInfo;
15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResources = context.mResources;
15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread = context.mMainThread;
15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContentResolver = context.mContentResolver;
15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOuterContext = this;
15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
152301e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn    final void init(LoadedApk packageInfo,
15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IBinder activityToken, ActivityThread mainThread) {
1525ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima        init(packageInfo, activityToken, mainThread, null);
1526ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima    }
1527ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima
152801e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn    final void init(LoadedApk packageInfo,
1529ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima                IBinder activityToken, ActivityThread mainThread,
1530ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima                Resources container) {
15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPackageInfo = packageInfo;
15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResources = mPackageInfo.getResources(mainThread);
1533ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima
1534559a78753165f20d5973b958791056154baecc43Dianne Hackborn        if (mResources != null && container != null
1535559a78753165f20d5973b958791056154baecc43Dianne Hackborn                && container.getCompatibilityInfo().applicationScale !=
1536559a78753165f20d5973b958791056154baecc43Dianne Hackborn                        mResources.getCompatibilityInfo().applicationScale) {
1537ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima            if (DEBUG) {
1538ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima                Log.d(TAG, "loaded context has different scaling. Using container's" +
1539ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima                        " compatiblity info:" + container.getDisplayMetrics());
1540ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima            }
1541ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima            mResources = mainThread.getTopLevelResources(
1542ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima                    mPackageInfo.getResDir(), container.getCompatibilityInfo().copy());
1543ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima        }
15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread = mainThread;
15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContentResolver = new ApplicationContentResolver(this, mainThread);
15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setActivityToken(activityToken);
15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void init(Resources resources, ActivityThread mainThread) {
15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPackageInfo = null;
15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResources = resources;
15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread = mainThread;
15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContentResolver = new ApplicationContentResolver(this, mainThread);
15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void scheduleFinalCleanup(String who, String what) {
15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread.scheduleContextCleanup(this, who, what);
15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performFinalCleanup(String who, String what) {
15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //Log.i(TAG, "Cleanup up context: " + this);
15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPackageInfo.removeContextRegistrations(getOuterContext(), who, what);
15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Context getReceiverRestrictedContext() {
15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mReceiverRestrictedContext != null) {
15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mReceiverRestrictedContext;
15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mReceiverRestrictedContext = new ReceiverRestrictedContext(getOuterContext());
15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void setActivityToken(IBinder token) {
15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mActivityToken = token;
15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15765f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void setOuterContext(Context context) {
15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOuterContext = context;
15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15805f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Context getOuterContext() {
15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mOuterContext;
15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15845f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final IBinder getActivityToken() {
15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mActivityToken;
15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static void setFilePermissionsFromMode(String name, int mode,
15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int extraPermissions) {
15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int perms = FileUtils.S_IRUSR|FileUtils.S_IWUSR
15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            |FileUtils.S_IRGRP|FileUtils.S_IWGRP
15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            |extraPermissions;
15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mode&MODE_WORLD_READABLE) != 0) {
15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            perms |= FileUtils.S_IROTH;
15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mode&MODE_WORLD_WRITEABLE) != 0) {
15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            perms |= FileUtils.S_IWOTH;
15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1600569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima        if (DEBUG) {
16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.i(TAG, "File " + name + ": mode=0x" + Integer.toHexString(mode)
16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                  + ", perms=0x" + Integer.toHexString(perms));
16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileUtils.setPermissions(name, perms, -1, -1);
16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1607a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor    private File validateFilePath(String name, boolean createDirectory) {
1608a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        File dir;
1609a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        File f;
1610a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor
1611a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        if (name.charAt(0) == File.separatorChar) {
1612a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            String dirPath = name.substring(0, name.lastIndexOf(File.separatorChar));
1613a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            dir = new File(dirPath);
1614a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            name = name.substring(name.lastIndexOf(File.separatorChar));
1615a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            f = new File(dir, name);
1616a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        } else {
1617a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            dir = getDatabasesDir();
1618a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            f = makeFilename(dir, name);
1619a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        }
1620a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor
1621a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        if (createDirectory && !dir.isDirectory() && dir.mkdir()) {
1622a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            FileUtils.setPermissions(dir.getPath(),
1623a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor                FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
1624a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor                -1, -1);
1625a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        }
1626a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor
1627a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        return f;
1628a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor    }
1629a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor
16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File makeFilename(File base, String name) {
16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (name.indexOf(File.separatorChar) < 0) {
16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new File(base, name);
16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new IllegalArgumentException(
1635a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor                "File " + name + " contains a path separator");
16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final class ApplicationContentResolver extends ContentResolver {
1643cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        public ApplicationContentResolver(Context context, ActivityThread mainThread) {
16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(context);
16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMainThread = mainThread;
16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1649cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        protected IContentProvider acquireProvider(Context context, String name) {
16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mMainThread.acquireProvider(context, name);
16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1654cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        protected IContentProvider acquireExistingProvider(Context context, String name) {
1655cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn            return mMainThread.acquireExistingProvider(context, name);
1656cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        }
1657cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn
1658cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        @Override
1659cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        public boolean releaseProvider(IContentProvider provider) {
16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mMainThread.releaseProvider(provider);
16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16625f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final ActivityThread mMainThread;
16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/
16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final class ApplicationPackageManager extends PackageManager {
16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PackageInfo getPackageInfo(String packageName, int flags)
16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throws NameNotFoundException {
16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PackageInfo pi = mPM.getPackageInfo(packageName, flags);
16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pi != null) {
16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return pi;
16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new NameNotFoundException(packageName);
16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1687eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda        @Override
1688470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn        public String[] currentToCanonicalPackageNames(String[] names) {
1689470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn            try {
1690470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn                return mPM.currentToCanonicalPackageNames(names);
1691470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn            } catch (RemoteException e) {
1692470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn                throw new RuntimeException("Package manager has died", e);
1693470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn            }
1694470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn        }
16955f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
1696470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn        @Override
1697470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn        public String[] canonicalToCurrentPackageNames(String[] names) {
1698470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn            try {
1699470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn                return mPM.canonicalToCurrentPackageNames(names);
1700470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn            } catch (RemoteException e) {
1701470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn                throw new RuntimeException("Package manager has died", e);
1702470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn            }
1703470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn        }
17045f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
1705470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn        @Override
1706eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda        public Intent getLaunchIntentForPackage(String packageName) {
17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // First see if the package has an INFO activity; the existence of
17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // such an activity is implied to be the desired front-door for the
17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // overall package (such as if it has multiple launcher entries).
1710eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda            Intent intentToResolve = new Intent(Intent.ACTION_MAIN);
1711eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda            intentToResolve.addCategory(Intent.CATEGORY_INFO);
1712c14b9ccdf13163cae5ce5d21bcf377010b37594bDianne Hackborn            intentToResolve.setPackage(packageName);
1713c14b9ccdf13163cae5ce5d21bcf377010b37594bDianne Hackborn            ResolveInfo resolveInfo = resolveActivity(intentToResolve, 0);
1714eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda
17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Otherwise, try to find a main launcher activity.
1716eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda            if (resolveInfo == null) {
1717eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda                // reuse the intent instance
1718eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda                intentToResolve.removeCategory(Intent.CATEGORY_INFO);
1719eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda                intentToResolve.addCategory(Intent.CATEGORY_LAUNCHER);
1720c14b9ccdf13163cae5ce5d21bcf377010b37594bDianne Hackborn                intentToResolve.setPackage(packageName);
1721c14b9ccdf13163cae5ce5d21bcf377010b37594bDianne Hackborn                resolveInfo = resolveActivity(intentToResolve, 0);
1722eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda            }
1723eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda            if (resolveInfo == null) {
1724eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda                return null;
1725eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda            }
1726df4cfa3664e06132c2e2cc26cade06a881f5e529Johan Erlandsson            Intent intent = new Intent(intentToResolve);
1727df4cfa3664e06132c2e2cc26cade06a881f5e529Johan Erlandsson            intent.setClassName(resolveInfo.activityInfo.applicationInfo.packageName,
1728df4cfa3664e06132c2e2cc26cade06a881f5e529Johan Erlandsson                                resolveInfo.activityInfo.name);
17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
1730eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda            return intent;
17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1732eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda
17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int[] getPackageGids(String packageName)
17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws NameNotFoundException {
17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int[] gids = mPM.getPackageGids(packageName);
17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (gids == null || gids.length > 0) {
17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return gids;
17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new NameNotFoundException(packageName);
17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PermissionInfo getPermissionInfo(String name, int flags)
17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws NameNotFoundException {
17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PermissionInfo pi = mPM.getPermissionInfo(name, flags);
17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pi != null) {
17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return pi;
17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new NameNotFoundException(name);
17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public List<PermissionInfo> queryPermissionsByGroup(String group, int flags)
17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throws NameNotFoundException {
17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                List<PermissionInfo> pi = mPM.queryPermissionsByGroup(group, flags);
17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pi != null) {
17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return pi;
17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new NameNotFoundException(group);
17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PermissionGroupInfo getPermissionGroupInfo(String name,
17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int flags) throws NameNotFoundException {
17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PermissionGroupInfo pgi = mPM.getPermissionGroupInfo(name, flags);
17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pgi != null) {
17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return pgi;
17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new NameNotFoundException(name);
17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public List<PermissionGroupInfo> getAllPermissionGroups(int flags) {
17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.getAllPermissionGroups(flags);
17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ApplicationInfo getApplicationInfo(String packageName, int flags)
18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws NameNotFoundException {
18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ApplicationInfo ai = mPM.getApplicationInfo(packageName, flags);
18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ai != null) {
18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return ai;
18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new NameNotFoundException(packageName);
18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ActivityInfo getActivityInfo(ComponentName className, int flags)
18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws NameNotFoundException {
18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityInfo ai = mPM.getActivityInfo(className, flags);
18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ai != null) {
18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return ai;
18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new NameNotFoundException(className.toString());
18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ActivityInfo getReceiverInfo(ComponentName className, int flags)
18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws NameNotFoundException {
18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityInfo ai = mPM.getReceiverInfo(className, flags);
18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ai != null) {
18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return ai;
18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new NameNotFoundException(className.toString());
18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ServiceInfo getServiceInfo(ComponentName className, int flags)
18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws NameNotFoundException {
18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ServiceInfo si = mPM.getServiceInfo(className, flags);
18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (si != null) {
18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return si;
18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new NameNotFoundException(className.toString());
18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1863361199b5e742c6635d4d7a03de6cf37b31cf442cDianne Hackborn        public ProviderInfo getProviderInfo(ComponentName className, int flags)
1864361199b5e742c6635d4d7a03de6cf37b31cf442cDianne Hackborn            throws NameNotFoundException {
1865361199b5e742c6635d4d7a03de6cf37b31cf442cDianne Hackborn            try {
1866361199b5e742c6635d4d7a03de6cf37b31cf442cDianne Hackborn                ProviderInfo pi = mPM.getProviderInfo(className, flags);
1867361199b5e742c6635d4d7a03de6cf37b31cf442cDianne Hackborn                if (pi != null) {
1868361199b5e742c6635d4d7a03de6cf37b31cf442cDianne Hackborn                    return pi;
1869361199b5e742c6635d4d7a03de6cf37b31cf442cDianne Hackborn                }
1870361199b5e742c6635d4d7a03de6cf37b31cf442cDianne Hackborn            } catch (RemoteException e) {
1871361199b5e742c6635d4d7a03de6cf37b31cf442cDianne Hackborn                throw new RuntimeException("Package manager has died", e);
1872361199b5e742c6635d4d7a03de6cf37b31cf442cDianne Hackborn            }
1873361199b5e742c6635d4d7a03de6cf37b31cf442cDianne Hackborn
1874361199b5e742c6635d4d7a03de6cf37b31cf442cDianne Hackborn            throw new NameNotFoundException(className.toString());
1875361199b5e742c6635d4d7a03de6cf37b31cf442cDianne Hackborn        }
1876361199b5e742c6635d4d7a03de6cf37b31cf442cDianne Hackborn
1877361199b5e742c6635d4d7a03de6cf37b31cf442cDianne Hackborn        @Override
18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String[] getSystemSharedLibraryNames() {
18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             try {
18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 return mPM.getSystemSharedLibraryNames();
18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             } catch (RemoteException e) {
18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 throw new RuntimeException("Package manager has died", e);
18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             }
18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
188749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn        public FeatureInfo[] getSystemAvailableFeatures() {
188849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn            try {
188949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                return mPM.getSystemAvailableFeatures();
189049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn            } catch (RemoteException e) {
189149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                throw new RuntimeException("Package manager has died", e);
189249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn            }
189349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn        }
18945f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
189549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn        @Override
1896039c68e75606e837cf021815a0210836724574adDianne Hackborn        public boolean hasSystemFeature(String name) {
1897039c68e75606e837cf021815a0210836724574adDianne Hackborn            try {
1898039c68e75606e837cf021815a0210836724574adDianne Hackborn                return mPM.hasSystemFeature(name);
1899039c68e75606e837cf021815a0210836724574adDianne Hackborn            } catch (RemoteException e) {
1900039c68e75606e837cf021815a0210836724574adDianne Hackborn                throw new RuntimeException("Package manager has died", e);
1901039c68e75606e837cf021815a0210836724574adDianne Hackborn            }
1902039c68e75606e837cf021815a0210836724574adDianne Hackborn        }
19035f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
1904039c68e75606e837cf021815a0210836724574adDianne Hackborn        @Override
19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int checkPermission(String permName, String pkgName) {
19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.checkPermission(permName, pkgName);
19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean addPermission(PermissionInfo info) {
19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.addPermission(info);
19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1923d7c096845dee7616095eda0fe9e7aa08f0ba9c20Dianne Hackborn        public boolean addPermissionAsync(PermissionInfo info) {
1924d7c096845dee7616095eda0fe9e7aa08f0ba9c20Dianne Hackborn            try {
1925d7c096845dee7616095eda0fe9e7aa08f0ba9c20Dianne Hackborn                return mPM.addPermissionAsync(info);
1926d7c096845dee7616095eda0fe9e7aa08f0ba9c20Dianne Hackborn            } catch (RemoteException e) {
1927d7c096845dee7616095eda0fe9e7aa08f0ba9c20Dianne Hackborn                throw new RuntimeException("Package manager has died", e);
1928d7c096845dee7616095eda0fe9e7aa08f0ba9c20Dianne Hackborn            }
1929d7c096845dee7616095eda0fe9e7aa08f0ba9c20Dianne Hackborn        }
1930d7c096845dee7616095eda0fe9e7aa08f0ba9c20Dianne Hackborn
1931d7c096845dee7616095eda0fe9e7aa08f0ba9c20Dianne Hackborn        @Override
19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void removePermission(String name) {
19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPM.removePermission(name);
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        }
19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int checkSignatures(String pkg1, String pkg2) {
19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.checkSignatures(pkg1, pkg2);
19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1950766cbfe44be3c5013a6a22bd6cd8ad1055a37256Dianne Hackborn        public int checkSignatures(int uid1, int uid2) {
1951766cbfe44be3c5013a6a22bd6cd8ad1055a37256Dianne Hackborn            try {
1952766cbfe44be3c5013a6a22bd6cd8ad1055a37256Dianne Hackborn                return mPM.checkUidSignatures(uid1, uid2);
1953766cbfe44be3c5013a6a22bd6cd8ad1055a37256Dianne Hackborn            } catch (RemoteException e) {
1954766cbfe44be3c5013a6a22bd6cd8ad1055a37256Dianne Hackborn                throw new RuntimeException("Package manager has died", e);
1955766cbfe44be3c5013a6a22bd6cd8ad1055a37256Dianne Hackborn            }
1956766cbfe44be3c5013a6a22bd6cd8ad1055a37256Dianne Hackborn        }
1957766cbfe44be3c5013a6a22bd6cd8ad1055a37256Dianne Hackborn
1958766cbfe44be3c5013a6a22bd6cd8ad1055a37256Dianne Hackborn        @Override
19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String[] getPackagesForUid(int uid) {
19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.getPackagesForUid(uid);
19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String getNameForUid(int uid) {
19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.getNameForUid(uid);
19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19755f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
19775f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer        public int getUidForSharedUser(String sharedUserName)
19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throws NameNotFoundException {
19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int uid = mPM.getUidForSharedUser(sharedUserName);
19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if(uid != -1) {
19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return uid;
19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new NameNotFoundException("No shared userid for user:"+sharedUserName);
19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public List<PackageInfo> getInstalledPackages(int flags) {
19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.getInstalledPackages(flags);
19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public List<ApplicationInfo> getInstalledApplications(int flags) {
20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.getInstalledApplications(flags);
20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ResolveInfo resolveActivity(Intent intent, int flags) {
20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.resolveIntent(
20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    intent,
20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    intent.resolveTypeIfNeeded(mContext.getContentResolver()),
20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    flags);
20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public List<ResolveInfo> queryIntentActivities(Intent intent,
20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int flags) {
20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.queryIntentActivities(
20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    intent,
20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    intent.resolveTypeIfNeeded(mContext.getContentResolver()),
20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    flags);
20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public List<ResolveInfo> queryIntentActivityOptions(
20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ComponentName caller, Intent[] specifics, Intent intent,
20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int flags) {
20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final ContentResolver resolver = mContext.getContentResolver();
20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] specificTypes = null;
20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (specifics != null) {
20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int N = specifics.length;
20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Intent sp = specifics[i];
20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (sp != null) {
20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        String t = sp.resolveTypeIfNeeded(resolver);
20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (t != null) {
20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (specificTypes == null) {
20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                specificTypes = new String[N];
20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            specificTypes[i] = t;
20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.queryIntentActivityOptions(caller, specifics,
20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    specificTypes, intent, intent.resolveTypeIfNeeded(resolver),
20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    flags);
20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public List<ResolveInfo> queryBroadcastReceivers(Intent intent, int flags) {
20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.queryIntentReceivers(
20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    intent,
20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    intent.resolveTypeIfNeeded(mContext.getContentResolver()),
20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    flags);
20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ResolveInfo resolveService(Intent intent, int flags) {
20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.resolveService(
20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    intent,
20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    intent.resolveTypeIfNeeded(mContext.getContentResolver()),
20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    flags);
20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public List<ResolveInfo> queryIntentServices(Intent intent, int flags) {
20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.queryIntentServices(
20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    intent,
20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    intent.resolveTypeIfNeeded(mContext.getContentResolver()),
20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    flags);
20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ProviderInfo resolveContentProvider(String name,
21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int flags) {
21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.resolveContentProvider(name, flags);
21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public List<ProviderInfo> queryContentProviders(String processName,
21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int uid, int flags) {
21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.queryContentProviders(processName, uid, flags);
21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public InstrumentationInfo getInstrumentationInfo(
21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ComponentName className, int flags)
21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throws NameNotFoundException {
21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                InstrumentationInfo ii = mPM.getInstrumentationInfo(
21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        className, flags);
21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ii != null) {
21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return ii;
21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new NameNotFoundException(className.toString());
21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public List<InstrumentationInfo> queryInstrumentation(
21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String targetPackage, int flags) {
21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.queryInstrumentation(targetPackage, flags);
21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override public Drawable getDrawable(String packageName, int resid,
21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ApplicationInfo appInfo) {
21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ResourceName name = new ResourceName(packageName, resid);
21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Drawable dr = getCachedIcon(name);
21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (dr != null) {
21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return dr;
21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (appInfo == null) {
21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    appInfo = getApplicationInfo(packageName, 0);
21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (NameNotFoundException e) {
21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Resources r = getResourcesForApplication(appInfo);
21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dr = r.getDrawable(resid);
216511ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn                if (false) {
216611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn                    RuntimeException e = new RuntimeException("here");
216711ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn                    e.fillInStackTrace();
216811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn                    Log.w(TAG, "Getting drawable 0x" + Integer.toHexString(resid)
216911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn                            + " from package " + packageName
217011ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn                            + ": app scale=" + r.getCompatibilityInfo().applicationScale
217111ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn                            + ", caller scale=" + mContext.getResources().getCompatibilityInfo().applicationScale,
217211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn                            e);
217311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn                }
21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_ICONS) Log.v(TAG, "Getting drawable 0x"
21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + Integer.toHexString(resid) + " from " + r
21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + ": " + dr);
21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                putCachedIcon(name, dr);
21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return dr;
21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (NameNotFoundException e) {
21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w("PackageManager", "Failure retrieving resources for"
21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + appInfo.packageName);
21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RuntimeException e) {
21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If an exception was thrown, fall through to return
21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // default icon.
21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w("PackageManager", "Failure retrieving icon 0x"
21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + Integer.toHexString(resid) + " in package "
21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + packageName, e);
21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override public Drawable getActivityIcon(ComponentName activityName)
21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throws NameNotFoundException {
21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getActivityInfo(activityName, 0).loadIcon(this);
21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override public Drawable getActivityIcon(Intent intent)
21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throws NameNotFoundException {
21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (intent.getComponent() != null) {
22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getActivityIcon(intent.getComponent());
22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ResolveInfo info = resolveActivity(
22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                intent, PackageManager.MATCH_DEFAULT_ONLY);
22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (info != null) {
22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return info.activityInfo.loadIcon(this);
22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new NameNotFoundException(intent.toURI());
22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override public Drawable getDefaultActivityIcon() {
22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return Resources.getSystem().getDrawable(
22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.drawable.sym_def_app_icon);
22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override public Drawable getApplicationIcon(ApplicationInfo info) {
221807330791116513710d879c45b2f095cd314cbfd0Jeff Brown            return info.loadIcon(this);
22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override public Drawable getApplicationIcon(String packageName)
22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throws NameNotFoundException {
22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getApplicationIcon(getApplicationInfo(packageName, 0));
22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
222581cd2e90ccdda498234384c8207afe2213714e60Adam Powell
222681cd2e90ccdda498234384c8207afe2213714e60Adam Powell        @Override
222781cd2e90ccdda498234384c8207afe2213714e60Adam Powell        public Drawable getActivityLogo(ComponentName activityName)
222881cd2e90ccdda498234384c8207afe2213714e60Adam Powell                throws NameNotFoundException {
222981cd2e90ccdda498234384c8207afe2213714e60Adam Powell            return getActivityInfo(activityName, 0).loadLogo(this);
223081cd2e90ccdda498234384c8207afe2213714e60Adam Powell        }
223181cd2e90ccdda498234384c8207afe2213714e60Adam Powell
223281cd2e90ccdda498234384c8207afe2213714e60Adam Powell        @Override
223381cd2e90ccdda498234384c8207afe2213714e60Adam Powell        public Drawable getActivityLogo(Intent intent)
223481cd2e90ccdda498234384c8207afe2213714e60Adam Powell                throws NameNotFoundException {
223581cd2e90ccdda498234384c8207afe2213714e60Adam Powell            if (intent.getComponent() != null) {
223681cd2e90ccdda498234384c8207afe2213714e60Adam Powell                return getActivityLogo(intent.getComponent());
223781cd2e90ccdda498234384c8207afe2213714e60Adam Powell            }
223881cd2e90ccdda498234384c8207afe2213714e60Adam Powell
223981cd2e90ccdda498234384c8207afe2213714e60Adam Powell            ResolveInfo info = resolveActivity(
224081cd2e90ccdda498234384c8207afe2213714e60Adam Powell                    intent, PackageManager.MATCH_DEFAULT_ONLY);
224181cd2e90ccdda498234384c8207afe2213714e60Adam Powell            if (info != null) {
224281cd2e90ccdda498234384c8207afe2213714e60Adam Powell                return info.activityInfo.loadLogo(this);
224381cd2e90ccdda498234384c8207afe2213714e60Adam Powell            }
224481cd2e90ccdda498234384c8207afe2213714e60Adam Powell
224581cd2e90ccdda498234384c8207afe2213714e60Adam Powell            throw new NameNotFoundException(intent.toUri(0));
224681cd2e90ccdda498234384c8207afe2213714e60Adam Powell        }
224781cd2e90ccdda498234384c8207afe2213714e60Adam Powell
224881cd2e90ccdda498234384c8207afe2213714e60Adam Powell        @Override
224981cd2e90ccdda498234384c8207afe2213714e60Adam Powell        public Drawable getApplicationLogo(ApplicationInfo info) {
225081cd2e90ccdda498234384c8207afe2213714e60Adam Powell            return info.loadLogo(this);
225181cd2e90ccdda498234384c8207afe2213714e60Adam Powell        }
225281cd2e90ccdda498234384c8207afe2213714e60Adam Powell
225381cd2e90ccdda498234384c8207afe2213714e60Adam Powell        @Override
225481cd2e90ccdda498234384c8207afe2213714e60Adam Powell        public Drawable getApplicationLogo(String packageName)
225581cd2e90ccdda498234384c8207afe2213714e60Adam Powell                throws NameNotFoundException {
225681cd2e90ccdda498234384c8207afe2213714e60Adam Powell            return getApplicationLogo(getApplicationInfo(packageName, 0));
225781cd2e90ccdda498234384c8207afe2213714e60Adam Powell        }
22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override public Resources getResourcesForActivity(
22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ComponentName activityName) throws NameNotFoundException {
22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getResourcesForApplication(
22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                getActivityInfo(activityName, 0).applicationInfo);
22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override public Resources getResourcesForApplication(
22669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ApplicationInfo app) throws NameNotFoundException {
22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (app.packageName.equals("system")) {
22689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mContext.mMainThread.getSystemContext().getResources();
22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Resources r = mContext.mMainThread.getTopLevelResources(
22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    app.uid == Process.myUid() ? app.sourceDir
227211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn                    : app.publicSourceDir, mContext.mPackageInfo);
22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (r != null) {
22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return r;
22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new NameNotFoundException("Unable to open " + app.publicSourceDir);
22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override public Resources getResourcesForApplication(
22809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String appPackageName) throws NameNotFoundException {
22819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getResourcesForApplication(
22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                getApplicationInfo(appPackageName, 0));
22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mCachedSafeMode = -1;
22869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override public boolean isSafeMode() {
22879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
22889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mCachedSafeMode < 0) {
22899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mCachedSafeMode = mPM.isSafeMode() ? 1 : 0;
22909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mCachedSafeMode != 0;
22929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
22939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Package manager has died", e);
22949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        static void configurationChanged() {
22989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (sSync) {
22999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sIconCache.clear();
23009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sStringCache.clear();
23019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23042155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn        ApplicationPackageManager(ContextImpl context,
23059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                IPackageManager pm) {
23069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mContext = context;
23079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPM = pm;
23089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private Drawable getCachedIcon(ResourceName name) {
23119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (sSync) {
23129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WeakReference<Drawable> wr = sIconCache.get(name);
23139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_ICONS) Log.v(TAG, "Get cached weak drawable ref for "
23149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + name + ": " + wr);
23159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (wr != null) {   // we have the activity
23169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Drawable dr = wr.get();
23179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (dr != null) {
23189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (DEBUG_ICONS) Log.v(TAG, "Get cached drawable for "
23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + name + ": " + dr);
23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return dr;
23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
23229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // our entry has been purged
23239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sIconCache.remove(name);
23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
23279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private void putCachedIcon(ResourceName name, Drawable dr) {
23309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (sSync) {
23319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sIconCache.put(name, new WeakReference<Drawable>(dr));
23329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_ICONS) Log.v(TAG, "Added cached drawable for "
23339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + name + ": " + dr);
23349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23374416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn        static final void handlePackageBroadcast(int cmd, String[] pkgList,
23384416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn                boolean hasPkgInfo) {
23394416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn            boolean immediateGc = false;
23404416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn            if (cmd == IApplicationThread.EXTERNAL_STORAGE_UNAVAILABLE) {
23414416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn                immediateGc = true;
23424416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn            }
23434416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn            if (pkgList != null && (pkgList.length > 0)) {
23444416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn                boolean needCleanup = false;
23454416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn                for (String ssp : pkgList) {
23464416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn                    synchronized (sSync) {
23474416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn                        if (sIconCache.size() > 0) {
234808675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                            Iterator<ResourceName> it = sIconCache.keySet().iterator();
234908675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                            while (it.hasNext()) {
235008675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                                ResourceName nm = it.next();
235108675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                                if (nm.packageName.equals(ssp)) {
235208675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                                    //Log.i(TAG, "Removing cached drawable for " + nm);
235308675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                                    it.remove();
235408675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                                    needCleanup = true;
235508675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                                }
23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
23574416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn                        }
23584416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn                        if (sStringCache.size() > 0) {
23594416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn                            Iterator<ResourceName> it = sStringCache.keySet().iterator();
236008675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                            while (it.hasNext()) {
236108675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                                ResourceName nm = it.next();
236208675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                                if (nm.packageName.equals(ssp)) {
236308675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                                    //Log.i(TAG, "Removing cached string for " + nm);
236408675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                                    it.remove();
236508675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                                    needCleanup = true;
236608675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu                                }
23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
23699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
23704416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn                }
23714416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn                if (needCleanup || hasPkgInfo) {
23724416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn                    if (immediateGc) {
23734416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn                        // Schedule an immediate gc.
23744416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn                        Runtime.getRuntime().gc();
23754416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn                    } else {
23764416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn                        ActivityThread.currentActivityThread().scheduleGcIdler();
23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
23789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23815f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static final class ResourceName {
23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final String packageName;
23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int iconId;
23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ResourceName(String _packageName, int _iconId) {
23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                packageName = _packageName;
23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                iconId = _iconId;
23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ResourceName(ApplicationInfo aInfo, int _iconId) {
23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                this(aInfo.packageName, _iconId);
23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ResourceName(ComponentInfo cInfo, int _iconId) {
23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                this(cInfo.applicationInfo.packageName, _iconId);
23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ResourceName(ResolveInfo rInfo, int _iconId) {
24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                this(rInfo.activityInfo.applicationInfo.packageName, _iconId);
24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
24049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public boolean equals(Object o) {
24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (this == o) return true;
24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (o == null || getClass() != o.getClass()) return false;
24079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ResourceName that = (ResourceName) o;
24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (iconId != that.iconId) return false;
24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return !(packageName != null ?
24129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        !packageName.equals(that.packageName) : that.packageName != null);
24139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
24179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int hashCode() {
24189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int result;
24199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                result = packageName.hashCode();
24209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                result = 31 * result + iconId;
24219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return result;
24229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
24259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public String toString() {
24269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "{ResourceName " + packageName + " / " + iconId + "}";
24279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private CharSequence getCachedString(ResourceName name) {
24319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (sSync) {
24329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WeakReference<CharSequence> wr = sStringCache.get(name);
24339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (wr != null) {   // we have the activity
24349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    CharSequence cs = wr.get();
24359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (cs != null) {
24369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return cs;
24379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
24389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // our entry has been purged
24399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sStringCache.remove(name);
24409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private void putCachedString(ResourceName name, CharSequence cs) {
24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (sSync) {
24479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sStringCache.put(name, new WeakReference<CharSequence>(cs));
24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
24529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public CharSequence getText(String packageName, int resid,
24539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ApplicationInfo appInfo) {
24549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ResourceName name = new ResourceName(packageName, resid);
24559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence text = getCachedString(name);
24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (text != null) {
24579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return text;
24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (appInfo == null) {
24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    appInfo = getApplicationInfo(packageName, 0);
24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (NameNotFoundException e) {
24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Resources r = getResourcesForApplication(appInfo);
24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                text = r.getText(resid);
24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                putCachedString(name, text);
24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return text;
24719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (NameNotFoundException e) {
24729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w("PackageManager", "Failure retrieving resources for"
24739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + appInfo.packageName);
24749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RuntimeException e) {
24759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If an exception was thrown, fall through to return
24769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // default icon.
24779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w("PackageManager", "Failure retrieving text 0x"
24789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + Integer.toHexString(resid) + " in package "
24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + packageName, e);
24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
24859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public XmlResourceParser getXml(String packageName, int resid,
24869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ApplicationInfo appInfo) {
24879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (appInfo == null) {
24889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
24899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    appInfo = getApplicationInfo(packageName, 0);
24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (NameNotFoundException e) {
24919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
24929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Resources r = getResourcesForApplication(appInfo);
24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return r.getXml(resid);
24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RuntimeException e) {
24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If an exception was thrown, fall through to return
24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // default icon.
25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w("PackageManager", "Failure retrieving xml 0x"
25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + Integer.toHexString(resid) + " in package "
25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + packageName, e);
25039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (NameNotFoundException e) {
25049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w("PackageManager", "Failure retrieving resources for"
25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + appInfo.packageName);
25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public CharSequence getApplicationLabel(ApplicationInfo info) {
251207330791116513710d879c45b2f095cd314cbfd0Jeff Brown            return info.loadLabel(this);
25139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
251665e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski        public void installPackage(Uri packageURI, IPackageInstallObserver observer, int flags,
251765e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski                String installerPackageName) {
25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
251965e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski                mPM.installPackage(packageURI, observer, flags, installerPackageName);
25209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
25219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Should never happen!
25229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
25268946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu        public void movePackage(String packageName, IPackageMoveObserver observer, int flags) {
25278946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu            try {
25288946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu                mPM.movePackage(packageName, observer, flags);
25298946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu            } catch (RemoteException e) {
25308946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu                // Should never happen!
25318946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu            }
25328946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu        }
25338946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu
25348946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu        @Override
253565e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski        public String getInstallerPackageName(String packageName) {
253665e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski            try {
253765e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski                return mPM.getInstallerPackageName(packageName);
253865e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski            } catch (RemoteException e) {
253965e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski                // Should never happen!
254065e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski            }
254165e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski            return null;
254265e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski        }
254365e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski
254465e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski        @Override
25459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void deletePackage(String packageName, IPackageDeleteObserver observer, int flags) {
25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
25479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPM.deletePackage(packageName, observer, flags);
25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
25499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Should never happen!
25509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
25535f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer        public void clearApplicationUserData(String packageName,
25549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                IPackageDataObserver observer) {
25559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
25569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPM.clearApplicationUserData(packageName, observer);
25579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
25589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Should never happen!
25599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
25625f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer        public void deleteApplicationCacheFiles(String packageName,
25639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                IPackageDataObserver observer) {
25649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
25659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPM.deleteApplicationCacheFiles(packageName, observer);
25669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
25679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Should never happen!
25689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void freeStorageAndNotify(long idealStorageSize, IPackageDataObserver observer) {
25729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
25739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPM.freeStorageAndNotify(idealStorageSize, observer);
25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
25759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Should never happen!
25769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25781ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu
25791ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        @Override
2580bc806f65edc33f6eda0f475ac84e5e037a013a90Suchi Amalapurapu        public void freeStorage(long freeStorageSize, IntentSender pi) {
25811ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu            try {
25821ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu                mPM.freeStorage(freeStorageSize, pi);
25831ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu            } catch (RemoteException e) {
25841ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu                // Should never happen!
25851ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu            }
25861ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        }
25875f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
25889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
25895f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer        public void getPackageSizeInfo(String packageName,
25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                IPackageStatsObserver observer) {
25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPM.getPackageSizeInfo(packageName, observer);
25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Should never happen!
25959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
25989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void addPackageToPreferred(String packageName) {
25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPM.addPackageToPreferred(packageName);
26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Should never happen!
26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void removePackageFromPreferred(String packageName) {
26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPM.removePackageFromPreferred(packageName);
26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Should never happen!
26129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public List<PackageInfo> getPreferredPackages(int flags) {
26179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
26189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.getPreferredPackages(flags);
26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
26209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Should never happen!
26219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new ArrayList<PackageInfo>();
26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
26269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void addPreferredActivity(IntentFilter filter,
26279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int match, ComponentName[] set, ComponentName activity) {
26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
26299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPM.addPreferredActivity(filter, match, set, activity);
26309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
26319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Should never happen!
26329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26345f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
26359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
26368dbe612dc60526d635e57257b58627b33a099678Satish Sampath        public void replacePreferredActivity(IntentFilter filter,
26378dbe612dc60526d635e57257b58627b33a099678Satish Sampath                int match, ComponentName[] set, ComponentName activity) {
26388dbe612dc60526d635e57257b58627b33a099678Satish Sampath            try {
26398dbe612dc60526d635e57257b58627b33a099678Satish Sampath                mPM.replacePreferredActivity(filter, match, set, activity);
26408dbe612dc60526d635e57257b58627b33a099678Satish Sampath            } catch (RemoteException e) {
26418dbe612dc60526d635e57257b58627b33a099678Satish Sampath                // Should never happen!
26428dbe612dc60526d635e57257b58627b33a099678Satish Sampath            }
26438dbe612dc60526d635e57257b58627b33a099678Satish Sampath        }
26448dbe612dc60526d635e57257b58627b33a099678Satish Sampath
26458dbe612dc60526d635e57257b58627b33a099678Satish Sampath        @Override
26469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void clearPackagePreferredActivities(String packageName) {
26479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
26489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPM.clearPackagePreferredActivities(packageName);
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        }
26535f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
26549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
26559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getPreferredActivities(List<IntentFilter> outFilters,
26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                List<ComponentName> outActivities, String packageName) {
26579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
26589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.getPreferredActivities(outFilters, outActivities, packageName);
26599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
26609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Should never happen!
26619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return 0;
26639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26645f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
26659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
26669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setComponentEnabledSetting(ComponentName componentName,
26679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int newState, int flags) {
26689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
26699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPM.setComponentEnabledSetting(componentName, newState, flags);
26709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
26719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Should never happen!
26729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
26769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getComponentEnabledSetting(ComponentName componentName) {
26779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
26789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.getComponentEnabledSetting(componentName);
26799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
26809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Should never happen!
26819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
26839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
26869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setApplicationEnabledSetting(String packageName,
26879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int newState, int flags) {
26889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
26899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPM.setApplicationEnabledSetting(packageName, newState, flags);
26909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
26919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Should never happen!
26929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26945f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
26959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
26969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getApplicationEnabledSetting(String packageName) {
26979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
26989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mPM.getApplicationEnabledSetting(packageName);
26999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
27009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Should never happen!
27019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
27039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
270593565c4b3265c16aee4a82d7556f811776c17db8Kenny Root        @Override
270693565c4b3265c16aee4a82d7556f811776c17db8Kenny Root        public void setPackageObbPath(String packageName, String path) {
270793565c4b3265c16aee4a82d7556f811776c17db8Kenny Root            try {
270893565c4b3265c16aee4a82d7556f811776c17db8Kenny Root                mPM.setPackageObbPath(packageName, path);
270993565c4b3265c16aee4a82d7556f811776c17db8Kenny Root            } catch (RemoteException e) {
271093565c4b3265c16aee4a82d7556f811776c17db8Kenny Root                // Should never happen!
271193565c4b3265c16aee4a82d7556f811776c17db8Kenny Root            }
271293565c4b3265c16aee4a82d7556f811776c17db8Kenny Root        }
271393565c4b3265c16aee4a82d7556f811776c17db8Kenny Root
27142155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn        private final ContextImpl mContext;
27159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final IPackageManager mPM;
27169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static final Object sSync = new Object();
27189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static HashMap<ResourceName, WeakReference<Drawable> > sIconCache
27199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                = new HashMap<ResourceName, WeakReference<Drawable> >();
27209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static HashMap<ResourceName, WeakReference<CharSequence> > sStringCache
27219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                = new HashMap<ResourceName, WeakReference<CharSequence> >();
27229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
27259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
27269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
27279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final class SharedPreferencesImpl implements SharedPreferences {
27299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27306194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick        // Lock ordering rules:
27316194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick        //  - acquire SharedPreferencesImpl.this before EditorImpl.this
27326194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick        //  - acquire mWritingToDiskLock before EditorImpl.this
27336194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick
27349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final File mFile;
27359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final File mBackupFile;
27369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final int mMode;
27379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27389acdeb99c5102f89a9a73eb4d62e38e7ac86e01cBrad Fitzpatrick        private Map<String, Object> mMap;     // guarded by 'this'
2739333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick        private int mDiskWritesInFlight = 0;  // guarded by 'this'
27409acdeb99c5102f89a9a73eb4d62e38e7ac86e01cBrad Fitzpatrick        private boolean mLoaded = false;      // guarded by 'this'
27419acdeb99c5102f89a9a73eb4d62e38e7ac86e01cBrad Fitzpatrick        private long mStatTimestamp;          // guarded by 'this'
27429acdeb99c5102f89a9a73eb4d62e38e7ac86e01cBrad Fitzpatrick        private long mStatSize;               // guarded by 'this'
2743333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick
2744333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick        private final Object mWritingToDiskLock = new Object();
2745105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        private static final Object mContent = new Object();
27469acdeb99c5102f89a9a73eb4d62e38e7ac86e01cBrad Fitzpatrick        private final WeakHashMap<OnSharedPreferenceChangeListener, Object> mListeners;
27479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SharedPreferencesImpl(
27499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            File file, int mode, Map initialContents) {
27509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mFile = file;
27519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBackupFile = makeBackupFile(file);
27529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMode = mode;
27536194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            mLoaded = initialContents != null;
2754333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            mMap = initialContents != null ? initialContents : new HashMap<String, Object>();
2755333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            FileStatus stat = new FileStatus();
2756333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            if (FileUtils.getFileStatus(file.getPath(), stat)) {
27579acdeb99c5102f89a9a73eb4d62e38e7ac86e01cBrad Fitzpatrick                mStatTimestamp = stat.mtime;
27589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2759105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mListeners = new WeakHashMap<OnSharedPreferenceChangeListener, Object>();
27609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27626194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick        // Has this SharedPreferences ever had values assigned to it?
27636194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick        boolean isLoaded() {
27646194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            synchronized (this) {
27656194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                return mLoaded;
27666194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            }
27676194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick        }
27686194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick
27696194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick        // Has the file changed out from under us?  i.e. writes that
27706194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick        // we didn't instigate.
27716194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick        public boolean hasFileChangedUnexpectedly() {
27726194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            synchronized (this) {
27736194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                if (mDiskWritesInFlight > 0) {
27746194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                    // If we know we caused it, it's not unexpected.
277590bc5ee02bd91c138f88180879c6ef748a578f47Brad Fitzpatrick                    if (DEBUG) Log.d(TAG, "disk write in flight, not unexpected.");
27766194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                    return false;
27776194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                }
27786194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            }
2779333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            FileStatus stat = new FileStatus();
2780333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            if (!FileUtils.getFileStatus(mFile.getPath(), stat)) {
2781333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                return true;
2782333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            }
27839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
27849acdeb99c5102f89a9a73eb4d62e38e7ac86e01cBrad Fitzpatrick                return mStatTimestamp != stat.mtime || mStatSize != stat.size;
27859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27875f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
27889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void replace(Map newContents) {
27896194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            synchronized (this) {
27906194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                mLoaded = true;
27916194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                if (newContents != null) {
27929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMap = newContents;
27939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
27949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27965f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
27979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) {
27989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized(this) {
2799105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mListeners.put(listener, mContent);
28009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void unregisterOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) {
28049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized(this) {
28059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mListeners.remove(listener);
28069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<String, ?> getAll() {
28109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized(this) {
28119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //noinspection unchecked
2812333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                return new HashMap<String, Object>(mMap);
28139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String getString(String key, String defValue) {
28179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
28189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String v = (String)mMap.get(key);
28199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return v != null ? v : defValue;
28209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2822212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell
2823212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        public Set<String> getStringSet(String key, Set<String> defValues) {
2824212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            synchronized (this) {
2825212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                Set<String> v = (Set<String>) mMap.get(key);
2826212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                return v != null ? v : defValues;
2827212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            }
2828212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell        }
28299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getInt(String key, int defValue) {
28319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
28329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Integer v = (Integer)mMap.get(key);
28339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return v != null ? v : defValue;
28349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long getLong(String key, long defValue) {
28379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
2838333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                Long v = (Long)mMap.get(key);
28399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return v != null ? v : defValue;
28409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public float getFloat(String key, float defValue) {
28439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
28449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Float v = (Float)mMap.get(key);
28459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return v != null ? v : defValue;
28469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean getBoolean(String key, boolean defValue) {
28499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
28509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Boolean v = (Boolean)mMap.get(key);
28519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return v != null ? v : defValue;
28529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean contains(String key) {
28569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
28579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mMap.containsKey(key);
28589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2861333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick        public Editor edit() {
2862333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            return new EditorImpl();
2863333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick        }
2864333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick
2865333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick        // Return value from EditorImpl#commitToMemory()
2866333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick        private static class MemoryCommitResult {
2867333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            public boolean changesMade;  // any keys different?
2868333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            public List<String> keysModified;  // may be null
2869333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            public Set<OnSharedPreferenceChangeListener> listeners;  // may be null
2870333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            public Map<?, ?> mapToWriteToDisk;
2871333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            public final CountDownLatch writtenToDiskLatch = new CountDownLatch(1);
2872333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            public volatile boolean writeToDiskResult = false;
2873333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick
2874333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            public void setDiskWriteResult(boolean result) {
2875333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                writeToDiskResult = result;
2876333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                writtenToDiskLatch.countDown();
2877333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            }
2878333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick        }
2879333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick
28809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class EditorImpl implements Editor {
28819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            private final Map<String, Object> mModified = Maps.newHashMap();
28829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            private boolean mClear = false;
28839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Editor putString(String key, String value) {
28859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                synchronized (this) {
28869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mModified.put(key, value);
28879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return this;
28889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
28899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2890212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            public Editor putStringSet(String key, Set<String> values) {
2891212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                synchronized (this) {
2892212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                    mModified.put(key, values);
2893212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                    return this;
2894212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell                }
2895212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell            }
28969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Editor putInt(String key, int value) {
28979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                synchronized (this) {
28989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mModified.put(key, value);
28999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return this;
29009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
29019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Editor putLong(String key, long value) {
29039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                synchronized (this) {
29049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mModified.put(key, value);
29059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return this;
29069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
29079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Editor putFloat(String key, float value) {
29099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                synchronized (this) {
29109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mModified.put(key, value);
29119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return this;
29129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
29139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Editor putBoolean(String key, boolean value) {
29159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                synchronized (this) {
29169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mModified.put(key, value);
29179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return this;
29189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
29199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Editor remove(String key) {
29229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                synchronized (this) {
29239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mModified.put(key, this);
29249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return this;
29259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
29269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Editor clear() {
29299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                synchronized (this) {
29309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mClear = true;
29319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return this;
29329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
29339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
293566fce5068a8a3aeb28aaf713843891b286a75280Brad Fitzpatrick            public void apply() {
2936333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                final MemoryCommitResult mcr = commitToMemory();
2937333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                final Runnable awaitCommit = new Runnable() {
2938333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                        public void run() {
2939333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                            try {
2940333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                                mcr.writtenToDiskLatch.await();
2941333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                            } catch (InterruptedException ignored) {
2942333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                            }
2943333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                        }
2944333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                    };
29459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2946333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                QueuedWork.add(awaitCommit);
29479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2948333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                Runnable postWriteRunnable = new Runnable() {
2949333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                        public void run() {
2950333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                            awaitCommit.run();
2951333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                            QueuedWork.remove(awaitCommit);
2952333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                        }
2953333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                    };
29549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2955333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                SharedPreferencesImpl.this.enqueueDiskWrite(mcr, postWriteRunnable);
29569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2957333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                // Okay to notify the listeners before it's hit disk
2958333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                // because the listeners should always get the same
2959333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                // SharedPreferences instance back, which has the
2960333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                // changes reflected in memory.
2961333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                notifyListeners(mcr);
2962333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            }
2963333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick
2964333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            // Returns true if any changes were made
2965333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            private MemoryCommitResult commitToMemory() {
2966333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                MemoryCommitResult mcr = new MemoryCommitResult();
29679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                synchronized (SharedPreferencesImpl.this) {
2968333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                    // We optimistically don't make a deep copy until
2969333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                    // a memory commit comes in when we're already
2970333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                    // writing to disk.
2971333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                    if (mDiskWritesInFlight > 0) {
2972333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                        // We can't modify our mMap as a currently
2973333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                        // in-flight write owns it.  Clone it before
2974333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                        // modifying it.
2975333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                        // noinspection unchecked
2976333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                        mMap = new HashMap<String, Object>(mMap);
2977333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                    }
2978333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                    mcr.mapToWriteToDisk = mMap;
2979333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                    mDiskWritesInFlight++;
2980333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick
2981333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                    boolean hasListeners = mListeners.size() > 0;
29829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (hasListeners) {
2983333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                        mcr.keysModified = new ArrayList<String>();
2984333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                        mcr.listeners =
2985333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                            new HashSet<OnSharedPreferenceChangeListener>(mListeners.keySet());
29869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
29879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized (this) {
29899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (mClear) {
299067fed01522ad26c850b20d2c960e4d392dc401d1Brad Fitzpatrick                            if (!mMap.isEmpty()) {
2991333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                                mcr.changesMade = true;
299267fed01522ad26c850b20d2c960e4d392dc401d1Brad Fitzpatrick                                mMap.clear();
299367fed01522ad26c850b20d2c960e4d392dc401d1Brad Fitzpatrick                            }
29949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mClear = false;
29959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
29969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2997105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        for (Entry<String, Object> e : mModified.entrySet()) {
29989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            String k = e.getKey();
29999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Object v = e.getValue();
300067fed01522ad26c850b20d2c960e4d392dc401d1Brad Fitzpatrick                            if (v == this) {  // magic value for a removal mutation
3001333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                                if (!mMap.containsKey(k)) {
3002333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                                    continue;
300367fed01522ad26c850b20d2c960e4d392dc401d1Brad Fitzpatrick                                }
3004333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                                mMap.remove(k);
30059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } else {
300667fed01522ad26c850b20d2c960e4d392dc401d1Brad Fitzpatrick                                boolean isSame = false;
300767fed01522ad26c850b20d2c960e4d392dc401d1Brad Fitzpatrick                                if (mMap.containsKey(k)) {
300867fed01522ad26c850b20d2c960e4d392dc401d1Brad Fitzpatrick                                    Object existingValue = mMap.get(k);
3009333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                                    if (existingValue != null && existingValue.equals(v)) {
3010333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                                        continue;
3011333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                                    }
301267fed01522ad26c850b20d2c960e4d392dc401d1Brad Fitzpatrick                                }
3013333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                                mMap.put(k, v);
30149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
30159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3016333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                            mcr.changesMade = true;
30179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (hasListeners) {
3018333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                                mcr.keysModified.add(k);
30199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
30209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
30219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mModified.clear();
30239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
3024333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                }
3025333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                return mcr;
3026333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            }
30279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3028333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            public boolean commit() {
3029333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                MemoryCommitResult mcr = commitToMemory();
3030333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                SharedPreferencesImpl.this.enqueueDiskWrite(
3031333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                    mcr, null /* sync write on this thread okay */);
3032333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                try {
3033333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                    mcr.writtenToDiskLatch.await();
3034333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                } catch (InterruptedException e) {
3035333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                    return false;
30369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3037333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                notifyListeners(mcr);
3038333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                return mcr.writeToDiskResult;
3039333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            }
30409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3041333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            private void notifyListeners(final MemoryCommitResult mcr) {
3042333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                if (mcr.listeners == null || mcr.keysModified == null ||
3043333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                    mcr.keysModified.size() == 0) {
3044333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                    return;
3045333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                }
3046333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                if (Looper.myLooper() == Looper.getMainLooper()) {
3047333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                    for (int i = mcr.keysModified.size() - 1; i >= 0; i--) {
3048333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                        final String key = mcr.keysModified.get(i);
3049333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                        for (OnSharedPreferenceChangeListener listener : mcr.listeners) {
3050105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                            if (listener != null) {
3051105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                                listener.onSharedPreferenceChanged(SharedPreferencesImpl.this, key);
3052105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                            }
30539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
30549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
3055333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                } else {
3056333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                    // Run this function on the main thread.
3057333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                    ActivityThread.sMainThreadHandler.post(new Runnable() {
3058333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                            public void run() {
3059333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                                notifyListeners(mcr);
3060333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                            }
3061333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                        });
30629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
30639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3066333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick        /**
3067333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick         * Enqueue an already-committed-to-memory result to be written
3068333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick         * to disk.
3069333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick         *
3070333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick         * They will be written to disk one-at-a-time in the order
3071333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick         * that they're enqueued.
3072333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick         *
3073333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick         * @param postWriteRunnable if non-null, we're being called
307466fce5068a8a3aeb28aaf713843891b286a75280Brad Fitzpatrick         *   from apply() and this is the runnable to run after
3075333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick         *   the write proceeds.  if null (from a regular commit()),
3076333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick         *   then we're allowed to do this disk write on the main
3077333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick         *   thread (which in addition to reducing allocations and
3078333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick         *   creating a background thread, this has the advantage that
3079333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick         *   we catch them in userdebug StrictMode reports to convert
308066fce5068a8a3aeb28aaf713843891b286a75280Brad Fitzpatrick         *   them where possible to apply() ...)
3081333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick         */
3082333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick        private void enqueueDiskWrite(final MemoryCommitResult mcr,
3083333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                                      final Runnable postWriteRunnable) {
3084333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            final Runnable writeToDiskRunnable = new Runnable() {
3085333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                    public void run() {
3086333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                        synchronized (mWritingToDiskLock) {
3087333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                            writeToFile(mcr);
3088333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                        }
3089333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                        synchronized (SharedPreferencesImpl.this) {
3090333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                            mDiskWritesInFlight--;
3091333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                        }
3092333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                        if (postWriteRunnable != null) {
3093333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                            postWriteRunnable.run();
3094333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                        }
3095333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                    }
3096333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                };
3097333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick
3098333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            final boolean isFromSyncCommit = (postWriteRunnable == null);
3099333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick
3100333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            // Typical #commit() path with fewer allocations, doing a write on
3101333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            // the current thread.
3102333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            if (isFromSyncCommit) {
3103333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                boolean wasEmpty = false;
3104333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                synchronized (SharedPreferencesImpl.this) {
3105333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                    wasEmpty = mDiskWritesInFlight == 1;
3106333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                }
3107333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                if (wasEmpty) {
3108333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                    writeToDiskRunnable.run();
3109333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                    return;
3110333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                }
3111333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            }
3112333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick
3113333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            QueuedWork.singleThreadExecutor().execute(writeToDiskRunnable);
31149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31155f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
3116333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick        private static FileOutputStream createFileOutputStream(File file) {
31179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            FileOutputStream str = null;
31189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
31199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str = new FileOutputStream(file);
31209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (FileNotFoundException e) {
31219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                File parent = file.getParentFile();
31229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!parent.mkdir()) {
31239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.e(TAG, "Couldn't create directory for SharedPreferences file " + file);
31249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
31259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
31269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                FileUtils.setPermissions(
31279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    parent.getPath(),
31289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
31299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    -1, -1);
31309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
31319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    str = new FileOutputStream(file);
31329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (FileNotFoundException e2) {
31339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.e(TAG, "Couldn't create SharedPreferences file " + file, e2);
31349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
31359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return str;
31379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3139333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick        // Note: must hold mWritingToDiskLock
3140333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick        private void writeToFile(MemoryCommitResult mcr) {
31419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Rename the current file so it may be used as a backup during the next read
31429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mFile.exists()) {
3143333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                if (!mcr.changesMade) {
314467fed01522ad26c850b20d2c960e4d392dc401d1Brad Fitzpatrick                    // If the file already exists, but no changes were
314567fed01522ad26c850b20d2c960e4d392dc401d1Brad Fitzpatrick                    // made to the underlying map, it's wasteful to
314667fed01522ad26c850b20d2c960e4d392dc401d1Brad Fitzpatrick                    // re-write the file.  Return as if we wrote it
314767fed01522ad26c850b20d2c960e4d392dc401d1Brad Fitzpatrick                    // out.
3148333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                    mcr.setDiskWriteResult(true);
3149333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                    return;
315067fed01522ad26c850b20d2c960e4d392dc401d1Brad Fitzpatrick                }
31511afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                if (!mBackupFile.exists()) {
31521afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                    if (!mFile.renameTo(mBackupFile)) {
31531afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                        Log.e(TAG, "Couldn't rename file " + mFile
31541afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                                + " to backup file " + mBackupFile);
3155333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                        mcr.setDiskWriteResult(false);
3156333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                        return;
31571afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                    }
31581afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                } else {
31591afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                    mFile.delete();
31609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
31619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31625f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
31639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Attempt to write the file, delete the backup and return true as atomically as
31649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // possible.  If any exception occurs, delete the new file; next time we will restore
31659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // from the backup.
31669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
31679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                FileOutputStream str = createFileOutputStream(mFile);
31689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str == null) {
3169333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                    mcr.setDiskWriteResult(false);
3170333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                    return;
31719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3172333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                XmlUtils.writeMapXml(mcr.mapToWriteToDisk, str);
31738bdf5935c0db4a66ab33a10b43398d2523cfa15dDianne Hackborn                FileUtils.sync(str);
31749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str.close();
31759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                setFilePermissionsFromMode(mFile.getPath(), mMode, 0);
3176333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                FileStatus stat = new FileStatus();
3177333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                if (FileUtils.getFileStatus(mFile.getPath(), stat)) {
3178333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                    synchronized (this) {
31799acdeb99c5102f89a9a73eb4d62e38e7ac86e01cBrad Fitzpatrick                        mStatTimestamp = stat.mtime;
31809acdeb99c5102f89a9a73eb4d62e38e7ac86e01cBrad Fitzpatrick                        mStatSize = stat.size;
3181333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                    }
31829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
318351bf077883df4f5cc816fbfec6d19eedffc26d70Dianne Hackborn                // Writing was successful, delete the backup file if there is one.
318451bf077883df4f5cc816fbfec6d19eedffc26d70Dianne Hackborn                mBackupFile.delete();
3185333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                mcr.setDiskWriteResult(true);
3186333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                return;
31879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (XmlPullParserException e) {
3188333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                Log.w(TAG, "writeToFile: Got exception:", e);
31899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (IOException e) {
3190333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick                Log.w(TAG, "writeToFile: Got exception:", e);
31919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Clean up an unsuccessfully written file
31939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mFile.exists()) {
31949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!mFile.delete()) {
31959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.e(TAG, "Couldn't clean up partially-written file " + mFile);
31969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
31979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3198333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            mcr.setDiskWriteResult(false);
31999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3202