ContextImpl.java revision 5fd2169eabd77e6bfafaf456e58051a3bafb2bca
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; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.hardware.SensorManager; 46c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodimport android.hardware.usb.IUsbManager; 47c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodimport android.hardware.usb.UsbManager; 48a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.location.CountryDetector; 49a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.location.ICountryDetector; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.location.ILocationManager; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.location.LocationManager; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.AudioManager; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.ConnectivityManager; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.IConnectivityManager; 55c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriffimport android.net.ThrottleManager; 56c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriffimport android.net.IThrottleManager; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.wifi.IWifiManager; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.wifi.WifiManager; 6050b4d8f643f31b37e9872f562fb869059cf79c8aNick Pellyimport android.nfc.NfcManager; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder; 62c63806d852a550d82bbe6cadff8a2139d78ed559Adam Powellimport android.os.Build; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 64f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnorimport android.os.DropBoxManager; 65539d3c475f44b1499499a8b70375a192545cf113Oscar Montemayorimport android.os.Environment; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.FileUtils; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IPowerManager; 7075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.Looper; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.PowerManager; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process; 7375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.RemoteException; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Vibrator; 76b104340496e3a531e26c8f428c808eca0e039f50San Mehatimport android.os.storage.StorageManager; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.TelephonyManager; 789f53119b72e6da865bcd53173d3dacd1eba01aeeDianne Hackbornimport android.content.ClipboardManager; 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AndroidRuntimeException; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ContextThemeWrapper; 825be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackbornimport android.view.Display; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManagerImpl; 8475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.view.accessibility.AccessibilityManager; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.InputMethodManager; 86603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintanaimport android.accounts.AccountManager; 87603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintanaimport android.accounts.IAccountManager; 8887bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackbornimport android.app.admin.DevicePolicyManager; 89f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnorimport com.android.internal.os.IDropBoxManagerService; 90952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileNotFoundException; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass ReceiverRestrictedContext extends ContextWrapper { 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ReceiverRestrictedContext(Context base) { 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(base); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) { 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return registerReceiver(receiver, filter, null, null); 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String broadcastPermission, Handler scheduler) { 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ReceiverCallNotAllowedException( 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "IntentReceiver components are not allowed to register to receive intents"); 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //ex.fillInStackTrace(); 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.e("IntentReceiver", ex.getMessage(), ex); 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //return mContext.registerReceiver(receiver, filter, broadcastPermission, 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // scheduler); 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean bindService(Intent service, ServiceConnection conn, int flags) { 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ReceiverCallNotAllowedException( 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "IntentReceiver components are not allowed to bind to services"); 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.bindService(service, interfaceName, conn, flags); 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 1322155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn * Common implementation of Context API, which provides the base 1332155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn * context object for Activity and other application components. 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1352155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackbornclass ContextImpl extends Context { 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final static String TAG = "ApplicationContext"; 137569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima private final static boolean DEBUG = false; 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 139333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick private static final HashMap<String, SharedPreferencesImpl> sSharedPrefs = 140333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick new HashMap<String, SharedPreferencesImpl>(); 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14201e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn /*package*/ LoadedApk mPackageInfo; 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Resources mResources; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ ActivityThread mMainThread; 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Context mOuterContext; 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private IBinder mActivityToken = null; 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ApplicationContentResolver mContentResolver; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mThemeResource = 0; 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Resources.Theme mTheme = null; 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private PackageManager mPackageManager; 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Context mReceiverRestrictedContext = null; 152870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy private boolean mRestricted; 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Object mSync = new Object(); 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File mDatabasesDir; 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File mPreferencesDir; 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File mFilesDir; 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File mCacheDir; 160805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn private File mObbDir; 161e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn private File mExternalFilesDir; 162e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn private File mExternalCacheDir; 1635f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String[] EMPTY_FILE_LIST = {}; 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 166224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick /** 167224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick * Override this class when the system service constructor needs a 168224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick * ContextImpl. Else, use StaticServiceFetcher below. 169224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick */ 170224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick /*package*/ static class ServiceFetcher { 171224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick int mContextCacheIndex = -1; 172224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 173224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick /** 174224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick * Main entrypoint; only override if you don't need caching. 175224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick */ 176224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object getService(ContextImpl ctx) { 177224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick ArrayList<Object> cache = ctx.mServiceCache; 178224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick Object service; 179224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick synchronized (cache) { 180224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick if (cache.size() == 0) { 181224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // Initialize the cache vector on first access. 182224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // At this point sNextPerContextServiceCacheIndex 183224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // is the number of potential services that are 184224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // cached per-Context. 185224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick for (int i = 0; i < sNextPerContextServiceCacheIndex; i++) { 186224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick cache.add(null); 187224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 188224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } else { 189224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick service = cache.get(mContextCacheIndex); 190224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick if (service != null) { 191224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return service; 192224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 193224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 194224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick service = createService(ctx); 195224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick cache.set(mContextCacheIndex, service); 196224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return service; 197224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 198224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 199224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 200224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick /** 201224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick * Override this to create a new per-Context instance of the 202224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick * service. getService() will handle locking and caching. 203224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick */ 204224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 205224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick throw new RuntimeException("Not implemented"); 206224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 207224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 208224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 209224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick /** 210224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick * Override this class for services to be cached process-wide. 211224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick */ 212224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick abstract static class StaticServiceFetcher extends ServiceFetcher { 213224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick private Object mCachedInstance; 214224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 215224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick @Override 216224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public final Object getService(ContextImpl unused) { 217224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick synchronized (StaticServiceFetcher.this) { 218224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick Object service = mCachedInstance; 219224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick if (service != null) { 220224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return service; 221224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 222224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return mCachedInstance = createStaticService(); 223224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 224224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 225224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 226224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public abstract Object createStaticService(); 227224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 228224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 229224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick private static final HashMap<String, ServiceFetcher> SYSTEM_SERVICE_MAP = 230224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick new HashMap<String, ServiceFetcher>(); 231224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 232224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick private static int sNextPerContextServiceCacheIndex = 0; 233224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick private static void registerService(String serviceName, ServiceFetcher fetcher) { 234224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick if (!(fetcher instanceof StaticServiceFetcher)) { 235224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick fetcher.mContextCacheIndex = sNextPerContextServiceCacheIndex++; 236224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 237224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick SYSTEM_SERVICE_MAP.put(serviceName, fetcher); 238224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 239224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 240224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // This one's defined separately and given a variable name so it 241224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // can be re-used by getWallpaperManager(), avoiding a HashMap 242224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // lookup. 243224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick private static ServiceFetcher WALLPAPER_FETCHER = new ServiceFetcher() { 244224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 245224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new WallpaperManager(ctx.getOuterContext(), 246224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick ctx.mMainThread.getHandler()); 247224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}; 248224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 249224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick static { 250224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(ACCESSIBILITY_SERVICE, new ServiceFetcher() { 251224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object getService(ContextImpl ctx) { 252224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return AccessibilityManager.getInstance(ctx); 253224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 254224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 255224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(ACCOUNT_SERVICE, new ServiceFetcher() { 256224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 257224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IBinder b = ServiceManager.getService(ACCOUNT_SERVICE); 258224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IAccountManager service = IAccountManager.Stub.asInterface(b); 259224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new AccountManager(ctx, service); 260224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 261224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 262224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(ACTIVITY_SERVICE, new ServiceFetcher() { 263224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 264224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new ActivityManager(ctx.getOuterContext(), ctx.mMainThread.getHandler()); 265224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 266224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 267224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(ALARM_SERVICE, new StaticServiceFetcher() { 268224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createStaticService() { 269224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IBinder b = ServiceManager.getService(ALARM_SERVICE); 270224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IAlarmManager service = IAlarmManager.Stub.asInterface(b); 271224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new AlarmManager(service); 272224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 273224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 274224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(AUDIO_SERVICE, new ServiceFetcher() { 275224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 276224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new AudioManager(ctx); 277224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 278224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 279224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(CLIPBOARD_SERVICE, new ServiceFetcher() { 280224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 281224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new ClipboardManager(ctx.getOuterContext(), 282224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick ctx.mMainThread.getHandler()); 283224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 284224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 285224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(CONNECTIVITY_SERVICE, new StaticServiceFetcher() { 286224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createStaticService() { 287224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IBinder b = ServiceManager.getService(CONNECTIVITY_SERVICE); 288224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new ConnectivityManager(IConnectivityManager.Stub.asInterface(b)); 289224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 290224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 291224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(COUNTRY_DETECTOR, new StaticServiceFetcher() { 292224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createStaticService() { 293224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IBinder b = ServiceManager.getService(COUNTRY_DETECTOR); 294224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new CountryDetector(ICountryDetector.Stub.asInterface(b)); 295224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 296224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 297224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(DEVICE_POLICY_SERVICE, new ServiceFetcher() { 298224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 299224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return DevicePolicyManager.create(ctx, ctx.mMainThread.getHandler()); 300224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 301224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 302224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(DOWNLOAD_SERVICE, new ServiceFetcher() { 303224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 304224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new DownloadManager(ctx.getContentResolver(), ctx.getPackageName()); 305224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 306224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 307d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly registerService(NFC_SERVICE, new ServiceFetcher() { 308d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly public Object createService(ContextImpl ctx) { 309d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly return new NfcManager(ctx); 310d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly }}); 311d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly 312224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(DROPBOX_SERVICE, new StaticServiceFetcher() { 313224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createStaticService() { 314224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return createDropBoxManager(); 315224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 316224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 317224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(INPUT_METHOD_SERVICE, new ServiceFetcher() { 318224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 319224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return InputMethodManager.getInstance(ctx); 320224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 321224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 322224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(KEYGUARD_SERVICE, new ServiceFetcher() { 323224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object getService(ContextImpl ctx) { 324224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // TODO: why isn't this caching it? It wasn't 325224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // before, so I'm preserving the old behavior and 326224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // using getService(), instead of createService() 327224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // which would do the caching. 328224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new KeyguardManager(); 329224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 330224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 331224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(LAYOUT_INFLATER_SERVICE, new ServiceFetcher() { 332224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 333224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return PolicyManager.makeNewLayoutInflater(ctx.getOuterContext()); 334224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 335224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 336224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(LOCATION_SERVICE, new StaticServiceFetcher() { 337224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createStaticService() { 338224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IBinder b = ServiceManager.getService(LOCATION_SERVICE); 339224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new LocationManager(ILocationManager.Stub.asInterface(b)); 340224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 341224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 342224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(NOTIFICATION_SERVICE, new ServiceFetcher() { 343224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 344224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick final Context outerContext = ctx.getOuterContext(); 345224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new NotificationManager( 346224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick new ContextThemeWrapper(outerContext, 347d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn Resources.selectSystemTheme(0, 348d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn outerContext.getApplicationInfo().targetSdkVersion, 349d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn com.android.internal.R.style.Theme_Dialog, 350d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn com.android.internal.R.style.Theme_Holo_Dialog)), 351224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick ctx.mMainThread.getHandler()); 352224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 353224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 354224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // Note: this was previously cached in a static variable, but 355224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // constructed using mMainThread.getHandler(), so converting 356224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // it to be a regular Context-cached service... 357224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(POWER_SERVICE, new ServiceFetcher() { 358224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 359224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IBinder b = ServiceManager.getService(POWER_SERVICE); 360224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IPowerManager service = IPowerManager.Stub.asInterface(b); 361224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new PowerManager(service, ctx.mMainThread.getHandler()); 362224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 363224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 364224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(SEARCH_SERVICE, new ServiceFetcher() { 365224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 366224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new SearchManager(ctx.getOuterContext(), 367224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick ctx.mMainThread.getHandler()); 368224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 369224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 370224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(SENSOR_SERVICE, new ServiceFetcher() { 371224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 372224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new SensorManager(ctx.mMainThread.getHandler().getLooper()); 373224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 374224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 375224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(STATUS_BAR_SERVICE, new ServiceFetcher() { 376224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 377224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new StatusBarManager(ctx.getOuterContext()); 378224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 379224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 380224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(STORAGE_SERVICE, new ServiceFetcher() { 381224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 382224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick try { 383224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new StorageManager(ctx.mMainThread.getHandler().getLooper()); 384224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } catch (RemoteException rex) { 385224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick Log.e(TAG, "Failed to create StorageManager", rex); 386224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return null; 387224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 388224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 389224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 390224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(TELEPHONY_SERVICE, new ServiceFetcher() { 391224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 392224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new TelephonyManager(ctx.getOuterContext()); 393224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 394224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 395224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(THROTTLE_SERVICE, new StaticServiceFetcher() { 396224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createStaticService() { 397224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IBinder b = ServiceManager.getService(THROTTLE_SERVICE); 398224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new ThrottleManager(IThrottleManager.Stub.asInterface(b)); 399224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 400224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 401224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(UI_MODE_SERVICE, new ServiceFetcher() { 402224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 403224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new UiModeManager(); 404224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 405224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 4063a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood registerService(USB_SERVICE, new ServiceFetcher() { 4073a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public Object createService(ContextImpl ctx) { 408e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood IBinder b = ServiceManager.getService(USB_SERVICE); 4093a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood return new UsbManager(ctx, IUsbManager.Stub.asInterface(b)); 410e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood }}); 411e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 412224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(VIBRATOR_SERVICE, new ServiceFetcher() { 413224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 414224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new Vibrator(); 415224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 416224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 417224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(WALLPAPER_SERVICE, WALLPAPER_FETCHER); 418224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 419224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(WIFI_SERVICE, new ServiceFetcher() { 420224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 421224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IBinder b = ServiceManager.getService(WIFI_SERVICE); 422224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IWifiManager service = IWifiManager.Stub.asInterface(b); 423224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new WifiManager(service, ctx.mMainThread.getHandler()); 424224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 425224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 426224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(WINDOW_SERVICE, new ServiceFetcher() { 427224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object getService(ContextImpl ctx) { 4285fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn return WindowManagerImpl.getDefault(ctx.mPackageInfo.mCompatibilityInfo); 429224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 430224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 431224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 4325fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn static ContextImpl getImpl(Context context) { 4335fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn Context nextContext; 4345fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn while ((context instanceof ContextWrapper) && 4355fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn (nextContext=((ContextWrapper)context).getBaseContext()) != null) { 4365fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn context = nextContext; 4375fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn } 4385fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn return (ContextImpl)context; 4395fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn } 4405fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn 441224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // The system service cache for the system services that are 442224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // cached per-ContextImpl. Package-scoped to avoid accessor 443224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // methods. 444224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick final ArrayList<Object> mServiceCache = new ArrayList<Object>(); 445224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AssetManager getAssets() { 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mResources.getAssets(); 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Resources getResources() { 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mResources; 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PackageManager getPackageManager() { 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageManager != null) { 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackageManager; 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IPackageManager pm = ActivityThread.getPackageManager(); 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pm != null) { 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Doesn't matter if we make more than one instance. 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (mPackageManager = new ApplicationPackageManager(this, pm)); 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ContentResolver getContentResolver() { 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mContentResolver; 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Looper getMainLooper() { 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMainThread.getLooper(); 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4805f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Context getApplicationContext() { 483eb9e9ec06167b0caa459f2fb3f3fae094bb8d8f7Christopher Tate return (mPackageInfo != null) ? 484eb9e9ec06167b0caa459f2fb3f3fae094bb8d8f7Christopher Tate mPackageInfo.getApplication() : mMainThread.getApplication(); 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4865f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setTheme(int resid) { 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mThemeResource = resid; 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4915f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 493247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn public int getThemeResId() { 494247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn return mThemeResource; 495247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn } 496247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn 497247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn @Override 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Resources.Theme getTheme() { 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTheme == null) { 500d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn mThemeResource = Resources.selectDefaultTheme(mThemeResource, 501d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn getOuterContext().getApplicationInfo().targetSdkVersion); 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTheme = mResources.newTheme(); 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTheme.applyStyle(mThemeResource, true); 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mTheme; 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ClassLoader getClassLoader() { 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackageInfo != null ? 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageInfo.getClassLoader() : ClassLoader.getSystemClassLoader(); 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getPackageName() { 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackageInfo.getPackageName(); 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Not supported in system context"); 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5235c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn public ApplicationInfo getApplicationInfo() { 5245c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn if (mPackageInfo != null) { 5255c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn return mPackageInfo.getApplicationInfo(); 5265c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn } 5275c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn throw new RuntimeException("Not supported in system context"); 5285c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn } 5295c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn 5305c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn @Override 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getPackageResourcePath() { 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackageInfo.getResDir(); 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Not supported in system context"); 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getPackageCodePath() { 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackageInfo.getAppDir(); 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Not supported in system context"); 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5455f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 54623ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato public File getSharedPrefsFile(String name) { 54723ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato return makeFilename(getPreferencesDir(), name + ".xml"); 54823ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato } 54923ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SharedPreferences getSharedPreferences(String name, int mode) { 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SharedPreferencesImpl sp; 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (sSharedPrefs) { 554333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick sp = sSharedPrefs.get(name); 5556194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick if (sp == null) { 5564cd50b8d76e08d75df1a2e9d4902bcdc880bd1c1Brad Fitzpatrick File prefsFile = getSharedPrefsFile(name); 5574cd50b8d76e08d75df1a2e9d4902bcdc880bd1c1Brad Fitzpatrick sp = new SharedPreferencesImpl(prefsFile, mode); 5586194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick sSharedPrefs.put(name, sp); 5596194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick return sp; 5606194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick } 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5624e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick if ((mode & Context.MODE_MULTI_PROCESS) != 0 || 5634e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick getApplicationInfo().targetSdkVersion < android.os.Build.VERSION_CODES.HONEYCOMB) { 5644e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick // If somebody else (some other process) changed the prefs 5654e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick // file behind our back, we reload it. This has been the 5664e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick // historical (if undocumented) behavior. 5674e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick sp.startReloadIfChangedUnexpectedly(); 5684e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick } 5696194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick return sp; 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File getPreferencesDir() { 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPreferencesDir == null) { 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPreferencesDir = new File(getDataDirFile(), "shared_prefs"); 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPreferencesDir; 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public FileInputStream openFileInput(String name) 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws FileNotFoundException { 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project File f = makeFilename(getFilesDir(), name); 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new FileInputStream(f); 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public FileOutputStream openFileOutput(String name, int mode) 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws FileNotFoundException { 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean append = (mode&MODE_APPEND) != 0; 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project File f = makeFilename(getFilesDir(), name); 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileOutputStream fos = new FileOutputStream(f, append); 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setFilePermissionsFromMode(f.getPath(), mode, 0); 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return fos; 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (FileNotFoundException e) { 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project File parent = f.getParentFile(); 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parent.mkdir(); 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileUtils.setPermissions( 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parent.getPath(), 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH, 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project -1, -1); 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileOutputStream fos = new FileOutputStream(f, append); 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setFilePermissionsFromMode(f.getPath(), mode, 0); 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return fos; 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean deleteFile(String name) { 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project File f = makeFilename(getFilesDir(), name); 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return f.delete(); 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public File getFilesDir() { 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFilesDir == null) { 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFilesDir = new File(getDataDirFile(), "files"); 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mFilesDir.exists()) { 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(!mFilesDir.mkdirs()) { 6255f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer Log.w(TAG, "Unable to create files directory " + mFilesDir.getPath()); 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileUtils.setPermissions( 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFilesDir.getPath(), 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH, 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project -1, -1); 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFilesDir; 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6365f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 638e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn public File getExternalFilesDir(String type) { 639e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn synchronized (mSync) { 640e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn if (mExternalFilesDir == null) { 641e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn mExternalFilesDir = Environment.getExternalStorageAppFilesDirectory( 642e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn getPackageName()); 643e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 644e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn if (!mExternalFilesDir.exists()) { 645e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn try { 646e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn (new File(Environment.getExternalStorageAndroidDataDir(), 647e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn ".nomedia")).createNewFile(); 648e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } catch (IOException e) { 649e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 650e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn if (!mExternalFilesDir.mkdirs()) { 651e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn Log.w(TAG, "Unable to create external files directory"); 652e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn return null; 653e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 654e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 655e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn if (type == null) { 656e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn return mExternalFilesDir; 657e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 658e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn File dir = new File(mExternalFilesDir, type); 659e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn if (!dir.exists()) { 660e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn if (!dir.mkdirs()) { 661e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn Log.w(TAG, "Unable to create external media directory " + dir); 662e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn return null; 663e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 664e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 665e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn return dir; 666e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 667e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 6685f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 669e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn @Override 670805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn public File getObbDir() { 671805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn synchronized (mSync) { 672805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn if (mObbDir == null) { 673805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn mObbDir = Environment.getExternalStorageAppObbDirectory( 674805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn getPackageName()); 675805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn } 676805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn return mObbDir; 677805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn } 678805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn } 679805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn 680805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn @Override 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public File getCacheDir() { 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCacheDir == null) { 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheDir = new File(getDataDirFile(), "cache"); 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mCacheDir.exists()) { 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(!mCacheDir.mkdirs()) { 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unable to create cache directory"); 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileUtils.setPermissions( 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheDir.getPath(), 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH, 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project -1, -1); 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCacheDir; 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6995f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 700e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn @Override 701e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn public File getExternalCacheDir() { 702e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn synchronized (mSync) { 703e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn if (mExternalCacheDir == null) { 704e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn mExternalCacheDir = Environment.getExternalStorageAppCacheDirectory( 705e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn getPackageName()); 706e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 707e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn if (!mExternalCacheDir.exists()) { 708e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn try { 709e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn (new File(Environment.getExternalStorageAndroidDataDir(), 710e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn ".nomedia")).createNewFile(); 711e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } catch (IOException e) { 712e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 713e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn if (!mExternalCacheDir.mkdirs()) { 714e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn Log.w(TAG, "Unable to create external cache directory"); 715e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn return null; 716e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 717e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 718e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn return mExternalCacheDir; 719e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 720e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 7215f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public File getFileStreamPath(String name) { 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return makeFilename(getFilesDir(), name); 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String[] fileList() { 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String[] list = getFilesDir().list(); 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (list != null) ? list : EMPTY_FILE_LIST; 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory) { 735a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor File f = validateFilePath(name, true); 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(f, factory); 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setFilePermissionsFromMode(f.getPath(), mode, 0); 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return db; 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 74274f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory, 74374f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori DatabaseErrorHandler errorHandler) { 74474f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori File f = validateFilePath(name, true); 74574f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(f.getPath(), factory, errorHandler); 74674f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori setFilePermissionsFromMode(f.getPath(), mode, 0); 74774f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori return db; 74874f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori } 74974f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori 75074f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori @Override 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean deleteDatabase(String name) { 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 753a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor File f = validateFilePath(name, false); 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return f.delete(); 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public File getDatabasePath(String name) { 762a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor return validateFilePath(name, false); 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String[] databaseList() { 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String[] list = getDatabasesDir().list(); 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (list != null) ? list : EMPTY_FILE_LIST; 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7715f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File getDatabasesDir() { 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDatabasesDir == null) { 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabasesDir = new File(getDataDirFile(), "databases"); 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDatabasesDir.getPath().equals("databases")) { 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabasesDir = new File("/data/system"); 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDatabasesDir; 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7835f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable getWallpaper() { 7864c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn return getWallpaperManager().getDrawable(); 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 7908cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn public Drawable peekWallpaper() { 7914c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn return getWallpaperManager().peekDrawable(); 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getWallpaperDesiredMinimumWidth() { 7968cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn return getWallpaperManager().getDesiredMinimumWidth(); 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getWallpaperDesiredMinimumHeight() { 8018cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn return getWallpaperManager().getDesiredMinimumHeight(); 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setWallpaper(Bitmap bitmap) throws IOException { 8064c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn getWallpaperManager().setBitmap(bitmap); 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setWallpaper(InputStream data) throws IOException { 8114c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn getWallpaperManager().setStream(data); 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void clearWallpaper() throws IOException { 8168cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn getWallpaperManager().clear(); 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startActivity(Intent intent) { 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new AndroidRuntimeException( 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Calling startActivity() from outside of an Activity " 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " context requires the FLAG_ACTIVITY_NEW_TASK flag." 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " Is this really what you want?"); 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getInstrumentation().execStartActivity( 8286e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn getOuterContext(), mMainThread.getApplicationThread(), null, 8296e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn (Activity)null, intent, -1); 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 833621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn public void startActivities(Intent[] intents) { 834621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if ((intents[0].getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { 835621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn throw new AndroidRuntimeException( 836621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn "Calling startActivities() from outside of an Activity " 837621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn + " context requires the FLAG_ACTIVITY_NEW_TASK flag on first Intent." 838621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn + " Is this really what you want?"); 839621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 840621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn mMainThread.getInstrumentation().execStartActivities( 841621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn getOuterContext(), mMainThread.getApplicationThread(), null, 842621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn (Activity)null, intents); 843621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 844621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 845621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn @Override 846fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn public void startIntentSender(IntentSender intent, 847fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags) 848fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn throws IntentSender.SendIntentException { 849fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn try { 850fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn String resolvedType = null; 851fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn if (fillInIntent != null) { 852fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn resolvedType = fillInIntent.resolveTypeIfNeeded(getContentResolver()); 853fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn } 854fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn int result = ActivityManagerNative.getDefault() 855fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn .startActivityIntentSender(mMainThread.getApplicationThread(), intent, 856fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn fillInIntent, resolvedType, null, null, 857fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn 0, flagsMask, flagsValues); 858fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn if (result == IActivityManager.START_CANCELED) { 859fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn throw new IntentSender.SendIntentException(); 860fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn } 861fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn Instrumentation.checkStartActivityResult(result, null); 862fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn } catch (RemoteException e) { 863fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn } 864fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn } 8655f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 866fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn @Override 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void sendBroadcast(Intent intent) { 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().broadcastIntent( 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), intent, resolvedType, null, 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Activity.RESULT_OK, null, null, null, false, false); 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void sendBroadcast(Intent intent, String receiverPermission) { 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().broadcastIntent( 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), intent, resolvedType, null, 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Activity.RESULT_OK, null, null, receiverPermission, false, false); 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void sendOrderedBroadcast(Intent intent, 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String receiverPermission) { 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().broadcastIntent( 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), intent, resolvedType, null, 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Activity.RESULT_OK, null, null, receiverPermission, true, false); 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void sendOrderedBroadcast(Intent intent, 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String receiverPermission, BroadcastReceiver resultReceiver, 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Handler scheduler, int initialCode, String initialData, 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle initialExtras) { 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IIntentReceiver rd = null; 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resultReceiver != null) { 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scheduler == null) { 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scheduler = mMainThread.getHandler(); 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rd = mPackageInfo.getReceiverDispatcher( 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resultReceiver, getOuterContext(), scheduler, 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getInstrumentation(), false); 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scheduler == null) { 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scheduler = mMainThread.getHandler(); 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 91801e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn rd = new LoadedApk.ReceiverDispatcher( 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver(); 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().broadcastIntent( 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), intent, resolvedType, rd, 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project initialCode, initialData, initialExtras, receiverPermission, 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project true, false); 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void sendStickyBroadcast(Intent intent) { 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().broadcastIntent( 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), intent, resolvedType, null, 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Activity.RESULT_OK, null, null, null, false, true); 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 944efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn public void sendStickyOrderedBroadcast(Intent intent, 945efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn BroadcastReceiver resultReceiver, 946efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn Handler scheduler, int initialCode, String initialData, 947efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn Bundle initialExtras) { 948efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn IIntentReceiver rd = null; 949efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn if (resultReceiver != null) { 950efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn if (mPackageInfo != null) { 951efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn if (scheduler == null) { 952efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn scheduler = mMainThread.getHandler(); 953efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } 954efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn rd = mPackageInfo.getReceiverDispatcher( 955efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn resultReceiver, getOuterContext(), scheduler, 956efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn mMainThread.getInstrumentation(), false); 957efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } else { 958efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn if (scheduler == null) { 959efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn scheduler = mMainThread.getHandler(); 960efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } 96101e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn rd = new LoadedApk.ReceiverDispatcher( 962efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver(); 963efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } 964efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } 965efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 966efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn try { 967efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn ActivityManagerNative.getDefault().broadcastIntent( 968efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn mMainThread.getApplicationThread(), intent, resolvedType, rd, 969efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn initialCode, initialData, initialExtras, null, 970efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn true, true); 971efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } catch (RemoteException e) { 972efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } 973efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } 974efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn 975efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn @Override 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeStickyBroadcast(Intent intent) { 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resolvedType != null) { 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent = new Intent(intent); 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.setDataAndType(intent.getData(), resolvedType); 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().unbroadcastIntent( 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), intent); 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 Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) { 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return registerReceiver(receiver, filter, null, null); 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String broadcastPermission, Handler scheduler) { 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return registerReceiverInternal(receiver, filter, broadcastPermission, 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scheduler, getOuterContext()); 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Intent registerReceiverInternal(BroadcastReceiver receiver, 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IntentFilter filter, String broadcastPermission, 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Handler scheduler, Context context) { 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IIntentReceiver rd = null; 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (receiver != null) { 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null && context != null) { 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scheduler == null) { 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scheduler = mMainThread.getHandler(); 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rd = mPackageInfo.getReceiverDispatcher( 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project receiver, context, scheduler, 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getInstrumentation(), true); 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scheduler == null) { 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scheduler = mMainThread.getHandler(); 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 101701e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn rd = new LoadedApk.ReceiverDispatcher( 1018399cccb85749e02f6d3e12d1d2846310e7cbfdf1Dianne Hackborn receiver, context, scheduler, null, true).getIIntentReceiver(); 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ActivityManagerNative.getDefault().registerReceiver( 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rd, filter, broadcastPermission); 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unregisterReceiver(BroadcastReceiver receiver) { 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IIntentReceiver rd = mPackageInfo.forgetReceiverDispatcher( 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getOuterContext(), receiver); 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().unregisterReceiver(rd); 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Not supported in system context"); 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ComponentName startService(Intent service) { 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ComponentName cn = ActivityManagerNative.getDefault().startService( 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), service, 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project service.resolveTypeIfNeeded(getContentResolver())); 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cn != null && cn.getPackageName().equals("!")) { 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException( 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Not allowed to start service " + service 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " without permission " + cn.getClassName()); 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return cn; 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean stopService(Intent service) { 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int res = ActivityManagerNative.getDefault().stopService( 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), service, 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project service.resolveTypeIfNeeded(getContentResolver())); 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res < 0) { 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException( 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Not allowed to stop service " + service); 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res != 0; 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean bindService(Intent service, ServiceConnection conn, 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags) { 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IServiceConnection sd; 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sd = mPackageInfo.getServiceDispatcher(conn, getOuterContext(), 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getHandler(), flags); 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Not supported in system context"); 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int res = ActivityManagerNative.getDefault().bindService( 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), getActivityToken(), 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project service, service.resolveTypeIfNeeded(getContentResolver()), 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sd, flags); 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res < 0) { 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException( 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Not allowed to bind to service " + service); 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res != 0; 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unbindService(ServiceConnection conn) { 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IServiceConnection sd = mPackageInfo.forgetServiceDispatcher( 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getOuterContext(), conn); 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().unbindService(sd); 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Not supported in system context"); 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean startInstrumentation(ComponentName className, 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String profileFile, Bundle arguments) { 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ActivityManagerNative.getDefault().startInstrumentation( 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project className, profileFile, 0, arguments, null); 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // System has crashed, nothing we can do. 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Object getSystemService(String name) { 1130224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name); 1131224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return fetcher == null ? null : fetcher.getService(this); 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11348cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn private WallpaperManager getWallpaperManager() { 1135224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return (WallpaperManager) WALLPAPER_FETCHER.getService(this); 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1138438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick /* package */ static DropBoxManager createDropBoxManager() { 1139438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick IBinder b = ServiceManager.getService(DROPBOX_SERVICE); 1140438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick IDropBoxManagerService service = IDropBoxManagerService.Stub.asInterface(b); 1141ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick if (service == null) { 1142ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick // Don't return a DropBoxManager that will NPE upon use. 1143ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick // This also avoids caching a broken DropBoxManager in 1144ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick // getDropBoxManager during early boot, before the 1145ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick // DROPBOX_SERVICE is registered. 1146ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick return null; 1147ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick } 1148438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick return new DropBoxManager(service); 1149438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick } 1150438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int checkPermission(String permission, int pid, int uid) { 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (permission == null) { 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("permission is null"); 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!Process.supportsProcesses()) { 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.PERMISSION_GRANTED; 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ActivityManagerNative.getDefault().checkPermission( 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project permission, pid, uid); 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.PERMISSION_DENIED; 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int checkCallingPermission(String permission) { 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (permission == null) { 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("permission is null"); 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!Process.supportsProcesses()) { 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.PERMISSION_GRANTED; 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pid = Binder.getCallingPid(); 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pid != Process.myPid()) { 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return checkPermission(permission, pid, 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingUid()); 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.PERMISSION_DENIED; 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int checkCallingOrSelfPermission(String permission) { 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (permission == null) { 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("permission is null"); 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return checkPermission(permission, Binder.getCallingPid(), 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingUid()); 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void enforce( 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String permission, int resultOfCheck, 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean selfToo, int uid, String message) { 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resultOfCheck != PackageManager.PERMISSION_GRANTED) { 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException( 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (message != null ? (message + ": ") : "") + 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (selfToo 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? "Neither user " + uid + " nor current process has " 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : "User " + uid + " does not have ") + 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project permission + 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "."); 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforcePermission( 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String permission, int pid, int uid, String message) { 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforce(permission, 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkPermission(permission, pid, uid), 12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false, 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uid, 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project message); 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceCallingPermission(String permission, String message) { 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforce(permission, 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkCallingPermission(permission), 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false, 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingUid(), 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project message); 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceCallingOrSelfPermission( 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String permission, String message) { 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforce(permission, 12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkCallingOrSelfPermission(permission), 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project true, 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingUid(), 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project message); 12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void grantUriPermission(String toPackage, Uri uri, int modeFlags) { 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().grantUriPermission( 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), toPackage, uri, 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project modeFlags); 12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void revokeUriPermission(Uri uri, int modeFlags) { 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().revokeUriPermission( 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), uri, 12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project modeFlags); 12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int checkUriPermission(Uri uri, int pid, int uid, int modeFlags) { 12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!Process.supportsProcesses()) { 12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.PERMISSION_GRANTED; 12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ActivityManagerNative.getDefault().checkUriPermission( 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uri, pid, uid, modeFlags); 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.PERMISSION_DENIED; 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int checkCallingUriPermission(Uri uri, int modeFlags) { 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!Process.supportsProcesses()) { 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.PERMISSION_GRANTED; 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pid = Binder.getCallingPid(); 12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pid != Process.myPid()) { 12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return checkUriPermission(uri, pid, 12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingUid(), modeFlags); 12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.PERMISSION_DENIED; 12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int checkCallingOrSelfUriPermission(Uri uri, int modeFlags) { 12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return checkUriPermission(uri, Binder.getCallingPid(), 12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingUid(), modeFlags); 12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int checkUriPermission(Uri uri, String readPermission, 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String writePermission, int pid, int uid, int modeFlags) { 1290569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima if (DEBUG) { 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i("foo", "checkUriPermission: uri=" + uri + "readPermission=" 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + readPermission + " writePermission=" + writePermission 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " pid=" + pid + " uid=" + uid + " mode" + modeFlags); 12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((modeFlags&Intent.FLAG_GRANT_READ_URI_PERMISSION) != 0) { 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (readPermission == null 12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || checkPermission(readPermission, pid, uid) 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project == PackageManager.PERMISSION_GRANTED) { 12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.PERMISSION_GRANTED; 13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((modeFlags&Intent.FLAG_GRANT_WRITE_URI_PERMISSION) != 0) { 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (writePermission == null 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || checkPermission(writePermission, pid, uid) 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project == PackageManager.PERMISSION_GRANTED) { 13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.PERMISSION_GRANTED; 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return uri != null ? checkUriPermission(uri, pid, uid, modeFlags) 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : PackageManager.PERMISSION_DENIED; 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String uriModeFlagToString(int uriModeFlags) { 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (uriModeFlags) { 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case Intent.FLAG_GRANT_READ_URI_PERMISSION | 13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent.FLAG_GRANT_WRITE_URI_PERMISSION: 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "read and write"; 13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case Intent.FLAG_GRANT_READ_URI_PERMISSION: 13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "read"; 13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case Intent.FLAG_GRANT_WRITE_URI_PERMISSION: 13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "write"; 13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException( 13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Unknown permission mode flags: " + uriModeFlags); 13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void enforceForUri( 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int modeFlags, int resultOfCheck, boolean selfToo, 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int uid, Uri uri, String message) { 13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resultOfCheck != PackageManager.PERMISSION_GRANTED) { 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException( 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (message != null ? (message + ": ") : "") + 13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (selfToo 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? "Neither user " + uid + " nor current process has " 13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : "User " + uid + " does not have ") + 13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uriModeFlagToString(modeFlags) + 13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " permission on " + 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uri + 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "."); 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceUriPermission( 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri uri, int pid, int uid, int modeFlags, String message) { 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceForUri( 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project modeFlags, checkUriPermission(uri, pid, uid, modeFlags), 13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false, uid, uri, message); 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceCallingUriPermission( 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri uri, int modeFlags, String message) { 13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceForUri( 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project modeFlags, checkCallingUriPermission(uri, modeFlags), 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false, Binder.getCallingUid(), uri, message); 13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceCallingOrSelfUriPermission( 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri uri, int modeFlags, String message) { 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceForUri( 13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project modeFlags, 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkCallingOrSelfUriPermission(uri, modeFlags), true, 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingUid(), uri, message); 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceUriPermission( 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri uri, String readPermission, String writePermission, 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pid, int uid, int modeFlags, String message) { 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceForUri(modeFlags, 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkUriPermission( 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uri, readPermission, writePermission, pid, uid, 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project modeFlags), 13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false, 13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uid, 13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uri, 13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project message); 13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Context createPackageContext(String packageName, int flags) 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws PackageManager.NameNotFoundException { 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (packageName.equals("system") || packageName.equals("android")) { 13822155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn return new ContextImpl(mMainThread.getSystemContext()); 13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 138501e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn LoadedApk pi = 1386e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn mMainThread.getPackageInfo(packageName, mResources.getCompatibilityInfo(), flags); 13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pi != null) { 13882155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn ContextImpl c = new ContextImpl(); 1389870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy c.mRestricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED; 1390ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima c.init(pi, null, mMainThread, mResources); 13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c.mResources != null) { 13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return c; 13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Should be a better exception. 13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new PackageManager.NameNotFoundException( 13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Application package " + packageName + " not found"); 13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1401870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy @Override 1402870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy public boolean isRestricted() { 1403870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy return mRestricted; 1404870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy } 1405870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy 14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File getDataDirFile() { 14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackageInfo.getDataDirFile(); 14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Not supported in system context"); 14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public File getDir(String name, int mode) { 14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project name = "app_" + name; 14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project File file = makeFilename(getDataDirFile(), name); 14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!file.exists()) { 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project file.mkdir(); 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setFilePermissionsFromMode(file.getPath(), mode, 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH); 14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return file; 14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14252155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn static ContextImpl createSystemContext(ActivityThread mainThread) { 14262155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn ContextImpl context = new ContextImpl(); 14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project context.init(Resources.getSystem(), mainThread); 14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return context; 14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14312155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn ContextImpl() { 14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOuterContext = this; 14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a new ApplicationContext from an existing one. The new one 14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * works and operates the same as the one it is copying. 14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context Existing application context. 14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14412155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn public ContextImpl(ContextImpl context) { 14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageInfo = context.mPackageInfo; 14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResources = context.mResources; 14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread = context.mMainThread; 14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContentResolver = context.mContentResolver; 14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOuterContext = this; 14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 144901e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn final void init(LoadedApk packageInfo, 14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder activityToken, ActivityThread mainThread) { 1451ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima init(packageInfo, activityToken, mainThread, null); 1452ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima } 1453ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima 145401e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn final void init(LoadedApk packageInfo, 1455ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima IBinder activityToken, ActivityThread mainThread, 1456ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima Resources container) { 14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageInfo = packageInfo; 14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResources = mPackageInfo.getResources(mainThread); 1459ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima 1460559a78753165f20d5973b958791056154baecc43Dianne Hackborn if (mResources != null && container != null 1461559a78753165f20d5973b958791056154baecc43Dianne Hackborn && container.getCompatibilityInfo().applicationScale != 1462559a78753165f20d5973b958791056154baecc43Dianne Hackborn mResources.getCompatibilityInfo().applicationScale) { 1463ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima if (DEBUG) { 1464ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima Log.d(TAG, "loaded context has different scaling. Using container's" + 1465ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima " compatiblity info:" + container.getDisplayMetrics()); 1466ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima } 1467ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima mResources = mainThread.getTopLevelResources( 1468e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn mPackageInfo.getResDir(), container.getCompatibilityInfo()); 1469ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima } 14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread = mainThread; 14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContentResolver = new ApplicationContentResolver(this, mainThread); 14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setActivityToken(activityToken); 14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final void init(Resources resources, ActivityThread mainThread) { 14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageInfo = null; 14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResources = resources; 14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread = mainThread; 14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContentResolver = new ApplicationContentResolver(this, mainThread); 14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final void scheduleFinalCleanup(String who, String what) { 14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.scheduleContextCleanup(this, who, what); 14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final void performFinalCleanup(String who, String what) { 14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.i(TAG, "Cleanup up context: " + this); 14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageInfo.removeContextRegistrations(getOuterContext(), who, what); 14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Context getReceiverRestrictedContext() { 14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mReceiverRestrictedContext != null) { 14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mReceiverRestrictedContext; 14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mReceiverRestrictedContext = new ReceiverRestrictedContext(getOuterContext()); 14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final void setActivityToken(IBinder token) { 15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivityToken = token; 15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15025f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final void setOuterContext(Context context) { 15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOuterContext = context; 15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15065f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Context getOuterContext() { 15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mOuterContext; 15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15105f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final IBinder getActivityToken() { 15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mActivityToken; 15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1515d3da44032084b6dd280487280553dcdbd7933e3eBrad Fitzpatrick static void setFilePermissionsFromMode(String name, int mode, 15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int extraPermissions) { 15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int perms = FileUtils.S_IRUSR|FileUtils.S_IWUSR 15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project |FileUtils.S_IRGRP|FileUtils.S_IWGRP 15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project |extraPermissions; 15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mode&MODE_WORLD_READABLE) != 0) { 15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perms |= FileUtils.S_IROTH; 15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mode&MODE_WORLD_WRITEABLE) != 0) { 15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perms |= FileUtils.S_IWOTH; 15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1526569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima if (DEBUG) { 15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(TAG, "File " + name + ": mode=0x" + Integer.toHexString(mode) 15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", perms=0x" + Integer.toHexString(perms)); 15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileUtils.setPermissions(name, perms, -1, -1); 15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1533a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor private File validateFilePath(String name, boolean createDirectory) { 1534a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor File dir; 1535a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor File f; 1536a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor 1537a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor if (name.charAt(0) == File.separatorChar) { 1538a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor String dirPath = name.substring(0, name.lastIndexOf(File.separatorChar)); 1539a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor dir = new File(dirPath); 1540a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor name = name.substring(name.lastIndexOf(File.separatorChar)); 1541a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor f = new File(dir, name); 1542a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor } else { 1543a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor dir = getDatabasesDir(); 1544a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor f = makeFilename(dir, name); 1545a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor } 1546a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor 1547a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor if (createDirectory && !dir.isDirectory() && dir.mkdir()) { 1548a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor FileUtils.setPermissions(dir.getPath(), 1549a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH, 1550a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor -1, -1); 1551a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor } 1552a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor 1553a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor return f; 1554a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor } 1555a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor 15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File makeFilename(File base, String name) { 15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name.indexOf(File.separatorChar) < 0) { 15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new File(base, name); 15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException( 1561a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor "File " + name + " contains a path separator"); 15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ---------------------------------------------------------------------- 15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ---------------------------------------------------------------------- 15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ---------------------------------------------------------------------- 15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final class ApplicationContentResolver extends ContentResolver { 1569cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn public ApplicationContentResolver(Context context, ActivityThread mainThread) { 15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context); 15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread = mainThread; 15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1575cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn protected IContentProvider acquireProvider(Context context, String name) { 15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMainThread.acquireProvider(context, name); 15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1580cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn protected IContentProvider acquireExistingProvider(Context context, String name) { 1581cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn return mMainThread.acquireExistingProvider(context, name); 1582cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn } 1583cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn 1584cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn @Override 1585cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn public boolean releaseProvider(IContentProvider provider) { 15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMainThread.releaseProvider(provider); 15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15885f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final ActivityThread mMainThread; 15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1592