ContextImpl.java revision 6ae8d1821822296df0606c9cd1c46708cc21cb58
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
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.BroadcastReceiver;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentResolver;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContextWrapper;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IContentProvider;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IntentFilter;
291ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.content.IIntentReceiver;
301ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.content.IntentSender;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ReceiverCallNotAllowedException;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ServiceConnection;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.SharedPreferences;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ApplicationInfo;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.IPackageManager;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.AssetManager;
385be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackbornimport android.content.res.CompatibilityInfo;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources;
4074f170f9468d3cf6d7d0ef453320141a3e63571bVasu Noriimport android.database.DatabaseErrorHandler;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.sqlite.SQLiteDatabase;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.sqlite.SQLiteDatabase.CursorFactory;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Bitmap;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable;
45b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodimport android.hardware.ISerialManager;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.hardware.SensorManager;
47b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodimport android.hardware.SerialManager;
4825157e458d6e10b027d1ba6b78b0487156c9f57aJeff Brownimport android.hardware.SystemSensorManager;
49ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brownimport android.hardware.input.IInputManager;
509df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brownimport android.hardware.input.InputManager;
51c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodimport android.hardware.usb.IUsbManager;
52c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodimport android.hardware.usb.UsbManager;
53a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.location.CountryDetector;
54a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.location.ICountryDetector;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.location.ILocationManager;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.location.LocationManager;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.AudioManager;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.ConnectivityManager;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.IConnectivityManager;
601a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkeyimport android.net.INetworkPolicyManager;
611a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkeyimport android.net.NetworkPolicyManager;
62c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriffimport android.net.ThrottleManager;
63c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriffimport android.net.IThrottleManager;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri;
657d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.net.nsd.INsdManager;
667d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.net.nsd.NsdManager;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.wifi.IWifiManager;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.wifi.WifiManager;
6955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.net.wifi.p2p.IWifiP2pManager;
7055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.net.wifi.p2p.WifiP2pManager;
7150b4d8f643f31b37e9872f562fb869059cf79c8aNick Pellyimport android.nfc.NfcManager;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle;
74f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnorimport android.os.DropBoxManager;
75539d3c475f44b1499499a8b70375a192545cf113Oscar Montemayorimport android.os.Environment;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.FileUtils;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IPowerManager;
8075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.Looper;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.PowerManager;
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process;
8375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.RemoteException;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager;
85742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport android.os.UserId;
86c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brownimport android.os.SystemVibrator;
87b104340496e3a531e26c8f428c808eca0e039f50San Mehatimport android.os.storage.StorageManager;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.TelephonyManager;
899f53119b72e6da865bcd53173d3dacd1eba01aeeDianne Hackbornimport android.content.ClipboardManager;
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AndroidRuntimeException;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ContextThemeWrapper;
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManagerImpl;
9475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.view.accessibility.AccessibilityManager;
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.InputMethodManager;
96988323c57bd25a58f05dfa492d9b9c8ab62c5153satokimport android.view.textservice.TextServicesManager;
97603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintanaimport android.accounts.AccountManager;
98603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintanaimport android.accounts.IAccountManager;
9987bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackbornimport android.app.admin.DevicePolicyManager;
100f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnorimport com.android.internal.os.IDropBoxManagerService;
101952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream;
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileNotFoundException;
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream;
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream;
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap;
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass ReceiverRestrictedContext extends ContextWrapper {
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ReceiverRestrictedContext(Context base) {
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(base);
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return registerReceiver(receiver, filter, null, null);
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String broadcastPermission, Handler scheduler) {
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new ReceiverCallNotAllowedException(
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "IntentReceiver components are not allowed to register to receive intents");
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //ex.fillInStackTrace();
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //Log.e("IntentReceiver", ex.getMessage(), ex);
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //return mContext.registerReceiver(receiver, filter, broadcastPermission,
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //        scheduler);
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean bindService(Intent service, ServiceConnection conn, int flags) {
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new ReceiverCallNotAllowedException(
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "IntentReceiver components are not allowed to bind to services");
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //ex.fillInStackTrace();
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //Log.e("IntentReceiver", ex.getMessage(), ex);
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //return mContext.bindService(service, interfaceName, conn, flags);
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
1432155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn * Common implementation of Context API, which provides the base
1442155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn * context object for Activity and other application components.
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
1462155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackbornclass ContextImpl extends Context {
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static String TAG = "ApplicationContext";
148569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima    private final static boolean DEBUG = false;
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
150333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick    private static final HashMap<String, SharedPreferencesImpl> sSharedPrefs =
151333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            new HashMap<String, SharedPreferencesImpl>();
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15301e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn    /*package*/ LoadedApk mPackageInfo;
1546c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn    private String mBasePackageName;
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Resources mResources;
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ ActivityThread mMainThread;
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Context mOuterContext;
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IBinder mActivityToken = null;
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ApplicationContentResolver mContentResolver;
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mThemeResource = 0;
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Resources.Theme mTheme = null;
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private PackageManager mPackageManager;
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Context mReceiverRestrictedContext = null;
164870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy    private boolean mRestricted;
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Object mSync = new Object();
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File mDatabasesDir;
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File mPreferencesDir;
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File mFilesDir;
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File mCacheDir;
172805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn    private File mObbDir;
173e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    private File mExternalFilesDir;
174e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    private File mExternalCacheDir;
1755f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String[] EMPTY_FILE_LIST = {};
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
178224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    /**
179224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick     * Override this class when the system service constructor needs a
180224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick     * ContextImpl.  Else, use StaticServiceFetcher below.
181224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick     */
182224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    /*package*/ static class ServiceFetcher {
183224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        int mContextCacheIndex = -1;
184224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
185224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        /**
186224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick         * Main entrypoint; only override if you don't need caching.
187224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick         */
188224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        public Object getService(ContextImpl ctx) {
189224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            ArrayList<Object> cache = ctx.mServiceCache;
190224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            Object service;
191224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            synchronized (cache) {
192224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                if (cache.size() == 0) {
193224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // Initialize the cache vector on first access.
194224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // At this point sNextPerContextServiceCacheIndex
195224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // is the number of potential services that are
196224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // cached per-Context.
197224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    for (int i = 0; i < sNextPerContextServiceCacheIndex; i++) {
198224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        cache.add(null);
199224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    }
200224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                } else {
201224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    service = cache.get(mContextCacheIndex);
202224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    if (service != null) {
203224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        return service;
204224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    }
205224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }
206224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                service = createService(ctx);
207224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                cache.set(mContextCacheIndex, service);
208224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                return service;
209224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            }
210224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        }
211224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
212224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        /**
213224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick         * Override this to create a new per-Context instance of the
214224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick         * service.  getService() will handle locking and caching.
215224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick         */
216224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        public Object createService(ContextImpl ctx) {
217224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            throw new RuntimeException("Not implemented");
218224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        }
219224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    }
220224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
221224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    /**
222224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick     * Override this class for services to be cached process-wide.
223224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick     */
224224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    abstract static class StaticServiceFetcher extends ServiceFetcher {
225224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        private Object mCachedInstance;
226224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
227224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        @Override
228224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        public final Object getService(ContextImpl unused) {
229224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            synchronized (StaticServiceFetcher.this) {
230224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                Object service = mCachedInstance;
231224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                if (service != null) {
232224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return service;
233224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }
234224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                return mCachedInstance = createStaticService();
235224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            }
236224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        }
237224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
238224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        public abstract Object createStaticService();
239224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    }
240224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
241224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    private static final HashMap<String, ServiceFetcher> SYSTEM_SERVICE_MAP =
242224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            new HashMap<String, ServiceFetcher>();
243224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
244224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    private static int sNextPerContextServiceCacheIndex = 0;
245224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    private static void registerService(String serviceName, ServiceFetcher fetcher) {
246224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        if (!(fetcher instanceof StaticServiceFetcher)) {
247224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            fetcher.mContextCacheIndex = sNextPerContextServiceCacheIndex++;
248224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        }
249224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        SYSTEM_SERVICE_MAP.put(serviceName, fetcher);
250224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    }
251224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
252224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // This one's defined separately and given a variable name so it
253224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // can be re-used by getWallpaperManager(), avoiding a HashMap
254224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // lookup.
255224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    private static ServiceFetcher WALLPAPER_FETCHER = new ServiceFetcher() {
256224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            public Object createService(ContextImpl ctx) {
257224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                return new WallpaperManager(ctx.getOuterContext(),
258224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        ctx.mMainThread.getHandler());
259224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            }};
260224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
261224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    static {
262224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(ACCESSIBILITY_SERVICE, new ServiceFetcher() {
263224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object getService(ContextImpl ctx) {
264224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return AccessibilityManager.getInstance(ctx);
265224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
266224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
267224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(ACCOUNT_SERVICE, new ServiceFetcher() {
268224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
269224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(ACCOUNT_SERVICE);
270224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IAccountManager service = IAccountManager.Stub.asInterface(b);
271224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new AccountManager(ctx, service);
272224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
273224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
274224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(ACTIVITY_SERVICE, new ServiceFetcher() {
275224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
276224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new ActivityManager(ctx.getOuterContext(), ctx.mMainThread.getHandler());
277224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
278224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
279224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(ALARM_SERVICE, new StaticServiceFetcher() {
280224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createStaticService() {
281224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(ALARM_SERVICE);
282224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IAlarmManager service = IAlarmManager.Stub.asInterface(b);
283224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new AlarmManager(service);
284224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
285224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
286224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(AUDIO_SERVICE, new ServiceFetcher() {
287224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
288224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new AudioManager(ctx);
289224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
290224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
291224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(CLIPBOARD_SERVICE, new ServiceFetcher() {
292224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
293224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new ClipboardManager(ctx.getOuterContext(),
294224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                            ctx.mMainThread.getHandler());
295224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
296224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
297224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(CONNECTIVITY_SERVICE, new StaticServiceFetcher() {
298224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createStaticService() {
299224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(CONNECTIVITY_SERVICE);
300224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new ConnectivityManager(IConnectivityManager.Stub.asInterface(b));
301224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
302224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
303224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(COUNTRY_DETECTOR, new StaticServiceFetcher() {
304224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createStaticService() {
305224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(COUNTRY_DETECTOR);
306224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new CountryDetector(ICountryDetector.Stub.asInterface(b));
307224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
308224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
309224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(DEVICE_POLICY_SERVICE, new ServiceFetcher() {
310224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
311224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return DevicePolicyManager.create(ctx, ctx.mMainThread.getHandler());
312224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
313224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
314224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(DOWNLOAD_SERVICE, new ServiceFetcher() {
315224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
316224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new DownloadManager(ctx.getContentResolver(), ctx.getPackageName());
317224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
318224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
319d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly        registerService(NFC_SERVICE, new ServiceFetcher() {
320d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly                public Object createService(ContextImpl ctx) {
321d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly                    return new NfcManager(ctx);
322d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly                }});
323d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly
324224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(DROPBOX_SERVICE, new StaticServiceFetcher() {
325224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createStaticService() {
326224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return createDropBoxManager();
327224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
328224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
3299f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        registerService(INPUT_SERVICE, new StaticServiceFetcher() {
3309f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown                public Object createStaticService() {
3319f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown                    return InputManager.getInstance();
332ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown                }});
3339df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown
334224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(INPUT_METHOD_SERVICE, new ServiceFetcher() {
335224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
336224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return InputMethodManager.getInstance(ctx);
337224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
338224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
339988323c57bd25a58f05dfa492d9b9c8ab62c5153satok        registerService(TEXT_SERVICES_MANAGER_SERVICE, new ServiceFetcher() {
340988323c57bd25a58f05dfa492d9b9c8ab62c5153satok                public Object createService(ContextImpl ctx) {
341988323c57bd25a58f05dfa492d9b9c8ab62c5153satok                    return TextServicesManager.getInstance();
342988323c57bd25a58f05dfa492d9b9c8ab62c5153satok                }});
343988323c57bd25a58f05dfa492d9b9c8ab62c5153satok
344224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(KEYGUARD_SERVICE, new ServiceFetcher() {
345224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object getService(ContextImpl ctx) {
346224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // TODO: why isn't this caching it?  It wasn't
347224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // before, so I'm preserving the old behavior and
348224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // using getService(), instead of createService()
349224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // which would do the caching.
350224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new KeyguardManager();
351224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
352224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
353224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(LAYOUT_INFLATER_SERVICE, new ServiceFetcher() {
354224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
355224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return PolicyManager.makeNewLayoutInflater(ctx.getOuterContext());
356224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
357224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
358224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(LOCATION_SERVICE, new StaticServiceFetcher() {
359224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createStaticService() {
360224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(LOCATION_SERVICE);
361224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new LocationManager(ILocationManager.Stub.asInterface(b));
362224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
363224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
3641a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey        registerService(NETWORK_POLICY_SERVICE, new ServiceFetcher() {
3651a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey            @Override
3661a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey            public Object createService(ContextImpl ctx) {
3671a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey                return new NetworkPolicyManager(INetworkPolicyManager.Stub.asInterface(
3681a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey                        ServiceManager.getService(NETWORK_POLICY_SERVICE)));
3691a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey            }
3701a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey        });
3711a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey
372224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(NOTIFICATION_SERVICE, new ServiceFetcher() {
373224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
374224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    final Context outerContext = ctx.getOuterContext();
375224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new NotificationManager(
376224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        new ContextThemeWrapper(outerContext,
377d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn                                Resources.selectSystemTheme(0,
378d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn                                        outerContext.getApplicationInfo().targetSdkVersion,
379d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn                                        com.android.internal.R.style.Theme_Dialog,
3806e90a362bc66cc67b1beae27b21d3f0148403b08Adam Powell                                        com.android.internal.R.style.Theme_Holo_Dialog,
3816e90a362bc66cc67b1beae27b21d3f0148403b08Adam Powell                                        com.android.internal.R.style.Theme_DeviceDefault_Dialog)),
382224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        ctx.mMainThread.getHandler());
383224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
384224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
3857d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        registerService(NSD_SERVICE, new ServiceFetcher() {
3867d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                @Override
3877d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                public Object createService(ContextImpl ctx) {
3887d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                    IBinder b = ServiceManager.getService(NSD_SERVICE);
3897d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                    INsdManager service = INsdManager.Stub.asInterface(b);
39022af38c5261d2c03796b496e6edb125327cace16Irfan Sheriff                    return new NsdManager(ctx.getOuterContext(), service);
3917d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                }});
3927d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
393224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        // Note: this was previously cached in a static variable, but
394224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        // constructed using mMainThread.getHandler(), so converting
395224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        // it to be a regular Context-cached service...
396224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(POWER_SERVICE, new ServiceFetcher() {
397224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
398224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(POWER_SERVICE);
399224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IPowerManager service = IPowerManager.Stub.asInterface(b);
400224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new PowerManager(service, ctx.mMainThread.getHandler());
401224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
402224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
403224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(SEARCH_SERVICE, new ServiceFetcher() {
404224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
405224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new SearchManager(ctx.getOuterContext(),
406224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                            ctx.mMainThread.getHandler());
407224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
408224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
409224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(SENSOR_SERVICE, new ServiceFetcher() {
410224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
41125157e458d6e10b027d1ba6b78b0487156c9f57aJeff Brown                    return new SystemSensorManager(ctx.mMainThread.getHandler().getLooper());
412224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
413224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
414224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(STATUS_BAR_SERVICE, new ServiceFetcher() {
415224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
416224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new StatusBarManager(ctx.getOuterContext());
417224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
418224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
419224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(STORAGE_SERVICE, new ServiceFetcher() {
420224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
421224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    try {
422224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        return new StorageManager(ctx.mMainThread.getHandler().getLooper());
423224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    } catch (RemoteException rex) {
424224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        Log.e(TAG, "Failed to create StorageManager", rex);
425224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        return null;
426224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    }
427224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
428224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
429224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(TELEPHONY_SERVICE, new ServiceFetcher() {
430224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
431224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new TelephonyManager(ctx.getOuterContext());
432224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
433224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
434224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(THROTTLE_SERVICE, new StaticServiceFetcher() {
435224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createStaticService() {
436224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(THROTTLE_SERVICE);
437224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new ThrottleManager(IThrottleManager.Stub.asInterface(b));
438224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
439224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
440224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(UI_MODE_SERVICE, new ServiceFetcher() {
441224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
442224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new UiModeManager();
443224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
444224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
4453a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        registerService(USB_SERVICE, new ServiceFetcher() {
4463a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood                public Object createService(ContextImpl ctx) {
447e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood                    IBinder b = ServiceManager.getService(USB_SERVICE);
4483a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood                    return new UsbManager(ctx, IUsbManager.Stub.asInterface(b));
449e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood                }});
450e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
451b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood        registerService(SERIAL_SERVICE, new ServiceFetcher() {
452b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood                public Object createService(ContextImpl ctx) {
453b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood                    IBinder b = ServiceManager.getService(SERIAL_SERVICE);
454b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood                    return new SerialManager(ctx, ISerialManager.Stub.asInterface(b));
455b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood                }});
456b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
457224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(VIBRATOR_SERVICE, new ServiceFetcher() {
458224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
459c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown                    return new SystemVibrator();
460224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
461224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
462224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(WALLPAPER_SERVICE, WALLPAPER_FETCHER);
463224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
464224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(WIFI_SERVICE, new ServiceFetcher() {
465224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
466224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(WIFI_SERVICE);
467224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IWifiManager service = IWifiManager.Stub.asInterface(b);
468224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new WifiManager(service, ctx.mMainThread.getHandler());
469224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
470224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
47155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync        registerService(WIFI_P2P_SERVICE, new ServiceFetcher() {
47255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                public Object createService(ContextImpl ctx) {
47355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                    IBinder b = ServiceManager.getService(WIFI_P2P_SERVICE);
47455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                    IWifiP2pManager service = IWifiP2pManager.Stub.asInterface(b);
47555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                    return new WifiP2pManager(service);
47655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                }});
47755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
478224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(WINDOW_SERVICE, new ServiceFetcher() {
479224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object getService(ContextImpl ctx) {
4805fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                    return WindowManagerImpl.getDefault(ctx.mPackageInfo.mCompatibilityInfo);
481224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
482224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    }
483224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
4845fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    static ContextImpl getImpl(Context context) {
4855fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        Context nextContext;
4865fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        while ((context instanceof ContextWrapper) &&
4875fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                (nextContext=((ContextWrapper)context).getBaseContext()) != null) {
4885fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            context = nextContext;
4895fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        }
4905fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        return (ContextImpl)context;
4915fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    }
4925fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
493224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // The system service cache for the system services that are
494224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // cached per-ContextImpl.  Package-scoped to avoid accessor
495224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // methods.
496224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    final ArrayList<Object> mServiceCache = new ArrayList<Object>();
497224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public AssetManager getAssets() {
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mResources.getAssets();
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Resources getResources() {
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mResources;
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PackageManager getPackageManager() {
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageManager != null) {
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageManager;
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IPackageManager pm = ActivityThread.getPackageManager();
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pm != null) {
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Doesn't matter if we make more than one instance.
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return (mPackageManager = new ApplicationPackageManager(this, pm));
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ContentResolver getContentResolver() {
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mContentResolver;
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Looper getMainLooper() {
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mMainThread.getLooper();
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5325f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Context getApplicationContext() {
535eb9e9ec06167b0caa459f2fb3f3fae094bb8d8f7Christopher Tate        return (mPackageInfo != null) ?
536eb9e9ec06167b0caa459f2fb3f3fae094bb8d8f7Christopher Tate                mPackageInfo.getApplication() : mMainThread.getApplication();
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5385f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setTheme(int resid) {
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mThemeResource = resid;
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5435f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
545247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn    public int getThemeResId() {
546247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn        return mThemeResource;
547247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn    }
548247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn
549247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn    @Override
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Resources.Theme getTheme() {
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mTheme == null) {
552d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn            mThemeResource = Resources.selectDefaultTheme(mThemeResource,
553d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn                    getOuterContext().getApplicationInfo().targetSdkVersion);
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTheme = mResources.newTheme();
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTheme.applyStyle(mThemeResource, true);
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mTheme;
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ClassLoader getClassLoader() {
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPackageInfo != null ?
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPackageInfo.getClassLoader() : ClassLoader.getSystemClassLoader();
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getPackageName() {
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageInfo.getPackageName();
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("Not supported in system context");
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5755c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn    public ApplicationInfo getApplicationInfo() {
5765c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        if (mPackageInfo != null) {
5775c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn            return mPackageInfo.getApplicationInfo();
5785c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        }
5795c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        throw new RuntimeException("Not supported in system context");
5805c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn    }
5815c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn
5825c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn    @Override
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getPackageResourcePath() {
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageInfo.getResDir();
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("Not supported in system context");
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getPackageCodePath() {
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageInfo.getAppDir();
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("Not supported in system context");
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5975f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
59823ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato    public File getSharedPrefsFile(String name) {
59923ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato        return makeFilename(getPreferencesDir(), name + ".xml");
60023ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato    }
60123ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public SharedPreferences getSharedPreferences(String name, int mode) {
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SharedPreferencesImpl sp;
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (sSharedPrefs) {
606333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            sp = sSharedPrefs.get(name);
6076194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            if (sp == null) {
6084cd50b8d76e08d75df1a2e9d4902bcdc880bd1c1Brad Fitzpatrick                File prefsFile = getSharedPrefsFile(name);
6094cd50b8d76e08d75df1a2e9d4902bcdc880bd1c1Brad Fitzpatrick                sp = new SharedPreferencesImpl(prefsFile, mode);
6106194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                sSharedPrefs.put(name, sp);
6116194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                return sp;
6126194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            }
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6144e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick        if ((mode & Context.MODE_MULTI_PROCESS) != 0 ||
6154e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick            getApplicationInfo().targetSdkVersion < android.os.Build.VERSION_CODES.HONEYCOMB) {
6164e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick            // If somebody else (some other process) changed the prefs
6174e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick            // file behind our back, we reload it.  This has been the
6184e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick            // historical (if undocumented) behavior.
6194e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick            sp.startReloadIfChangedUnexpectedly();
6204e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick        }
6216194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick        return sp;
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File getPreferencesDir() {
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mPreferencesDir == null) {
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPreferencesDir = new File(getDataDirFile(), "shared_prefs");
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPreferencesDir;
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public FileInputStream openFileInput(String name)
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws FileNotFoundException {
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File f = makeFilename(getFilesDir(), name);
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new FileInputStream(f);
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public FileOutputStream openFileOutput(String name, int mode)
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws FileNotFoundException {
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean append = (mode&MODE_APPEND) != 0;
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File f = makeFilename(getFilesDir(), name);
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            FileOutputStream fos = new FileOutputStream(f, append);
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setFilePermissionsFromMode(f.getPath(), mode, 0);
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return fos;
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (FileNotFoundException e) {
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File parent = f.getParentFile();
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        parent.mkdir();
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileUtils.setPermissions(
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            parent.getPath(),
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            -1, -1);
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileOutputStream fos = new FileOutputStream(f, append);
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setFilePermissionsFromMode(f.getPath(), mode, 0);
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return fos;
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean deleteFile(String name) {
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File f = makeFilename(getFilesDir(), name);
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return f.delete();
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getFilesDir() {
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mFilesDir == null) {
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mFilesDir = new File(getDataDirFile(), "files");
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mFilesDir.exists()) {
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if(!mFilesDir.mkdirs()) {
6775f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer                    Log.w(TAG, "Unable to create files directory " + mFilesDir.getPath());
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                FileUtils.setPermissions(
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mFilesDir.getPath(),
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        -1, -1);
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mFilesDir;
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6885f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
690e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    public File getExternalFilesDir(String type) {
691e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        synchronized (mSync) {
692e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (mExternalFilesDir == null) {
693e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                mExternalFilesDir = Environment.getExternalStorageAppFilesDirectory(
694e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                        getPackageName());
695e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
696e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (!mExternalFilesDir.exists()) {
697e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                try {
698e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    (new File(Environment.getExternalStorageAndroidDataDir(),
699e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                            ".nomedia")).createNewFile();
700e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                } catch (IOException e) {
701e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
702e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                if (!mExternalFilesDir.mkdirs()) {
703e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    Log.w(TAG, "Unable to create external files directory");
704e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    return null;
705e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
706e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
707e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (type == null) {
708e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                return mExternalFilesDir;
709e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
710e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            File dir = new File(mExternalFilesDir, type);
711e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (!dir.exists()) {
712e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                if (!dir.mkdirs()) {
713e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    Log.w(TAG, "Unable to create external media directory " + dir);
714e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    return null;
715e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
716e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
717e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            return dir;
718e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        }
719e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    }
7205f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
721e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    @Override
722805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn    public File getObbDir() {
723805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn        synchronized (mSync) {
724805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn            if (mObbDir == null) {
725805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn                mObbDir = Environment.getExternalStorageAppObbDirectory(
726805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn                        getPackageName());
727805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn            }
728805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn            return mObbDir;
729805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn        }
730805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn    }
731805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn
732805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn    @Override
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getCacheDir() {
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mCacheDir == null) {
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCacheDir = new File(getDataDirFile(), "cache");
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mCacheDir.exists()) {
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if(!mCacheDir.mkdirs()) {
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Unable to create cache directory");
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                FileUtils.setPermissions(
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mCacheDir.getPath(),
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        -1, -1);
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCacheDir;
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7515f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
752e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    @Override
753e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    public File getExternalCacheDir() {
754e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        synchronized (mSync) {
755e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (mExternalCacheDir == null) {
756e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                mExternalCacheDir = Environment.getExternalStorageAppCacheDirectory(
757e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                        getPackageName());
758e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
759e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (!mExternalCacheDir.exists()) {
760e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                try {
761e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    (new File(Environment.getExternalStorageAndroidDataDir(),
762e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                            ".nomedia")).createNewFile();
763e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                } catch (IOException e) {
764e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
765e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                if (!mExternalCacheDir.mkdirs()) {
766e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    Log.w(TAG, "Unable to create external cache directory");
767e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    return null;
768e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
769e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
770e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            return mExternalCacheDir;
771e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        }
772e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    }
7735f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getFileStreamPath(String name) {
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return makeFilename(getFilesDir(), name);
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String[] fileList() {
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String[] list = getFilesDir().list();
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (list != null) ? list : EMPTY_FILE_LIST;
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory) {
78747847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown        return openOrCreateDatabase(name, mode, factory, null);
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
79174f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori    public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory,
79274f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori            DatabaseErrorHandler errorHandler) {
79374f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori        File f = validateFilePath(name, true);
79447847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown        int flags = SQLiteDatabase.CREATE_IF_NECESSARY;
79547847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown        if ((mode & MODE_ENABLE_WRITE_AHEAD_LOGGING) != 0) {
79647847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown            flags |= SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING;
79747847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown        }
79847847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown        SQLiteDatabase db = SQLiteDatabase.openDatabase(f.getPath(), factory, flags, errorHandler);
79974f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori        setFilePermissionsFromMode(f.getPath(), mode, 0);
80074f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori        return db;
80174f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori    }
80274f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori
80374f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori    @Override
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean deleteDatabase(String name) {
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
806a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            File f = validateFilePath(name, false);
80779087e4b967d8af26c488c41b8c1a087a12da84dJeff Brown            return SQLiteDatabase.deleteDatabase(f);
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getDatabasePath(String name) {
815a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        return validateFilePath(name, false);
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String[] databaseList() {
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String[] list = getDatabasesDir().list();
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (list != null) ? list : EMPTY_FILE_LIST;
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8245f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File getDatabasesDir() {
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mDatabasesDir == null) {
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDatabasesDir = new File(getDataDirFile(), "databases");
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mDatabasesDir.getPath().equals("databases")) {
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDatabasesDir = new File("/data/system");
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mDatabasesDir;
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8365f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Drawable getWallpaper() {
8394c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        return getWallpaperManager().getDrawable();
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8438cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn    public Drawable peekWallpaper() {
8444c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        return getWallpaperManager().peekDrawable();
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getWallpaperDesiredMinimumWidth() {
8498cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        return getWallpaperManager().getDesiredMinimumWidth();
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getWallpaperDesiredMinimumHeight() {
8548cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        return getWallpaperManager().getDesiredMinimumHeight();
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setWallpaper(Bitmap bitmap) throws IOException  {
8594c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        getWallpaperManager().setBitmap(bitmap);
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setWallpaper(InputStream data) throws IOException {
8644c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        getWallpaperManager().setStream(data);
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void clearWallpaper() throws IOException {
8698cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        getWallpaperManager().clear();
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startActivity(Intent intent) {
874a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        startActivity(intent, null);
875a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    }
876a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn
877a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    @Override
878a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    public void startActivity(Intent intent, Bundle options) {
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new AndroidRuntimeException(
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Calling startActivity() from outside of an Activity "
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " context requires the FLAG_ACTIVITY_NEW_TASK flag."
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " Is this really what you want?");
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread.getInstrumentation().execStartActivity(
8866e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            getOuterContext(), mMainThread.getApplicationThread(), null,
887a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            (Activity)null, intent, -1, options);
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
891621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    public void startActivities(Intent[] intents) {
892a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        startActivities(intents, null);
893a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    }
894a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn
895a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    @Override
896a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    public void startActivities(Intent[] intents, Bundle options) {
897621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if ((intents[0].getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
898621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            throw new AndroidRuntimeException(
899621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    "Calling startActivities() from outside of an Activity "
900621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    + " context requires the FLAG_ACTIVITY_NEW_TASK flag on first Intent."
901621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    + " Is this really what you want?");
902621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
903621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        mMainThread.getInstrumentation().execStartActivities(
904621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            getOuterContext(), mMainThread.getApplicationThread(), null,
905a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            (Activity)null, intents, options);
906621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    }
907621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
908621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    @Override
909fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    public void startIntentSender(IntentSender intent,
910fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
911fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            throws IntentSender.SendIntentException {
912a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        startIntentSender(intent, fillInIntent, flagsMask, flagsValues, extraFlags, null);
913a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    }
914a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn
915a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    @Override
916a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    public void startIntentSender(IntentSender intent, Intent fillInIntent,
917a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            int flagsMask, int flagsValues, int extraFlags, Bundle options)
918a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            throws IntentSender.SendIntentException {
919fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn        try {
920fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            String resolvedType = null;
921fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            if (fillInIntent != null) {
9229ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn                fillInIntent.setAllowFds(false);
923fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                resolvedType = fillInIntent.resolveTypeIfNeeded(getContentResolver());
924fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            }
925fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            int result = ActivityManagerNative.getDefault()
926fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                .startActivityIntentSender(mMainThread.getApplicationThread(), intent,
927fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                        fillInIntent, resolvedType, null, null,
928a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                        0, flagsMask, flagsValues, options);
929a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            if (result == ActivityManager.START_CANCELED) {
930fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                throw new IntentSender.SendIntentException();
931fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            }
932fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            Instrumentation.checkStartActivityResult(result, null);
933fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn        } catch (RemoteException e) {
934fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn        }
935fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    }
9365f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
937fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    @Override
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendBroadcast(Intent intent) {
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
9419ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            intent.setAllowFds(false);
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, null,
944742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                Activity.RESULT_OK, null, null, null, false, false,
945742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                Binder.getOrigCallingUser());
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
95067cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani    /** @hide */
95167cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani    @Override
95267cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani    public void sendBroadcast(Intent intent, int userId) {
95367cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
95467cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani        try {
95567cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani            intent.setAllowFds(false);
95667cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani            ActivityManagerNative.getDefault().broadcastIntent(mMainThread.getApplicationThread(),
95767cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani                    intent, resolvedType, null, Activity.RESULT_OK, null, null, null, false, false,
95867cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani                    userId);
95967cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani        } catch (RemoteException e) {
96067cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani        }
96167cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani    }
96267cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendBroadcast(Intent intent, String receiverPermission) {
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
9679ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            intent.setAllowFds(false);
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, null,
970742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                Activity.RESULT_OK, null, null, receiverPermission, false, false,
971742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                Binder.getOrigCallingUser());
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendOrderedBroadcast(Intent intent,
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String receiverPermission) {
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
9819ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            intent.setAllowFds(false);
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, null,
984742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                Activity.RESULT_OK, null, null, receiverPermission, true, false,
985742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                Binder.getOrigCallingUser());
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendOrderedBroadcast(Intent intent,
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String receiverPermission, BroadcastReceiver resultReceiver,
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Handler scheduler, int initialCode, String initialData,
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Bundle initialExtras) {
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IIntentReceiver rd = null;
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resultReceiver != null) {
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mPackageInfo != null) {
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (scheduler == null) {
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scheduler = mMainThread.getHandler();
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                rd = mPackageInfo.getReceiverDispatcher(
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    resultReceiver, getOuterContext(), scheduler,
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getInstrumentation(), false);
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (scheduler == null) {
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scheduler = mMainThread.getHandler();
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
100801e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn                rd = new LoadedApk.ReceiverDispatcher(
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver();
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
10149ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            intent.setAllowFds(false);
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, rd,
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                initialCode, initialData, initialExtras, receiverPermission,
1018742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                true, false, Binder.getOrigCallingUser());
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendStickyBroadcast(Intent intent) {
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
10279ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            intent.setAllowFds(false);
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, null,
1030742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                Activity.RESULT_OK, null, null, null, false, true,
1031742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                Binder.getOrigCallingUser());
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1037efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn    public void sendStickyOrderedBroadcast(Intent intent,
1038efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            BroadcastReceiver resultReceiver,
1039efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            Handler scheduler, int initialCode, String initialData,
1040efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            Bundle initialExtras) {
1041efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        IIntentReceiver rd = null;
1042efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        if (resultReceiver != null) {
1043efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            if (mPackageInfo != null) {
1044efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                if (scheduler == null) {
1045efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                    scheduler = mMainThread.getHandler();
1046efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                }
1047efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                rd = mPackageInfo.getReceiverDispatcher(
1048efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                    resultReceiver, getOuterContext(), scheduler,
1049efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                    mMainThread.getInstrumentation(), false);
1050efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            } else {
1051efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                if (scheduler == null) {
1052efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                    scheduler = mMainThread.getHandler();
1053efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                }
105401e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn                rd = new LoadedApk.ReceiverDispatcher(
1055efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                        resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver();
1056efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            }
1057efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        }
1058efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1059efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        try {
10609ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            intent.setAllowFds(false);
1061efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            ActivityManagerNative.getDefault().broadcastIntent(
1062efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                mMainThread.getApplicationThread(), intent, resolvedType, rd,
1063efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                initialCode, initialData, initialExtras, null,
1064742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                true, true, Binder.getOrigCallingUser());
1065efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        } catch (RemoteException e) {
1066efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        }
1067efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn    }
1068efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn
1069efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn    @Override
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeStickyBroadcast(Intent intent) {
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resolvedType != null) {
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            intent = new Intent(intent);
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            intent.setDataAndType(intent.getData(), resolvedType);
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
10779ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            intent.setAllowFds(false);
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().unbroadcastIntent(
1079742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                    mMainThread.getApplicationThread(), intent, Binder.getOrigCallingUser());
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return registerReceiver(receiver, filter, null, null);
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String broadcastPermission, Handler scheduler) {
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return registerReceiverInternal(receiver, filter, broadcastPermission,
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                scheduler, getOuterContext());
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Intent registerReceiverInternal(BroadcastReceiver receiver,
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IntentFilter filter, String broadcastPermission,
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Handler scheduler, Context context) {
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IIntentReceiver rd = null;
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (receiver != null) {
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mPackageInfo != null && context != null) {
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (scheduler == null) {
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scheduler = mMainThread.getHandler();
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                rd = mPackageInfo.getReceiverDispatcher(
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    receiver, context, scheduler,
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getInstrumentation(), true);
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (scheduler == null) {
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scheduler = mMainThread.getHandler();
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
111201e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn                rd = new LoadedApk.ReceiverDispatcher(
1113399cccb85749e02f6d3e12d1d2846310e7cbfdf1Dianne Hackborn                        receiver, context, scheduler, null, true).getIIntentReceiver();
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().registerReceiver(
11186c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn                    mMainThread.getApplicationThread(), mBasePackageName,
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    rd, filter, broadcastPermission);
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void unregisterReceiver(BroadcastReceiver receiver) {
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IIntentReceiver rd = mPackageInfo.forgetReceiverDispatcher(
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getOuterContext(), receiver);
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityManagerNative.getDefault().unregisterReceiver(rd);
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("Not supported in system context");
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ComponentName startService(Intent service) {
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
11429ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            service.setAllowFds(false);
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ComponentName cn = ActivityManagerNative.getDefault().startService(
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), service,
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                service.resolveTypeIfNeeded(getContentResolver()));
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (cn != null && cn.getPackageName().equals("!")) {
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SecurityException(
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Not allowed to start service " + service
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " without permission " + cn.getClassName());
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return cn;
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean stopService(Intent service) {
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
11609ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            service.setAllowFds(false);
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int res = ActivityManagerNative.getDefault().stopService(
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), service,
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                service.resolveTypeIfNeeded(getContentResolver()));
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (res < 0) {
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SecurityException(
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Not allowed to stop service " + service);
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return res != 0;
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean bindService(Intent service, ServiceConnection conn,
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) {
117737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        return bindService(service, conn, flags, UserId.getUserId(Process.myUid()));
117837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    }
117937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
118037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    /** @hide */
118137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    @Override
118237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    public boolean bindService(Intent service, ServiceConnection conn, int flags, int userId) {
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IServiceConnection sd;
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sd = mPackageInfo.getServiceDispatcher(conn, getOuterContext(),
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getHandler(), flags);
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("Not supported in system context");
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1191c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            IBinder token = getActivityToken();
1192c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            if (token == null && (flags&BIND_AUTO_CREATE) == 0 && mPackageInfo != null
1193c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                    && mPackageInfo.getApplicationInfo().targetSdkVersion
1194c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                    < android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
1195c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                flags |= BIND_WAIVE_PRIORITY;
1196c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
11979ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            service.setAllowFds(false);
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int res = ActivityManagerNative.getDefault().bindService(
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), getActivityToken(),
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                service, service.resolveTypeIfNeeded(getContentResolver()),
120137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                sd, flags, userId);
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (res < 0) {
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SecurityException(
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Not allowed to bind to service " + service);
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return res != 0;
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void unbindService(ServiceConnection conn) {
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IServiceConnection sd = mPackageInfo.forgetServiceDispatcher(
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getOuterContext(), conn);
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityManagerNative.getDefault().unbindService(sd);
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("Not supported in system context");
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean startInstrumentation(ComponentName className,
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String profileFile, Bundle arguments) {
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
12309ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            if (arguments != null) {
12319ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn                arguments.setAllowFds(false);
12329ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            }
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().startInstrumentation(
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    className, profileFile, 0, arguments, null);
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // System has crashed, nothing we can do.
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Object getSystemService(String name) {
1243224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name);
1244224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        return fetcher == null ? null : fetcher.getService(this);
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12478cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn    private WallpaperManager getWallpaperManager() {
1248224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        return (WallpaperManager) WALLPAPER_FETCHER.getService(this);
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1251438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    /* package */ static DropBoxManager createDropBoxManager() {
1252438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        IBinder b = ServiceManager.getService(DROPBOX_SERVICE);
1253438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        IDropBoxManagerService service = IDropBoxManagerService.Stub.asInterface(b);
1254ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick        if (service == null) {
1255ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            // Don't return a DropBoxManager that will NPE upon use.
1256ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            // This also avoids caching a broken DropBoxManager in
1257ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            // getDropBoxManager during early boot, before the
1258ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            // DROPBOX_SERVICE is registered.
1259ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            return null;
1260ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick        }
1261438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        return new DropBoxManager(service);
1262438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    }
1263438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkPermission(String permission, int pid, int uid) {
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (permission == null) {
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException("permission is null");
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().checkPermission(
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    permission, pid, uid);
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PackageManager.PERMISSION_DENIED;
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkCallingPermission(String permission) {
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (permission == null) {
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException("permission is null");
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pid = Binder.getCallingPid();
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pid != Process.myPid()) {
1286742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            return checkPermission(permission, pid, Binder.getCallingUid());
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return PackageManager.PERMISSION_DENIED;
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkCallingOrSelfPermission(String permission) {
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (permission == null) {
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException("permission is null");
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return checkPermission(permission, Binder.getCallingPid(),
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid());
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void enforce(
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String permission, int resultOfCheck,
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean selfToo, int uid, String message) {
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resultOfCheck != PackageManager.PERMISSION_GRANTED) {
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SecurityException(
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (message != null ? (message + ": ") : "") +
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (selfToo
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     ? "Neither user " + uid + " nor current process has "
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     : "User " + uid + " does not have ") +
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    permission +
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ".");
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforcePermission(
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String permission, int pid, int uid, String message) {
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforce(permission,
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                checkPermission(permission, pid, uid),
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false,
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                uid,
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                message);
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingPermission(String permission, String message) {
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforce(permission,
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                checkCallingPermission(permission),
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false,
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid(),
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                message);
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingOrSelfPermission(
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String permission, String message) {
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforce(permission,
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                checkCallingOrSelfPermission(permission),
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                true,
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid(),
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                message);
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void grantUriPermission(String toPackage, Uri uri, int modeFlags) {
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         try {
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().grantUriPermission(
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getApplicationThread(), toPackage, uri,
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    modeFlags);
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void revokeUriPermission(Uri uri, int modeFlags) {
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         try {
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().revokeUriPermission(
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getApplicationThread(), uri,
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    modeFlags);
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkUriPermission(Uri uri, int pid, int uid, int modeFlags) {
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().checkUriPermission(
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uri, pid, uid, modeFlags);
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PackageManager.PERMISSION_DENIED;
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkCallingUriPermission(Uri uri, int modeFlags) {
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pid = Binder.getCallingPid();
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pid != Process.myPid()) {
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return checkUriPermission(uri, pid,
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Binder.getCallingUid(), modeFlags);
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return PackageManager.PERMISSION_DENIED;
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkCallingOrSelfUriPermission(Uri uri, int modeFlags) {
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return checkUriPermission(uri, Binder.getCallingPid(),
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid(), modeFlags);
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkUriPermission(Uri uri, String readPermission,
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String writePermission, int pid, int uid, int modeFlags) {
1390569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima        if (DEBUG) {
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.i("foo", "checkUriPermission: uri=" + uri + "readPermission="
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + readPermission + " writePermission=" + writePermission
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " pid=" + pid + " uid=" + uid + " mode" + modeFlags);
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((modeFlags&Intent.FLAG_GRANT_READ_URI_PERMISSION) != 0) {
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (readPermission == null
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    || checkPermission(readPermission, pid, uid)
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    == PackageManager.PERMISSION_GRANTED) {
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return PackageManager.PERMISSION_GRANTED;
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((modeFlags&Intent.FLAG_GRANT_WRITE_URI_PERMISSION) != 0) {
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (writePermission == null
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    || checkPermission(writePermission, pid, uid)
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    == PackageManager.PERMISSION_GRANTED) {
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return PackageManager.PERMISSION_GRANTED;
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return uri != null ? checkUriPermission(uri, pid, uid, modeFlags)
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                : PackageManager.PERMISSION_DENIED;
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String uriModeFlagToString(int uriModeFlags) {
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (uriModeFlags) {
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Intent.FLAG_GRANT_READ_URI_PERMISSION |
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Intent.FLAG_GRANT_WRITE_URI_PERMISSION:
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "read and write";
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Intent.FLAG_GRANT_READ_URI_PERMISSION:
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "read";
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Intent.FLAG_GRANT_WRITE_URI_PERMISSION:
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "write";
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new IllegalArgumentException(
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "Unknown permission mode flags: " + uriModeFlags);
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void enforceForUri(
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int modeFlags, int resultOfCheck, boolean selfToo,
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int uid, Uri uri, String message) {
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resultOfCheck != PackageManager.PERMISSION_GRANTED) {
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SecurityException(
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (message != null ? (message + ": ") : "") +
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (selfToo
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     ? "Neither user " + uid + " nor current process has "
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     : "User " + uid + " does not have ") +
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uriModeFlagToString(modeFlags) +
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    " permission on " +
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uri +
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ".");
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceUriPermission(
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri uri, int pid, int uid, int modeFlags, String message) {
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceForUri(
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                modeFlags, checkUriPermission(uri, pid, uid, modeFlags),
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false, uid, uri, message);
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingUriPermission(
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri uri, int modeFlags, String message) {
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceForUri(
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                modeFlags, checkCallingUriPermission(uri, modeFlags),
1454742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                false,
1455742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                Binder.getCallingUid(), uri, message);
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingOrSelfUriPermission(
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri uri, int modeFlags, String message) {
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceForUri(
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                modeFlags,
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                checkCallingOrSelfUriPermission(uri, modeFlags), true,
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid(), uri, message);
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceUriPermission(
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri uri, String readPermission, String writePermission,
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int pid, int uid, int modeFlags, String message) {
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceForUri(modeFlags,
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      checkUriPermission(
14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                              uri, readPermission, writePermission, pid, uid,
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                              modeFlags),
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      false,
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      uid,
14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      uri,
14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      message);
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Context createPackageContext(String packageName, int flags)
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws PackageManager.NameNotFoundException {
14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (packageName.equals("system") || packageName.equals("android")) {
1483816e4f758302aaf3b115b5914d48732ed78af946Jeff Sharkey            final ContextImpl context = new ContextImpl(mMainThread.getSystemContext());
1484816e4f758302aaf3b115b5914d48732ed78af946Jeff Sharkey            context.mBasePackageName = mBasePackageName;
1485816e4f758302aaf3b115b5914d48732ed78af946Jeff Sharkey            return context;
14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
148801e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn        LoadedApk pi =
1489e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            mMainThread.getPackageInfo(packageName, mResources.getCompatibilityInfo(), flags);
14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pi != null) {
14912155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn            ContextImpl c = new ContextImpl();
1492870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy            c.mRestricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED;
14936c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn            c.init(pi, null, mMainThread, mResources, mBasePackageName);
14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (c.mResources != null) {
14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return c;
14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Should be a better exception.
15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new PackageManager.NameNotFoundException(
15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "Application package " + packageName + " not found");
15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1504870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy    @Override
1505870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy    public boolean isRestricted() {
1506870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy        return mRestricted;
1507870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy    }
1508870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File getDataDirFile() {
15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageInfo.getDataDirFile();
15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("Not supported in system context");
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getDir(String name, int mode) {
15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        name = "app_" + name;
15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File file = makeFilename(getDataDirFile(), name);
15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!file.exists()) {
15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            file.mkdir();
15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setFilePermissionsFromMode(file.getPath(), mode,
15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH);
15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return file;
15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15282155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn    static ContextImpl createSystemContext(ActivityThread mainThread) {
15292155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn        ContextImpl context = new ContextImpl();
15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        context.init(Resources.getSystem(), mainThread);
15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return context;
15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15342155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn    ContextImpl() {
15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOuterContext = this;
15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new ApplicationContext from an existing one.  The new one
15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * works and operates the same as the one it is copying.
15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context Existing application context.
15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15442155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn    public ContextImpl(ContextImpl context) {
15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPackageInfo = context.mPackageInfo;
15466c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn        mBasePackageName = context.mBasePackageName;
15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResources = context.mResources;
15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread = context.mMainThread;
15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContentResolver = context.mContentResolver;
15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOuterContext = this;
15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
155301e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn    final void init(LoadedApk packageInfo,
15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IBinder activityToken, ActivityThread mainThread) {
15556c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn        init(packageInfo, activityToken, mainThread, null, null);
1556ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima    }
1557ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima
155801e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn    final void init(LoadedApk packageInfo,
1559ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima                IBinder activityToken, ActivityThread mainThread,
15606c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn                Resources container, String basePackageName) {
15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPackageInfo = packageInfo;
15626c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn        mBasePackageName = basePackageName != null ? basePackageName : packageInfo.mPackageName;
15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResources = mPackageInfo.getResources(mainThread);
1564ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima
1565559a78753165f20d5973b958791056154baecc43Dianne Hackborn        if (mResources != null && container != null
1566559a78753165f20d5973b958791056154baecc43Dianne Hackborn                && container.getCompatibilityInfo().applicationScale !=
1567559a78753165f20d5973b958791056154baecc43Dianne Hackborn                        mResources.getCompatibilityInfo().applicationScale) {
1568ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima            if (DEBUG) {
1569ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima                Log.d(TAG, "loaded context has different scaling. Using container's" +
1570ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima                        " compatiblity info:" + container.getDisplayMetrics());
1571ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima            }
1572ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima            mResources = mainThread.getTopLevelResources(
1573e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                    mPackageInfo.getResDir(), container.getCompatibilityInfo());
1574ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima        }
15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread = mainThread;
15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContentResolver = new ApplicationContentResolver(this, mainThread);
15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setActivityToken(activityToken);
15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void init(Resources resources, ActivityThread mainThread) {
15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPackageInfo = null;
15836c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn        mBasePackageName = null;
15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResources = resources;
15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread = mainThread;
15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContentResolver = new ApplicationContentResolver(this, mainThread);
15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void scheduleFinalCleanup(String who, String what) {
15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread.scheduleContextCleanup(this, who, what);
15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performFinalCleanup(String who, String what) {
15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //Log.i(TAG, "Cleanup up context: " + this);
15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPackageInfo.removeContextRegistrations(getOuterContext(), who, what);
15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Context getReceiverRestrictedContext() {
15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mReceiverRestrictedContext != null) {
16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mReceiverRestrictedContext;
16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mReceiverRestrictedContext = new ReceiverRestrictedContext(getOuterContext());
16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void setActivityToken(IBinder token) {
16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mActivityToken = token;
16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16085f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void setOuterContext(Context context) {
16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOuterContext = context;
16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16125f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Context getOuterContext() {
16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mOuterContext;
16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16165f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final IBinder getActivityToken() {
16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mActivityToken;
16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1621d3da44032084b6dd280487280553dcdbd7933e3eBrad Fitzpatrick    static void setFilePermissionsFromMode(String name, int mode,
16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int extraPermissions) {
16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int perms = FileUtils.S_IRUSR|FileUtils.S_IWUSR
16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            |FileUtils.S_IRGRP|FileUtils.S_IWGRP
16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            |extraPermissions;
16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mode&MODE_WORLD_READABLE) != 0) {
16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            perms |= FileUtils.S_IROTH;
16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mode&MODE_WORLD_WRITEABLE) != 0) {
16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            perms |= FileUtils.S_IWOTH;
16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1632569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima        if (DEBUG) {
16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.i(TAG, "File " + name + ": mode=0x" + Integer.toHexString(mode)
16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                  + ", perms=0x" + Integer.toHexString(perms));
16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileUtils.setPermissions(name, perms, -1, -1);
16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1639a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor    private File validateFilePath(String name, boolean createDirectory) {
1640a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        File dir;
1641a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        File f;
1642a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor
1643a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        if (name.charAt(0) == File.separatorChar) {
1644a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            String dirPath = name.substring(0, name.lastIndexOf(File.separatorChar));
1645a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            dir = new File(dirPath);
1646a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            name = name.substring(name.lastIndexOf(File.separatorChar));
1647a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            f = new File(dir, name);
1648a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        } else {
1649a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            dir = getDatabasesDir();
1650a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            f = makeFilename(dir, name);
1651a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        }
1652a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor
1653a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        if (createDirectory && !dir.isDirectory() && dir.mkdir()) {
1654a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            FileUtils.setPermissions(dir.getPath(),
1655a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor                FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
1656a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor                -1, -1);
1657a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        }
1658a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor
1659a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        return f;
1660a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor    }
1661a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor
16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File makeFilename(File base, String name) {
16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (name.indexOf(File.separatorChar) < 0) {
16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new File(base, name);
16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new IllegalArgumentException(
1667a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor                "File " + name + " contains a path separator");
16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final class ApplicationContentResolver extends ContentResolver {
1675cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        public ApplicationContentResolver(Context context, ActivityThread mainThread) {
16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(context);
16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMainThread = mainThread;
16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1681cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        protected IContentProvider acquireProvider(Context context, String name) {
16826ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn            return mMainThread.acquireProvider(context, name, true);
16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1686cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        protected IContentProvider acquireExistingProvider(Context context, String name) {
16876ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn            return mMainThread.acquireExistingProvider(context, name, true);
1688cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        }
1689cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn
1690cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        @Override
1691cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        public boolean releaseProvider(IContentProvider provider) {
16926ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn            return mMainThread.releaseProvider(provider, true);
16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16945f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
1695652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn        @Override
1696652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn        protected IContentProvider acquireUnstableProvider(Context c, String name) {
16976ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn            return mMainThread.acquireProvider(c, name, false);
1698652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn        }
1699652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn
1700652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn        @Override
1701652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn        public boolean releaseUnstableProvider(IContentProvider icp) {
17026ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn            return mMainThread.releaseProvider(icp, false);
17036ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        }
17046ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn
17056ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        @Override
17066ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        public void unstableProviderDied(IContentProvider icp) {
17076ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn            mMainThread.handleUnstableProviderDied(icp.asBinder(), true);
1708652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn        }
1709652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn
17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final ActivityThread mMainThread;
17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1713