ContextImpl.java revision 9f25b7fdf216c9ef0bd2322cd223eeaf0d60f77f
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; 48ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brownimport android.hardware.input.IInputManager; 499df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brownimport android.hardware.input.InputManager; 50c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodimport android.hardware.usb.IUsbManager; 51c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodimport android.hardware.usb.UsbManager; 52a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.location.CountryDetector; 53a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.location.ICountryDetector; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.location.ILocationManager; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.location.LocationManager; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.AudioManager; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.ConnectivityManager; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.IConnectivityManager; 591a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkeyimport android.net.INetworkPolicyManager; 601a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkeyimport android.net.NetworkPolicyManager; 61c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriffimport android.net.ThrottleManager; 62c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriffimport android.net.IThrottleManager; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 647d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.net.nsd.INsdManager; 657d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.net.nsd.NsdManager; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.wifi.IWifiManager; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.wifi.WifiManager; 6855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.net.wifi.p2p.IWifiP2pManager; 6955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.net.wifi.p2p.WifiP2pManager; 7050b4d8f643f31b37e9872f562fb869059cf79c8aNick Pellyimport android.nfc.NfcManager; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 73f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnorimport android.os.DropBoxManager; 74539d3c475f44b1499499a8b70375a192545cf113Oscar Montemayorimport android.os.Environment; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.FileUtils; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IPowerManager; 7975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.Looper; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.PowerManager; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process; 8275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.RemoteException; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 84742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport android.os.UserId; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Vibrator; 86b104340496e3a531e26c8f428c808eca0e039f50San Mehatimport android.os.storage.StorageManager; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.TelephonyManager; 889f53119b72e6da865bcd53173d3dacd1eba01aeeDianne Hackbornimport android.content.ClipboardManager; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AndroidRuntimeException; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ContextThemeWrapper; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManagerImpl; 9375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.view.accessibility.AccessibilityManager; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.InputMethodManager; 95988323c57bd25a58f05dfa492d9b9c8ab62c5153satokimport android.view.textservice.TextServicesManager; 96603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintanaimport android.accounts.AccountManager; 97603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintanaimport android.accounts.IAccountManager; 9887bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackbornimport android.app.admin.DevicePolicyManager; 99f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnorimport com.android.internal.os.IDropBoxManagerService; 100952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileNotFoundException; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream; 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass ReceiverRestrictedContext extends ContextWrapper { 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ReceiverRestrictedContext(Context base) { 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(base); 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) { 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return registerReceiver(receiver, filter, null, null); 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String broadcastPermission, Handler scheduler) { 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ReceiverCallNotAllowedException( 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "IntentReceiver components are not allowed to register to receive intents"); 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //ex.fillInStackTrace(); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.e("IntentReceiver", ex.getMessage(), ex); 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //return mContext.registerReceiver(receiver, filter, broadcastPermission, 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // scheduler); 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean bindService(Intent service, ServiceConnection conn, int flags) { 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ReceiverCallNotAllowedException( 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "IntentReceiver components are not allowed to bind to services"); 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //ex.fillInStackTrace(); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.e("IntentReceiver", ex.getMessage(), ex); 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //return mContext.bindService(service, interfaceName, conn, flags); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 1422155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn * Common implementation of Context API, which provides the base 1432155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn * context object for Activity and other application components. 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1452155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackbornclass ContextImpl extends Context { 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final static String TAG = "ApplicationContext"; 147569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima private final static boolean DEBUG = false; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 149333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick private static final HashMap<String, SharedPreferencesImpl> sSharedPrefs = 150333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick new HashMap<String, SharedPreferencesImpl>(); 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15201e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn /*package*/ LoadedApk mPackageInfo; 1536c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn private String mBasePackageName; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Resources mResources; 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ ActivityThread mMainThread; 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Context mOuterContext; 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private IBinder mActivityToken = null; 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ApplicationContentResolver mContentResolver; 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mThemeResource = 0; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Resources.Theme mTheme = null; 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private PackageManager mPackageManager; 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Context mReceiverRestrictedContext = null; 163870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy private boolean mRestricted; 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Object mSync = new Object(); 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File mDatabasesDir; 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File mPreferencesDir; 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File mFilesDir; 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File mCacheDir; 171805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn private File mObbDir; 172e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn private File mExternalFilesDir; 173e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn private File mExternalCacheDir; 1745f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String[] EMPTY_FILE_LIST = {}; 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 177224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick /** 178224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick * Override this class when the system service constructor needs a 179224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick * ContextImpl. Else, use StaticServiceFetcher below. 180224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick */ 181224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick /*package*/ static class ServiceFetcher { 182224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick int mContextCacheIndex = -1; 183224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 184224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick /** 185224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick * Main entrypoint; only override if you don't need caching. 186224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick */ 187224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object getService(ContextImpl ctx) { 188224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick ArrayList<Object> cache = ctx.mServiceCache; 189224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick Object service; 190224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick synchronized (cache) { 191224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick if (cache.size() == 0) { 192224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // Initialize the cache vector on first access. 193224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // At this point sNextPerContextServiceCacheIndex 194224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // is the number of potential services that are 195224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // cached per-Context. 196224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick for (int i = 0; i < sNextPerContextServiceCacheIndex; i++) { 197224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick cache.add(null); 198224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 199224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } else { 200224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick service = cache.get(mContextCacheIndex); 201224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick if (service != null) { 202224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return service; 203224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 204224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 205224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick service = createService(ctx); 206224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick cache.set(mContextCacheIndex, service); 207224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return service; 208224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 209224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 210224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 211224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick /** 212224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick * Override this to create a new per-Context instance of the 213224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick * service. getService() will handle locking and caching. 214224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick */ 215224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 216224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick throw new RuntimeException("Not implemented"); 217224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 218224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 219224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 220224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick /** 221224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick * Override this class for services to be cached process-wide. 222224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick */ 223224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick abstract static class StaticServiceFetcher extends ServiceFetcher { 224224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick private Object mCachedInstance; 225224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 226224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick @Override 227224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public final Object getService(ContextImpl unused) { 228224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick synchronized (StaticServiceFetcher.this) { 229224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick Object service = mCachedInstance; 230224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick if (service != null) { 231224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return service; 232224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 233224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return mCachedInstance = createStaticService(); 234224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 235224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 236224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 237224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public abstract Object createStaticService(); 238224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 239224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 240224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick private static final HashMap<String, ServiceFetcher> SYSTEM_SERVICE_MAP = 241224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick new HashMap<String, ServiceFetcher>(); 242224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 243224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick private static int sNextPerContextServiceCacheIndex = 0; 244224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick private static void registerService(String serviceName, ServiceFetcher fetcher) { 245224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick if (!(fetcher instanceof StaticServiceFetcher)) { 246224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick fetcher.mContextCacheIndex = sNextPerContextServiceCacheIndex++; 247224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 248224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick SYSTEM_SERVICE_MAP.put(serviceName, fetcher); 249224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 250224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 251224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // This one's defined separately and given a variable name so it 252224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // can be re-used by getWallpaperManager(), avoiding a HashMap 253224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // lookup. 254224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick private static ServiceFetcher WALLPAPER_FETCHER = new ServiceFetcher() { 255224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 256224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new WallpaperManager(ctx.getOuterContext(), 257224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick ctx.mMainThread.getHandler()); 258224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}; 259224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 260224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick static { 261224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(ACCESSIBILITY_SERVICE, new ServiceFetcher() { 262224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object getService(ContextImpl ctx) { 263224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return AccessibilityManager.getInstance(ctx); 264224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 265224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 266224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(ACCOUNT_SERVICE, new ServiceFetcher() { 267224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 268224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IBinder b = ServiceManager.getService(ACCOUNT_SERVICE); 269224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IAccountManager service = IAccountManager.Stub.asInterface(b); 270224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new AccountManager(ctx, service); 271224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 272224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 273224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(ACTIVITY_SERVICE, new ServiceFetcher() { 274224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 275224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new ActivityManager(ctx.getOuterContext(), ctx.mMainThread.getHandler()); 276224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 277224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 278224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(ALARM_SERVICE, new StaticServiceFetcher() { 279224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createStaticService() { 280224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IBinder b = ServiceManager.getService(ALARM_SERVICE); 281224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IAlarmManager service = IAlarmManager.Stub.asInterface(b); 282224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new AlarmManager(service); 283224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 284224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 285224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(AUDIO_SERVICE, new ServiceFetcher() { 286224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 287224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new AudioManager(ctx); 288224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 289224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 290224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(CLIPBOARD_SERVICE, new ServiceFetcher() { 291224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 292224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new ClipboardManager(ctx.getOuterContext(), 293224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick ctx.mMainThread.getHandler()); 294224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 295224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 296224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(CONNECTIVITY_SERVICE, new StaticServiceFetcher() { 297224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createStaticService() { 298224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IBinder b = ServiceManager.getService(CONNECTIVITY_SERVICE); 299224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new ConnectivityManager(IConnectivityManager.Stub.asInterface(b)); 300224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 301224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 302224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(COUNTRY_DETECTOR, new StaticServiceFetcher() { 303224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createStaticService() { 304224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IBinder b = ServiceManager.getService(COUNTRY_DETECTOR); 305224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new CountryDetector(ICountryDetector.Stub.asInterface(b)); 306224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 307224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 308224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(DEVICE_POLICY_SERVICE, new ServiceFetcher() { 309224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 310224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return DevicePolicyManager.create(ctx, ctx.mMainThread.getHandler()); 311224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 312224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 313224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(DOWNLOAD_SERVICE, new ServiceFetcher() { 314224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 315224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new DownloadManager(ctx.getContentResolver(), ctx.getPackageName()); 316224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 317224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 318d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly registerService(NFC_SERVICE, new ServiceFetcher() { 319d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly public Object createService(ContextImpl ctx) { 320d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly return new NfcManager(ctx); 321d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly }}); 322d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly 323224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(DROPBOX_SERVICE, new StaticServiceFetcher() { 324224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createStaticService() { 325224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return createDropBoxManager(); 326224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 327224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 3289f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown registerService(INPUT_SERVICE, new StaticServiceFetcher() { 3299f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown public Object createStaticService() { 3309f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown return InputManager.getInstance(); 331ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown }}); 3329df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown 333224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(INPUT_METHOD_SERVICE, new ServiceFetcher() { 334224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 335224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return InputMethodManager.getInstance(ctx); 336224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 337224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 338988323c57bd25a58f05dfa492d9b9c8ab62c5153satok registerService(TEXT_SERVICES_MANAGER_SERVICE, new ServiceFetcher() { 339988323c57bd25a58f05dfa492d9b9c8ab62c5153satok public Object createService(ContextImpl ctx) { 340988323c57bd25a58f05dfa492d9b9c8ab62c5153satok return TextServicesManager.getInstance(); 341988323c57bd25a58f05dfa492d9b9c8ab62c5153satok }}); 342988323c57bd25a58f05dfa492d9b9c8ab62c5153satok 343224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(KEYGUARD_SERVICE, new ServiceFetcher() { 344224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object getService(ContextImpl ctx) { 345224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // TODO: why isn't this caching it? It wasn't 346224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // before, so I'm preserving the old behavior and 347224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // using getService(), instead of createService() 348224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // which would do the caching. 349224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new KeyguardManager(); 350224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 351224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 352224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(LAYOUT_INFLATER_SERVICE, new ServiceFetcher() { 353224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 354224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return PolicyManager.makeNewLayoutInflater(ctx.getOuterContext()); 355224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 356224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 357224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(LOCATION_SERVICE, new StaticServiceFetcher() { 358224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createStaticService() { 359224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IBinder b = ServiceManager.getService(LOCATION_SERVICE); 360224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new LocationManager(ILocationManager.Stub.asInterface(b)); 361224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 362224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 3631a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey registerService(NETWORK_POLICY_SERVICE, new ServiceFetcher() { 3641a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey @Override 3651a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey public Object createService(ContextImpl ctx) { 3661a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey return new NetworkPolicyManager(INetworkPolicyManager.Stub.asInterface( 3671a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey ServiceManager.getService(NETWORK_POLICY_SERVICE))); 3681a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey } 3691a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey }); 3701a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey 371224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(NOTIFICATION_SERVICE, new ServiceFetcher() { 372224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 373224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick final Context outerContext = ctx.getOuterContext(); 374224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new NotificationManager( 375224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick new ContextThemeWrapper(outerContext, 376d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn Resources.selectSystemTheme(0, 377d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn outerContext.getApplicationInfo().targetSdkVersion, 378d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn com.android.internal.R.style.Theme_Dialog, 3796e90a362bc66cc67b1beae27b21d3f0148403b08Adam Powell com.android.internal.R.style.Theme_Holo_Dialog, 3806e90a362bc66cc67b1beae27b21d3f0148403b08Adam Powell com.android.internal.R.style.Theme_DeviceDefault_Dialog)), 381224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick ctx.mMainThread.getHandler()); 382224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 383224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 3847d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff registerService(NSD_SERVICE, new ServiceFetcher() { 3857d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff @Override 3867d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public Object createService(ContextImpl ctx) { 3877d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff IBinder b = ServiceManager.getService(NSD_SERVICE); 3887d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff INsdManager service = INsdManager.Stub.asInterface(b); 3897d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff return new NsdManager(service); 3907d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff }}); 3917d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 392224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // Note: this was previously cached in a static variable, but 393224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // constructed using mMainThread.getHandler(), so converting 394224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // it to be a regular Context-cached service... 395224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(POWER_SERVICE, new ServiceFetcher() { 396224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 397224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IBinder b = ServiceManager.getService(POWER_SERVICE); 398224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IPowerManager service = IPowerManager.Stub.asInterface(b); 399224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new PowerManager(service, ctx.mMainThread.getHandler()); 400224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 401224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 402224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(SEARCH_SERVICE, new ServiceFetcher() { 403224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 404224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new SearchManager(ctx.getOuterContext(), 405224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick ctx.mMainThread.getHandler()); 406224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 407224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 408224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(SENSOR_SERVICE, new ServiceFetcher() { 409224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 410224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new SensorManager(ctx.mMainThread.getHandler().getLooper()); 411224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 412224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 413224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(STATUS_BAR_SERVICE, new ServiceFetcher() { 414224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 415224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new StatusBarManager(ctx.getOuterContext()); 416224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 417224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 418224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(STORAGE_SERVICE, new ServiceFetcher() { 419224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 420224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick try { 421224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new StorageManager(ctx.mMainThread.getHandler().getLooper()); 422224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } catch (RemoteException rex) { 423224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick Log.e(TAG, "Failed to create StorageManager", rex); 424224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return null; 425224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 426224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 427224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 428224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(TELEPHONY_SERVICE, new ServiceFetcher() { 429224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 430224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new TelephonyManager(ctx.getOuterContext()); 431224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 432224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 433224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(THROTTLE_SERVICE, new StaticServiceFetcher() { 434224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createStaticService() { 435224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IBinder b = ServiceManager.getService(THROTTLE_SERVICE); 436224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new ThrottleManager(IThrottleManager.Stub.asInterface(b)); 437224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 438224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 439224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(UI_MODE_SERVICE, new ServiceFetcher() { 440224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 441224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new UiModeManager(); 442224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 443224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 4443a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood registerService(USB_SERVICE, new ServiceFetcher() { 4453a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public Object createService(ContextImpl ctx) { 446e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood IBinder b = ServiceManager.getService(USB_SERVICE); 4473a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood return new UsbManager(ctx, IUsbManager.Stub.asInterface(b)); 448e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood }}); 449e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 450b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood registerService(SERIAL_SERVICE, new ServiceFetcher() { 451b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood public Object createService(ContextImpl ctx) { 452b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood IBinder b = ServiceManager.getService(SERIAL_SERVICE); 453b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood return new SerialManager(ctx, ISerialManager.Stub.asInterface(b)); 454b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood }}); 455b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 456224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(VIBRATOR_SERVICE, new ServiceFetcher() { 457224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 458224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new Vibrator(); 459224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 460224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 461224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(WALLPAPER_SERVICE, WALLPAPER_FETCHER); 462224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 463224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(WIFI_SERVICE, new ServiceFetcher() { 464224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 465224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IBinder b = ServiceManager.getService(WIFI_SERVICE); 466224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IWifiManager service = IWifiManager.Stub.asInterface(b); 467224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new WifiManager(service, ctx.mMainThread.getHandler()); 468224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 469224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 47055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync registerService(WIFI_P2P_SERVICE, new ServiceFetcher() { 47155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public Object createService(ContextImpl ctx) { 47255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync IBinder b = ServiceManager.getService(WIFI_P2P_SERVICE); 47355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync IWifiP2pManager service = IWifiP2pManager.Stub.asInterface(b); 47455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return new WifiP2pManager(service); 47555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync }}); 47655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 477224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(WINDOW_SERVICE, new ServiceFetcher() { 478224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object getService(ContextImpl ctx) { 4795fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn return WindowManagerImpl.getDefault(ctx.mPackageInfo.mCompatibilityInfo); 480224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 481224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 482224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 4835fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn static ContextImpl getImpl(Context context) { 4845fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn Context nextContext; 4855fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn while ((context instanceof ContextWrapper) && 4865fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn (nextContext=((ContextWrapper)context).getBaseContext()) != null) { 4875fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn context = nextContext; 4885fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn } 4895fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn return (ContextImpl)context; 4905fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn } 4915fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn 492224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // The system service cache for the system services that are 493224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // cached per-ContextImpl. Package-scoped to avoid accessor 494224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // methods. 495224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick final ArrayList<Object> mServiceCache = new ArrayList<Object>(); 496224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AssetManager getAssets() { 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mResources.getAssets(); 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Resources getResources() { 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mResources; 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PackageManager getPackageManager() { 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageManager != null) { 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackageManager; 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IPackageManager pm = ActivityThread.getPackageManager(); 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pm != null) { 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Doesn't matter if we make more than one instance. 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (mPackageManager = new ApplicationPackageManager(this, pm)); 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ContentResolver getContentResolver() { 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mContentResolver; 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Looper getMainLooper() { 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMainThread.getLooper(); 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5315f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Context getApplicationContext() { 534eb9e9ec06167b0caa459f2fb3f3fae094bb8d8f7Christopher Tate return (mPackageInfo != null) ? 535eb9e9ec06167b0caa459f2fb3f3fae094bb8d8f7Christopher Tate mPackageInfo.getApplication() : mMainThread.getApplication(); 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5375f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setTheme(int resid) { 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mThemeResource = resid; 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5425f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 544247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn public int getThemeResId() { 545247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn return mThemeResource; 546247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn } 547247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn 548247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn @Override 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Resources.Theme getTheme() { 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTheme == null) { 551d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn mThemeResource = Resources.selectDefaultTheme(mThemeResource, 552d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn getOuterContext().getApplicationInfo().targetSdkVersion); 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTheme = mResources.newTheme(); 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTheme.applyStyle(mThemeResource, true); 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mTheme; 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ClassLoader getClassLoader() { 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackageInfo != null ? 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageInfo.getClassLoader() : ClassLoader.getSystemClassLoader(); 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getPackageName() { 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackageInfo.getPackageName(); 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Not supported in system context"); 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5745c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn public ApplicationInfo getApplicationInfo() { 5755c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn if (mPackageInfo != null) { 5765c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn return mPackageInfo.getApplicationInfo(); 5775c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn } 5785c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn throw new RuntimeException("Not supported in system context"); 5795c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn } 5805c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn 5815c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn @Override 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getPackageResourcePath() { 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackageInfo.getResDir(); 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Not supported in system context"); 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getPackageCodePath() { 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackageInfo.getAppDir(); 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Not supported in system context"); 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5965f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 59723ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato public File getSharedPrefsFile(String name) { 59823ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato return makeFilename(getPreferencesDir(), name + ".xml"); 59923ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato } 60023ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SharedPreferences getSharedPreferences(String name, int mode) { 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SharedPreferencesImpl sp; 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (sSharedPrefs) { 605333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick sp = sSharedPrefs.get(name); 6066194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick if (sp == null) { 6074cd50b8d76e08d75df1a2e9d4902bcdc880bd1c1Brad Fitzpatrick File prefsFile = getSharedPrefsFile(name); 6084cd50b8d76e08d75df1a2e9d4902bcdc880bd1c1Brad Fitzpatrick sp = new SharedPreferencesImpl(prefsFile, mode); 6096194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick sSharedPrefs.put(name, sp); 6106194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick return sp; 6116194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick } 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6134e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick if ((mode & Context.MODE_MULTI_PROCESS) != 0 || 6144e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick getApplicationInfo().targetSdkVersion < android.os.Build.VERSION_CODES.HONEYCOMB) { 6154e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick // If somebody else (some other process) changed the prefs 6164e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick // file behind our back, we reload it. This has been the 6174e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick // historical (if undocumented) behavior. 6184e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick sp.startReloadIfChangedUnexpectedly(); 6194e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick } 6206194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick return sp; 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File getPreferencesDir() { 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPreferencesDir == null) { 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPreferencesDir = new File(getDataDirFile(), "shared_prefs"); 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPreferencesDir; 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public FileInputStream openFileInput(String name) 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws FileNotFoundException { 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project File f = makeFilename(getFilesDir(), name); 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new FileInputStream(f); 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public FileOutputStream openFileOutput(String name, int mode) 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws FileNotFoundException { 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean append = (mode&MODE_APPEND) != 0; 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project File f = makeFilename(getFilesDir(), name); 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileOutputStream fos = new FileOutputStream(f, append); 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setFilePermissionsFromMode(f.getPath(), mode, 0); 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return fos; 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (FileNotFoundException e) { 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project File parent = f.getParentFile(); 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parent.mkdir(); 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileUtils.setPermissions( 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parent.getPath(), 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH, 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project -1, -1); 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileOutputStream fos = new FileOutputStream(f, append); 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setFilePermissionsFromMode(f.getPath(), mode, 0); 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return fos; 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean deleteFile(String name) { 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project File f = makeFilename(getFilesDir(), name); 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return f.delete(); 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public File getFilesDir() { 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFilesDir == null) { 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFilesDir = new File(getDataDirFile(), "files"); 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mFilesDir.exists()) { 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(!mFilesDir.mkdirs()) { 6765f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer Log.w(TAG, "Unable to create files directory " + mFilesDir.getPath()); 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileUtils.setPermissions( 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFilesDir.getPath(), 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH, 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project -1, -1); 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFilesDir; 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6875f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 689e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn public File getExternalFilesDir(String type) { 690e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn synchronized (mSync) { 691e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn if (mExternalFilesDir == null) { 692e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn mExternalFilesDir = Environment.getExternalStorageAppFilesDirectory( 693e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn getPackageName()); 694e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 695e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn if (!mExternalFilesDir.exists()) { 696e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn try { 697e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn (new File(Environment.getExternalStorageAndroidDataDir(), 698e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn ".nomedia")).createNewFile(); 699e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } catch (IOException e) { 700e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 701e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn if (!mExternalFilesDir.mkdirs()) { 702e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn Log.w(TAG, "Unable to create external files directory"); 703e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn return null; 704e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 705e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 706e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn if (type == null) { 707e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn return mExternalFilesDir; 708e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 709e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn File dir = new File(mExternalFilesDir, type); 710e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn if (!dir.exists()) { 711e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn if (!dir.mkdirs()) { 712e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn Log.w(TAG, "Unable to create external media directory " + dir); 713e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn return null; 714e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 715e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 716e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn return dir; 717e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 718e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 7195f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 720e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn @Override 721805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn public File getObbDir() { 722805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn synchronized (mSync) { 723805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn if (mObbDir == null) { 724805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn mObbDir = Environment.getExternalStorageAppObbDirectory( 725805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn getPackageName()); 726805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn } 727805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn return mObbDir; 728805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn } 729805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn } 730805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn 731805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn @Override 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public File getCacheDir() { 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCacheDir == null) { 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheDir = new File(getDataDirFile(), "cache"); 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mCacheDir.exists()) { 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(!mCacheDir.mkdirs()) { 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unable to create cache directory"); 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileUtils.setPermissions( 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheDir.getPath(), 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH, 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project -1, -1); 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCacheDir; 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7505f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 751e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn @Override 752e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn public File getExternalCacheDir() { 753e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn synchronized (mSync) { 754e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn if (mExternalCacheDir == null) { 755e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn mExternalCacheDir = Environment.getExternalStorageAppCacheDirectory( 756e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn getPackageName()); 757e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 758e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn if (!mExternalCacheDir.exists()) { 759e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn try { 760e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn (new File(Environment.getExternalStorageAndroidDataDir(), 761e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn ".nomedia")).createNewFile(); 762e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } catch (IOException e) { 763e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 764e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn if (!mExternalCacheDir.mkdirs()) { 765e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn Log.w(TAG, "Unable to create external cache directory"); 766e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn return null; 767e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 768e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 769e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn return mExternalCacheDir; 770e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 771e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 7725f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public File getFileStreamPath(String name) { 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return makeFilename(getFilesDir(), name); 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String[] fileList() { 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String[] list = getFilesDir().list(); 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (list != null) ? list : EMPTY_FILE_LIST; 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory) { 78647847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown return openOrCreateDatabase(name, mode, factory, null); 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 79074f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory, 79174f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori DatabaseErrorHandler errorHandler) { 79274f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori File f = validateFilePath(name, true); 79347847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown int flags = SQLiteDatabase.CREATE_IF_NECESSARY; 79447847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown if ((mode & MODE_ENABLE_WRITE_AHEAD_LOGGING) != 0) { 79547847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown flags |= SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING; 79647847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown } 79747847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown SQLiteDatabase db = SQLiteDatabase.openDatabase(f.getPath(), factory, flags, errorHandler); 79874f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori setFilePermissionsFromMode(f.getPath(), mode, 0); 79974f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori return db; 80074f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori } 80174f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori 80274f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori @Override 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean deleteDatabase(String name) { 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 805a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor File f = validateFilePath(name, false); 80679087e4b967d8af26c488c41b8c1a087a12da84dJeff Brown return SQLiteDatabase.deleteDatabase(f); 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public File getDatabasePath(String name) { 814a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor return validateFilePath(name, false); 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String[] databaseList() { 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String[] list = getDatabasesDir().list(); 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (list != null) ? list : EMPTY_FILE_LIST; 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8235f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File getDatabasesDir() { 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDatabasesDir == null) { 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabasesDir = new File(getDataDirFile(), "databases"); 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDatabasesDir.getPath().equals("databases")) { 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabasesDir = new File("/data/system"); 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDatabasesDir; 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8355f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable getWallpaper() { 8384c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn return getWallpaperManager().getDrawable(); 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8428cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn public Drawable peekWallpaper() { 8434c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn return getWallpaperManager().peekDrawable(); 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getWallpaperDesiredMinimumWidth() { 8488cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn return getWallpaperManager().getDesiredMinimumWidth(); 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getWallpaperDesiredMinimumHeight() { 8538cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn return getWallpaperManager().getDesiredMinimumHeight(); 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setWallpaper(Bitmap bitmap) throws IOException { 8584c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn getWallpaperManager().setBitmap(bitmap); 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setWallpaper(InputStream data) throws IOException { 8634c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn getWallpaperManager().setStream(data); 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void clearWallpaper() throws IOException { 8688cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn getWallpaperManager().clear(); 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startActivity(Intent intent) { 873a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn startActivity(intent, null); 874a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn } 875a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn 876a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn @Override 877a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn public void startActivity(Intent intent, Bundle options) { 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new AndroidRuntimeException( 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Calling startActivity() from outside of an Activity " 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " context requires the FLAG_ACTIVITY_NEW_TASK flag." 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " Is this really what you want?"); 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getInstrumentation().execStartActivity( 8856e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn getOuterContext(), mMainThread.getApplicationThread(), null, 886a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn (Activity)null, intent, -1, options); 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 890621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn public void startActivities(Intent[] intents) { 891a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn startActivities(intents, null); 892a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn } 893a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn 894a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn @Override 895a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn public void startActivities(Intent[] intents, Bundle options) { 896621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if ((intents[0].getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { 897621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn throw new AndroidRuntimeException( 898621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn "Calling startActivities() from outside of an Activity " 899621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn + " context requires the FLAG_ACTIVITY_NEW_TASK flag on first Intent." 900621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn + " Is this really what you want?"); 901621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 902621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn mMainThread.getInstrumentation().execStartActivities( 903621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn getOuterContext(), mMainThread.getApplicationThread(), null, 904a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn (Activity)null, intents, options); 905621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 906621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 907621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn @Override 908fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn public void startIntentSender(IntentSender intent, 909fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags) 910fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn throws IntentSender.SendIntentException { 911a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn startIntentSender(intent, fillInIntent, flagsMask, flagsValues, extraFlags, null); 912a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn } 913a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn 914a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn @Override 915a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn public void startIntentSender(IntentSender intent, Intent fillInIntent, 916a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn int flagsMask, int flagsValues, int extraFlags, Bundle options) 917a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn throws IntentSender.SendIntentException { 918fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn try { 919fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn String resolvedType = null; 920fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn if (fillInIntent != null) { 9219ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn fillInIntent.setAllowFds(false); 922fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn resolvedType = fillInIntent.resolveTypeIfNeeded(getContentResolver()); 923fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn } 924fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn int result = ActivityManagerNative.getDefault() 925fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn .startActivityIntentSender(mMainThread.getApplicationThread(), intent, 926fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn fillInIntent, resolvedType, null, null, 927a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn 0, flagsMask, flagsValues, options); 928a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn if (result == ActivityManager.START_CANCELED) { 929fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn throw new IntentSender.SendIntentException(); 930fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn } 931fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn Instrumentation.checkStartActivityResult(result, null); 932fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn } catch (RemoteException e) { 933fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn } 934fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn } 9355f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 936fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn @Override 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void sendBroadcast(Intent intent) { 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 9409ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn intent.setAllowFds(false); 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().broadcastIntent( 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), intent, resolvedType, null, 943742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani Activity.RESULT_OK, null, null, null, false, false, 944742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani Binder.getOrigCallingUser()); 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 94967cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani /** @hide */ 95067cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani @Override 95167cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani public void sendBroadcast(Intent intent, int userId) { 95267cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 95367cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani try { 95467cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani intent.setAllowFds(false); 95567cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani ActivityManagerNative.getDefault().broadcastIntent(mMainThread.getApplicationThread(), 95667cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani intent, resolvedType, null, Activity.RESULT_OK, null, null, null, false, false, 95767cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani userId); 95867cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani } catch (RemoteException e) { 95967cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani } 96067cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani } 96167cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void sendBroadcast(Intent intent, String receiverPermission) { 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 9669ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn intent.setAllowFds(false); 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().broadcastIntent( 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), intent, resolvedType, null, 969742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani Activity.RESULT_OK, null, null, receiverPermission, false, false, 970742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani Binder.getOrigCallingUser()); 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void sendOrderedBroadcast(Intent intent, 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String receiverPermission) { 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 9809ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn intent.setAllowFds(false); 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().broadcastIntent( 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), intent, resolvedType, null, 983742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani Activity.RESULT_OK, null, null, receiverPermission, true, false, 984742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani Binder.getOrigCallingUser()); 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void sendOrderedBroadcast(Intent intent, 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String receiverPermission, BroadcastReceiver resultReceiver, 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Handler scheduler, int initialCode, String initialData, 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle initialExtras) { 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IIntentReceiver rd = null; 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resultReceiver != null) { 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scheduler == null) { 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scheduler = mMainThread.getHandler(); 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rd = mPackageInfo.getReceiverDispatcher( 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resultReceiver, getOuterContext(), scheduler, 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getInstrumentation(), false); 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scheduler == null) { 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scheduler = mMainThread.getHandler(); 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 100701e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn rd = new LoadedApk.ReceiverDispatcher( 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver(); 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 10139ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn intent.setAllowFds(false); 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().broadcastIntent( 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), intent, resolvedType, rd, 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project initialCode, initialData, initialExtras, receiverPermission, 1017742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani true, false, Binder.getOrigCallingUser()); 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void sendStickyBroadcast(Intent intent) { 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 10269ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn intent.setAllowFds(false); 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().broadcastIntent( 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), intent, resolvedType, null, 1029742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani Activity.RESULT_OK, null, null, null, false, true, 1030742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani Binder.getOrigCallingUser()); 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1036efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn public void sendStickyOrderedBroadcast(Intent intent, 1037efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn BroadcastReceiver resultReceiver, 1038efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn Handler scheduler, int initialCode, String initialData, 1039efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn Bundle initialExtras) { 1040efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn IIntentReceiver rd = null; 1041efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn if (resultReceiver != null) { 1042efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn if (mPackageInfo != null) { 1043efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn if (scheduler == null) { 1044efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn scheduler = mMainThread.getHandler(); 1045efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } 1046efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn rd = mPackageInfo.getReceiverDispatcher( 1047efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn resultReceiver, getOuterContext(), scheduler, 1048efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn mMainThread.getInstrumentation(), false); 1049efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } else { 1050efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn if (scheduler == null) { 1051efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn scheduler = mMainThread.getHandler(); 1052efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } 105301e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn rd = new LoadedApk.ReceiverDispatcher( 1054efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver(); 1055efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } 1056efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } 1057efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 1058efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn try { 10599ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn intent.setAllowFds(false); 1060efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn ActivityManagerNative.getDefault().broadcastIntent( 1061efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn mMainThread.getApplicationThread(), intent, resolvedType, rd, 1062efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn initialCode, initialData, initialExtras, null, 1063742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani true, true, Binder.getOrigCallingUser()); 1064efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } catch (RemoteException e) { 1065efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } 1066efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } 1067efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn 1068efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn @Override 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeStickyBroadcast(Intent intent) { 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resolvedType != null) { 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent = new Intent(intent); 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.setDataAndType(intent.getData(), resolvedType); 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 10769ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn intent.setAllowFds(false); 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().unbroadcastIntent( 1078742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani mMainThread.getApplicationThread(), intent, Binder.getOrigCallingUser()); 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) { 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return registerReceiver(receiver, filter, null, null); 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String broadcastPermission, Handler scheduler) { 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return registerReceiverInternal(receiver, filter, broadcastPermission, 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scheduler, getOuterContext()); 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Intent registerReceiverInternal(BroadcastReceiver receiver, 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IntentFilter filter, String broadcastPermission, 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Handler scheduler, Context context) { 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IIntentReceiver rd = null; 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (receiver != null) { 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null && context != null) { 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scheduler == null) { 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scheduler = mMainThread.getHandler(); 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rd = mPackageInfo.getReceiverDispatcher( 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project receiver, context, scheduler, 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getInstrumentation(), true); 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scheduler == null) { 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scheduler = mMainThread.getHandler(); 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 111101e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn rd = new LoadedApk.ReceiverDispatcher( 1112399cccb85749e02f6d3e12d1d2846310e7cbfdf1Dianne Hackborn receiver, context, scheduler, null, true).getIIntentReceiver(); 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ActivityManagerNative.getDefault().registerReceiver( 11176c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn mMainThread.getApplicationThread(), mBasePackageName, 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rd, filter, broadcastPermission); 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unregisterReceiver(BroadcastReceiver receiver) { 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IIntentReceiver rd = mPackageInfo.forgetReceiverDispatcher( 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getOuterContext(), receiver); 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().unregisterReceiver(rd); 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Not supported in system context"); 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 ComponentName startService(Intent service) { 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 11419ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn service.setAllowFds(false); 11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ComponentName cn = ActivityManagerNative.getDefault().startService( 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), service, 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project service.resolveTypeIfNeeded(getContentResolver())); 11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cn != null && cn.getPackageName().equals("!")) { 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException( 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Not allowed to start service " + service 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " without permission " + cn.getClassName()); 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return cn; 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean stopService(Intent service) { 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 11599ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn service.setAllowFds(false); 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int res = ActivityManagerNative.getDefault().stopService( 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), service, 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project service.resolveTypeIfNeeded(getContentResolver())); 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res < 0) { 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException( 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Not allowed to stop service " + service); 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res != 0; 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean bindService(Intent service, ServiceConnection conn, 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags) { 117637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani return bindService(service, conn, flags, UserId.getUserId(Process.myUid())); 117737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani } 117837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani 117937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani /** @hide */ 118037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani @Override 118137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani public boolean bindService(Intent service, ServiceConnection conn, int flags, int userId) { 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IServiceConnection sd; 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sd = mPackageInfo.getServiceDispatcher(conn, getOuterContext(), 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getHandler(), flags); 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Not supported in system context"); 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1190c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn IBinder token = getActivityToken(); 1191c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn if (token == null && (flags&BIND_AUTO_CREATE) == 0 && mPackageInfo != null 1192c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn && mPackageInfo.getApplicationInfo().targetSdkVersion 1193c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn < android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 1194c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn flags |= BIND_WAIVE_PRIORITY; 1195c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn } 11969ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn service.setAllowFds(false); 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int res = ActivityManagerNative.getDefault().bindService( 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), getActivityToken(), 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project service, service.resolveTypeIfNeeded(getContentResolver()), 120037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani sd, flags, userId); 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res < 0) { 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException( 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Not allowed to bind to service " + service); 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res != 0; 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unbindService(ServiceConnection conn) { 12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IServiceConnection sd = mPackageInfo.forgetServiceDispatcher( 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getOuterContext(), conn); 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().unbindService(sd); 12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Not supported in system context"); 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean startInstrumentation(ComponentName className, 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String profileFile, Bundle arguments) { 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 12299ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn if (arguments != null) { 12309ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn arguments.setAllowFds(false); 12319ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn } 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ActivityManagerNative.getDefault().startInstrumentation( 12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project className, profileFile, 0, arguments, null); 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // System has crashed, nothing we can do. 12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Object getSystemService(String name) { 1242224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name); 1243224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return fetcher == null ? null : fetcher.getService(this); 12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12468cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn private WallpaperManager getWallpaperManager() { 1247224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return (WallpaperManager) WALLPAPER_FETCHER.getService(this); 12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1250438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick /* package */ static DropBoxManager createDropBoxManager() { 1251438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick IBinder b = ServiceManager.getService(DROPBOX_SERVICE); 1252438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick IDropBoxManagerService service = IDropBoxManagerService.Stub.asInterface(b); 1253ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick if (service == null) { 1254ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick // Don't return a DropBoxManager that will NPE upon use. 1255ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick // This also avoids caching a broken DropBoxManager in 1256ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick // getDropBoxManager during early boot, before the 1257ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick // DROPBOX_SERVICE is registered. 1258ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick return null; 1259ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick } 1260438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick return new DropBoxManager(service); 1261438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick } 1262438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int checkPermission(String permission, int pid, int uid) { 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (permission == null) { 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("permission is null"); 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ActivityManagerNative.getDefault().checkPermission( 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project permission, pid, uid); 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.PERMISSION_DENIED; 12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int checkCallingPermission(String permission) { 12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (permission == null) { 12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("permission is null"); 12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pid = Binder.getCallingPid(); 12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pid != Process.myPid()) { 1285742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani return checkPermission(permission, pid, Binder.getCallingUid()); 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.PERMISSION_DENIED; 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int checkCallingOrSelfPermission(String permission) { 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (permission == null) { 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("permission is null"); 12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return checkPermission(permission, Binder.getCallingPid(), 12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingUid()); 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void enforce( 13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String permission, int resultOfCheck, 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean selfToo, int uid, String message) { 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resultOfCheck != PackageManager.PERMISSION_GRANTED) { 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException( 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (message != null ? (message + ": ") : "") + 13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (selfToo 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? "Neither user " + uid + " nor current process has " 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : "User " + uid + " does not have ") + 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project permission + 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "."); 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforcePermission( 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String permission, int pid, int uid, String message) { 13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforce(permission, 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkPermission(permission, pid, uid), 13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false, 13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uid, 13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project message); 13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceCallingPermission(String permission, String message) { 13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforce(permission, 13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkCallingPermission(permission), 13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false, 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingUid(), 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project message); 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceCallingOrSelfPermission( 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String permission, String message) { 13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforce(permission, 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkCallingOrSelfPermission(permission), 13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project true, 13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingUid(), 13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project message); 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void grantUriPermission(String toPackage, Uri uri, int modeFlags) { 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().grantUriPermission( 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), toPackage, uri, 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project modeFlags); 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void revokeUriPermission(Uri uri, int modeFlags) { 13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().revokeUriPermission( 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), uri, 13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project modeFlags); 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int checkUriPermission(Uri uri, int pid, int uid, int modeFlags) { 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ActivityManagerNative.getDefault().checkUriPermission( 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uri, pid, uid, modeFlags); 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.PERMISSION_DENIED; 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int checkCallingUriPermission(Uri uri, int modeFlags) { 13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pid = Binder.getCallingPid(); 13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pid != Process.myPid()) { 13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return checkUriPermission(uri, pid, 13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingUid(), modeFlags); 13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.PERMISSION_DENIED; 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int checkCallingOrSelfUriPermission(Uri uri, int modeFlags) { 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return checkUriPermission(uri, Binder.getCallingPid(), 13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingUid(), modeFlags); 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int checkUriPermission(Uri uri, String readPermission, 13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String writePermission, int pid, int uid, int modeFlags) { 1389569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima if (DEBUG) { 13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i("foo", "checkUriPermission: uri=" + uri + "readPermission=" 13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + readPermission + " writePermission=" + writePermission 13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " pid=" + pid + " uid=" + uid + " mode" + modeFlags); 13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((modeFlags&Intent.FLAG_GRANT_READ_URI_PERMISSION) != 0) { 13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (readPermission == null 13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || checkPermission(readPermission, pid, uid) 13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project == PackageManager.PERMISSION_GRANTED) { 13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.PERMISSION_GRANTED; 13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((modeFlags&Intent.FLAG_GRANT_WRITE_URI_PERMISSION) != 0) { 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (writePermission == null 14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || checkPermission(writePermission, pid, uid) 14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project == PackageManager.PERMISSION_GRANTED) { 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.PERMISSION_GRANTED; 14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return uri != null ? checkUriPermission(uri, pid, uid, modeFlags) 14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : PackageManager.PERMISSION_DENIED; 14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String uriModeFlagToString(int uriModeFlags) { 14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (uriModeFlags) { 14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case Intent.FLAG_GRANT_READ_URI_PERMISSION | 14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent.FLAG_GRANT_WRITE_URI_PERMISSION: 14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "read and write"; 14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case Intent.FLAG_GRANT_READ_URI_PERMISSION: 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "read"; 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case Intent.FLAG_GRANT_WRITE_URI_PERMISSION: 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "write"; 14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException( 14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Unknown permission mode flags: " + uriModeFlags); 14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void enforceForUri( 14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int modeFlags, int resultOfCheck, boolean selfToo, 14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int uid, Uri uri, String message) { 14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resultOfCheck != PackageManager.PERMISSION_GRANTED) { 14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException( 14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (message != null ? (message + ": ") : "") + 14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (selfToo 14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? "Neither user " + uid + " nor current process has " 14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : "User " + uid + " does not have ") + 14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uriModeFlagToString(modeFlags) + 14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " permission on " + 14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uri + 14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "."); 14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceUriPermission( 14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri uri, int pid, int uid, int modeFlags, String message) { 14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceForUri( 14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project modeFlags, checkUriPermission(uri, pid, uid, modeFlags), 14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false, uid, uri, message); 14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceCallingUriPermission( 14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri uri, int modeFlags, String message) { 14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceForUri( 14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project modeFlags, checkCallingUriPermission(uri, modeFlags), 1453742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani false, 1454742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani Binder.getCallingUid(), uri, message); 14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceCallingOrSelfUriPermission( 14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri uri, int modeFlags, String message) { 14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceForUri( 14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project modeFlags, 14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkCallingOrSelfUriPermission(uri, modeFlags), true, 14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingUid(), uri, message); 14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceUriPermission( 14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri uri, String readPermission, String writePermission, 14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pid, int uid, int modeFlags, String message) { 14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceForUri(modeFlags, 14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkUriPermission( 14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uri, readPermission, writePermission, pid, uid, 14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project modeFlags), 14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false, 14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uid, 14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uri, 14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project message); 14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Context createPackageContext(String packageName, int flags) 14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws PackageManager.NameNotFoundException { 14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (packageName.equals("system") || packageName.equals("android")) { 14822155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn return new ContextImpl(mMainThread.getSystemContext()); 14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 148501e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn LoadedApk pi = 1486e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn mMainThread.getPackageInfo(packageName, mResources.getCompatibilityInfo(), flags); 14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pi != null) { 14882155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn ContextImpl c = new ContextImpl(); 1489870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy c.mRestricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED; 14906c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn c.init(pi, null, mMainThread, mResources, mBasePackageName); 14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c.mResources != null) { 14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return c; 14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Should be a better exception. 14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new PackageManager.NameNotFoundException( 14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Application package " + packageName + " not found"); 14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1501870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy @Override 1502870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy public boolean isRestricted() { 1503870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy return mRestricted; 1504870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy } 1505870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy 15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File getDataDirFile() { 15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackageInfo.getDataDirFile(); 15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Not supported in system context"); 15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public File getDir(String name, int mode) { 15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project name = "app_" + name; 15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project File file = makeFilename(getDataDirFile(), name); 15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!file.exists()) { 15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project file.mkdir(); 15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setFilePermissionsFromMode(file.getPath(), mode, 15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH); 15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return file; 15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15252155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn static ContextImpl createSystemContext(ActivityThread mainThread) { 15262155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn ContextImpl context = new ContextImpl(); 15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project context.init(Resources.getSystem(), mainThread); 15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return context; 15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15312155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn ContextImpl() { 15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOuterContext = this; 15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a new ApplicationContext from an existing one. The new one 15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * works and operates the same as the one it is copying. 15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context Existing application context. 15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15412155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn public ContextImpl(ContextImpl context) { 15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageInfo = context.mPackageInfo; 15436c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn mBasePackageName = context.mBasePackageName; 15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResources = context.mResources; 15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread = context.mMainThread; 15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContentResolver = context.mContentResolver; 15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOuterContext = this; 15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 155001e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn final void init(LoadedApk packageInfo, 15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder activityToken, ActivityThread mainThread) { 15526c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn init(packageInfo, activityToken, mainThread, null, null); 1553ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima } 1554ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima 155501e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn final void init(LoadedApk packageInfo, 1556ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima IBinder activityToken, ActivityThread mainThread, 15576c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn Resources container, String basePackageName) { 15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageInfo = packageInfo; 15596c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn mBasePackageName = basePackageName != null ? basePackageName : packageInfo.mPackageName; 15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResources = mPackageInfo.getResources(mainThread); 1561ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima 1562559a78753165f20d5973b958791056154baecc43Dianne Hackborn if (mResources != null && container != null 1563559a78753165f20d5973b958791056154baecc43Dianne Hackborn && container.getCompatibilityInfo().applicationScale != 1564559a78753165f20d5973b958791056154baecc43Dianne Hackborn mResources.getCompatibilityInfo().applicationScale) { 1565ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima if (DEBUG) { 1566ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima Log.d(TAG, "loaded context has different scaling. Using container's" + 1567ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima " compatiblity info:" + container.getDisplayMetrics()); 1568ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima } 1569ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima mResources = mainThread.getTopLevelResources( 1570e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn mPackageInfo.getResDir(), container.getCompatibilityInfo()); 1571ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima } 15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread = mainThread; 15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContentResolver = new ApplicationContentResolver(this, mainThread); 15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setActivityToken(activityToken); 15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final void init(Resources resources, ActivityThread mainThread) { 15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageInfo = null; 15806c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn mBasePackageName = null; 15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResources = resources; 15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread = mainThread; 15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContentResolver = new ApplicationContentResolver(this, mainThread); 15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final void scheduleFinalCleanup(String who, String what) { 15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.scheduleContextCleanup(this, who, what); 15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final void performFinalCleanup(String who, String what) { 15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.i(TAG, "Cleanup up context: " + this); 15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageInfo.removeContextRegistrations(getOuterContext(), who, what); 15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Context getReceiverRestrictedContext() { 15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mReceiverRestrictedContext != null) { 15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mReceiverRestrictedContext; 15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mReceiverRestrictedContext = new ReceiverRestrictedContext(getOuterContext()); 16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final void setActivityToken(IBinder token) { 16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivityToken = token; 16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16055f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final void setOuterContext(Context context) { 16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOuterContext = context; 16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16095f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Context getOuterContext() { 16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mOuterContext; 16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16135f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final IBinder getActivityToken() { 16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mActivityToken; 16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1618d3da44032084b6dd280487280553dcdbd7933e3eBrad Fitzpatrick static void setFilePermissionsFromMode(String name, int mode, 16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int extraPermissions) { 16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int perms = FileUtils.S_IRUSR|FileUtils.S_IWUSR 16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project |FileUtils.S_IRGRP|FileUtils.S_IWGRP 16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project |extraPermissions; 16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mode&MODE_WORLD_READABLE) != 0) { 16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perms |= FileUtils.S_IROTH; 16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mode&MODE_WORLD_WRITEABLE) != 0) { 16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perms |= FileUtils.S_IWOTH; 16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1629569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima if (DEBUG) { 16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(TAG, "File " + name + ": mode=0x" + Integer.toHexString(mode) 16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", perms=0x" + Integer.toHexString(perms)); 16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileUtils.setPermissions(name, perms, -1, -1); 16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1636a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor private File validateFilePath(String name, boolean createDirectory) { 1637a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor File dir; 1638a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor File f; 1639a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor 1640a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor if (name.charAt(0) == File.separatorChar) { 1641a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor String dirPath = name.substring(0, name.lastIndexOf(File.separatorChar)); 1642a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor dir = new File(dirPath); 1643a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor name = name.substring(name.lastIndexOf(File.separatorChar)); 1644a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor f = new File(dir, name); 1645a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor } else { 1646a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor dir = getDatabasesDir(); 1647a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor f = makeFilename(dir, name); 1648a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor } 1649a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor 1650a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor if (createDirectory && !dir.isDirectory() && dir.mkdir()) { 1651a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor FileUtils.setPermissions(dir.getPath(), 1652a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH, 1653a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor -1, -1); 1654a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor } 1655a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor 1656a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor return f; 1657a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor } 1658a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor 16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File makeFilename(File base, String name) { 16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name.indexOf(File.separatorChar) < 0) { 16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new File(base, name); 16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException( 1664a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor "File " + name + " contains a path separator"); 16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ---------------------------------------------------------------------- 16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ---------------------------------------------------------------------- 16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ---------------------------------------------------------------------- 16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final class ApplicationContentResolver extends ContentResolver { 1672cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn public ApplicationContentResolver(Context context, ActivityThread mainThread) { 16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context); 16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread = mainThread; 16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1678cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn protected IContentProvider acquireProvider(Context context, String name) { 16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMainThread.acquireProvider(context, name); 16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1683cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn protected IContentProvider acquireExistingProvider(Context context, String name) { 1684cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn return mMainThread.acquireExistingProvider(context, name); 1685cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn } 1686cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn 1687cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn @Override 1688cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn public boolean releaseProvider(IContentProvider provider) { 16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMainThread.releaseProvider(provider); 16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16915f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final ActivityThread mMainThread; 16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1695