ContextImpl.java revision a4972e951bf2bdb7afdafee95b3ab0c15b8bacae
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;
48c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodimport android.hardware.usb.IUsbManager;
49c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodimport android.hardware.usb.UsbManager;
50a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.location.CountryDetector;
51a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.location.ICountryDetector;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.location.ILocationManager;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.location.LocationManager;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.AudioManager;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.ConnectivityManager;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.IConnectivityManager;
571a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkeyimport android.net.INetworkPolicyManager;
581a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkeyimport android.net.NetworkPolicyManager;
59c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriffimport android.net.ThrottleManager;
60c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriffimport android.net.IThrottleManager;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.wifi.IWifiManager;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.wifi.WifiManager;
6455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.net.wifi.p2p.IWifiP2pManager;
6555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.net.wifi.p2p.WifiP2pManager;
6650b4d8f643f31b37e9872f562fb869059cf79c8aNick Pellyimport android.nfc.NfcManager;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle;
69f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnorimport android.os.DropBoxManager;
70539d3c475f44b1499499a8b70375a192545cf113Oscar Montemayorimport android.os.Environment;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.FileUtils;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IPowerManager;
7575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.Looper;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.PowerManager;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process;
7875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.RemoteException;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager;
80742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport android.os.UserId;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Vibrator;
82b104340496e3a531e26c8f428c808eca0e039f50San Mehatimport android.os.storage.StorageManager;
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.TelephonyManager;
849f53119b72e6da865bcd53173d3dacd1eba01aeeDianne Hackbornimport android.content.ClipboardManager;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AndroidRuntimeException;
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ContextThemeWrapper;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManagerImpl;
8975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.view.accessibility.AccessibilityManager;
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.InputMethodManager;
91988323c57bd25a58f05dfa492d9b9c8ab62c5153satokimport android.view.textservice.TextServicesManager;
92603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintanaimport android.accounts.AccountManager;
93603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintanaimport android.accounts.IAccountManager;
9487bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackbornimport android.app.admin.DevicePolicyManager;
95f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnorimport com.android.internal.os.IDropBoxManagerService;
96952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream;
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileNotFoundException;
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream;
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream;
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap;
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass ReceiverRestrictedContext extends ContextWrapper {
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ReceiverRestrictedContext(Context base) {
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(base);
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return registerReceiver(receiver, filter, null, null);
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            String broadcastPermission, Handler scheduler) {
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new ReceiverCallNotAllowedException(
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "IntentReceiver components are not allowed to register to receive intents");
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //ex.fillInStackTrace();
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //Log.e("IntentReceiver", ex.getMessage(), ex);
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //return mContext.registerReceiver(receiver, filter, broadcastPermission,
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //        scheduler);
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean bindService(Intent service, ServiceConnection conn, int flags) {
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new ReceiverCallNotAllowedException(
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "IntentReceiver components are not allowed to bind to services");
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //ex.fillInStackTrace();
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //Log.e("IntentReceiver", ex.getMessage(), ex);
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //return mContext.bindService(service, interfaceName, conn, flags);
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
1382155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn * Common implementation of Context API, which provides the base
1392155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn * context object for Activity and other application components.
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
1412155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackbornclass ContextImpl extends Context {
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static String TAG = "ApplicationContext";
143569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima    private final static boolean DEBUG = false;
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
145333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick    private static final HashMap<String, SharedPreferencesImpl> sSharedPrefs =
146333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            new HashMap<String, SharedPreferencesImpl>();
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14801e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn    /*package*/ LoadedApk mPackageInfo;
1496c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn    private String mBasePackageName;
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Resources mResources;
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ ActivityThread mMainThread;
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Context mOuterContext;
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IBinder mActivityToken = null;
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ApplicationContentResolver mContentResolver;
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mThemeResource = 0;
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Resources.Theme mTheme = null;
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private PackageManager mPackageManager;
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Context mReceiverRestrictedContext = null;
159870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy    private boolean mRestricted;
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Object mSync = new Object();
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File mDatabasesDir;
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File mPreferencesDir;
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File mFilesDir;
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File mCacheDir;
167805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn    private File mObbDir;
168e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    private File mExternalFilesDir;
169e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    private File mExternalCacheDir;
1705f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String[] EMPTY_FILE_LIST = {};
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
173224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    /**
174224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick     * Override this class when the system service constructor needs a
175224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick     * ContextImpl.  Else, use StaticServiceFetcher below.
176224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick     */
177224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    /*package*/ static class ServiceFetcher {
178224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        int mContextCacheIndex = -1;
179224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
180224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        /**
181224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick         * Main entrypoint; only override if you don't need caching.
182224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick         */
183224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        public Object getService(ContextImpl ctx) {
184224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            ArrayList<Object> cache = ctx.mServiceCache;
185224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            Object service;
186224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            synchronized (cache) {
187224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                if (cache.size() == 0) {
188224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // Initialize the cache vector on first access.
189224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // At this point sNextPerContextServiceCacheIndex
190224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // is the number of potential services that are
191224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // cached per-Context.
192224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    for (int i = 0; i < sNextPerContextServiceCacheIndex; i++) {
193224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        cache.add(null);
194224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    }
195224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                } else {
196224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    service = cache.get(mContextCacheIndex);
197224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    if (service != null) {
198224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        return service;
199224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    }
200224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }
201224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                service = createService(ctx);
202224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                cache.set(mContextCacheIndex, service);
203224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                return service;
204224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            }
205224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        }
206224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
207224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        /**
208224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick         * Override this to create a new per-Context instance of the
209224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick         * service.  getService() will handle locking and caching.
210224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick         */
211224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        public Object createService(ContextImpl ctx) {
212224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            throw new RuntimeException("Not implemented");
213224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        }
214224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    }
215224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
216224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    /**
217224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick     * Override this class for services to be cached process-wide.
218224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick     */
219224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    abstract static class StaticServiceFetcher extends ServiceFetcher {
220224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        private Object mCachedInstance;
221224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
222224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        @Override
223224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        public final Object getService(ContextImpl unused) {
224224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            synchronized (StaticServiceFetcher.this) {
225224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                Object service = mCachedInstance;
226224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                if (service != null) {
227224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return service;
228224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }
229224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                return mCachedInstance = createStaticService();
230224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            }
231224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        }
232224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
233224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        public abstract Object createStaticService();
234224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    }
235224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
236224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    private static final HashMap<String, ServiceFetcher> SYSTEM_SERVICE_MAP =
237224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            new HashMap<String, ServiceFetcher>();
238224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
239224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    private static int sNextPerContextServiceCacheIndex = 0;
240224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    private static void registerService(String serviceName, ServiceFetcher fetcher) {
241224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        if (!(fetcher instanceof StaticServiceFetcher)) {
242224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            fetcher.mContextCacheIndex = sNextPerContextServiceCacheIndex++;
243224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        }
244224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        SYSTEM_SERVICE_MAP.put(serviceName, fetcher);
245224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    }
246224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
247224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // This one's defined separately and given a variable name so it
248224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // can be re-used by getWallpaperManager(), avoiding a HashMap
249224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // lookup.
250224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    private static ServiceFetcher WALLPAPER_FETCHER = new ServiceFetcher() {
251224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            public Object createService(ContextImpl ctx) {
252224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                return new WallpaperManager(ctx.getOuterContext(),
253224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        ctx.mMainThread.getHandler());
254224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick            }};
255224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
256224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    static {
257224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(ACCESSIBILITY_SERVICE, new ServiceFetcher() {
258224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object getService(ContextImpl ctx) {
259224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return AccessibilityManager.getInstance(ctx);
260224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
261224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
262224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(ACCOUNT_SERVICE, new ServiceFetcher() {
263224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
264224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(ACCOUNT_SERVICE);
265224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IAccountManager service = IAccountManager.Stub.asInterface(b);
266224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new AccountManager(ctx, service);
267224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
268224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
269224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(ACTIVITY_SERVICE, new ServiceFetcher() {
270224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
271224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new ActivityManager(ctx.getOuterContext(), ctx.mMainThread.getHandler());
272224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
273224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
274224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(ALARM_SERVICE, new StaticServiceFetcher() {
275224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createStaticService() {
276224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(ALARM_SERVICE);
277224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IAlarmManager service = IAlarmManager.Stub.asInterface(b);
278224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new AlarmManager(service);
279224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
280224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
281224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(AUDIO_SERVICE, new ServiceFetcher() {
282224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
283224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new AudioManager(ctx);
284224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
285224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
286224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(CLIPBOARD_SERVICE, new ServiceFetcher() {
287224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
288224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new ClipboardManager(ctx.getOuterContext(),
289224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                            ctx.mMainThread.getHandler());
290224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
291224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
292224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(CONNECTIVITY_SERVICE, new StaticServiceFetcher() {
293224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createStaticService() {
294224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(CONNECTIVITY_SERVICE);
295224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new ConnectivityManager(IConnectivityManager.Stub.asInterface(b));
296224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
297224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
298224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(COUNTRY_DETECTOR, new StaticServiceFetcher() {
299224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createStaticService() {
300224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(COUNTRY_DETECTOR);
301224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new CountryDetector(ICountryDetector.Stub.asInterface(b));
302224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
303224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
304224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(DEVICE_POLICY_SERVICE, new ServiceFetcher() {
305224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
306224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return DevicePolicyManager.create(ctx, ctx.mMainThread.getHandler());
307224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
308224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
309224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(DOWNLOAD_SERVICE, new ServiceFetcher() {
310224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
311224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new DownloadManager(ctx.getContentResolver(), ctx.getPackageName());
312224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
313224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
314d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly        registerService(NFC_SERVICE, new ServiceFetcher() {
315d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly                public Object createService(ContextImpl ctx) {
316d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly                    return new NfcManager(ctx);
317d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly                }});
318d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly
319224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(DROPBOX_SERVICE, new StaticServiceFetcher() {
320224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createStaticService() {
321224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return createDropBoxManager();
322224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
323224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
324224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(INPUT_METHOD_SERVICE, new ServiceFetcher() {
325224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
326224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return InputMethodManager.getInstance(ctx);
327224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
328224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
329988323c57bd25a58f05dfa492d9b9c8ab62c5153satok        registerService(TEXT_SERVICES_MANAGER_SERVICE, new ServiceFetcher() {
330988323c57bd25a58f05dfa492d9b9c8ab62c5153satok                public Object createService(ContextImpl ctx) {
331988323c57bd25a58f05dfa492d9b9c8ab62c5153satok                    return TextServicesManager.getInstance();
332988323c57bd25a58f05dfa492d9b9c8ab62c5153satok                }});
333988323c57bd25a58f05dfa492d9b9c8ab62c5153satok
334224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(KEYGUARD_SERVICE, new ServiceFetcher() {
335224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object getService(ContextImpl ctx) {
336224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // TODO: why isn't this caching it?  It wasn't
337224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // before, so I'm preserving the old behavior and
338224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // using getService(), instead of createService()
339224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    // which would do the caching.
340224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new KeyguardManager();
341224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
342224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
343224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(LAYOUT_INFLATER_SERVICE, new ServiceFetcher() {
344224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
345224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return PolicyManager.makeNewLayoutInflater(ctx.getOuterContext());
346224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
347224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
348224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(LOCATION_SERVICE, new StaticServiceFetcher() {
349224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createStaticService() {
350224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(LOCATION_SERVICE);
351224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new LocationManager(ILocationManager.Stub.asInterface(b));
352224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
353224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
3541a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey        registerService(NETWORK_POLICY_SERVICE, new ServiceFetcher() {
3551a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey            @Override
3561a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey            public Object createService(ContextImpl ctx) {
3571a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey                return new NetworkPolicyManager(INetworkPolicyManager.Stub.asInterface(
3581a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey                        ServiceManager.getService(NETWORK_POLICY_SERVICE)));
3591a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey            }
3601a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey        });
3611a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey
362224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(NOTIFICATION_SERVICE, new ServiceFetcher() {
363224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
364224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    final Context outerContext = ctx.getOuterContext();
365224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new NotificationManager(
366224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        new ContextThemeWrapper(outerContext,
367d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn                                Resources.selectSystemTheme(0,
368d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn                                        outerContext.getApplicationInfo().targetSdkVersion,
369d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn                                        com.android.internal.R.style.Theme_Dialog,
3706e90a362bc66cc67b1beae27b21d3f0148403b08Adam Powell                                        com.android.internal.R.style.Theme_Holo_Dialog,
3716e90a362bc66cc67b1beae27b21d3f0148403b08Adam Powell                                        com.android.internal.R.style.Theme_DeviceDefault_Dialog)),
372224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        ctx.mMainThread.getHandler());
373224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
374224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
375224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        // Note: this was previously cached in a static variable, but
376224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        // constructed using mMainThread.getHandler(), so converting
377224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        // it to be a regular Context-cached service...
378224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(POWER_SERVICE, new ServiceFetcher() {
379224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
380224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(POWER_SERVICE);
381224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IPowerManager service = IPowerManager.Stub.asInterface(b);
382224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new PowerManager(service, ctx.mMainThread.getHandler());
383224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
384224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
385224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(SEARCH_SERVICE, new ServiceFetcher() {
386224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
387224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new SearchManager(ctx.getOuterContext(),
388224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                            ctx.mMainThread.getHandler());
389224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
390224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
391224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(SENSOR_SERVICE, new ServiceFetcher() {
392224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
393224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new SensorManager(ctx.mMainThread.getHandler().getLooper());
394224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
395224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
396224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(STATUS_BAR_SERVICE, new ServiceFetcher() {
397224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
398224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new StatusBarManager(ctx.getOuterContext());
399224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
400224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
401224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(STORAGE_SERVICE, new ServiceFetcher() {
402224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
403224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    try {
404224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        return new StorageManager(ctx.mMainThread.getHandler().getLooper());
405224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    } catch (RemoteException rex) {
406224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        Log.e(TAG, "Failed to create StorageManager", rex);
407224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                        return null;
408224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    }
409224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
410224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
411224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(TELEPHONY_SERVICE, new ServiceFetcher() {
412224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
413224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new TelephonyManager(ctx.getOuterContext());
414224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
415224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
416224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(THROTTLE_SERVICE, new StaticServiceFetcher() {
417224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createStaticService() {
418224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(THROTTLE_SERVICE);
419224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new ThrottleManager(IThrottleManager.Stub.asInterface(b));
420224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
421224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
422224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(UI_MODE_SERVICE, new ServiceFetcher() {
423224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
424224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new UiModeManager();
425224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
426224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
4273a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        registerService(USB_SERVICE, new ServiceFetcher() {
4283a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood                public Object createService(ContextImpl ctx) {
429e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood                    IBinder b = ServiceManager.getService(USB_SERVICE);
4303a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood                    return new UsbManager(ctx, IUsbManager.Stub.asInterface(b));
431e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood                }});
432e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood
433b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood        registerService(SERIAL_SERVICE, new ServiceFetcher() {
434b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood                public Object createService(ContextImpl ctx) {
435b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood                    IBinder b = ServiceManager.getService(SERIAL_SERVICE);
436b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood                    return new SerialManager(ctx, ISerialManager.Stub.asInterface(b));
437b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood                }});
438b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
439224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(VIBRATOR_SERVICE, new ServiceFetcher() {
440224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
441224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new Vibrator();
442224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
443224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
444224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(WALLPAPER_SERVICE, WALLPAPER_FETCHER);
445224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
446224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(WIFI_SERVICE, new ServiceFetcher() {
447224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object createService(ContextImpl ctx) {
448224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IBinder b = ServiceManager.getService(WIFI_SERVICE);
449224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    IWifiManager service = IWifiManager.Stub.asInterface(b);
450224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                    return new WifiManager(service, ctx.mMainThread.getHandler());
451224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
452224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
45355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync        registerService(WIFI_P2P_SERVICE, new ServiceFetcher() {
45455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                public Object createService(ContextImpl ctx) {
45555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                    IBinder b = ServiceManager.getService(WIFI_P2P_SERVICE);
45655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                    IWifiP2pManager service = IWifiP2pManager.Stub.asInterface(b);
45755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                    return new WifiP2pManager(service);
45855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                }});
45955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
460224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        registerService(WINDOW_SERVICE, new ServiceFetcher() {
461224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                public Object getService(ContextImpl ctx) {
4625fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                    return WindowManagerImpl.getDefault(ctx.mPackageInfo.mCompatibilityInfo);
463224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick                }});
464224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    }
465224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
4665fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    static ContextImpl getImpl(Context context) {
4675fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        Context nextContext;
4685fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        while ((context instanceof ContextWrapper) &&
4695fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                (nextContext=((ContextWrapper)context).getBaseContext()) != null) {
4705fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            context = nextContext;
4715fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        }
4725fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        return (ContextImpl)context;
4735fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    }
4745fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
475224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // The system service cache for the system services that are
476224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // cached per-ContextImpl.  Package-scoped to avoid accessor
477224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    // methods.
478224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick    final ArrayList<Object> mServiceCache = new ArrayList<Object>();
479224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public AssetManager getAssets() {
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mResources.getAssets();
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Resources getResources() {
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mResources;
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PackageManager getPackageManager() {
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageManager != null) {
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageManager;
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IPackageManager pm = ActivityThread.getPackageManager();
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pm != null) {
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Doesn't matter if we make more than one instance.
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return (mPackageManager = new ApplicationPackageManager(this, pm));
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ContentResolver getContentResolver() {
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mContentResolver;
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Looper getMainLooper() {
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mMainThread.getLooper();
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5145f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Context getApplicationContext() {
517eb9e9ec06167b0caa459f2fb3f3fae094bb8d8f7Christopher Tate        return (mPackageInfo != null) ?
518eb9e9ec06167b0caa459f2fb3f3fae094bb8d8f7Christopher Tate                mPackageInfo.getApplication() : mMainThread.getApplication();
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5205f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setTheme(int resid) {
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mThemeResource = resid;
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5255f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
527247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn    public int getThemeResId() {
528247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn        return mThemeResource;
529247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn    }
530247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn
531247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn    @Override
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Resources.Theme getTheme() {
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mTheme == null) {
534d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn            mThemeResource = Resources.selectDefaultTheme(mThemeResource,
535d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn                    getOuterContext().getApplicationInfo().targetSdkVersion);
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTheme = mResources.newTheme();
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTheme.applyStyle(mThemeResource, true);
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mTheme;
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ClassLoader getClassLoader() {
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPackageInfo != null ?
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPackageInfo.getClassLoader() : ClassLoader.getSystemClassLoader();
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getPackageName() {
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageInfo.getPackageName();
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("Not supported in system context");
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5575c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn    public ApplicationInfo getApplicationInfo() {
5585c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        if (mPackageInfo != null) {
5595c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn            return mPackageInfo.getApplicationInfo();
5605c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        }
5615c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        throw new RuntimeException("Not supported in system context");
5625c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn    }
5635c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn
5645c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn    @Override
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getPackageResourcePath() {
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageInfo.getResDir();
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("Not supported in system context");
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getPackageCodePath() {
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageInfo.getAppDir();
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("Not supported in system context");
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5795f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
58023ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato    public File getSharedPrefsFile(String name) {
58123ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato        return makeFilename(getPreferencesDir(), name + ".xml");
58223ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato    }
58323ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public SharedPreferences getSharedPreferences(String name, int mode) {
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SharedPreferencesImpl sp;
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (sSharedPrefs) {
588333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick            sp = sSharedPrefs.get(name);
5896194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            if (sp == null) {
5904cd50b8d76e08d75df1a2e9d4902bcdc880bd1c1Brad Fitzpatrick                File prefsFile = getSharedPrefsFile(name);
5914cd50b8d76e08d75df1a2e9d4902bcdc880bd1c1Brad Fitzpatrick                sp = new SharedPreferencesImpl(prefsFile, mode);
5926194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                sSharedPrefs.put(name, sp);
5936194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick                return sp;
5946194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick            }
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5964e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick        if ((mode & Context.MODE_MULTI_PROCESS) != 0 ||
5974e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick            getApplicationInfo().targetSdkVersion < android.os.Build.VERSION_CODES.HONEYCOMB) {
5984e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick            // If somebody else (some other process) changed the prefs
5994e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick            // file behind our back, we reload it.  This has been the
6004e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick            // historical (if undocumented) behavior.
6014e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick            sp.startReloadIfChangedUnexpectedly();
6024e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick        }
6036194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick        return sp;
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File getPreferencesDir() {
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mPreferencesDir == null) {
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPreferencesDir = new File(getDataDirFile(), "shared_prefs");
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPreferencesDir;
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public FileInputStream openFileInput(String name)
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws FileNotFoundException {
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File f = makeFilename(getFilesDir(), name);
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new FileInputStream(f);
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public FileOutputStream openFileOutput(String name, int mode)
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws FileNotFoundException {
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean append = (mode&MODE_APPEND) != 0;
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File f = makeFilename(getFilesDir(), name);
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            FileOutputStream fos = new FileOutputStream(f, append);
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setFilePermissionsFromMode(f.getPath(), mode, 0);
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return fos;
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (FileNotFoundException e) {
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File parent = f.getParentFile();
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        parent.mkdir();
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileUtils.setPermissions(
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            parent.getPath(),
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            -1, -1);
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileOutputStream fos = new FileOutputStream(f, append);
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setFilePermissionsFromMode(f.getPath(), mode, 0);
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return fos;
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean deleteFile(String name) {
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File f = makeFilename(getFilesDir(), name);
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return f.delete();
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getFilesDir() {
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mFilesDir == null) {
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mFilesDir = new File(getDataDirFile(), "files");
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mFilesDir.exists()) {
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if(!mFilesDir.mkdirs()) {
6595f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer                    Log.w(TAG, "Unable to create files directory " + mFilesDir.getPath());
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                FileUtils.setPermissions(
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mFilesDir.getPath(),
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        -1, -1);
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mFilesDir;
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6705f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
672e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    public File getExternalFilesDir(String type) {
673e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        synchronized (mSync) {
674e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (mExternalFilesDir == null) {
675e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                mExternalFilesDir = Environment.getExternalStorageAppFilesDirectory(
676e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                        getPackageName());
677e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
678e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (!mExternalFilesDir.exists()) {
679e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                try {
680e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    (new File(Environment.getExternalStorageAndroidDataDir(),
681e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                            ".nomedia")).createNewFile();
682e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                } catch (IOException e) {
683e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
684e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                if (!mExternalFilesDir.mkdirs()) {
685e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    Log.w(TAG, "Unable to create external files directory");
686e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    return null;
687e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
688e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
689e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (type == null) {
690e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                return mExternalFilesDir;
691e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
692e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            File dir = new File(mExternalFilesDir, type);
693e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (!dir.exists()) {
694e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                if (!dir.mkdirs()) {
695e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    Log.w(TAG, "Unable to create external media directory " + dir);
696e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    return null;
697e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
698e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
699e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            return dir;
700e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        }
701e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    }
7025f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
703e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    @Override
704805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn    public File getObbDir() {
705805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn        synchronized (mSync) {
706805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn            if (mObbDir == null) {
707805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn                mObbDir = Environment.getExternalStorageAppObbDirectory(
708805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn                        getPackageName());
709805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn            }
710805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn            return mObbDir;
711805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn        }
712805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn    }
713805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn
714805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn    @Override
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getCacheDir() {
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mCacheDir == null) {
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCacheDir = new File(getDataDirFile(), "cache");
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mCacheDir.exists()) {
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if(!mCacheDir.mkdirs()) {
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Unable to create cache directory");
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                FileUtils.setPermissions(
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mCacheDir.getPath(),
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        -1, -1);
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCacheDir;
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7335f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
734e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    @Override
735e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    public File getExternalCacheDir() {
736e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        synchronized (mSync) {
737e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (mExternalCacheDir == null) {
738e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                mExternalCacheDir = Environment.getExternalStorageAppCacheDirectory(
739e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                        getPackageName());
740e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
741e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            if (!mExternalCacheDir.exists()) {
742e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                try {
743e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    (new File(Environment.getExternalStorageAndroidDataDir(),
744e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                            ".nomedia")).createNewFile();
745e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                } catch (IOException e) {
746e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
747e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                if (!mExternalCacheDir.mkdirs()) {
748e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    Log.w(TAG, "Unable to create external cache directory");
749e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                    return null;
750e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn                }
751e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            }
752e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn            return mExternalCacheDir;
753e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn        }
754e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn    }
7555f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getFileStreamPath(String name) {
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return makeFilename(getFilesDir(), name);
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String[] fileList() {
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String[] list = getFilesDir().list();
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (list != null) ? list : EMPTY_FILE_LIST;
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory) {
769a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        File f = validateFilePath(name, true);
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(f, factory);
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setFilePermissionsFromMode(f.getPath(), mode, 0);
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return db;
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
77674f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori    public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory,
77774f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori            DatabaseErrorHandler errorHandler) {
77874f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori        File f = validateFilePath(name, true);
77974f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori        SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(f.getPath(), factory, errorHandler);
78074f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori        setFilePermissionsFromMode(f.getPath(), mode, 0);
78174f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori        return db;
78274f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori    }
78374f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori
78474f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori    @Override
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean deleteDatabase(String name) {
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
787a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            File f = validateFilePath(name, false);
78879087e4b967d8af26c488c41b8c1a087a12da84dJeff Brown            return SQLiteDatabase.deleteDatabase(f);
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getDatabasePath(String name) {
796a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        return validateFilePath(name, false);
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String[] databaseList() {
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String[] list = getDatabasesDir().list();
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (list != null) ? list : EMPTY_FILE_LIST;
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8055f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File getDatabasesDir() {
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mDatabasesDir == null) {
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDatabasesDir = new File(getDataDirFile(), "databases");
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mDatabasesDir.getPath().equals("databases")) {
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDatabasesDir = new File("/data/system");
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mDatabasesDir;
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8175f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Drawable getWallpaper() {
8204c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        return getWallpaperManager().getDrawable();
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8248cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn    public Drawable peekWallpaper() {
8254c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        return getWallpaperManager().peekDrawable();
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getWallpaperDesiredMinimumWidth() {
8308cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        return getWallpaperManager().getDesiredMinimumWidth();
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getWallpaperDesiredMinimumHeight() {
8358cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        return getWallpaperManager().getDesiredMinimumHeight();
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setWallpaper(Bitmap bitmap) throws IOException  {
8404c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        getWallpaperManager().setBitmap(bitmap);
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setWallpaper(InputStream data) throws IOException {
8454c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        getWallpaperManager().setStream(data);
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void clearWallpaper() throws IOException {
8508cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        getWallpaperManager().clear();
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startActivity(Intent intent) {
855a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        startActivity(intent, null);
856a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    }
857a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn
858a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    @Override
859a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    public void startActivity(Intent intent, Bundle options) {
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new AndroidRuntimeException(
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Calling startActivity() from outside of an Activity "
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " context requires the FLAG_ACTIVITY_NEW_TASK flag."
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " Is this really what you want?");
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread.getInstrumentation().execStartActivity(
8676e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            getOuterContext(), mMainThread.getApplicationThread(), null,
868a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            (Activity)null, intent, -1, options);
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
872621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    public void startActivities(Intent[] intents) {
873a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        startActivities(intents, null);
874a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    }
875a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn
876a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    @Override
877a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    public void startActivities(Intent[] intents, Bundle options) {
878621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if ((intents[0].getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
879621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            throw new AndroidRuntimeException(
880621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    "Calling startActivities() from outside of an Activity "
881621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    + " context requires the FLAG_ACTIVITY_NEW_TASK flag on first Intent."
882621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    + " Is this really what you want?");
883621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
884621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        mMainThread.getInstrumentation().execStartActivities(
885621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            getOuterContext(), mMainThread.getApplicationThread(), null,
886a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            (Activity)null, intents, options);
887621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    }
888621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
889621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    @Override
890fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    public void startIntentSender(IntentSender intent,
891fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
892fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            throws IntentSender.SendIntentException {
893a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        startIntentSender(intent, fillInIntent, flagsMask, flagsValues, extraFlags, null);
894a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    }
895a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn
896a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    @Override
897a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    public void startIntentSender(IntentSender intent, Intent fillInIntent,
898a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            int flagsMask, int flagsValues, int extraFlags, Bundle options)
899a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            throws IntentSender.SendIntentException {
900fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn        try {
901fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            String resolvedType = null;
902fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            if (fillInIntent != null) {
9039ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn                fillInIntent.setAllowFds(false);
904fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                resolvedType = fillInIntent.resolveTypeIfNeeded(getContentResolver());
905fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            }
906fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            int result = ActivityManagerNative.getDefault()
907fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                .startActivityIntentSender(mMainThread.getApplicationThread(), intent,
908fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                        fillInIntent, resolvedType, null, null,
909a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                        0, flagsMask, flagsValues, options);
910a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            if (result == ActivityManager.START_CANCELED) {
911fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn                throw new IntentSender.SendIntentException();
912fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            }
913fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn            Instrumentation.checkStartActivityResult(result, null);
914fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn        } catch (RemoteException e) {
915fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn        }
916fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    }
9175f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
918fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    @Override
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendBroadcast(Intent intent) {
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
9229ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            intent.setAllowFds(false);
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, null,
925742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                Activity.RESULT_OK, null, null, null, false, false,
926742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                Binder.getOrigCallingUser());
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
93167cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani    /** @hide */
93267cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani    @Override
93367cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani    public void sendBroadcast(Intent intent, int userId) {
93467cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
93567cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani        try {
93667cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani            intent.setAllowFds(false);
93767cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani            ActivityManagerNative.getDefault().broadcastIntent(mMainThread.getApplicationThread(),
93867cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani                    intent, resolvedType, null, Activity.RESULT_OK, null, null, null, false, false,
93967cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani                    userId);
94067cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani        } catch (RemoteException e) {
94167cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani        }
94267cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani    }
94367cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendBroadcast(Intent intent, String receiverPermission) {
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
9489ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            intent.setAllowFds(false);
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, null,
951742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                Activity.RESULT_OK, null, null, receiverPermission, false, false,
952742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                Binder.getOrigCallingUser());
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendOrderedBroadcast(Intent intent,
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String receiverPermission) {
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
9629ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            intent.setAllowFds(false);
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, null,
965742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                Activity.RESULT_OK, null, null, receiverPermission, true, false,
966742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                Binder.getOrigCallingUser());
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendOrderedBroadcast(Intent intent,
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String receiverPermission, BroadcastReceiver resultReceiver,
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Handler scheduler, int initialCode, String initialData,
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Bundle initialExtras) {
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IIntentReceiver rd = null;
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resultReceiver != null) {
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mPackageInfo != null) {
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (scheduler == null) {
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scheduler = mMainThread.getHandler();
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                rd = mPackageInfo.getReceiverDispatcher(
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    resultReceiver, getOuterContext(), scheduler,
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getInstrumentation(), false);
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (scheduler == null) {
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scheduler = mMainThread.getHandler();
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
98901e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn                rd = new LoadedApk.ReceiverDispatcher(
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver();
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
9959ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            intent.setAllowFds(false);
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, rd,
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                initialCode, initialData, initialExtras, receiverPermission,
999742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                true, false, Binder.getOrigCallingUser());
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendStickyBroadcast(Intent intent) {
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
10089ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            intent.setAllowFds(false);
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().broadcastIntent(
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), intent, resolvedType, null,
1011742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                Activity.RESULT_OK, null, null, null, false, true,
1012742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                Binder.getOrigCallingUser());
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1018efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn    public void sendStickyOrderedBroadcast(Intent intent,
1019efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            BroadcastReceiver resultReceiver,
1020efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            Handler scheduler, int initialCode, String initialData,
1021efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            Bundle initialExtras) {
1022efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        IIntentReceiver rd = null;
1023efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        if (resultReceiver != null) {
1024efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            if (mPackageInfo != null) {
1025efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                if (scheduler == null) {
1026efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                    scheduler = mMainThread.getHandler();
1027efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                }
1028efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                rd = mPackageInfo.getReceiverDispatcher(
1029efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                    resultReceiver, getOuterContext(), scheduler,
1030efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                    mMainThread.getInstrumentation(), false);
1031efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            } else {
1032efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                if (scheduler == null) {
1033efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                    scheduler = mMainThread.getHandler();
1034efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                }
103501e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn                rd = new LoadedApk.ReceiverDispatcher(
1036efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                        resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver();
1037efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            }
1038efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        }
1039efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
1040efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        try {
10419ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            intent.setAllowFds(false);
1042efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn            ActivityManagerNative.getDefault().broadcastIntent(
1043efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                mMainThread.getApplicationThread(), intent, resolvedType, rd,
1044efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn                initialCode, initialData, initialExtras, null,
1045742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                true, true, Binder.getOrigCallingUser());
1046efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        } catch (RemoteException e) {
1047efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn        }
1048efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn    }
1049efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn
1050efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn    @Override
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeStickyBroadcast(Intent intent) {
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resolvedType != null) {
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            intent = new Intent(intent);
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            intent.setDataAndType(intent.getData(), resolvedType);
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
10589ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            intent.setAllowFds(false);
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().unbroadcastIntent(
1060742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                    mMainThread.getApplicationThread(), intent, Binder.getOrigCallingUser());
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return registerReceiver(receiver, filter, null, null);
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String broadcastPermission, Handler scheduler) {
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return registerReceiverInternal(receiver, filter, broadcastPermission,
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                scheduler, getOuterContext());
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Intent registerReceiverInternal(BroadcastReceiver receiver,
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IntentFilter filter, String broadcastPermission,
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Handler scheduler, Context context) {
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IIntentReceiver rd = null;
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (receiver != null) {
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mPackageInfo != null && context != null) {
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (scheduler == null) {
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scheduler = mMainThread.getHandler();
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                rd = mPackageInfo.getReceiverDispatcher(
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    receiver, context, scheduler,
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getInstrumentation(), true);
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (scheduler == null) {
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scheduler = mMainThread.getHandler();
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
109301e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn                rd = new LoadedApk.ReceiverDispatcher(
1094399cccb85749e02f6d3e12d1d2846310e7cbfdf1Dianne Hackborn                        receiver, context, scheduler, null, true).getIIntentReceiver();
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().registerReceiver(
10996c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn                    mMainThread.getApplicationThread(), mBasePackageName,
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    rd, filter, broadcastPermission);
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void unregisterReceiver(BroadcastReceiver receiver) {
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IIntentReceiver rd = mPackageInfo.forgetReceiverDispatcher(
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getOuterContext(), receiver);
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityManagerNative.getDefault().unregisterReceiver(rd);
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("Not supported in system context");
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ComponentName startService(Intent service) {
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
11239ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            service.setAllowFds(false);
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ComponentName cn = ActivityManagerNative.getDefault().startService(
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), service,
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                service.resolveTypeIfNeeded(getContentResolver()));
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (cn != null && cn.getPackageName().equals("!")) {
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SecurityException(
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Not allowed to start service " + service
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " without permission " + cn.getClassName());
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return cn;
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean stopService(Intent service) {
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
11419ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            service.setAllowFds(false);
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int res = ActivityManagerNative.getDefault().stopService(
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), service,
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                service.resolveTypeIfNeeded(getContentResolver()));
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (res < 0) {
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SecurityException(
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Not allowed to stop service " + service);
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return res != 0;
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean bindService(Intent service, ServiceConnection conn,
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) {
115837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        return bindService(service, conn, flags, UserId.getUserId(Process.myUid()));
115937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    }
116037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
116137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    /** @hide */
116237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    @Override
116337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    public boolean bindService(Intent service, ServiceConnection conn, int flags, int userId) {
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IServiceConnection sd;
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sd = mPackageInfo.getServiceDispatcher(conn, getOuterContext(),
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getHandler(), flags);
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("Not supported in system context");
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1172c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            IBinder token = getActivityToken();
1173c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            if (token == null && (flags&BIND_AUTO_CREATE) == 0 && mPackageInfo != null
1174c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                    && mPackageInfo.getApplicationInfo().targetSdkVersion
1175c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                    < android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
1176c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                flags |= BIND_WAIVE_PRIORITY;
1177c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
11789ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            service.setAllowFds(false);
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int res = ActivityManagerNative.getDefault().bindService(
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMainThread.getApplicationThread(), getActivityToken(),
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                service, service.resolveTypeIfNeeded(getContentResolver()),
118237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                sd, flags, userId);
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (res < 0) {
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SecurityException(
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Not allowed to bind to service " + service);
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return res != 0;
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void unbindService(ServiceConnection conn) {
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IServiceConnection sd = mPackageInfo.forgetServiceDispatcher(
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getOuterContext(), conn);
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityManagerNative.getDefault().unbindService(sd);
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("Not supported in system context");
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean startInstrumentation(ComponentName className,
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String profileFile, Bundle arguments) {
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
12119ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            if (arguments != null) {
12129ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn                arguments.setAllowFds(false);
12139ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn            }
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().startInstrumentation(
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    className, profileFile, 0, arguments, null);
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // System has crashed, nothing we can do.
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Object getSystemService(String name) {
1224224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name);
1225224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        return fetcher == null ? null : fetcher.getService(this);
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12288cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn    private WallpaperManager getWallpaperManager() {
1229224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick        return (WallpaperManager) WALLPAPER_FETCHER.getService(this);
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1232438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    /* package */ static DropBoxManager createDropBoxManager() {
1233438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        IBinder b = ServiceManager.getService(DROPBOX_SERVICE);
1234438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        IDropBoxManagerService service = IDropBoxManagerService.Stub.asInterface(b);
1235ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick        if (service == null) {
1236ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            // Don't return a DropBoxManager that will NPE upon use.
1237ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            // This also avoids caching a broken DropBoxManager in
1238ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            // getDropBoxManager during early boot, before the
1239ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            // DROPBOX_SERVICE is registered.
1240ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            return null;
1241ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick        }
1242438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick        return new DropBoxManager(service);
1243438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick    }
1244438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkPermission(String permission, int pid, int uid) {
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (permission == null) {
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException("permission is null");
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().checkPermission(
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    permission, pid, uid);
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PackageManager.PERMISSION_DENIED;
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkCallingPermission(String permission) {
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (permission == null) {
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException("permission is null");
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pid = Binder.getCallingPid();
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pid != Process.myPid()) {
1267742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            return checkPermission(permission, pid, Binder.getCallingUid());
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return PackageManager.PERMISSION_DENIED;
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkCallingOrSelfPermission(String permission) {
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (permission == null) {
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException("permission is null");
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return checkPermission(permission, Binder.getCallingPid(),
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid());
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void enforce(
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String permission, int resultOfCheck,
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean selfToo, int uid, String message) {
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resultOfCheck != PackageManager.PERMISSION_GRANTED) {
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SecurityException(
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (message != null ? (message + ": ") : "") +
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (selfToo
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     ? "Neither user " + uid + " nor current process has "
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     : "User " + uid + " does not have ") +
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    permission +
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ".");
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforcePermission(
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String permission, int pid, int uid, String message) {
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforce(permission,
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                checkPermission(permission, pid, uid),
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false,
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                uid,
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                message);
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingPermission(String permission, String message) {
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforce(permission,
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                checkCallingPermission(permission),
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false,
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid(),
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                message);
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingOrSelfPermission(
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String permission, String message) {
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforce(permission,
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                checkCallingOrSelfPermission(permission),
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                true,
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid(),
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                message);
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void grantUriPermission(String toPackage, Uri uri, int modeFlags) {
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         try {
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().grantUriPermission(
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getApplicationThread(), toPackage, uri,
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    modeFlags);
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void revokeUriPermission(Uri uri, int modeFlags) {
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         try {
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityManagerNative.getDefault().revokeUriPermission(
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMainThread.getApplicationThread(), uri,
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    modeFlags);
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkUriPermission(Uri uri, int pid, int uid, int modeFlags) {
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ActivityManagerNative.getDefault().checkUriPermission(
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uri, pid, uid, modeFlags);
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PackageManager.PERMISSION_DENIED;
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkCallingUriPermission(Uri uri, int modeFlags) {
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pid = Binder.getCallingPid();
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pid != Process.myPid()) {
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return checkUriPermission(uri, pid,
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Binder.getCallingUid(), modeFlags);
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return PackageManager.PERMISSION_DENIED;
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkCallingOrSelfUriPermission(Uri uri, int modeFlags) {
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return checkUriPermission(uri, Binder.getCallingPid(),
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid(), modeFlags);
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkUriPermission(Uri uri, String readPermission,
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String writePermission, int pid, int uid, int modeFlags) {
1371569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima        if (DEBUG) {
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.i("foo", "checkUriPermission: uri=" + uri + "readPermission="
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + readPermission + " writePermission=" + writePermission
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " pid=" + pid + " uid=" + uid + " mode" + modeFlags);
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((modeFlags&Intent.FLAG_GRANT_READ_URI_PERMISSION) != 0) {
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (readPermission == null
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    || checkPermission(readPermission, pid, uid)
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    == PackageManager.PERMISSION_GRANTED) {
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return PackageManager.PERMISSION_GRANTED;
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((modeFlags&Intent.FLAG_GRANT_WRITE_URI_PERMISSION) != 0) {
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (writePermission == null
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    || checkPermission(writePermission, pid, uid)
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    == PackageManager.PERMISSION_GRANTED) {
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return PackageManager.PERMISSION_GRANTED;
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return uri != null ? checkUriPermission(uri, pid, uid, modeFlags)
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                : PackageManager.PERMISSION_DENIED;
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String uriModeFlagToString(int uriModeFlags) {
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (uriModeFlags) {
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Intent.FLAG_GRANT_READ_URI_PERMISSION |
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Intent.FLAG_GRANT_WRITE_URI_PERMISSION:
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "read and write";
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Intent.FLAG_GRANT_READ_URI_PERMISSION:
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "read";
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case Intent.FLAG_GRANT_WRITE_URI_PERMISSION:
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "write";
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new IllegalArgumentException(
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "Unknown permission mode flags: " + uriModeFlags);
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void enforceForUri(
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int modeFlags, int resultOfCheck, boolean selfToo,
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int uid, Uri uri, String message) {
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resultOfCheck != PackageManager.PERMISSION_GRANTED) {
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SecurityException(
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (message != null ? (message + ": ") : "") +
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (selfToo
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     ? "Neither user " + uid + " nor current process has "
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     : "User " + uid + " does not have ") +
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uriModeFlagToString(modeFlags) +
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    " permission on " +
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uri +
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ".");
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceUriPermission(
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri uri, int pid, int uid, int modeFlags, String message) {
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceForUri(
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                modeFlags, checkUriPermission(uri, pid, uid, modeFlags),
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false, uid, uri, message);
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingUriPermission(
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri uri, int modeFlags, String message) {
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceForUri(
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                modeFlags, checkCallingUriPermission(uri, modeFlags),
1435742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                false,
1436742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                Binder.getCallingUid(), uri, message);
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingOrSelfUriPermission(
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri uri, int modeFlags, String message) {
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceForUri(
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                modeFlags,
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                checkCallingOrSelfUriPermission(uri, modeFlags), true,
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingUid(), uri, message);
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceUriPermission(
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri uri, String readPermission, String writePermission,
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int pid, int uid, int modeFlags, String message) {
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceForUri(modeFlags,
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      checkUriPermission(
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                              uri, readPermission, writePermission, pid, uid,
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                              modeFlags),
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      false,
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      uid,
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      uri,
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      message);
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Context createPackageContext(String packageName, int flags)
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws PackageManager.NameNotFoundException {
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (packageName.equals("system") || packageName.equals("android")) {
14642155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn            return new ContextImpl(mMainThread.getSystemContext());
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
146701e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn        LoadedApk pi =
1468e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            mMainThread.getPackageInfo(packageName, mResources.getCompatibilityInfo(), flags);
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pi != null) {
14702155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn            ContextImpl c = new ContextImpl();
1471870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy            c.mRestricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED;
14726c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn            c.init(pi, null, mMainThread, mResources, mBasePackageName);
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (c.mResources != null) {
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return c;
14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Should be a better exception.
14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new PackageManager.NameNotFoundException(
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "Application package " + packageName + " not found");
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1483870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy    @Override
1484870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy    public boolean isRestricted() {
1485870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy        return mRestricted;
1486870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy    }
1487870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy
14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File getDataDirFile() {
14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPackageInfo != null) {
14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageInfo.getDataDirFile();
14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new RuntimeException("Not supported in system context");
14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getDir(String name, int mode) {
14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        name = "app_" + name;
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File file = makeFilename(getDataDirFile(), name);
14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!file.exists()) {
15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            file.mkdir();
15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setFilePermissionsFromMode(file.getPath(), mode,
15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH);
15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return file;
15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15072155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn    static ContextImpl createSystemContext(ActivityThread mainThread) {
15082155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn        ContextImpl context = new ContextImpl();
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        context.init(Resources.getSystem(), mainThread);
15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return context;
15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15132155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn    ContextImpl() {
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOuterContext = this;
15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new ApplicationContext from an existing one.  The new one
15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * works and operates the same as the one it is copying.
15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context Existing application context.
15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15232155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn    public ContextImpl(ContextImpl context) {
15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPackageInfo = context.mPackageInfo;
15256c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn        mBasePackageName = context.mBasePackageName;
15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResources = context.mResources;
15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread = context.mMainThread;
15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContentResolver = context.mContentResolver;
15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOuterContext = this;
15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
153201e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn    final void init(LoadedApk packageInfo,
15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IBinder activityToken, ActivityThread mainThread) {
15346c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn        init(packageInfo, activityToken, mainThread, null, null);
1535ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima    }
1536ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima
153701e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn    final void init(LoadedApk packageInfo,
1538ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima                IBinder activityToken, ActivityThread mainThread,
15396c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn                Resources container, String basePackageName) {
15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPackageInfo = packageInfo;
15416c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn        mBasePackageName = basePackageName != null ? basePackageName : packageInfo.mPackageName;
15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResources = mPackageInfo.getResources(mainThread);
1543ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima
1544559a78753165f20d5973b958791056154baecc43Dianne Hackborn        if (mResources != null && container != null
1545559a78753165f20d5973b958791056154baecc43Dianne Hackborn                && container.getCompatibilityInfo().applicationScale !=
1546559a78753165f20d5973b958791056154baecc43Dianne Hackborn                        mResources.getCompatibilityInfo().applicationScale) {
1547ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima            if (DEBUG) {
1548ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima                Log.d(TAG, "loaded context has different scaling. Using container's" +
1549ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima                        " compatiblity info:" + container.getDisplayMetrics());
1550ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima            }
1551ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima            mResources = mainThread.getTopLevelResources(
1552e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                    mPackageInfo.getResDir(), container.getCompatibilityInfo());
1553ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima        }
15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread = mainThread;
15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContentResolver = new ApplicationContentResolver(this, mainThread);
15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setActivityToken(activityToken);
15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void init(Resources resources, ActivityThread mainThread) {
15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPackageInfo = null;
15626c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn        mBasePackageName = null;
15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResources = resources;
15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread = mainThread;
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContentResolver = new ApplicationContentResolver(this, mainThread);
15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void scheduleFinalCleanup(String who, String what) {
15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMainThread.scheduleContextCleanup(this, who, what);
15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void performFinalCleanup(String who, String what) {
15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //Log.i(TAG, "Cleanup up context: " + this);
15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPackageInfo.removeContextRegistrations(getOuterContext(), who, what);
15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Context getReceiverRestrictedContext() {
15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mReceiverRestrictedContext != null) {
15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mReceiverRestrictedContext;
15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mReceiverRestrictedContext = new ReceiverRestrictedContext(getOuterContext());
15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void setActivityToken(IBinder token) {
15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mActivityToken = token;
15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15875f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final void setOuterContext(Context context) {
15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOuterContext = context;
15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15915f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Context getOuterContext() {
15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mOuterContext;
15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15955f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final IBinder getActivityToken() {
15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mActivityToken;
15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1600d3da44032084b6dd280487280553dcdbd7933e3eBrad Fitzpatrick    static void setFilePermissionsFromMode(String name, int mode,
16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int extraPermissions) {
16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int perms = FileUtils.S_IRUSR|FileUtils.S_IWUSR
16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            |FileUtils.S_IRGRP|FileUtils.S_IWGRP
16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            |extraPermissions;
16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mode&MODE_WORLD_READABLE) != 0) {
16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            perms |= FileUtils.S_IROTH;
16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mode&MODE_WORLD_WRITEABLE) != 0) {
16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            perms |= FileUtils.S_IWOTH;
16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1611569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima        if (DEBUG) {
16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.i(TAG, "File " + name + ": mode=0x" + Integer.toHexString(mode)
16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                  + ", perms=0x" + Integer.toHexString(perms));
16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileUtils.setPermissions(name, perms, -1, -1);
16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1618a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor    private File validateFilePath(String name, boolean createDirectory) {
1619a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        File dir;
1620a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        File f;
1621a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor
1622a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        if (name.charAt(0) == File.separatorChar) {
1623a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            String dirPath = name.substring(0, name.lastIndexOf(File.separatorChar));
1624a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            dir = new File(dirPath);
1625a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            name = name.substring(name.lastIndexOf(File.separatorChar));
1626a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            f = new File(dir, name);
1627a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        } else {
1628a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            dir = getDatabasesDir();
1629a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            f = makeFilename(dir, name);
1630a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        }
1631a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor
1632a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        if (createDirectory && !dir.isDirectory() && dir.mkdir()) {
1633a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor            FileUtils.setPermissions(dir.getPath(),
1634a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor                FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
1635a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor                -1, -1);
1636a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        }
1637a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor
1638a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor        return f;
1639a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor    }
1640a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor
16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File makeFilename(File base, String name) {
16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (name.indexOf(File.separatorChar) < 0) {
16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new File(base, name);
16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new IllegalArgumentException(
1646a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor                "File " + name + " contains a path separator");
16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ----------------------------------------------------------------------
16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final class ApplicationContentResolver extends ContentResolver {
1654cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        public ApplicationContentResolver(Context context, ActivityThread mainThread) {
16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(context);
16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMainThread = mainThread;
16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1660cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        protected IContentProvider acquireProvider(Context context, String name) {
16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mMainThread.acquireProvider(context, name);
16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1665cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        protected IContentProvider acquireExistingProvider(Context context, String name) {
1666cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn            return mMainThread.acquireExistingProvider(context, name);
1667cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        }
1668cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn
1669cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        @Override
1670cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn        public boolean releaseProvider(IContentProvider provider) {
16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mMainThread.releaseProvider(provider);
16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16735f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer
16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final ActivityThread mMainThread;
16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1677