ContextImpl.java revision 8264408f5995534f8e3147b001664ea0df52aaa5
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;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
211abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganeshimport android.bluetooth.BluetoothAdapter;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.BroadcastReceiver;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentResolver;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContextWrapper;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IContentProvider;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IntentFilter;
301ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.content.IIntentReceiver;
311ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.content.IntentSender;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ReceiverCallNotAllowedException;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ServiceConnection;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.SharedPreferences;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ApplicationInfo;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.IPackageManager;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.AssetManager;
395be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackbornimport android.content.res.CompatibilityInfo;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources;
4174f170f9468d3cf6d7d0ef453320141a3e63571bVasu Noriimport android.database.DatabaseErrorHandler;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.sqlite.SQLiteDatabase;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.sqlite.SQLiteDatabase.CursorFactory;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Bitmap;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable;
46b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodimport android.hardware.ISerialManager;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.hardware.SensorManager;
48b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodimport android.hardware.SerialManager;
4925157e458d6e10b027d1ba6b78b0487156c9f57aJeff Brownimport android.hardware.SystemSensorManager;
50fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport android.hardware.display.DisplayManager;
51ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brownimport android.hardware.input.IInputManager;
529df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brownimport android.hardware.input.InputManager;
53c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodimport android.hardware.usb.IUsbManager;
54c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodimport android.hardware.usb.UsbManager;
55a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.location.CountryDetector;
56a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.location.ICountryDetector;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.location.ILocationManager;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.location.LocationManager;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.AudioManager;
60b58b8f832d06b0ffa8886eba5a4916578a3b8743Dianne Hackbornimport android.media.MediaRouter;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.ConnectivityManager;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.IConnectivityManager;
631a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkeyimport android.net.INetworkPolicyManager;
641a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkeyimport android.net.NetworkPolicyManager;
65c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriffimport android.net.ThrottleManager;
66c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriffimport android.net.IThrottleManager;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri;
687d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.net.nsd.INsdManager;
697d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.net.nsd.NsdManager;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.wifi.IWifiManager;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.wifi.WifiManager;
7255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.net.wifi.p2p.IWifiP2pManager;
7355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.net.wifi.p2p.WifiP2pManager;
7450b4d8f643f31b37e9872f562fb869059cf79c8aNick Pellyimport android.nfc.NfcManager;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle;
77f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnorimport android.os.DropBoxManager;
78539d3c475f44b1499499a8b70375a192545cf113Oscar Montemayorimport android.os.Environment;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.FileUtils;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IPowerManager;
8375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.Looper;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.PowerManager;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process;
8675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.RemoteException;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager;
88742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport android.os.UserId;
89c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brownimport android.os.SystemVibrator;
90b104340496e3a531e26c8f428c808eca0e039f50San Mehatimport android.os.storage.StorageManager;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.TelephonyManager;
929f53119b72e6da865bcd53173d3dacd1eba01aeeDianne Hackbornimport android.content.ClipboardManager;
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AndroidRuntimeException;
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ContextThemeWrapper;
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManagerImpl;
9775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.view.accessibility.AccessibilityManager;
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.InputMethodManager;
99988323c57bd25a58f05dfa492d9b9c8ab62c5153satokimport android.view.textservice.TextServicesManager;
100603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintanaimport android.accounts.AccountManager;
101603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintanaimport android.accounts.IAccountManager;
10287bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackbornimport android.app.admin.DevicePolicyManager;
103f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnorimport com.android.internal.os.IDropBoxManagerService;
104952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream;
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileNotFoundException;
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream;
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass ReceiverRestrictedContext extends ContextWrapper {
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ReceiverRestrictedContext(Context base) {
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(base);
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return registerReceiver(receiver, filter, null, null);
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String broadcastPermission, Handler scheduler) {
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new ReceiverCallNotAllowedException(
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "IntentReceiver components are not allowed to register to receive intents");
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //ex.fillInStackTrace();
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //Log.e("IntentReceiver", ex.getMessage(), ex);
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //return mContext.registerReceiver(receiver, filter, broadcastPermission,
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //        scheduler);
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean bindService(Intent service, ServiceConnection conn, int flags) {
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new ReceiverCallNotAllowedException(
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "IntentReceiver components are not allowed to bind to services");
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //ex.fillInStackTrace();
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //Log.e("IntentReceiver", ex.getMessage(), ex);
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //return mContext.bindService(service, interfaceName, conn, flags);
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
1462155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn * Common implementation of Context API, which provides the base
1472155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn * context object for Activity and other application components.
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
1492155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackbornclass ContextImpl extends Context {
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static String TAG = "ApplicationContext";
151569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima    private final static boolean DEBUG = false;
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
153333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick    private static final HashMap<String, SharedPreferencesImpl> sSharedPrefs =
154333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            new HashMap<String, SharedPreferencesImpl>();
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15601e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn    /*package*/ LoadedApk mPackageInfo;
1576c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn    private String mBasePackageName;
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Resources mResources;
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ ActivityThread mMainThread;
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Context mOuterContext;
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IBinder mActivityToken = null;
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ApplicationContentResolver mContentResolver;
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mThemeResource = 0;
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Resources.Theme mTheme = null;
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private PackageManager mPackageManager;
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Context mReceiverRestrictedContext = null;
167870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy    private boolean mRestricted;
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Object mSync = new Object();
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File mDatabasesDir;
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File mPreferencesDir;
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File mFilesDir;
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File mCacheDir;
175805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn    private File mObbDir;
176e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    private File mExternalFilesDir;
177e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    private File mExternalCacheDir;
1785f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String[] EMPTY_FILE_LIST = {};
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
181224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    /**
182224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick     * Override this class when the system service constructor needs a
183224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick     * ContextImpl.  Else, use StaticServiceFetcher below.
184224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick     */
185224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    /*package*/ static class ServiceFetcher {
186224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        int mContextCacheIndex = -1;
187224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
188224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        /**
189224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick         * Main entrypoint; only override if you don't need caching.
190224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick         */
191224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        public Object getService(ContextImpl ctx) {
192224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            ArrayList<Object> cache = ctx.mServiceCache;
193224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            Object service;
194224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            synchronized (cache) {
195224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                if (cache.size() == 0) {
196224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // Initialize the cache vector on first access.
197224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // At this point sNextPerContextServiceCacheIndex
198224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // is the number of potential services that are
199224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // cached per-Context.
200224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    for (int i = 0; i < sNextPerContextServiceCacheIndex; i++) {
201224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        cache.add(null);
202224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    }
203224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                } else {
204224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    service = cache.get(mContextCacheIndex);
205224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    if (service != null) {
206224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        return service;
207224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    }
208224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }
209224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                service = createService(ctx);
210224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                cache.set(mContextCacheIndex, service);
211224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                return service;
212224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            }
213224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        }
214224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
215224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        /**
216224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick         * Override this to create a new per-Context instance of the
217224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick         * service.  getService() will handle locking and caching.
218224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick         */
219224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        public Object createService(ContextImpl ctx) {
220224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            throw new RuntimeException("Not implemented");
221224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        }
222224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    }
223224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
224224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    /**
225224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick     * Override this class for services to be cached process-wide.
226224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick     */
227224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    abstract static class StaticServiceFetcher extends ServiceFetcher {
228224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        private Object mCachedInstance;
229224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
230224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        @Override
231224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        public final Object getService(ContextImpl unused) {
232224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            synchronized (StaticServiceFetcher.this) {
233224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                Object service = mCachedInstance;
234224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                if (service != null) {
235224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return service;
236224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }
237224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                return mCachedInstance = createStaticService();
238224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            }
239224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        }
240224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
241224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        public abstract Object createStaticService();
242224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    }
243224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
244224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    private static final HashMap<String, ServiceFetcher> SYSTEM_SERVICE_MAP =
245224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            new HashMap<String, ServiceFetcher>();
246224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
247224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    private static int sNextPerContextServiceCacheIndex = 0;
248224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    private static void registerService(String serviceName, ServiceFetcher fetcher) {
249224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        if (!(fetcher instanceof StaticServiceFetcher)) {
250224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            fetcher.mContextCacheIndex = sNextPerContextServiceCacheIndex++;
251224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        }
252224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        SYSTEM_SERVICE_MAP.put(serviceName, fetcher);
253224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    }
254224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
255224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // This one's defined separately and given a variable name so it
256224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // can be re-used by getWallpaperManager(), avoiding a HashMap
257224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // lookup.
258224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    private static ServiceFetcher WALLPAPER_FETCHER = new ServiceFetcher() {
259224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            public Object createService(ContextImpl ctx) {
260224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                return new WallpaperManager(ctx.getOuterContext(),
261224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        ctx.mMainThread.getHandler());
262224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            }};
263224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
264224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    static {
265224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(ACCESSIBILITY_SERVICE, new ServiceFetcher() {
266224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object getService(ContextImpl ctx) {
267224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return AccessibilityManager.getInstance(ctx);
268224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
269224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
270224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(ACCOUNT_SERVICE, new ServiceFetcher() {
271224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
272224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(ACCOUNT_SERVICE);
273224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IAccountManager service = IAccountManager.Stub.asInterface(b);
274224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new AccountManager(ctx, service);
275224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
276224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
277224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(ACTIVITY_SERVICE, new ServiceFetcher() {
278224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
279224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new ActivityManager(ctx.getOuterContext(), ctx.mMainThread.getHandler());
280224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
281224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
282224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(ALARM_SERVICE, new StaticServiceFetcher() {
283224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createStaticService() {
284224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(ALARM_SERVICE);
285224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IAlarmManager service = IAlarmManager.Stub.asInterface(b);
286224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new AlarmManager(service);
287224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
288224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
289224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(AUDIO_SERVICE, new ServiceFetcher() {
290224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
291224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new AudioManager(ctx);
292224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
293224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
294b58b8f832d06b0ffa8886eba5a4916578a3b8743Dianne Hackborn        registerService(MEDIA_ROUTER_SERVICE, new ServiceFetcher() {
295b58b8f832d06b0ffa8886eba5a4916578a3b8743Dianne Hackborn                public Object createService(ContextImpl ctx) {
296b58b8f832d06b0ffa8886eba5a4916578a3b8743Dianne Hackborn                    return new MediaRouter(ctx);
297b58b8f832d06b0ffa8886eba5a4916578a3b8743Dianne Hackborn                }});
298b58b8f832d06b0ffa8886eba5a4916578a3b8743Dianne Hackborn
2991abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh        registerService(BLUETOOTH_SERVICE, new ServiceFetcher() {
3001abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh                public Object createService(ContextImpl ctx) {
3011abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh                    return BluetoothAdapter.getDefaultAdapter();
3021abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh                }});
3031abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh
304224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(CLIPBOARD_SERVICE, new ServiceFetcher() {
305224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
306224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new ClipboardManager(ctx.getOuterContext(),
307224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                            ctx.mMainThread.getHandler());
308224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
309224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
310224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(CONNECTIVITY_SERVICE, new StaticServiceFetcher() {
311224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createStaticService() {
312224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(CONNECTIVITY_SERVICE);
313224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new ConnectivityManager(IConnectivityManager.Stub.asInterface(b));
314224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
315224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
316224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(COUNTRY_DETECTOR, new StaticServiceFetcher() {
317224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createStaticService() {
318224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(COUNTRY_DETECTOR);
319224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new CountryDetector(ICountryDetector.Stub.asInterface(b));
320224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
321224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
322224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(DEVICE_POLICY_SERVICE, new ServiceFetcher() {
323224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
324224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return DevicePolicyManager.create(ctx, ctx.mMainThread.getHandler());
325224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
326224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
327224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(DOWNLOAD_SERVICE, new ServiceFetcher() {
328224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
329224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new DownloadManager(ctx.getContentResolver(), ctx.getPackageName());
330224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
331224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
332d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly        registerService(NFC_SERVICE, new ServiceFetcher() {
333d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly                public Object createService(ContextImpl ctx) {
334d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly                    return new NfcManager(ctx);
335d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly                }});
336d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly
337224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(DROPBOX_SERVICE, new StaticServiceFetcher() {
338224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createStaticService() {
339224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return createDropBoxManager();
340224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
341224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
3429f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        registerService(INPUT_SERVICE, new StaticServiceFetcher() {
3439f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown                public Object createStaticService() {
3449f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown                    return InputManager.getInstance();
345ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown                }});
3469df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown
347fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        registerService(DISPLAY_SERVICE, new StaticServiceFetcher() {
348fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown            public Object createStaticService() {
349fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown                return DisplayManager.getInstance();
350fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown            }});
351fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
352224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(INPUT_METHOD_SERVICE, new ServiceFetcher() {
353224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
354224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return InputMethodManager.getInstance(ctx);
355224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
356224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
357988323c57bd25a58f05dfa492d9b9c8ab62c5153satok        registerService(TEXT_SERVICES_MANAGER_SERVICE, new ServiceFetcher() {
358988323c57bd25a58f05dfa492d9b9c8ab62c5153satok                public Object createService(ContextImpl ctx) {
359988323c57bd25a58f05dfa492d9b9c8ab62c5153satok                    return TextServicesManager.getInstance();
360988323c57bd25a58f05dfa492d9b9c8ab62c5153satok                }});
361988323c57bd25a58f05dfa492d9b9c8ab62c5153satok
362224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(KEYGUARD_SERVICE, new ServiceFetcher() {
363224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object getService(ContextImpl ctx) {
364224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // TODO: why isn't this caching it?  It wasn't
365224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // before, so I'm preserving the old behavior and
366224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // using getService(), instead of createService()
367224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // which would do the caching.
368224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new KeyguardManager();
369224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
370224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
371224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(LAYOUT_INFLATER_SERVICE, new ServiceFetcher() {
372224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
373224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return PolicyManager.makeNewLayoutInflater(ctx.getOuterContext());
374224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
375224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
376e0fd693c6098f59004f9e96ad75c058e26c337b0Nick Pelly        registerService(LOCATION_SERVICE, new ServiceFetcher() {
377e0fd693c6098f59004f9e96ad75c058e26c337b0Nick Pelly                public Object createService(ContextImpl ctx) {
378224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(LOCATION_SERVICE);
379e0fd693c6098f59004f9e96ad75c058e26c337b0Nick Pelly                    return new LocationManager(ctx, ILocationManager.Stub.asInterface(b));
380224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
381224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
3821a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey        registerService(NETWORK_POLICY_SERVICE, new ServiceFetcher() {
3831a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey            @Override
3841a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey            public Object createService(ContextImpl ctx) {
3851a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey                return new NetworkPolicyManager(INetworkPolicyManager.Stub.asInterface(
3861a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey                        ServiceManager.getService(NETWORK_POLICY_SERVICE)));
3871a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey            }
3881a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey        });
3891a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey
390224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(NOTIFICATION_SERVICE, new ServiceFetcher() {
391224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
392224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    final Context outerContext = ctx.getOuterContext();
393224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new NotificationManager(
394224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        new ContextThemeWrapper(outerContext,
395d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn                                Resources.selectSystemTheme(0,
396d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn                                        outerContext.getApplicationInfo().targetSdkVersion,
397d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn                                        com.android.internal.R.style.Theme_Dialog,
3986e90a362bc66cc67b1beae27b21d3f0148403b08Adam Powell                                        com.android.internal.R.style.Theme_Holo_Dialog,
3996e90a362bc66cc67b1beae27b21d3f0148403b08Adam Powell                                        com.android.internal.R.style.Theme_DeviceDefault_Dialog)),
400224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        ctx.mMainThread.getHandler());
401224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
402224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
4037d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        registerService(NSD_SERVICE, new ServiceFetcher() {
4047d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                @Override
4057d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                public Object createService(ContextImpl ctx) {
4067d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                    IBinder b = ServiceManager.getService(NSD_SERVICE);
4077d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                    INsdManager service = INsdManager.Stub.asInterface(b);
40822af38c5261d2c03796b496e6edb125327cace16Irfan Sheriff                    return new NsdManager(ctx.getOuterContext(), service);
4097d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                }});
4107d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
411224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        // Note: this was previously cached in a static variable, but
412224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        // constructed using mMainThread.getHandler(), so converting
413224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        // it to be a regular Context-cached service...
414224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(POWER_SERVICE, new ServiceFetcher() {
415224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
416224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(POWER_SERVICE);
417224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IPowerManager service = IPowerManager.Stub.asInterface(b);
418224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new PowerManager(service, ctx.mMainThread.getHandler());
419224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
420224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
421224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(SEARCH_SERVICE, new ServiceFetcher() {
422224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
423224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new SearchManager(ctx.getOuterContext(),
424224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                            ctx.mMainThread.getHandler());
425224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
426224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
427224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(SENSOR_SERVICE, new ServiceFetcher() {
428224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
42925157e458d6e10b027d1ba6b78b0487156c9f57aJeff Brown                    return new SystemSensorManager(ctx.mMainThread.getHandler().getLooper());
430224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
431224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
432224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(STATUS_BAR_SERVICE, new ServiceFetcher() {
433224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
434224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new StatusBarManager(ctx.getOuterContext());
435224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
436224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
437224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(STORAGE_SERVICE, new ServiceFetcher() {
438224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
439224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    try {
440224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        return new StorageManager(ctx.mMainThread.getHandler().getLooper());
441224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    } catch (RemoteException rex) {
442224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        Log.e(TAG, "Failed to create StorageManager", rex);
443224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        return null;
444224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    }
445224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
446224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
447224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(TELEPHONY_SERVICE, new ServiceFetcher() {
448224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
449224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new TelephonyManager(ctx.getOuterContext());
450224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
451224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
452224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(THROTTLE_SERVICE, new StaticServiceFetcher() {
453224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createStaticService() {
454224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(THROTTLE_SERVICE);
455224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new ThrottleManager(IThrottleManager.Stub.asInterface(b));
456224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
457224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
458224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(UI_MODE_SERVICE, new ServiceFetcher() {
459224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
460224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new UiModeManager();
461224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
462224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
4633a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        registerService(USB_SERVICE, new ServiceFetcher() {
4643a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood                public Object createService(ContextImpl ctx) {
465e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood                    IBinder b = ServiceManager.getService(USB_SERVICE);
4663a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood                    return new UsbManager(ctx, IUsbManager.Stub.asInterface(b));
467e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood                }});
468e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
469b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood        registerService(SERIAL_SERVICE, new ServiceFetcher() {
470b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood                public Object createService(ContextImpl ctx) {
471b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood                    IBinder b = ServiceManager.getService(SERIAL_SERVICE);
472b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood                    return new SerialManager(ctx, ISerialManager.Stub.asInterface(b));
473b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood                }});
474b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
475224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(VIBRATOR_SERVICE, new ServiceFetcher() {
476224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
477c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown                    return new SystemVibrator();
478224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
479224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
480224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(WALLPAPER_SERVICE, WALLPAPER_FETCHER);
481224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
482224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(WIFI_SERVICE, new ServiceFetcher() {
483224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
484224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(WIFI_SERVICE);
485224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IWifiManager service = IWifiManager.Stub.asInterface(b);
48688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                    return new WifiManager(ctx.getOuterContext(), service);
487224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
488224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
48955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync        registerService(WIFI_P2P_SERVICE, new ServiceFetcher() {
49055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                public Object createService(ContextImpl ctx) {
49155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                    IBinder b = ServiceManager.getService(WIFI_P2P_SERVICE);
49255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                    IWifiP2pManager service = IWifiP2pManager.Stub.asInterface(b);
49355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                    return new WifiP2pManager(service);
49455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                }});
49555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
496224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(WINDOW_SERVICE, new ServiceFetcher() {
497224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object getService(ContextImpl ctx) {
498d32460c5b7bea7b06e345397fdbaca58d9732dcfJeff Brown                    return WindowManagerImpl.getDefault().makeCompatible(
499d32460c5b7bea7b06e345397fdbaca58d9732dcfJeff Brown                            ctx.mPackageInfo.mCompatibilityInfo);
500224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
501224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    }
502224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
5035fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    static ContextImpl getImpl(Context context) {
5045fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        Context nextContext;
5055fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        while ((context instanceof ContextWrapper) &&
5065fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                (nextContext=((ContextWrapper)context).getBaseContext()) != null) {
5075fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            context = nextContext;
5085fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        }
5095fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        return (ContextImpl)context;
5105fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    }
5115fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
512224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // The system service cache for the system services that are
513224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // cached per-ContextImpl.  Package-scoped to avoid accessor
514224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // methods.
515224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    final ArrayList<Object> mServiceCache = new ArrayList<Object>();
516224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public AssetManager getAssets() {
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mResources.getAssets();
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Resources getResources() {
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mResources;
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PackageManager getPackageManager() {
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageManager != null) {
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageManager;
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IPackageManager pm = ActivityThread.getPackageManager();
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pm != null) {
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Doesn't matter if we make more than one instance.
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return (mPackageManager = new ApplicationPackageManager(this, pm));
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ContentResolver getContentResolver() {
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mContentResolver;
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Looper getMainLooper() {
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mMainThread.getLooper();
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5515f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Context getApplicationContext() {
554eb9e9ec06167b0caa459f2fb3f3fae094bb8d8f7Christopher Tate        return (mPackageInfo != null) ?
555eb9e9ec06167b0caa459f2fb3f3fae094bb8d8f7Christopher Tate                mPackageInfo.getApplication() : mMainThread.getApplication();
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5575f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setTheme(int resid) {
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mThemeResource = resid;
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5625f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
564247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn    public int getThemeResId() {
565247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn        return mThemeResource;
566247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn    }
567247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn
568247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn    @Override
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Resources.Theme getTheme() {
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mTheme == null) {
571d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn            mThemeResource = Resources.selectDefaultTheme(mThemeResource,
572d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn                    getOuterContext().getApplicationInfo().targetSdkVersion);
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTheme = mResources.newTheme();
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTheme.applyStyle(mThemeResource, true);
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mTheme;
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ClassLoader getClassLoader() {
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPackageInfo != null ?
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPackageInfo.getClassLoader() : ClassLoader.getSystemClassLoader();
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getPackageName() {
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageInfo.getPackageName();
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("Not supported in system context");
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5945c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn    public ApplicationInfo getApplicationInfo() {
5955c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        if (mPackageInfo != null) {
5965c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn            return mPackageInfo.getApplicationInfo();
5975c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        }
5985c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        throw new RuntimeException("Not supported in system context");
5995c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn    }
6005c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn
6015c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn    @Override
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getPackageResourcePath() {
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageInfo.getResDir();
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("Not supported in system context");
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getPackageCodePath() {
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageInfo.getAppDir();
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("Not supported in system context");
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6165f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
61723ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato    public File getSharedPrefsFile(String name) {
61823ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato        return makeFilename(getPreferencesDir(), name + ".xml");
61923ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato    }
62023ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public SharedPreferences getSharedPreferences(String name, int mode) {
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SharedPreferencesImpl sp;
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (sSharedPrefs) {
625333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            sp = sSharedPrefs.get(name);
6266194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            if (sp == null) {
6274cd50b8d76e08d75df1a2e9d4902bcdc880bd1c1Brad Fitzpatrick                File prefsFile = getSharedPrefsFile(name);
6284cd50b8d76e08d75df1a2e9d4902bcdc880bd1c1Brad Fitzpatrick                sp = new SharedPreferencesImpl(prefsFile, mode);
6296194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                sSharedPrefs.put(name, sp);
6306194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                return sp;
6316194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            }
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6334e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick        if ((mode & Context.MODE_MULTI_PROCESS) != 0 ||
6344e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick            getApplicationInfo().targetSdkVersion < android.os.Build.VERSION_CODES.HONEYCOMB) {
6354e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick            // If somebody else (some other process) changed the prefs
6364e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick            // file behind our back, we reload it.  This has been the
6374e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick            // historical (if undocumented) behavior.
6384e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick            sp.startReloadIfChangedUnexpectedly();
6394e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick        }
6406194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick        return sp;
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File getPreferencesDir() {
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mPreferencesDir == null) {
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPreferencesDir = new File(getDataDirFile(), "shared_prefs");
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPreferencesDir;
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public FileInputStream openFileInput(String name)
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws FileNotFoundException {
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File f = makeFilename(getFilesDir(), name);
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new FileInputStream(f);
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public FileOutputStream openFileOutput(String name, int mode)
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws FileNotFoundException {
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean append = (mode&MODE_APPEND) != 0;
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File f = makeFilename(getFilesDir(), name);
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            FileOutputStream fos = new FileOutputStream(f, append);
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setFilePermissionsFromMode(f.getPath(), mode, 0);
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return fos;
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (FileNotFoundException e) {
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File parent = f.getParentFile();
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        parent.mkdir();
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileUtils.setPermissions(
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            parent.getPath(),
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            -1, -1);
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileOutputStream fos = new FileOutputStream(f, append);
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setFilePermissionsFromMode(f.getPath(), mode, 0);
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return fos;
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean deleteFile(String name) {
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File f = makeFilename(getFilesDir(), name);
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return f.delete();
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getFilesDir() {
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mFilesDir == null) {
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mFilesDir = new File(getDataDirFile(), "files");
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mFilesDir.exists()) {
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if(!mFilesDir.mkdirs()) {
6965f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer                    Log.w(TAG, "Unable to create files directory " + mFilesDir.getPath());
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                FileUtils.setPermissions(
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mFilesDir.getPath(),
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        -1, -1);
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mFilesDir;
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7075f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
709e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    public File getExternalFilesDir(String type) {
710e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        synchronized (mSync) {
711e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (mExternalFilesDir == null) {
712e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                mExternalFilesDir = Environment.getExternalStorageAppFilesDirectory(
713e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                        getPackageName());
714e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
715e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (!mExternalFilesDir.exists()) {
716e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                try {
717e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    (new File(Environment.getExternalStorageAndroidDataDir(),
718e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                            ".nomedia")).createNewFile();
719e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                } catch (IOException e) {
720e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
721e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                if (!mExternalFilesDir.mkdirs()) {
722e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    Log.w(TAG, "Unable to create external files directory");
723e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    return null;
724e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
725e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
726e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (type == null) {
727e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                return mExternalFilesDir;
728e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
729e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            File dir = new File(mExternalFilesDir, type);
730e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (!dir.exists()) {
731e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                if (!dir.mkdirs()) {
732e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    Log.w(TAG, "Unable to create external media directory " + dir);
733e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    return null;
734e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
735e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
736e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            return dir;
737e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        }
738e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    }
7395f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
740e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    @Override
741805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn    public File getObbDir() {
742805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn        synchronized (mSync) {
743805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn            if (mObbDir == null) {
744805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn                mObbDir = Environment.getExternalStorageAppObbDirectory(
745805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn                        getPackageName());
746805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn            }
747805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn            return mObbDir;
748805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn        }
749805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn    }
750805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn
751805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn    @Override
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getCacheDir() {
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mCacheDir == null) {
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCacheDir = new File(getDataDirFile(), "cache");
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mCacheDir.exists()) {
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if(!mCacheDir.mkdirs()) {
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Unable to create cache directory");
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                FileUtils.setPermissions(
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mCacheDir.getPath(),
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        -1, -1);
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCacheDir;
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7705f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
771e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    @Override
772e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    public File getExternalCacheDir() {
773e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        synchronized (mSync) {
774e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (mExternalCacheDir == null) {
775e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                mExternalCacheDir = Environment.getExternalStorageAppCacheDirectory(
776e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                        getPackageName());
777e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
778e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (!mExternalCacheDir.exists()) {
779e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                try {
780e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    (new File(Environment.getExternalStorageAndroidDataDir(),
781e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                            ".nomedia")).createNewFile();
782e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                } catch (IOException e) {
783e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
784e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                if (!mExternalCacheDir.mkdirs()) {
785e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    Log.w(TAG, "Unable to create external cache directory");
786e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    return null;
787e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
788e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
789e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            return mExternalCacheDir;
790e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        }
791e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    }
7925f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getFileStreamPath(String name) {
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return makeFilename(getFilesDir(), name);
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String[] fileList() {
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String[] list = getFilesDir().list();
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (list != null) ? list : EMPTY_FILE_LIST;
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory) {
80647847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown        return openOrCreateDatabase(name, mode, factory, null);
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
81074f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori    public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory,
81174f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori            DatabaseErrorHandler errorHandler) {
81274f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori        File f = validateFilePath(name, true);
81347847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown        int flags = SQLiteDatabase.CREATE_IF_NECESSARY;
81447847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown        if ((mode & MODE_ENABLE_WRITE_AHEAD_LOGGING) != 0) {
81547847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown            flags |= SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING;
81647847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown        }
81747847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown        SQLiteDatabase db = SQLiteDatabase.openDatabase(f.getPath(), factory, flags, errorHandler);
81874f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori        setFilePermissionsFromMode(f.getPath(), mode, 0);
81974f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori        return db;
82074f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori    }
82174f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori
82274f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori    @Override
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean deleteDatabase(String name) {
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
825a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            File f = validateFilePath(name, false);
82679087e4b967d8af26c488c41b8c1a087a12da84dJeff Brown            return SQLiteDatabase.deleteDatabase(f);
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getDatabasePath(String name) {
834a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        return validateFilePath(name, false);
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String[] databaseList() {
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String[] list = getDatabasesDir().list();
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (list != null) ? list : EMPTY_FILE_LIST;
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8435f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File getDatabasesDir() {
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mDatabasesDir == null) {
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDatabasesDir = new File(getDataDirFile(), "databases");
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mDatabasesDir.getPath().equals("databases")) {
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDatabasesDir = new File("/data/system");
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mDatabasesDir;
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8555f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Drawable getWallpaper() {
8584c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        return getWallpaperManager().getDrawable();
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8628cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn    public Drawable peekWallpaper() {
8634c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        return getWallpaperManager().peekDrawable();
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getWallpaperDesiredMinimumWidth() {
8688cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        return getWallpaperManager().getDesiredMinimumWidth();
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getWallpaperDesiredMinimumHeight() {
8738cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        return getWallpaperManager().getDesiredMinimumHeight();
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setWallpaper(Bitmap bitmap) throws IOException  {
8784c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        getWallpaperManager().setBitmap(bitmap);
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setWallpaper(InputStream data) throws IOException {
8834c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        getWallpaperManager().setStream(data);
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void clearWallpaper() throws IOException {
8888cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        getWallpaperManager().clear();
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startActivity(Intent intent) {
893a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        startActivity(intent, null);
894a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    }
895a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn
8968264408f5995534f8e3147b001664ea0df52aaa5Amith Yamasani    /** @hide */
8978264408f5995534f8e3147b001664ea0df52aaa5Amith Yamasani    @Override
8988264408f5995534f8e3147b001664ea0df52aaa5Amith Yamasani    public void startActivityAsUser(Intent intent, int userId) {
8998264408f5995534f8e3147b001664ea0df52aaa5Amith Yamasani        try {
9008264408f5995534f8e3147b001664ea0df52aaa5Amith Yamasani            ActivityManagerNative.getDefault().startActivityAsUser(
9018264408f5995534f8e3147b001664ea0df52aaa5Amith Yamasani                mMainThread.getApplicationThread(), intent,
9028264408f5995534f8e3147b001664ea0df52aaa5Amith Yamasani                intent.resolveTypeIfNeeded(getContentResolver()),
9038264408f5995534f8e3147b001664ea0df52aaa5Amith Yamasani                null, null, 0, Intent.FLAG_ACTIVITY_NEW_TASK, null, null, null, userId);
9048264408f5995534f8e3147b001664ea0df52aaa5Amith Yamasani        } catch (RemoteException re) {
9058264408f5995534f8e3147b001664ea0df52aaa5Amith Yamasani        }
9068264408f5995534f8e3147b001664ea0df52aaa5Amith Yamasani    }
9078264408f5995534f8e3147b001664ea0df52aaa5Amith Yamasani
908a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    @Override
909a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    public void startActivity(Intent intent, Bundle options) {
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new AndroidRuntimeException(
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Calling startActivity() from outside of an Activity "
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " context requires the FLAG_ACTIVITY_NEW_TASK flag."
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " Is this really what you want?");
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread.getInstrumentation().execStartActivity(
9176e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            getOuterContext(), mMainThread.getApplicationThread(), null,
918a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            (Activity)null, intent, -1, options);
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
922621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    public void startActivities(Intent[] intents) {
923a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        startActivities(intents, null);
924a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    }
925a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn
926a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    @Override
927a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    public void startActivities(Intent[] intents, Bundle options) {
928621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if ((intents[0].getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
929621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            throw new AndroidRuntimeException(
930621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    "Calling startActivities() from outside of an Activity "
931621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    + " context requires the FLAG_ACTIVITY_NEW_TASK flag on first Intent."
932621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    + " Is this really what you want?");
933621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
934621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        mMainThread.getInstrumentation().execStartActivities(
935621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            getOuterContext(), mMainThread.getApplicationThread(), null,
936a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            (Activity)null, intents, options);
937621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    }
938621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
939621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    @Override
940fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    public void startIntentSender(IntentSender intent,
941fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
942fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            throws IntentSender.SendIntentException {
943a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        startIntentSender(intent, fillInIntent, flagsMask, flagsValues, extraFlags, null);
944a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    }
945a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn
946a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    @Override
947a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    public void startIntentSender(IntentSender intent, Intent fillInIntent,
948a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            int flagsMask, int flagsValues, int extraFlags, Bundle options)
949a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            throws IntentSender.SendIntentException {
950fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn        try {
951fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            String resolvedType = null;
952fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            if (fillInIntent != null) {
9539ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn                fillInIntent.setAllowFds(false);
954fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                resolvedType = fillInIntent.resolveTypeIfNeeded(getContentResolver());
955fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            }
956fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            int result = ActivityManagerNative.getDefault()
957fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                .startActivityIntentSender(mMainThread.getApplicationThread(), intent,
958fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                        fillInIntent, resolvedType, null, null,
959a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                        0, flagsMask, flagsValues, options);
960a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            if (result == ActivityManager.START_CANCELED) {
961fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                throw new IntentSender.SendIntentException();
962fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            }
963fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            Instrumentation.checkStartActivityResult(result, null);
964fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn        } catch (RemoteException e) {
965fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn        }
966fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    }
9675f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
968fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    @Override
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendBroadcast(Intent intent) {
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
9729ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            intent.setAllowFds(false);
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, null,
975742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                Activity.RESULT_OK, null, null, null, false, false,
976742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                Binder.getOrigCallingUser());
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
98167cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani    @Override
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendBroadcast(Intent intent, String receiverPermission) {
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
9859ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            intent.setAllowFds(false);
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, null,
988742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                Activity.RESULT_OK, null, null, receiverPermission, false, false,
989742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                Binder.getOrigCallingUser());
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendOrderedBroadcast(Intent intent,
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String receiverPermission) {
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
9999ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            intent.setAllowFds(false);
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, null,
1002742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                Activity.RESULT_OK, null, null, receiverPermission, true, false,
1003742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                Binder.getOrigCallingUser());
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendOrderedBroadcast(Intent intent,
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String receiverPermission, BroadcastReceiver resultReceiver,
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Handler scheduler, int initialCode, String initialData,
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Bundle initialExtras) {
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IIntentReceiver rd = null;
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resultReceiver != null) {
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mPackageInfo != null) {
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (scheduler == null) {
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scheduler = mMainThread.getHandler();
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                rd = mPackageInfo.getReceiverDispatcher(
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    resultReceiver, getOuterContext(), scheduler,
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getInstrumentation(), false);
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (scheduler == null) {
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scheduler = mMainThread.getHandler();
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
102601e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn                rd = new LoadedApk.ReceiverDispatcher(
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver();
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
10329ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            intent.setAllowFds(false);
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, rd,
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                initialCode, initialData, initialExtras, receiverPermission,
1036742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                true, false, Binder.getOrigCallingUser());
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10427d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn    public void sendBroadcastToUser(Intent intent, int userHandle) {
10437d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
10447d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        try {
10457d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            intent.setAllowFds(false);
10467d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            ActivityManagerNative.getDefault().broadcastIntent(mMainThread.getApplicationThread(),
10477d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                    intent, resolvedType, null, Activity.RESULT_OK, null, null, null, false, false,
10487d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                    userHandle);
10497d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        } catch (RemoteException e) {
10507d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        }
10517d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn    }
10527d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn
10537d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn    @Override
10547d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn    public void sendOrderedBroadcastToUser(Intent intent, int userHandle,
10557d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            BroadcastReceiver resultReceiver, Handler scheduler,
10567d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            int initialCode, String initialData, Bundle initialExtras) {
10577d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        IIntentReceiver rd = null;
10587d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        if (resultReceiver != null) {
10597d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            if (mPackageInfo != null) {
10607d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                if (scheduler == null) {
10617d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                    scheduler = mMainThread.getHandler();
10627d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                }
10637d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                rd = mPackageInfo.getReceiverDispatcher(
10647d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                    resultReceiver, getOuterContext(), scheduler,
10657d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                    mMainThread.getInstrumentation(), false);
10667d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            } else {
10677d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                if (scheduler == null) {
10687d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                    scheduler = mMainThread.getHandler();
10697d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                }
10707d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                rd = new LoadedApk.ReceiverDispatcher(
10717d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                        resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver();
10727d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            }
10737d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        }
10747d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
10757d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        try {
10767d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            intent.setAllowFds(false);
10777d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            ActivityManagerNative.getDefault().broadcastIntent(
10787d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                mMainThread.getApplicationThread(), intent, resolvedType, rd,
10797d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                initialCode, initialData, initialExtras, null,
10807d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                true, false, userHandle);
10817d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        } catch (RemoteException e) {
10827d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        }
10837d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn    }
10847d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn
10857d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn    @Override
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendStickyBroadcast(Intent intent) {
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
10899ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            intent.setAllowFds(false);
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, null,
1092742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                Activity.RESULT_OK, null, null, null, false, true,
1093742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                Binder.getOrigCallingUser());
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1099efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn    public void sendStickyOrderedBroadcast(Intent intent,
1100efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            BroadcastReceiver resultReceiver,
1101efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            Handler scheduler, int initialCode, String initialData,
1102efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            Bundle initialExtras) {
1103efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        IIntentReceiver rd = null;
1104efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        if (resultReceiver != null) {
1105efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            if (mPackageInfo != null) {
1106efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                if (scheduler == null) {
1107efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                    scheduler = mMainThread.getHandler();
1108efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                }
1109efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                rd = mPackageInfo.getReceiverDispatcher(
1110efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                    resultReceiver, getOuterContext(), scheduler,
1111efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                    mMainThread.getInstrumentation(), false);
1112efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            } else {
1113efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                if (scheduler == null) {
1114efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                    scheduler = mMainThread.getHandler();
1115efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                }
111601e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn                rd = new LoadedApk.ReceiverDispatcher(
1117efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                        resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver();
1118efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            }
1119efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        }
1120efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1121efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        try {
11229ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            intent.setAllowFds(false);
1123efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            ActivityManagerNative.getDefault().broadcastIntent(
1124efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                mMainThread.getApplicationThread(), intent, resolvedType, rd,
1125efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                initialCode, initialData, initialExtras, null,
1126742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                true, true, Binder.getOrigCallingUser());
1127efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        } catch (RemoteException e) {
1128efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        }
1129efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn    }
1130efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn
1131efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn    @Override
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeStickyBroadcast(Intent intent) {
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resolvedType != null) {
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            intent = new Intent(intent);
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            intent.setDataAndType(intent.getData(), resolvedType);
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
11399ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            intent.setAllowFds(false);
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().unbroadcastIntent(
1141742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                    mMainThread.getApplicationThread(), intent, Binder.getOrigCallingUser());
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return registerReceiver(receiver, filter, null, null);
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String broadcastPermission, Handler scheduler) {
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return registerReceiverInternal(receiver, filter, broadcastPermission,
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                scheduler, getOuterContext());
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Intent registerReceiverInternal(BroadcastReceiver receiver,
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IntentFilter filter, String broadcastPermission,
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Handler scheduler, Context context) {
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IIntentReceiver rd = null;
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (receiver != null) {
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mPackageInfo != null && context != null) {
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (scheduler == null) {
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scheduler = mMainThread.getHandler();
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                rd = mPackageInfo.getReceiverDispatcher(
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    receiver, context, scheduler,
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getInstrumentation(), true);
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (scheduler == null) {
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scheduler = mMainThread.getHandler();
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
117401e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn                rd = new LoadedApk.ReceiverDispatcher(
1175399cccb85749e02f6d3e12d1d2846310e7cbfdf1Dianne Hackborn                        receiver, context, scheduler, null, true).getIIntentReceiver();
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().registerReceiver(
11806c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn                    mMainThread.getApplicationThread(), mBasePackageName,
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    rd, filter, broadcastPermission);
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void unregisterReceiver(BroadcastReceiver receiver) {
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IIntentReceiver rd = mPackageInfo.forgetReceiverDispatcher(
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getOuterContext(), receiver);
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityManagerNative.getDefault().unregisterReceiver(rd);
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("Not supported in system context");
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ComponentName startService(Intent service) {
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
12049ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            service.setAllowFds(false);
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ComponentName cn = ActivityManagerNative.getDefault().startService(
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), service,
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                service.resolveTypeIfNeeded(getContentResolver()));
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (cn != null && cn.getPackageName().equals("!")) {
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SecurityException(
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Not allowed to start service " + service
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " without permission " + cn.getClassName());
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return cn;
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean stopService(Intent service) {
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
12229ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            service.setAllowFds(false);
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int res = ActivityManagerNative.getDefault().stopService(
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), service,
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                service.resolveTypeIfNeeded(getContentResolver()));
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (res < 0) {
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SecurityException(
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Not allowed to stop service " + service);
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return res != 0;
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean bindService(Intent service, ServiceConnection conn,
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) {
123937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        return bindService(service, conn, flags, UserId.getUserId(Process.myUid()));
124037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    }
124137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
124237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    /** @hide */
124337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    @Override
12447d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn    public boolean bindService(Intent service, ServiceConnection conn, int flags, int userHandle) {
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IServiceConnection sd;
124679b3317b775810bac088b0998c48eb6506e2578cChristopher Tate        if (conn == null) {
124779b3317b775810bac088b0998c48eb6506e2578cChristopher Tate            throw new IllegalArgumentException("connection is null");
124879b3317b775810bac088b0998c48eb6506e2578cChristopher Tate        }
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sd = mPackageInfo.getServiceDispatcher(conn, getOuterContext(),
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getHandler(), flags);
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("Not supported in system context");
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1256c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            IBinder token = getActivityToken();
1257c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            if (token == null && (flags&BIND_AUTO_CREATE) == 0 && mPackageInfo != null
1258c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                    && mPackageInfo.getApplicationInfo().targetSdkVersion
1259c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                    < android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
1260c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                flags |= BIND_WAIVE_PRIORITY;
1261c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
12629ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            service.setAllowFds(false);
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int res = ActivityManagerNative.getDefault().bindService(
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), getActivityToken(),
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                service, service.resolveTypeIfNeeded(getContentResolver()),
12667d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                sd, flags, userHandle);
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (res < 0) {
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SecurityException(
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Not allowed to bind to service " + service);
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return res != 0;
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void unbindService(ServiceConnection conn) {
127979b3317b775810bac088b0998c48eb6506e2578cChristopher Tate        if (conn == null) {
128079b3317b775810bac088b0998c48eb6506e2578cChristopher Tate            throw new IllegalArgumentException("connection is null");
128179b3317b775810bac088b0998c48eb6506e2578cChristopher Tate        }
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IServiceConnection sd = mPackageInfo.forgetServiceDispatcher(
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getOuterContext(), conn);
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityManagerNative.getDefault().unbindService(sd);
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("Not supported in system context");
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean startInstrumentation(ComponentName className,
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String profileFile, Bundle arguments) {
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
12989ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            if (arguments != null) {
12999ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn                arguments.setAllowFds(false);
13009ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            }
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().startInstrumentation(
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    className, profileFile, 0, arguments, null);
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // System has crashed, nothing we can do.
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Object getSystemService(String name) {
1311224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name);
1312224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        return fetcher == null ? null : fetcher.getService(this);
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13158cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn    private WallpaperManager getWallpaperManager() {
1316224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        return (WallpaperManager) WALLPAPER_FETCHER.getService(this);
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1319438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    /* package */ static DropBoxManager createDropBoxManager() {
1320438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        IBinder b = ServiceManager.getService(DROPBOX_SERVICE);
1321438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        IDropBoxManagerService service = IDropBoxManagerService.Stub.asInterface(b);
1322ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick        if (service == null) {
1323ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            // Don't return a DropBoxManager that will NPE upon use.
1324ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            // This also avoids caching a broken DropBoxManager in
1325ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            // getDropBoxManager during early boot, before the
1326ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            // DROPBOX_SERVICE is registered.
1327ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            return null;
1328ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick        }
1329438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        return new DropBoxManager(service);
1330438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    }
1331438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkPermission(String permission, int pid, int uid) {
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (permission == null) {
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException("permission is null");
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().checkPermission(
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    permission, pid, uid);
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PackageManager.PERMISSION_DENIED;
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkCallingPermission(String permission) {
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (permission == null) {
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException("permission is null");
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pid = Binder.getCallingPid();
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pid != Process.myPid()) {
1354742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            return checkPermission(permission, pid, Binder.getCallingUid());
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return PackageManager.PERMISSION_DENIED;
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkCallingOrSelfPermission(String permission) {
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (permission == null) {
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException("permission is null");
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return checkPermission(permission, Binder.getCallingPid(),
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid());
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void enforce(
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String permission, int resultOfCheck,
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean selfToo, int uid, String message) {
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resultOfCheck != PackageManager.PERMISSION_GRANTED) {
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SecurityException(
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (message != null ? (message + ": ") : "") +
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (selfToo
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     ? "Neither user " + uid + " nor current process has "
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     : "User " + uid + " does not have ") +
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    permission +
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ".");
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforcePermission(
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String permission, int pid, int uid, String message) {
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforce(permission,
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                checkPermission(permission, pid, uid),
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false,
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                uid,
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                message);
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingPermission(String permission, String message) {
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforce(permission,
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                checkCallingPermission(permission),
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false,
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid(),
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                message);
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingOrSelfPermission(
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String permission, String message) {
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforce(permission,
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                checkCallingOrSelfPermission(permission),
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                true,
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid(),
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                message);
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void grantUriPermission(String toPackage, Uri uri, int modeFlags) {
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         try {
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().grantUriPermission(
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getApplicationThread(), toPackage, uri,
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    modeFlags);
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void revokeUriPermission(Uri uri, int modeFlags) {
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         try {
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().revokeUriPermission(
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getApplicationThread(), uri,
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    modeFlags);
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkUriPermission(Uri uri, int pid, int uid, int modeFlags) {
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().checkUriPermission(
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uri, pid, uid, modeFlags);
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PackageManager.PERMISSION_DENIED;
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkCallingUriPermission(Uri uri, int modeFlags) {
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pid = Binder.getCallingPid();
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pid != Process.myPid()) {
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return checkUriPermission(uri, pid,
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Binder.getCallingUid(), modeFlags);
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return PackageManager.PERMISSION_DENIED;
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkCallingOrSelfUriPermission(Uri uri, int modeFlags) {
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return checkUriPermission(uri, Binder.getCallingPid(),
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid(), modeFlags);
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkUriPermission(Uri uri, String readPermission,
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String writePermission, int pid, int uid, int modeFlags) {
1458569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima        if (DEBUG) {
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.i("foo", "checkUriPermission: uri=" + uri + "readPermission="
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + readPermission + " writePermission=" + writePermission
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " pid=" + pid + " uid=" + uid + " mode" + modeFlags);
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((modeFlags&Intent.FLAG_GRANT_READ_URI_PERMISSION) != 0) {
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (readPermission == null
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    || checkPermission(readPermission, pid, uid)
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    == PackageManager.PERMISSION_GRANTED) {
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return PackageManager.PERMISSION_GRANTED;
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((modeFlags&Intent.FLAG_GRANT_WRITE_URI_PERMISSION) != 0) {
14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (writePermission == null
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    || checkPermission(writePermission, pid, uid)
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    == PackageManager.PERMISSION_GRANTED) {
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return PackageManager.PERMISSION_GRANTED;
14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return uri != null ? checkUriPermission(uri, pid, uid, modeFlags)
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                : PackageManager.PERMISSION_DENIED;
14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String uriModeFlagToString(int uriModeFlags) {
14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (uriModeFlags) {
14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Intent.FLAG_GRANT_READ_URI_PERMISSION |
14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Intent.FLAG_GRANT_WRITE_URI_PERMISSION:
14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "read and write";
14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Intent.FLAG_GRANT_READ_URI_PERMISSION:
14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "read";
14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Intent.FLAG_GRANT_WRITE_URI_PERMISSION:
14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "write";
14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new IllegalArgumentException(
14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "Unknown permission mode flags: " + uriModeFlags);
14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void enforceForUri(
14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int modeFlags, int resultOfCheck, boolean selfToo,
14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int uid, Uri uri, String message) {
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resultOfCheck != PackageManager.PERMISSION_GRANTED) {
14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SecurityException(
15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (message != null ? (message + ": ") : "") +
15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (selfToo
15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     ? "Neither user " + uid + " nor current process has "
15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     : "User " + uid + " does not have ") +
15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uriModeFlagToString(modeFlags) +
15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    " permission on " +
15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uri +
15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ".");
15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceUriPermission(
15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri uri, int pid, int uid, int modeFlags, String message) {
15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceForUri(
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                modeFlags, checkUriPermission(uri, pid, uid, modeFlags),
15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false, uid, uri, message);
15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingUriPermission(
15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri uri, int modeFlags, String message) {
15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceForUri(
15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                modeFlags, checkCallingUriPermission(uri, modeFlags),
1522742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                false,
1523742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                Binder.getCallingUid(), uri, message);
15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingOrSelfUriPermission(
15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri uri, int modeFlags, String message) {
15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceForUri(
15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                modeFlags,
15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                checkCallingOrSelfUriPermission(uri, modeFlags), true,
15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid(), uri, message);
15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceUriPermission(
15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri uri, String readPermission, String writePermission,
15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int pid, int uid, int modeFlags, String message) {
15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceForUri(modeFlags,
15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      checkUriPermission(
15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                              uri, readPermission, writePermission, pid, uid,
15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                              modeFlags),
15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      false,
15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      uid,
15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      uri,
15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      message);
15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Context createPackageContext(String packageName, int flags)
15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws PackageManager.NameNotFoundException {
15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (packageName.equals("system") || packageName.equals("android")) {
1551816e4f758302aaf3b115b5914d48732ed78af946Jeff Sharkey            final ContextImpl context = new ContextImpl(mMainThread.getSystemContext());
1552816e4f758302aaf3b115b5914d48732ed78af946Jeff Sharkey            context.mBasePackageName = mBasePackageName;
1553816e4f758302aaf3b115b5914d48732ed78af946Jeff Sharkey            return context;
15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
155601e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn        LoadedApk pi =
1557e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            mMainThread.getPackageInfo(packageName, mResources.getCompatibilityInfo(), flags);
15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pi != null) {
15592155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn            ContextImpl c = new ContextImpl();
1560870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy            c.mRestricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED;
15616c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn            c.init(pi, null, mMainThread, mResources, mBasePackageName);
15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (c.mResources != null) {
15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return c;
15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Should be a better exception.
15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new PackageManager.NameNotFoundException(
15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "Application package " + packageName + " not found");
15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1572870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy    @Override
1573870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy    public boolean isRestricted() {
1574870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy        return mRestricted;
1575870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy    }
1576870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy
15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File getDataDirFile() {
15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageInfo.getDataDirFile();
15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("Not supported in system context");
15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getDir(String name, int mode) {
15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        name = "app_" + name;
15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File file = makeFilename(getDataDirFile(), name);
15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!file.exists()) {
15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            file.mkdir();
15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setFilePermissionsFromMode(file.getPath(), mode,
15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH);
15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return file;
15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15962155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn    static ContextImpl createSystemContext(ActivityThread mainThread) {
15972155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn        ContextImpl context = new ContextImpl();
15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        context.init(Resources.getSystem(), mainThread);
15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return context;
16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16022155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn    ContextImpl() {
16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOuterContext = this;
16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new ApplicationContext from an existing one.  The new one
16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * works and operates the same as the one it is copying.
16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context Existing application context.
16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16122155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn    public ContextImpl(ContextImpl context) {
16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPackageInfo = context.mPackageInfo;
16146c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn        mBasePackageName = context.mBasePackageName;
16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResources = context.mResources;
16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread = context.mMainThread;
16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContentResolver = context.mContentResolver;
16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOuterContext = this;
16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
162101e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn    final void init(LoadedApk packageInfo,
16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IBinder activityToken, ActivityThread mainThread) {
16236c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn        init(packageInfo, activityToken, mainThread, null, null);
1624ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima    }
1625ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima
162601e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn    final void init(LoadedApk packageInfo,
1627ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima                IBinder activityToken, ActivityThread mainThread,
16286c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn                Resources container, String basePackageName) {
16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPackageInfo = packageInfo;
16306c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn        mBasePackageName = basePackageName != null ? basePackageName : packageInfo.mPackageName;
16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResources = mPackageInfo.getResources(mainThread);
1632ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima
1633559a78753165f20d5973b958791056154baecc43Dianne Hackborn        if (mResources != null && container != null
1634559a78753165f20d5973b958791056154baecc43Dianne Hackborn                && container.getCompatibilityInfo().applicationScale !=
1635559a78753165f20d5973b958791056154baecc43Dianne Hackborn                        mResources.getCompatibilityInfo().applicationScale) {
1636ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima            if (DEBUG) {
1637ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima                Log.d(TAG, "loaded context has different scaling. Using container's" +
1638ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima                        " compatiblity info:" + container.getDisplayMetrics());
1639ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima            }
1640ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima            mResources = mainThread.getTopLevelResources(
1641e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                    mPackageInfo.getResDir(), container.getCompatibilityInfo());
1642ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima        }
16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread = mainThread;
16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContentResolver = new ApplicationContentResolver(this, mainThread);
16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setActivityToken(activityToken);
16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void init(Resources resources, ActivityThread mainThread) {
16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPackageInfo = null;
16516c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn        mBasePackageName = null;
16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResources = resources;
16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread = mainThread;
16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContentResolver = new ApplicationContentResolver(this, mainThread);
16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void scheduleFinalCleanup(String who, String what) {
16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread.scheduleContextCleanup(this, who, what);
16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performFinalCleanup(String who, String what) {
16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //Log.i(TAG, "Cleanup up context: " + this);
16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPackageInfo.removeContextRegistrations(getOuterContext(), who, what);
16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Context getReceiverRestrictedContext() {
16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mReceiverRestrictedContext != null) {
16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mReceiverRestrictedContext;
16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mReceiverRestrictedContext = new ReceiverRestrictedContext(getOuterContext());
16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void setActivityToken(IBinder token) {
16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mActivityToken = token;
16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16765f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void setOuterContext(Context context) {
16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOuterContext = context;
16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16805f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Context getOuterContext() {
16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mOuterContext;
16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16845f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final IBinder getActivityToken() {
16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mActivityToken;
16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1689d3da44032084b6dd280487280553dcdbd7933e3eBrad Fitzpatrick    static void setFilePermissionsFromMode(String name, int mode,
16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int extraPermissions) {
16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int perms = FileUtils.S_IRUSR|FileUtils.S_IWUSR
16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            |FileUtils.S_IRGRP|FileUtils.S_IWGRP
16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            |extraPermissions;
16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mode&MODE_WORLD_READABLE) != 0) {
16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            perms |= FileUtils.S_IROTH;
16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mode&MODE_WORLD_WRITEABLE) != 0) {
16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            perms |= FileUtils.S_IWOTH;
16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1700569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima        if (DEBUG) {
17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.i(TAG, "File " + name + ": mode=0x" + Integer.toHexString(mode)
17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                  + ", perms=0x" + Integer.toHexString(perms));
17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileUtils.setPermissions(name, perms, -1, -1);
17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1707a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor    private File validateFilePath(String name, boolean createDirectory) {
1708a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        File dir;
1709a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        File f;
1710a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor
1711a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        if (name.charAt(0) == File.separatorChar) {
1712a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            String dirPath = name.substring(0, name.lastIndexOf(File.separatorChar));
1713a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            dir = new File(dirPath);
1714a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            name = name.substring(name.lastIndexOf(File.separatorChar));
1715a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            f = new File(dir, name);
1716a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        } else {
1717a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            dir = getDatabasesDir();
1718a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            f = makeFilename(dir, name);
1719a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        }
1720a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor
1721a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        if (createDirectory && !dir.isDirectory() && dir.mkdir()) {
1722a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            FileUtils.setPermissions(dir.getPath(),
1723a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor                FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
1724a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor                -1, -1);
1725a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        }
1726a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor
1727a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        return f;
1728a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor    }
1729a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor
17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File makeFilename(File base, String name) {
17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (name.indexOf(File.separatorChar) < 0) {
17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new File(base, name);
17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new IllegalArgumentException(
1735a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor                "File " + name + " contains a path separator");
17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final class ApplicationContentResolver extends ContentResolver {
1743cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        public ApplicationContentResolver(Context context, ActivityThread mainThread) {
17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(context);
17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMainThread = mainThread;
17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1749cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        protected IContentProvider acquireProvider(Context context, String name) {
17506ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn            return mMainThread.acquireProvider(context, name, true);
17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1754cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        protected IContentProvider acquireExistingProvider(Context context, String name) {
17556ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn            return mMainThread.acquireExistingProvider(context, name, true);
1756cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        }
1757cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn
1758cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        @Override
1759cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        public boolean releaseProvider(IContentProvider provider) {
17606ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn            return mMainThread.releaseProvider(provider, true);
17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17625f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
1763652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn        @Override
1764652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn        protected IContentProvider acquireUnstableProvider(Context c, String name) {
17656ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn            return mMainThread.acquireProvider(c, name, false);
1766652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn        }
1767652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn
1768652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn        @Override
1769652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn        public boolean releaseUnstableProvider(IContentProvider icp) {
17706ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn            return mMainThread.releaseProvider(icp, false);
17716ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        }
17726ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn
17736ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        @Override
17746ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        public void unstableProviderDied(IContentProvider icp) {
17756ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn            mMainThread.handleUnstableProviderDied(icp.asBinder(), true);
1776652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn        }
1777652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn
17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final ActivityThread mMainThread;
17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1781