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; 206d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkeyimport com.android.internal.util.Preconditions; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 221abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganeshimport android.bluetooth.BluetoothAdapter; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.BroadcastReceiver; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentResolver; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContextWrapper; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IContentProvider; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IntentFilter; 311ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.content.IIntentReceiver; 321ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.content.IntentSender; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ReceiverCallNotAllowedException; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ServiceConnection; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.SharedPreferences; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ApplicationInfo; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.IPackageManager; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager; 396d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkeyimport android.content.pm.PackageManager.NameNotFoundException; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.AssetManager; 415be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackbornimport android.content.res.CompatibilityInfo; 42756220bd1912535840388a6743830d2e59ad4964Dianne Hackbornimport android.content.res.Configuration; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources; 4474f170f9468d3cf6d7d0ef453320141a3e63571bVasu Noriimport android.database.DatabaseErrorHandler; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.sqlite.SQLiteDatabase; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.sqlite.SQLiteDatabase.CursorFactory; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Bitmap; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable; 49b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodimport android.hardware.ISerialManager; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.hardware.SensorManager; 51b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodimport android.hardware.SerialManager; 5225157e458d6e10b027d1ba6b78b0487156c9f57aJeff Brownimport android.hardware.SystemSensorManager; 53fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport android.hardware.display.DisplayManager; 54ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brownimport android.hardware.input.IInputManager; 559df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brownimport android.hardware.input.InputManager; 56c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodimport android.hardware.usb.IUsbManager; 57c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodimport android.hardware.usb.UsbManager; 58a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.location.CountryDetector; 59a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.location.ICountryDetector; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.location.ILocationManager; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.location.LocationManager; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.AudioManager; 63b58b8f832d06b0ffa8886eba5a4916578a3b8743Dianne Hackbornimport android.media.MediaRouter; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.ConnectivityManager; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.IConnectivityManager; 661a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkeyimport android.net.INetworkPolicyManager; 671a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkeyimport android.net.NetworkPolicyManager; 68c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriffimport android.net.ThrottleManager; 69c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriffimport android.net.IThrottleManager; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 717d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.net.nsd.INsdManager; 727d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.net.nsd.NsdManager; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.wifi.IWifiManager; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.wifi.WifiManager; 7555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.net.wifi.p2p.IWifiP2pManager; 7655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.net.wifi.p2p.WifiP2pManager; 7750b4d8f643f31b37e9872f562fb869059cf79c8aNick Pellyimport android.nfc.NfcManager; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder; 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 80cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasaniimport android.os.Debug; 81f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnorimport android.os.DropBoxManager; 82539d3c475f44b1499499a8b70375a192545cf113Oscar Montemayorimport android.os.Environment; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.FileUtils; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IPowerManager; 87258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasaniimport android.os.IUserManager; 8875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.Looper; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.PowerManager; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process; 9175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.RemoteException; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 93f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackbornimport android.os.UserHandle; 94c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brownimport android.os.SystemVibrator; 95258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasaniimport android.os.UserManager; 96b104340496e3a531e26c8f428c808eca0e039f50San Mehatimport android.os.storage.StorageManager; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.TelephonyManager; 989f53119b72e6da865bcd53173d3dacd1eba01aeeDianne Hackbornimport android.content.ClipboardManager; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AndroidRuntimeException; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 101cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasaniimport android.util.Slog; 10298365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.view.CompatibilityInfoHolder; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ContextThemeWrapper; 10498365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.view.Display; 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManagerImpl; 10675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.view.accessibility.AccessibilityManager; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.InputMethodManager; 108988323c57bd25a58f05dfa492d9b9c8ab62c5153satokimport android.view.textservice.TextServicesManager; 109603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintanaimport android.accounts.AccountManager; 110603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintanaimport android.accounts.IAccountManager; 11187bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackbornimport android.app.admin.DevicePolicyManager; 112f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnorimport com.android.internal.os.IDropBoxManagerService; 113952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileNotFoundException; 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream; 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream; 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap; 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass ReceiverRestrictedContext extends ContextWrapper { 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ReceiverRestrictedContext(Context base) { 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(base); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) { 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return registerReceiver(receiver, filter, null, null); 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String broadcastPermission, Handler scheduler) { 13627bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey if (receiver == null) { 13727bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey // Allow retrieving current sticky broadcast; this is safe since we 13827bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey // aren't actually registering a receiver. 13927bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey return super.registerReceiver(null, filter, broadcastPermission, scheduler); 14027bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey } else { 14127bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey throw new ReceiverCallNotAllowedException( 14227bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey "BroadcastReceiver components are not allowed to register to receive intents"); 14327bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey } 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 14720e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user, 14820e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn IntentFilter filter, String broadcastPermission, Handler scheduler) { 14927bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey if (receiver == null) { 15027bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey // Allow retrieving current sticky broadcast; this is safe since we 15127bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey // aren't actually registering a receiver. 15227bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey return super.registerReceiverAsUser(null, user, filter, broadcastPermission, scheduler); 15327bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey } else { 15427bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey throw new ReceiverCallNotAllowedException( 15527bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey "BroadcastReceiver components are not allowed to register to receive intents"); 15627bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey } 15720e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn } 15820e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn 15920e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn @Override 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean bindService(Intent service, ServiceConnection conn, int flags) { 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ReceiverCallNotAllowedException( 16227bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey "BroadcastReceiver components are not allowed to bind to services"); 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 1672155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn * Common implementation of Context API, which provides the base 1682155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn * context object for Activity and other application components. 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1702155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackbornclass ContextImpl extends Context { 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final static String TAG = "ApplicationContext"; 172569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima private final static boolean DEBUG = false; 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 174333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick private static final HashMap<String, SharedPreferencesImpl> sSharedPrefs = 175333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick new HashMap<String, SharedPreferencesImpl>(); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17701e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn /*package*/ LoadedApk mPackageInfo; 1786c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn private String mBasePackageName; 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Resources mResources; 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ ActivityThread mMainThread; 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Context mOuterContext; 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private IBinder mActivityToken = null; 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ApplicationContentResolver mContentResolver; 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mThemeResource = 0; 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Resources.Theme mTheme = null; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private PackageManager mPackageManager; 187a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown private Display mDisplay; // may be null if default display 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Context mReceiverRestrictedContext = null; 189870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy private boolean mRestricted; 1906d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey private UserHandle mUser; 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Object mSync = new Object(); 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File mDatabasesDir; 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File mPreferencesDir; 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File mFilesDir; 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File mCacheDir; 198805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn private File mObbDir; 199e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn private File mExternalFilesDir; 200e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn private File mExternalCacheDir; 2015f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String[] EMPTY_FILE_LIST = {}; 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 204224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick /** 205224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick * Override this class when the system service constructor needs a 206224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick * ContextImpl. Else, use StaticServiceFetcher below. 207224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick */ 208224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick /*package*/ static class ServiceFetcher { 209224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick int mContextCacheIndex = -1; 210224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 211224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick /** 212224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick * Main entrypoint; only override if you don't need caching. 213224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick */ 214224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object getService(ContextImpl ctx) { 215224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick ArrayList<Object> cache = ctx.mServiceCache; 216224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick Object service; 217224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick synchronized (cache) { 218224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick if (cache.size() == 0) { 219224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // Initialize the cache vector on first access. 220224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // At this point sNextPerContextServiceCacheIndex 221224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // is the number of potential services that are 222224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // cached per-Context. 223224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick for (int i = 0; i < sNextPerContextServiceCacheIndex; i++) { 224224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick cache.add(null); 225224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 226224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } else { 227224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick service = cache.get(mContextCacheIndex); 228224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick if (service != null) { 229224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return service; 230224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 231224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 232224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick service = createService(ctx); 233224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick cache.set(mContextCacheIndex, service); 234224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return service; 235224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 236224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 237224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 238224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick /** 239224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick * Override this to create a new per-Context instance of the 240224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick * service. getService() will handle locking and caching. 241224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick */ 242224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 243224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick throw new RuntimeException("Not implemented"); 244224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 245224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 246224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 247224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick /** 248224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick * Override this class for services to be cached process-wide. 249224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick */ 250224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick abstract static class StaticServiceFetcher extends ServiceFetcher { 251224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick private Object mCachedInstance; 252224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 253224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick @Override 254224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public final Object getService(ContextImpl unused) { 255224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick synchronized (StaticServiceFetcher.this) { 256224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick Object service = mCachedInstance; 257224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick if (service != null) { 258224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return service; 259224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 260224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return mCachedInstance = createStaticService(); 261224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 262224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 263224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 264224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public abstract Object createStaticService(); 265224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 266224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 267224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick private static final HashMap<String, ServiceFetcher> SYSTEM_SERVICE_MAP = 268224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick new HashMap<String, ServiceFetcher>(); 269224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 270224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick private static int sNextPerContextServiceCacheIndex = 0; 271224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick private static void registerService(String serviceName, ServiceFetcher fetcher) { 272224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick if (!(fetcher instanceof StaticServiceFetcher)) { 273224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick fetcher.mContextCacheIndex = sNextPerContextServiceCacheIndex++; 274224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 275224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick SYSTEM_SERVICE_MAP.put(serviceName, fetcher); 276224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 277224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 278224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // This one's defined separately and given a variable name so it 279224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // can be re-used by getWallpaperManager(), avoiding a HashMap 280224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // lookup. 281224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick private static ServiceFetcher WALLPAPER_FETCHER = new ServiceFetcher() { 282224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 283224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new WallpaperManager(ctx.getOuterContext(), 284224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick ctx.mMainThread.getHandler()); 285224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}; 286224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 287224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick static { 288224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(ACCESSIBILITY_SERVICE, new ServiceFetcher() { 289224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object getService(ContextImpl ctx) { 290224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return AccessibilityManager.getInstance(ctx); 291224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 292224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 293224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(ACCOUNT_SERVICE, new ServiceFetcher() { 294224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 295224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IBinder b = ServiceManager.getService(ACCOUNT_SERVICE); 296224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IAccountManager service = IAccountManager.Stub.asInterface(b); 297224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new AccountManager(ctx, service); 298224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 299224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 300224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(ACTIVITY_SERVICE, new ServiceFetcher() { 301224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 302224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new ActivityManager(ctx.getOuterContext(), ctx.mMainThread.getHandler()); 303224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 304224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 305224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(ALARM_SERVICE, new StaticServiceFetcher() { 306224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createStaticService() { 307224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IBinder b = ServiceManager.getService(ALARM_SERVICE); 308224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IAlarmManager service = IAlarmManager.Stub.asInterface(b); 309224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new AlarmManager(service); 310224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 311224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 312224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(AUDIO_SERVICE, new ServiceFetcher() { 313224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 314224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new AudioManager(ctx); 315224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 316224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 317b58b8f832d06b0ffa8886eba5a4916578a3b8743Dianne Hackborn registerService(MEDIA_ROUTER_SERVICE, new ServiceFetcher() { 318b58b8f832d06b0ffa8886eba5a4916578a3b8743Dianne Hackborn public Object createService(ContextImpl ctx) { 319b58b8f832d06b0ffa8886eba5a4916578a3b8743Dianne Hackborn return new MediaRouter(ctx); 320b58b8f832d06b0ffa8886eba5a4916578a3b8743Dianne Hackborn }}); 321b58b8f832d06b0ffa8886eba5a4916578a3b8743Dianne Hackborn 3221abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh registerService(BLUETOOTH_SERVICE, new ServiceFetcher() { 3231abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh public Object createService(ContextImpl ctx) { 3241abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh return BluetoothAdapter.getDefaultAdapter(); 3251abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh }}); 3261abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh 327224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(CLIPBOARD_SERVICE, new ServiceFetcher() { 328224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 329224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new ClipboardManager(ctx.getOuterContext(), 330224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick ctx.mMainThread.getHandler()); 331224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 332224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 333224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(CONNECTIVITY_SERVICE, new StaticServiceFetcher() { 334224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createStaticService() { 335224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IBinder b = ServiceManager.getService(CONNECTIVITY_SERVICE); 336224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new ConnectivityManager(IConnectivityManager.Stub.asInterface(b)); 337224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 338224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 339224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(COUNTRY_DETECTOR, new StaticServiceFetcher() { 340224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createStaticService() { 341224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IBinder b = ServiceManager.getService(COUNTRY_DETECTOR); 342224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new CountryDetector(ICountryDetector.Stub.asInterface(b)); 343224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 344224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 345224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(DEVICE_POLICY_SERVICE, new ServiceFetcher() { 346224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 347224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return DevicePolicyManager.create(ctx, ctx.mMainThread.getHandler()); 348224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 349224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 350224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(DOWNLOAD_SERVICE, new ServiceFetcher() { 351224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 352224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new DownloadManager(ctx.getContentResolver(), ctx.getPackageName()); 353224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 354224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 355d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly registerService(NFC_SERVICE, new ServiceFetcher() { 356d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly public Object createService(ContextImpl ctx) { 357d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly return new NfcManager(ctx); 358d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly }}); 359d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly 360224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(DROPBOX_SERVICE, new StaticServiceFetcher() { 361224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createStaticService() { 362224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return createDropBoxManager(); 363224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 364224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 3659f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown registerService(INPUT_SERVICE, new StaticServiceFetcher() { 3669f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown public Object createStaticService() { 3679f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown return InputManager.getInstance(); 368ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown }}); 3699df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown 370bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown registerService(DISPLAY_SERVICE, new ServiceFetcher() { 371bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown @Override 372bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown public Object createService(ContextImpl ctx) { 373bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown return new DisplayManager(ctx.getOuterContext()); 374bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown }}); 375fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown 376224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(INPUT_METHOD_SERVICE, new ServiceFetcher() { 377224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 378224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return InputMethodManager.getInstance(ctx); 379224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 380224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 381988323c57bd25a58f05dfa492d9b9c8ab62c5153satok registerService(TEXT_SERVICES_MANAGER_SERVICE, new ServiceFetcher() { 382988323c57bd25a58f05dfa492d9b9c8ab62c5153satok public Object createService(ContextImpl ctx) { 383988323c57bd25a58f05dfa492d9b9c8ab62c5153satok return TextServicesManager.getInstance(); 384988323c57bd25a58f05dfa492d9b9c8ab62c5153satok }}); 385988323c57bd25a58f05dfa492d9b9c8ab62c5153satok 386224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(KEYGUARD_SERVICE, new ServiceFetcher() { 387224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object getService(ContextImpl ctx) { 388224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // TODO: why isn't this caching it? It wasn't 389224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // before, so I'm preserving the old behavior and 390224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // using getService(), instead of createService() 391224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // which would do the caching. 392224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new KeyguardManager(); 393224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 394224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 395224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(LAYOUT_INFLATER_SERVICE, new ServiceFetcher() { 396224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 397224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return PolicyManager.makeNewLayoutInflater(ctx.getOuterContext()); 398224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 399224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 400e0fd693c6098f59004f9e96ad75c058e26c337b0Nick Pelly registerService(LOCATION_SERVICE, new ServiceFetcher() { 401e0fd693c6098f59004f9e96ad75c058e26c337b0Nick Pelly public Object createService(ContextImpl ctx) { 402224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IBinder b = ServiceManager.getService(LOCATION_SERVICE); 403e0fd693c6098f59004f9e96ad75c058e26c337b0Nick Pelly return new LocationManager(ctx, ILocationManager.Stub.asInterface(b)); 404224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 405224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 4061a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey registerService(NETWORK_POLICY_SERVICE, new ServiceFetcher() { 4071a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey @Override 4081a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey public Object createService(ContextImpl ctx) { 4091a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey return new NetworkPolicyManager(INetworkPolicyManager.Stub.asInterface( 4101a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey ServiceManager.getService(NETWORK_POLICY_SERVICE))); 4111a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey } 4121a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey }); 4131a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey 414224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(NOTIFICATION_SERVICE, new ServiceFetcher() { 415224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 416224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick final Context outerContext = ctx.getOuterContext(); 417224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new NotificationManager( 418224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick new ContextThemeWrapper(outerContext, 419d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn Resources.selectSystemTheme(0, 420d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn outerContext.getApplicationInfo().targetSdkVersion, 421d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn com.android.internal.R.style.Theme_Dialog, 4226e90a362bc66cc67b1beae27b21d3f0148403b08Adam Powell com.android.internal.R.style.Theme_Holo_Dialog, 4236e90a362bc66cc67b1beae27b21d3f0148403b08Adam Powell com.android.internal.R.style.Theme_DeviceDefault_Dialog)), 424224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick ctx.mMainThread.getHandler()); 425224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 426224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 4277d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff registerService(NSD_SERVICE, new ServiceFetcher() { 4287d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff @Override 4297d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public Object createService(ContextImpl ctx) { 4307d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff IBinder b = ServiceManager.getService(NSD_SERVICE); 4317d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff INsdManager service = INsdManager.Stub.asInterface(b); 43222af38c5261d2c03796b496e6edb125327cace16Irfan Sheriff return new NsdManager(ctx.getOuterContext(), service); 4337d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff }}); 4347d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 435224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // Note: this was previously cached in a static variable, but 436224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // constructed using mMainThread.getHandler(), so converting 437224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // it to be a regular Context-cached service... 438224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(POWER_SERVICE, new ServiceFetcher() { 439224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 440224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IBinder b = ServiceManager.getService(POWER_SERVICE); 441224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IPowerManager service = IPowerManager.Stub.asInterface(b); 4429630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown return new PowerManager(ctx.getOuterContext(), 4439630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown service, ctx.mMainThread.getHandler()); 444224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 445224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 446224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(SEARCH_SERVICE, new ServiceFetcher() { 447224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 448224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new SearchManager(ctx.getOuterContext(), 449224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick ctx.mMainThread.getHandler()); 450224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 451224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 452224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(SENSOR_SERVICE, new ServiceFetcher() { 453224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 45425157e458d6e10b027d1ba6b78b0487156c9f57aJeff Brown return new SystemSensorManager(ctx.mMainThread.getHandler().getLooper()); 455224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 456224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 457224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(STATUS_BAR_SERVICE, new ServiceFetcher() { 458224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 459224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new StatusBarManager(ctx.getOuterContext()); 460224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 461224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 462224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(STORAGE_SERVICE, new ServiceFetcher() { 463224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 464224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick try { 465224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new StorageManager(ctx.mMainThread.getHandler().getLooper()); 466224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } catch (RemoteException rex) { 467224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick Log.e(TAG, "Failed to create StorageManager", rex); 468224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return null; 469224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 470224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 471224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 472224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(TELEPHONY_SERVICE, new ServiceFetcher() { 473224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 474224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new TelephonyManager(ctx.getOuterContext()); 475224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 476224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 477224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(THROTTLE_SERVICE, new StaticServiceFetcher() { 478224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createStaticService() { 479224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IBinder b = ServiceManager.getService(THROTTLE_SERVICE); 480224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new ThrottleManager(IThrottleManager.Stub.asInterface(b)); 481224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 482224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 483224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(UI_MODE_SERVICE, new ServiceFetcher() { 484224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 485224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new UiModeManager(); 486224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 487224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 4883a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood registerService(USB_SERVICE, new ServiceFetcher() { 4893a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public Object createService(ContextImpl ctx) { 490e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood IBinder b = ServiceManager.getService(USB_SERVICE); 4913a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood return new UsbManager(ctx, IUsbManager.Stub.asInterface(b)); 492e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood }}); 493e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 494b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood registerService(SERIAL_SERVICE, new ServiceFetcher() { 495b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood public Object createService(ContextImpl ctx) { 496b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood IBinder b = ServiceManager.getService(SERIAL_SERVICE); 497b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood return new SerialManager(ctx, ISerialManager.Stub.asInterface(b)); 498b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood }}); 499b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 500224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(VIBRATOR_SERVICE, new ServiceFetcher() { 501224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 502c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown return new SystemVibrator(); 503224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 504224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 505224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(WALLPAPER_SERVICE, WALLPAPER_FETCHER); 506224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 507224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(WIFI_SERVICE, new ServiceFetcher() { 508224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 509224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IBinder b = ServiceManager.getService(WIFI_SERVICE); 510224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IWifiManager service = IWifiManager.Stub.asInterface(b); 51188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff return new WifiManager(ctx.getOuterContext(), service); 512224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 513224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 51455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync registerService(WIFI_P2P_SERVICE, new ServiceFetcher() { 51555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public Object createService(ContextImpl ctx) { 51655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync IBinder b = ServiceManager.getService(WIFI_P2P_SERVICE); 51755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync IWifiP2pManager service = IWifiP2pManager.Stub.asInterface(b); 51855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return new WifiP2pManager(service); 51955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync }}); 52055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 521224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(WINDOW_SERVICE, new ServiceFetcher() { 522224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object getService(ContextImpl ctx) { 523a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown Display display = ctx.mDisplay; 524a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown if (display == null) { 525a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown DisplayManager dm = (DisplayManager)ctx.getOuterContext().getSystemService( 526a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown Context.DISPLAY_SERVICE); 527a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown display = dm.getDisplay(Display.DEFAULT_DISPLAY); 528a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown } 529a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown return new WindowManagerImpl(display); 530224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 531258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani 532258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani registerService(USER_SERVICE, new ServiceFetcher() { 533258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani public Object getService(ContextImpl ctx) { 534258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani IBinder b = ServiceManager.getService(USER_SERVICE); 535258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani IUserManager service = IUserManager.Stub.asInterface(b); 536258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani return new UserManager(ctx, service); 537258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani }}); 538224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 539224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 5405fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn static ContextImpl getImpl(Context context) { 5415fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn Context nextContext; 5425fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn while ((context instanceof ContextWrapper) && 5435fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn (nextContext=((ContextWrapper)context).getBaseContext()) != null) { 5445fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn context = nextContext; 5455fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn } 5465fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn return (ContextImpl)context; 5475fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn } 5485fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn 549224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // The system service cache for the system services that are 550224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // cached per-ContextImpl. Package-scoped to avoid accessor 551224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // methods. 552224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick final ArrayList<Object> mServiceCache = new ArrayList<Object>(); 553224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AssetManager getAssets() { 556756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn return getResources().getAssets(); 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Resources getResources() { 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mResources; 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PackageManager getPackageManager() { 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageManager != null) { 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackageManager; 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IPackageManager pm = ActivityThread.getPackageManager(); 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pm != null) { 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Doesn't matter if we make more than one instance. 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (mPackageManager = new ApplicationPackageManager(this, pm)); 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ContentResolver getContentResolver() { 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mContentResolver; 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Looper getMainLooper() { 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMainThread.getLooper(); 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5885f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Context getApplicationContext() { 591eb9e9ec06167b0caa459f2fb3f3fae094bb8d8f7Christopher Tate return (mPackageInfo != null) ? 592eb9e9ec06167b0caa459f2fb3f3fae094bb8d8f7Christopher Tate mPackageInfo.getApplication() : mMainThread.getApplication(); 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5945f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setTheme(int resid) { 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mThemeResource = resid; 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5995f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 601247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn public int getThemeResId() { 602247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn return mThemeResource; 603247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn } 604247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn 605247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn @Override 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Resources.Theme getTheme() { 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTheme == null) { 608d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn mThemeResource = Resources.selectDefaultTheme(mThemeResource, 609d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn getOuterContext().getApplicationInfo().targetSdkVersion); 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTheme = mResources.newTheme(); 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTheme.applyStyle(mThemeResource, true); 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mTheme; 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ClassLoader getClassLoader() { 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackageInfo != null ? 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageInfo.getClassLoader() : ClassLoader.getSystemClassLoader(); 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getPackageName() { 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackageInfo.getPackageName(); 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Not supported in system context"); 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6315c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn public ApplicationInfo getApplicationInfo() { 6325c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn if (mPackageInfo != null) { 6335c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn return mPackageInfo.getApplicationInfo(); 6345c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn } 6355c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn throw new RuntimeException("Not supported in system context"); 6365c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn } 6375c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn 6385c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn @Override 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getPackageResourcePath() { 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackageInfo.getResDir(); 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Not supported in system context"); 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getPackageCodePath() { 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackageInfo.getAppDir(); 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Not supported in system context"); 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6535f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 65423ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato public File getSharedPrefsFile(String name) { 65523ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato return makeFilename(getPreferencesDir(), name + ".xml"); 65623ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato } 65723ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SharedPreferences getSharedPreferences(String name, int mode) { 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SharedPreferencesImpl sp; 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (sSharedPrefs) { 662333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick sp = sSharedPrefs.get(name); 6636194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick if (sp == null) { 6644cd50b8d76e08d75df1a2e9d4902bcdc880bd1c1Brad Fitzpatrick File prefsFile = getSharedPrefsFile(name); 6654cd50b8d76e08d75df1a2e9d4902bcdc880bd1c1Brad Fitzpatrick sp = new SharedPreferencesImpl(prefsFile, mode); 6666194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick sSharedPrefs.put(name, sp); 6676194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick return sp; 6686194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick } 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6704e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick if ((mode & Context.MODE_MULTI_PROCESS) != 0 || 6714e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick getApplicationInfo().targetSdkVersion < android.os.Build.VERSION_CODES.HONEYCOMB) { 6724e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick // If somebody else (some other process) changed the prefs 6734e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick // file behind our back, we reload it. This has been the 6744e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick // historical (if undocumented) behavior. 6754e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick sp.startReloadIfChangedUnexpectedly(); 6764e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick } 6776194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick return sp; 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File getPreferencesDir() { 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPreferencesDir == null) { 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPreferencesDir = new File(getDataDirFile(), "shared_prefs"); 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPreferencesDir; 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public FileInputStream openFileInput(String name) 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws FileNotFoundException { 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project File f = makeFilename(getFilesDir(), name); 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new FileInputStream(f); 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public FileOutputStream openFileOutput(String name, int mode) 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws FileNotFoundException { 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean append = (mode&MODE_APPEND) != 0; 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project File f = makeFilename(getFilesDir(), name); 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileOutputStream fos = new FileOutputStream(f, append); 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setFilePermissionsFromMode(f.getPath(), mode, 0); 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return fos; 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (FileNotFoundException e) { 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project File parent = f.getParentFile(); 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parent.mkdir(); 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileUtils.setPermissions( 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parent.getPath(), 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH, 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project -1, -1); 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileOutputStream fos = new FileOutputStream(f, append); 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setFilePermissionsFromMode(f.getPath(), mode, 0); 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return fos; 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean deleteFile(String name) { 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project File f = makeFilename(getFilesDir(), name); 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return f.delete(); 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public File getFilesDir() { 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFilesDir == null) { 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFilesDir = new File(getDataDirFile(), "files"); 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mFilesDir.exists()) { 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(!mFilesDir.mkdirs()) { 7335f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer Log.w(TAG, "Unable to create files directory " + mFilesDir.getPath()); 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileUtils.setPermissions( 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFilesDir.getPath(), 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH, 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project -1, -1); 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFilesDir; 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7445f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 746e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn public File getExternalFilesDir(String type) { 747e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn synchronized (mSync) { 748e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn if (mExternalFilesDir == null) { 749e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn mExternalFilesDir = Environment.getExternalStorageAppFilesDirectory( 750e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn getPackageName()); 751e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 752e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn if (!mExternalFilesDir.exists()) { 753e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn try { 754e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn (new File(Environment.getExternalStorageAndroidDataDir(), 755e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn ".nomedia")).createNewFile(); 756e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } catch (IOException e) { 757e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 758e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn if (!mExternalFilesDir.mkdirs()) { 759e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn Log.w(TAG, "Unable to create external files directory"); 760e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn return null; 761e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 762e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 763e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn if (type == null) { 764e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn return mExternalFilesDir; 765e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 766e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn File dir = new File(mExternalFilesDir, type); 767e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn if (!dir.exists()) { 768e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn if (!dir.mkdirs()) { 769e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn Log.w(TAG, "Unable to create external media directory " + dir); 770e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn return null; 771e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 772e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 773e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn return dir; 774e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 775e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 7765f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 777e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn @Override 778805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn public File getObbDir() { 779805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn synchronized (mSync) { 780805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn if (mObbDir == null) { 781805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn mObbDir = Environment.getExternalStorageAppObbDirectory( 782805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn getPackageName()); 783805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn } 784805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn return mObbDir; 785805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn } 786805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn } 787805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn 788805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn @Override 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public File getCacheDir() { 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCacheDir == null) { 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheDir = new File(getDataDirFile(), "cache"); 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mCacheDir.exists()) { 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(!mCacheDir.mkdirs()) { 79692d570529c72c00ab456521a5b0237f62a6abdf5Amith Yamasani Log.w(TAG, "Unable to create cache directory " + mCacheDir.getAbsolutePath()); 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileUtils.setPermissions( 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheDir.getPath(), 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH, 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project -1, -1); 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCacheDir; 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8075f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 808e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn @Override 809e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn public File getExternalCacheDir() { 810e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn synchronized (mSync) { 811e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn if (mExternalCacheDir == null) { 812e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn mExternalCacheDir = Environment.getExternalStorageAppCacheDirectory( 813e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn getPackageName()); 814e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 815e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn if (!mExternalCacheDir.exists()) { 816e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn try { 817e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn (new File(Environment.getExternalStorageAndroidDataDir(), 818e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn ".nomedia")).createNewFile(); 819e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } catch (IOException e) { 820e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 821e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn if (!mExternalCacheDir.mkdirs()) { 822e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn Log.w(TAG, "Unable to create external cache directory"); 823e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn return null; 824e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 825e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 826e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn return mExternalCacheDir; 827e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 828e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 8295f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public File getFileStreamPath(String name) { 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return makeFilename(getFilesDir(), name); 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String[] fileList() { 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String[] list = getFilesDir().list(); 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (list != null) ? list : EMPTY_FILE_LIST; 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory) { 84347847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown return openOrCreateDatabase(name, mode, factory, null); 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 84774f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory, 84874f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori DatabaseErrorHandler errorHandler) { 84974f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori File f = validateFilePath(name, true); 85047847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown int flags = SQLiteDatabase.CREATE_IF_NECESSARY; 85147847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown if ((mode & MODE_ENABLE_WRITE_AHEAD_LOGGING) != 0) { 85247847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown flags |= SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING; 85347847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown } 85447847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown SQLiteDatabase db = SQLiteDatabase.openDatabase(f.getPath(), factory, flags, errorHandler); 85574f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori setFilePermissionsFromMode(f.getPath(), mode, 0); 85674f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori return db; 85774f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori } 85874f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori 85974f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori @Override 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean deleteDatabase(String name) { 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 862a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor File f = validateFilePath(name, false); 86379087e4b967d8af26c488c41b8c1a087a12da84dJeff Brown return SQLiteDatabase.deleteDatabase(f); 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public File getDatabasePath(String name) { 871a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor return validateFilePath(name, false); 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String[] databaseList() { 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String[] list = getDatabasesDir().list(); 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (list != null) ? list : EMPTY_FILE_LIST; 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8805f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File getDatabasesDir() { 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDatabasesDir == null) { 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabasesDir = new File(getDataDirFile(), "databases"); 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDatabasesDir.getPath().equals("databases")) { 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabasesDir = new File("/data/system"); 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDatabasesDir; 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8925f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable getWallpaper() { 8954c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn return getWallpaperManager().getDrawable(); 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8998cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn public Drawable peekWallpaper() { 9004c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn return getWallpaperManager().peekDrawable(); 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getWallpaperDesiredMinimumWidth() { 9058cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn return getWallpaperManager().getDesiredMinimumWidth(); 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getWallpaperDesiredMinimumHeight() { 9108cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn return getWallpaperManager().getDesiredMinimumHeight(); 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setWallpaper(Bitmap bitmap) throws IOException { 9154c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn getWallpaperManager().setBitmap(bitmap); 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setWallpaper(InputStream data) throws IOException { 9204c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn getWallpaperManager().setStream(data); 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void clearWallpaper() throws IOException { 9258cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn getWallpaperManager().clear(); 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startActivity(Intent intent) { 930cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani warnIfCallingFromSystemProcess(); 931a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn startActivity(intent, null); 932a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn } 933a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn 9348264408f5995534f8e3147b001664ea0df52aaa5Amith Yamasani /** @hide */ 9358264408f5995534f8e3147b001664ea0df52aaa5Amith Yamasani @Override 93679af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn public void startActivityAsUser(Intent intent, UserHandle user) { 937f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn startActivityAsUser(intent, null, user); 9388264408f5995534f8e3147b001664ea0df52aaa5Amith Yamasani } 9398264408f5995534f8e3147b001664ea0df52aaa5Amith Yamasani 940a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn @Override 941a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn public void startActivity(Intent intent, Bundle options) { 942cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani warnIfCallingFromSystemProcess(); 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new AndroidRuntimeException( 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Calling startActivity() from outside of an Activity " 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " context requires the FLAG_ACTIVITY_NEW_TASK flag." 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " Is this really what you want?"); 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getInstrumentation().execStartActivity( 9506e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn getOuterContext(), mMainThread.getApplicationThread(), null, 951a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn (Activity)null, intent, -1, options); 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 954258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani /** @hide */ 955258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani @Override 95679af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn public void startActivityAsUser(Intent intent, Bundle options, UserHandle user) { 957258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani try { 958258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani ActivityManagerNative.getDefault().startActivityAsUser( 959258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani mMainThread.getApplicationThread(), intent, 960258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani intent.resolveTypeIfNeeded(getContentResolver()), 96179af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn null, null, 0, Intent.FLAG_ACTIVITY_NEW_TASK, null, null, options, 96279af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn user.getIdentifier()); 963258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } catch (RemoteException re) { 964258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } 965258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } 966258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 968621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn public void startActivities(Intent[] intents) { 969cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani warnIfCallingFromSystemProcess(); 970a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn startActivities(intents, null); 971a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn } 972a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn 973ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani /** @hide */ 974ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani @Override 975ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani public void startActivitiesAsUser(Intent[] intents, Bundle options, UserHandle userHandle) { 976ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani if ((intents[0].getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { 977ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani throw new AndroidRuntimeException( 978ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani "Calling startActivities() from outside of an Activity " 979ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani + " context requires the FLAG_ACTIVITY_NEW_TASK flag on first Intent." 980ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani + " Is this really what you want?"); 981ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani } 982ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani mMainThread.getInstrumentation().execStartActivitiesAsUser( 983ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani getOuterContext(), mMainThread.getApplicationThread(), null, 984ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani (Activity)null, intents, options, userHandle.getIdentifier()); 985ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani } 986ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani 987a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn @Override 988a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn public void startActivities(Intent[] intents, Bundle options) { 989cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani warnIfCallingFromSystemProcess(); 990621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if ((intents[0].getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { 991621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn throw new AndroidRuntimeException( 992621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn "Calling startActivities() from outside of an Activity " 993621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn + " context requires the FLAG_ACTIVITY_NEW_TASK flag on first Intent." 994621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn + " Is this really what you want?"); 995621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 996621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn mMainThread.getInstrumentation().execStartActivities( 997621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn getOuterContext(), mMainThread.getApplicationThread(), null, 998a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn (Activity)null, intents, options); 999621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 1000621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 1001621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn @Override 1002fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn public void startIntentSender(IntentSender intent, 1003fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags) 1004fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn throws IntentSender.SendIntentException { 1005a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn startIntentSender(intent, fillInIntent, flagsMask, flagsValues, extraFlags, null); 1006a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn } 1007a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn 1008a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn @Override 1009a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn public void startIntentSender(IntentSender intent, Intent fillInIntent, 1010a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn int flagsMask, int flagsValues, int extraFlags, Bundle options) 1011a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn throws IntentSender.SendIntentException { 1012fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn try { 1013fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn String resolvedType = null; 1014fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn if (fillInIntent != null) { 10159ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn fillInIntent.setAllowFds(false); 1016fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn resolvedType = fillInIntent.resolveTypeIfNeeded(getContentResolver()); 1017fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn } 1018fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn int result = ActivityManagerNative.getDefault() 1019fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn .startActivityIntentSender(mMainThread.getApplicationThread(), intent, 1020fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn fillInIntent, resolvedType, null, null, 1021a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn 0, flagsMask, flagsValues, options); 1022a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn if (result == ActivityManager.START_CANCELED) { 1023fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn throw new IntentSender.SendIntentException(); 1024fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn } 1025fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn Instrumentation.checkStartActivityResult(result, null); 1026fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn } catch (RemoteException e) { 1027fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn } 1028fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn } 10295f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 1030fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn @Override 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void sendBroadcast(Intent intent) { 1032cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani warnIfCallingFromSystemProcess(); 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 10359ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn intent.setAllowFds(false); 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().broadcastIntent( 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), intent, resolvedType, null, 1038742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani Activity.RESULT_OK, null, null, null, false, false, 1039ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey getUserId()); 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 104467cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani @Override 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void sendBroadcast(Intent intent, String receiverPermission) { 1046cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani warnIfCallingFromSystemProcess(); 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 10499ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn intent.setAllowFds(false); 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().broadcastIntent( 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), intent, resolvedType, null, 1052742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani Activity.RESULT_OK, null, null, receiverPermission, false, false, 1053ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey getUserId()); 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void sendOrderedBroadcast(Intent intent, 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String receiverPermission) { 1061cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani warnIfCallingFromSystemProcess(); 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 10649ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn intent.setAllowFds(false); 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().broadcastIntent( 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), intent, resolvedType, null, 1067742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani Activity.RESULT_OK, null, null, receiverPermission, true, false, 1068ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey getUserId()); 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void sendOrderedBroadcast(Intent intent, 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String receiverPermission, BroadcastReceiver resultReceiver, 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Handler scheduler, int initialCode, String initialData, 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle initialExtras) { 1078cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani warnIfCallingFromSystemProcess(); 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IIntentReceiver rd = null; 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resultReceiver != null) { 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scheduler == null) { 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scheduler = mMainThread.getHandler(); 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rd = mPackageInfo.getReceiverDispatcher( 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resultReceiver, getOuterContext(), scheduler, 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getInstrumentation(), false); 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scheduler == null) { 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scheduler = mMainThread.getHandler(); 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 109201e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn rd = new LoadedApk.ReceiverDispatcher( 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver(); 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 10989ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn intent.setAllowFds(false); 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().broadcastIntent( 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), intent, resolvedType, rd, 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project initialCode, initialData, initialExtras, receiverPermission, 1102ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey true, false, getUserId()); 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 110879af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn public void sendBroadcastAsUser(Intent intent, UserHandle user) { 11097d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 11107d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn try { 11117d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn intent.setAllowFds(false); 11127d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn ActivityManagerNative.getDefault().broadcastIntent(mMainThread.getApplicationThread(), 11137d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn intent, resolvedType, null, Activity.RESULT_OK, null, null, null, false, false, 111479af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn user.getIdentifier()); 11157d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn } catch (RemoteException e) { 11167d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn } 11177d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn } 11187d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn 11197d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn @Override 11205ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn public void sendBroadcastAsUser(Intent intent, UserHandle user, 11215ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn String receiverPermission) { 11225ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 11235ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn try { 11245ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn intent.setAllowFds(false); 11255ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn ActivityManagerNative.getDefault().broadcastIntent( 11265ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mMainThread.getApplicationThread(), intent, resolvedType, null, 11275ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn Activity.RESULT_OK, null, null, receiverPermission, false, false, 11285ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn user.getIdentifier()); 11295ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn } catch (RemoteException e) { 11305ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn } 11315ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn } 11325ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn 11335ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn @Override 113479af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, 11355ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, 11367d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn int initialCode, String initialData, Bundle initialExtras) { 11377d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn IIntentReceiver rd = null; 11387d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn if (resultReceiver != null) { 11397d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn if (mPackageInfo != null) { 11407d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn if (scheduler == null) { 11417d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn scheduler = mMainThread.getHandler(); 11427d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn } 11437d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn rd = mPackageInfo.getReceiverDispatcher( 11447d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn resultReceiver, getOuterContext(), scheduler, 11457d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn mMainThread.getInstrumentation(), false); 11467d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn } else { 11477d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn if (scheduler == null) { 11487d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn scheduler = mMainThread.getHandler(); 11497d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn } 11507d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn rd = new LoadedApk.ReceiverDispatcher( 11517d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver(); 11527d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn } 11537d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn } 11547d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 11557d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn try { 11567d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn intent.setAllowFds(false); 11577d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn ActivityManagerNative.getDefault().broadcastIntent( 11587d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn mMainThread.getApplicationThread(), intent, resolvedType, rd, 11595ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn initialCode, initialData, initialExtras, receiverPermission, 116079af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn true, false, user.getIdentifier()); 11617d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn } catch (RemoteException e) { 11627d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn } 11637d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn } 11647d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn 11657d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn @Override 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void sendStickyBroadcast(Intent intent) { 1167cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani warnIfCallingFromSystemProcess(); 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 11709ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn intent.setAllowFds(false); 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().broadcastIntent( 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), intent, resolvedType, null, 1173742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani Activity.RESULT_OK, null, null, null, false, true, 1174ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey getUserId()); 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1180efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn public void sendStickyOrderedBroadcast(Intent intent, 1181efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn BroadcastReceiver resultReceiver, 1182efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn Handler scheduler, int initialCode, String initialData, 1183efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn Bundle initialExtras) { 1184cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani warnIfCallingFromSystemProcess(); 1185efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn IIntentReceiver rd = null; 1186efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn if (resultReceiver != null) { 1187efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn if (mPackageInfo != null) { 1188efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn if (scheduler == null) { 1189efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn scheduler = mMainThread.getHandler(); 1190efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } 1191efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn rd = mPackageInfo.getReceiverDispatcher( 1192efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn resultReceiver, getOuterContext(), scheduler, 1193efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn mMainThread.getInstrumentation(), false); 1194efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } else { 1195efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn if (scheduler == null) { 1196efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn scheduler = mMainThread.getHandler(); 1197efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } 119801e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn rd = new LoadedApk.ReceiverDispatcher( 1199efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver(); 1200efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } 1201efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } 1202efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 1203efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn try { 12049ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn intent.setAllowFds(false); 1205efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn ActivityManagerNative.getDefault().broadcastIntent( 1206efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn mMainThread.getApplicationThread(), intent, resolvedType, rd, 1207efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn initialCode, initialData, initialExtras, null, 1208ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey true, true, getUserId()); 1209efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } catch (RemoteException e) { 1210efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } 1211efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } 1212efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn 1213efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn @Override 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeStickyBroadcast(Intent intent) { 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resolvedType != null) { 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent = new Intent(intent); 12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.setDataAndType(intent.getData(), resolvedType); 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 12219ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn intent.setAllowFds(false); 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().unbroadcastIntent( 1223ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey mMainThread.getApplicationThread(), intent, getUserId()); 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 12295ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn public void sendStickyBroadcastAsUser(Intent intent, UserHandle user) { 12305ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 12315ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn try { 12325ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn intent.setAllowFds(false); 12335ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn ActivityManagerNative.getDefault().broadcastIntent( 12345ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mMainThread.getApplicationThread(), intent, resolvedType, null, 12355ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn Activity.RESULT_OK, null, null, null, false, true, user.getIdentifier()); 12365ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn } catch (RemoteException e) { 12375ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn } 12385ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn } 12395ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn 12405ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn @Override 12415ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn public void sendStickyOrderedBroadcastAsUser(Intent intent, 12425ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn UserHandle user, BroadcastReceiver resultReceiver, 12435ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn Handler scheduler, int initialCode, String initialData, 12445ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn Bundle initialExtras) { 12455ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn IIntentReceiver rd = null; 12465ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn if (resultReceiver != null) { 12475ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn if (mPackageInfo != null) { 12485ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn if (scheduler == null) { 12495ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn scheduler = mMainThread.getHandler(); 12505ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn } 12515ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn rd = mPackageInfo.getReceiverDispatcher( 12525ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn resultReceiver, getOuterContext(), scheduler, 12535ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mMainThread.getInstrumentation(), false); 12545ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn } else { 12555ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn if (scheduler == null) { 12565ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn scheduler = mMainThread.getHandler(); 12575ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn } 12585ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn rd = new LoadedApk.ReceiverDispatcher( 12595ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver(); 12605ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn } 12615ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn } 12625ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 12635ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn try { 12645ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn intent.setAllowFds(false); 12655ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn ActivityManagerNative.getDefault().broadcastIntent( 12665ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mMainThread.getApplicationThread(), intent, resolvedType, rd, 12675ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn initialCode, initialData, initialExtras, null, 12685ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn true, true, user.getIdentifier()); 12695ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn } catch (RemoteException e) { 12705ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn } 12715ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn } 12725ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn 12735ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn @Override 12745ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn public void removeStickyBroadcastAsUser(Intent intent, UserHandle user) { 12755ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 12765ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn if (resolvedType != null) { 12775ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn intent = new Intent(intent); 12785ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn intent.setDataAndType(intent.getData(), resolvedType); 12795ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn } 12805ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn try { 12815ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn intent.setAllowFds(false); 12825ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn ActivityManagerNative.getDefault().unbroadcastIntent( 12835ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mMainThread.getApplicationThread(), intent, user.getIdentifier()); 12845ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn } catch (RemoteException e) { 12855ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn } 12865ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn } 12875ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn 12885ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn @Override 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) { 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return registerReceiver(receiver, filter, null, null); 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String broadcastPermission, Handler scheduler) { 1296ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey return registerReceiverInternal(receiver, getUserId(), 129720e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn filter, broadcastPermission, scheduler, getOuterContext()); 129820e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn } 129920e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn 130020e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn @Override 130120e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user, 130220e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn IntentFilter filter, String broadcastPermission, Handler scheduler) { 130320e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn return registerReceiverInternal(receiver, user.getIdentifier(), 130420e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn filter, broadcastPermission, scheduler, getOuterContext()); 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 130720e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn private Intent registerReceiverInternal(BroadcastReceiver receiver, int userId, 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IntentFilter filter, String broadcastPermission, 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Handler scheduler, Context context) { 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IIntentReceiver rd = null; 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (receiver != null) { 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null && context != null) { 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scheduler == null) { 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scheduler = mMainThread.getHandler(); 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rd = mPackageInfo.getReceiverDispatcher( 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project receiver, context, scheduler, 13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getInstrumentation(), true); 13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scheduler == null) { 13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scheduler = mMainThread.getHandler(); 13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 132301e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn rd = new LoadedApk.ReceiverDispatcher( 1324399cccb85749e02f6d3e12d1d2846310e7cbfdf1Dianne Hackborn receiver, context, scheduler, null, true).getIIntentReceiver(); 13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ActivityManagerNative.getDefault().registerReceiver( 13296c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn mMainThread.getApplicationThread(), mBasePackageName, 133020e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn rd, filter, broadcastPermission, userId); 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unregisterReceiver(BroadcastReceiver receiver) { 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IIntentReceiver rd = mPackageInfo.forgetReceiverDispatcher( 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getOuterContext(), receiver); 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().unregisterReceiver(rd); 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Not supported in system context"); 13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ComponentName startService(Intent service) { 1352cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani warnIfCallingFromSystemProcess(); 1353ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey return startServiceAsUser(service, mUser); 13547767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn } 13557767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn 13567767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn @Override 13577767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn public boolean stopService(Intent service) { 1358cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani warnIfCallingFromSystemProcess(); 1359ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey return stopServiceAsUser(service, mUser); 13607767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn } 13617767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn 13627767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn @Override 13637767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn public ComponentName startServiceAsUser(Intent service, UserHandle user) { 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 13659ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn service.setAllowFds(false); 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ComponentName cn = ActivityManagerNative.getDefault().startService( 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), service, 13687767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn service.resolveTypeIfNeeded(getContentResolver()), user.getIdentifier()); 1369c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn if (cn != null) { 1370c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn if (cn.getPackageName().equals("!")) { 1371c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn throw new SecurityException( 1372c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn "Not allowed to start service " + service 1373c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn + " without permission " + cn.getClassName()); 1374c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn } else if (cn.getPackageName().equals("!!")) { 1375c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn throw new SecurityException( 1376c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn "Unable to start service " + service 1377c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn + ": " + cn.getClassName()); 1378c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn } 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return cn; 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 13877767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn public boolean stopServiceAsUser(Intent service, UserHandle user) { 13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 13899ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn service.setAllowFds(false); 13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int res = ActivityManagerNative.getDefault().stopService( 13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), service, 13927767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn service.resolveTypeIfNeeded(getContentResolver()), user.getIdentifier()); 13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res < 0) { 13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException( 13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Not allowed to stop service " + service); 13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res != 0; 13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean bindService(Intent service, ServiceConnection conn, 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags) { 1406cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani warnIfCallingFromSystemProcess(); 1407f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn return bindService(service, conn, flags, UserHandle.getUserId(Process.myUid())); 140837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani } 140937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani 141037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani /** @hide */ 141137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani @Override 14127d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn public boolean bindService(Intent service, ServiceConnection conn, int flags, int userHandle) { 14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IServiceConnection sd; 141479b3317b775810bac088b0998c48eb6506e2578cChristopher Tate if (conn == null) { 141579b3317b775810bac088b0998c48eb6506e2578cChristopher Tate throw new IllegalArgumentException("connection is null"); 141679b3317b775810bac088b0998c48eb6506e2578cChristopher Tate } 14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sd = mPackageInfo.getServiceDispatcher(conn, getOuterContext(), 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getHandler(), flags); 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Not supported in system context"); 14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1424c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn IBinder token = getActivityToken(); 1425c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn if (token == null && (flags&BIND_AUTO_CREATE) == 0 && mPackageInfo != null 1426c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn && mPackageInfo.getApplicationInfo().targetSdkVersion 1427c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn < android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 1428c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn flags |= BIND_WAIVE_PRIORITY; 1429c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn } 14309ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn service.setAllowFds(false); 14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int res = ActivityManagerNative.getDefault().bindService( 14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), getActivityToken(), 14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project service, service.resolveTypeIfNeeded(getContentResolver()), 14347d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn sd, flags, userHandle); 14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res < 0) { 14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException( 14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Not allowed to bind to service " + service); 14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res != 0; 14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unbindService(ServiceConnection conn) { 144779b3317b775810bac088b0998c48eb6506e2578cChristopher Tate if (conn == null) { 144879b3317b775810bac088b0998c48eb6506e2578cChristopher Tate throw new IllegalArgumentException("connection is null"); 144979b3317b775810bac088b0998c48eb6506e2578cChristopher Tate } 14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IServiceConnection sd = mPackageInfo.forgetServiceDispatcher( 14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getOuterContext(), conn); 14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().unbindService(sd); 14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Not supported in system context"); 14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean startInstrumentation(ComponentName className, 14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String profileFile, Bundle arguments) { 14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 14669ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn if (arguments != null) { 14679ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn arguments.setAllowFds(false); 14689ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn } 14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ActivityManagerNative.getDefault().startInstrumentation( 1470ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey className, profileFile, 0, arguments, null, getUserId()); 14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // System has crashed, nothing we can do. 14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Object getSystemService(String name) { 1479224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name); 1480224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return fetcher == null ? null : fetcher.getService(this); 14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14838cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn private WallpaperManager getWallpaperManager() { 1484224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return (WallpaperManager) WALLPAPER_FETCHER.getService(this); 14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1487438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick /* package */ static DropBoxManager createDropBoxManager() { 1488438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick IBinder b = ServiceManager.getService(DROPBOX_SERVICE); 1489438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick IDropBoxManagerService service = IDropBoxManagerService.Stub.asInterface(b); 1490ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick if (service == null) { 1491ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick // Don't return a DropBoxManager that will NPE upon use. 1492ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick // This also avoids caching a broken DropBoxManager in 1493ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick // getDropBoxManager during early boot, before the 1494ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick // DROPBOX_SERVICE is registered. 1495ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick return null; 1496ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick } 1497438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick return new DropBoxManager(service); 1498438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick } 1499438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick 15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int checkPermission(String permission, int pid, int uid) { 15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (permission == null) { 15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("permission is null"); 15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ActivityManagerNative.getDefault().checkPermission( 15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project permission, pid, uid); 15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.PERMISSION_DENIED; 15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int checkCallingPermission(String permission) { 15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (permission == null) { 15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("permission is null"); 15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pid = Binder.getCallingPid(); 15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pid != Process.myPid()) { 1522742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani return checkPermission(permission, pid, Binder.getCallingUid()); 15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.PERMISSION_DENIED; 15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int checkCallingOrSelfPermission(String permission) { 15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (permission == null) { 15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("permission is null"); 15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return checkPermission(permission, Binder.getCallingPid(), 15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingUid()); 15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void enforce( 15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String permission, int resultOfCheck, 15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean selfToo, int uid, String message) { 15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resultOfCheck != PackageManager.PERMISSION_GRANTED) { 15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException( 15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (message != null ? (message + ": ") : "") + 15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (selfToo 15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? "Neither user " + uid + " nor current process has " 15454dc7a68dbeaa0edd8815b2105915753310d58343Christopher Tate : "uid " + uid + " does not have ") + 15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project permission + 15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "."); 15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforcePermission( 15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String permission, int pid, int uid, String message) { 15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforce(permission, 15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkPermission(permission, pid, uid), 15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false, 15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uid, 15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project message); 15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceCallingPermission(String permission, String message) { 15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforce(permission, 15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkCallingPermission(permission), 15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false, 15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingUid(), 15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project message); 15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceCallingOrSelfPermission( 15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String permission, String message) { 15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforce(permission, 15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkCallingOrSelfPermission(permission), 15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project true, 15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingUid(), 15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project message); 15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void grantUriPermission(String toPackage, Uri uri, int modeFlags) { 15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().grantUriPermission( 15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), toPackage, uri, 15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project modeFlags); 15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void revokeUriPermission(Uri uri, int modeFlags) { 15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().revokeUriPermission( 15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), uri, 15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project modeFlags); 15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int checkUriPermission(Uri uri, int pid, int uid, int modeFlags) { 15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ActivityManagerNative.getDefault().checkUriPermission( 16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uri, pid, uid, modeFlags); 16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.PERMISSION_DENIED; 16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int checkCallingUriPermission(Uri uri, int modeFlags) { 16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pid = Binder.getCallingPid(); 16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pid != Process.myPid()) { 16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return checkUriPermission(uri, pid, 16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingUid(), modeFlags); 16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.PERMISSION_DENIED; 16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int checkCallingOrSelfUriPermission(Uri uri, int modeFlags) { 16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return checkUriPermission(uri, Binder.getCallingPid(), 16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingUid(), modeFlags); 16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int checkUriPermission(Uri uri, String readPermission, 16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String writePermission, int pid, int uid, int modeFlags) { 1626569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima if (DEBUG) { 16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i("foo", "checkUriPermission: uri=" + uri + "readPermission=" 16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + readPermission + " writePermission=" + writePermission 16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " pid=" + pid + " uid=" + uid + " mode" + modeFlags); 16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((modeFlags&Intent.FLAG_GRANT_READ_URI_PERMISSION) != 0) { 16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (readPermission == null 16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || checkPermission(readPermission, pid, uid) 16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project == PackageManager.PERMISSION_GRANTED) { 16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.PERMISSION_GRANTED; 16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((modeFlags&Intent.FLAG_GRANT_WRITE_URI_PERMISSION) != 0) { 16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (writePermission == null 16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || checkPermission(writePermission, pid, uid) 16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project == PackageManager.PERMISSION_GRANTED) { 16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.PERMISSION_GRANTED; 16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return uri != null ? checkUriPermission(uri, pid, uid, modeFlags) 16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : PackageManager.PERMISSION_DENIED; 16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String uriModeFlagToString(int uriModeFlags) { 16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (uriModeFlags) { 16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case Intent.FLAG_GRANT_READ_URI_PERMISSION | 16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent.FLAG_GRANT_WRITE_URI_PERMISSION: 16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "read and write"; 16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case Intent.FLAG_GRANT_READ_URI_PERMISSION: 16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "read"; 16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case Intent.FLAG_GRANT_WRITE_URI_PERMISSION: 16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "write"; 16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException( 16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Unknown permission mode flags: " + uriModeFlags); 16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void enforceForUri( 16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int modeFlags, int resultOfCheck, boolean selfToo, 16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int uid, Uri uri, String message) { 16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resultOfCheck != PackageManager.PERMISSION_GRANTED) { 16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException( 16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (message != null ? (message + ": ") : "") + 16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (selfToo 16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? "Neither user " + uid + " nor current process has " 16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : "User " + uid + " does not have ") + 16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uriModeFlagToString(modeFlags) + 16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " permission on " + 16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uri + 16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "."); 16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceUriPermission( 16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri uri, int pid, int uid, int modeFlags, String message) { 16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceForUri( 16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project modeFlags, checkUriPermission(uri, pid, uid, modeFlags), 16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false, uid, uri, message); 16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceCallingUriPermission( 16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri uri, int modeFlags, String message) { 16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceForUri( 16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project modeFlags, checkCallingUriPermission(uri, modeFlags), 1690742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani false, 1691742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani Binder.getCallingUid(), uri, message); 16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceCallingOrSelfUriPermission( 16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri uri, int modeFlags, String message) { 16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceForUri( 16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project modeFlags, 16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkCallingOrSelfUriPermission(uri, modeFlags), true, 16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingUid(), uri, message); 17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceUriPermission( 17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri uri, String readPermission, String writePermission, 17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pid, int uid, int modeFlags, String message) { 17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceForUri(modeFlags, 17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkUriPermission( 17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uri, readPermission, writePermission, pid, uid, 17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project modeFlags), 17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false, 17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uid, 17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uri, 17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project message); 17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1715cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani private void warnIfCallingFromSystemProcess() { 1716cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani if (Process.myUid() == Process.SYSTEM_UID) { 1717cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani Slog.w(TAG, "Calling a method in the system process without a qualified user: " 1718cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani + Debug.getCallers(3)); 1719cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani } 1720cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani } 1721cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani 17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Context createPackageContext(String packageName, int flags) 17246d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey throws NameNotFoundException { 172564442c11555d828a41af0b8a58ab933357889061Amith Yamasani return createPackageContextAsUser(packageName, flags, 172664442c11555d828a41af0b8a58ab933357889061Amith Yamasani mUser != null ? mUser : Process.myUserHandle()); 17276d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey } 17286d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey 17296d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey @Override 17306d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey public Context createPackageContextAsUser(String packageName, int flags, UserHandle user) 17316d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey throws NameNotFoundException { 17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (packageName.equals("system") || packageName.equals("android")) { 1733816e4f758302aaf3b115b5914d48732ed78af946Jeff Sharkey final ContextImpl context = new ContextImpl(mMainThread.getSystemContext()); 17346f2a3d298205522f2e799800dace0e6c345dd4d3Adam Powell context.mRestricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED; 17356f2a3d298205522f2e799800dace0e6c345dd4d3Adam Powell context.init(mPackageInfo, null, mMainThread, mResources, mBasePackageName, user); 1736816e4f758302aaf3b115b5914d48732ed78af946Jeff Sharkey return context; 17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 173901e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn LoadedApk pi = 174098edc951712823dbf5db2b7e9c203a0e98fc616bAmith Yamasani mMainThread.getPackageInfo(packageName, mResources.getCompatibilityInfo(), flags, 174198edc951712823dbf5db2b7e9c203a0e98fc616bAmith Yamasani user.getIdentifier()); 17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pi != null) { 17432155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn ContextImpl c = new ContextImpl(); 1744870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy c.mRestricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED; 17456d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey c.init(pi, null, mMainThread, mResources, mBasePackageName, user); 17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c.mResources != null) { 17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return c; 17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Should be a better exception. 17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new PackageManager.NameNotFoundException( 17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Application package " + packageName + " not found"); 17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1756870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy @Override 1757756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn public Context createConfigurationContext(Configuration overrideConfiguration) { 1758a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown if (overrideConfiguration == null) { 1759a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown throw new IllegalArgumentException("overrideConfiguration must not be null"); 1760a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown } 1761a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown 1762756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn ContextImpl c = new ContextImpl(); 1763756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn c.init(mPackageInfo, null, mMainThread); 1764756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn c.mResources = mMainThread.getTopLevelResources( 1765a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown mPackageInfo.getResDir(), 1766a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown getDisplayId(), overrideConfiguration, 1767756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn mResources.getCompatibilityInfo()); 1768756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn return c; 1769756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn } 1770756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn 1771756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn @Override 1772a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown public Context createDisplayContext(Display display) { 1773a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown if (display == null) { 1774a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown throw new IllegalArgumentException("display must not be null"); 1775a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown } 1776a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown 1777a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown int displayId = display.getDisplayId(); 1778a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown CompatibilityInfo ci = CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO; 1779a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown CompatibilityInfoHolder cih = getCompatibilityInfo(displayId); 1780a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown if (cih != null) { 1781a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown ci = cih.get(); 1782a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown } 1783a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown 1784a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown ContextImpl context = new ContextImpl(); 1785a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown context.init(mPackageInfo, null, mMainThread); 1786a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown context.mDisplay = display; 1787a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown context.mResources = mMainThread.getTopLevelResources( 1788a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown mPackageInfo.getResDir(), displayId, null, ci); 1789a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown return context; 1790a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown } 1791a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown 1792a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown private int getDisplayId() { 1793a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown return mDisplay != null ? mDisplay.getDisplayId() : Display.DEFAULT_DISPLAY; 1794a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown } 1795a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown 1796a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown @Override 1797870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy public boolean isRestricted() { 1798870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy return mRestricted; 1799870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy } 1800870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy 180198365d7663cbd82979a5700faf0050220b01084dJeff Brown @Override 1802a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown public CompatibilityInfoHolder getCompatibilityInfo(int displayId) { 1803a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown return displayId == Display.DEFAULT_DISPLAY ? mPackageInfo.mCompatibilityInfo : null; 180498365d7663cbd82979a5700faf0050220b01084dJeff Brown } 180598365d7663cbd82979a5700faf0050220b01084dJeff Brown 18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File getDataDirFile() { 18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackageInfo.getDataDirFile(); 18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Not supported in system context"); 18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public File getDir(String name, int mode) { 18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project name = "app_" + name; 18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project File file = makeFilename(getDataDirFile(), name); 18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!file.exists()) { 18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project file.mkdir(); 18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setFilePermissionsFromMode(file.getPath(), mode, 18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH); 18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return file; 18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1825ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey /** {@hide} */ 1826ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey public int getUserId() { 1827ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey return mUser.getIdentifier(); 1828ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey } 1829ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey 18302155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn static ContextImpl createSystemContext(ActivityThread mainThread) { 18316d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey final ContextImpl context = new ContextImpl(); 18326d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey context.init(Resources.getSystem(), mainThread, Process.myUserHandle()); 18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return context; 18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18362155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn ContextImpl() { 18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOuterContext = this; 18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a new ApplicationContext from an existing one. The new one 18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * works and operates the same as the one it is copying. 18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context Existing application context. 18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18462155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn public ContextImpl(ContextImpl context) { 18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageInfo = context.mPackageInfo; 18486c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn mBasePackageName = context.mBasePackageName; 18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResources = context.mResources; 18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread = context.mMainThread; 18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContentResolver = context.mContentResolver; 18526d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey mUser = context.mUser; 1853a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown mDisplay = context.mDisplay; 18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOuterContext = this; 18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18576d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey final void init(LoadedApk packageInfo, IBinder activityToken, ActivityThread mainThread) { 18586d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey init(packageInfo, activityToken, mainThread, null, null, Process.myUserHandle()); 1859ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima } 1860ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima 18616d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey final void init(LoadedApk packageInfo, IBinder activityToken, ActivityThread mainThread, 18626d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey Resources container, String basePackageName, UserHandle user) { 18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageInfo = packageInfo; 18646c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn mBasePackageName = basePackageName != null ? basePackageName : packageInfo.mPackageName; 18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResources = mPackageInfo.getResources(mainThread); 1866ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima 1867559a78753165f20d5973b958791056154baecc43Dianne Hackborn if (mResources != null && container != null 1868559a78753165f20d5973b958791056154baecc43Dianne Hackborn && container.getCompatibilityInfo().applicationScale != 1869559a78753165f20d5973b958791056154baecc43Dianne Hackborn mResources.getCompatibilityInfo().applicationScale) { 1870ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima if (DEBUG) { 1871ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima Log.d(TAG, "loaded context has different scaling. Using container's" + 1872ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima " compatiblity info:" + container.getDisplayMetrics()); 1873ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima } 1874ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima mResources = mainThread.getTopLevelResources( 1875a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown mPackageInfo.getResDir(), Display.DEFAULT_DISPLAY, 1876a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown null, container.getCompatibilityInfo()); 1877ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima } 18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread = mainThread; 1879756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn mActivityToken = activityToken; 18806d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey mContentResolver = new ApplicationContentResolver(this, mainThread, user); 18816d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey mUser = user; 18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18846d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey final void init(Resources resources, ActivityThread mainThread, UserHandle user) { 18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageInfo = null; 18866c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn mBasePackageName = null; 18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResources = resources; 18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread = mainThread; 18896d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey mContentResolver = new ApplicationContentResolver(this, mainThread, user); 18906d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey mUser = user; 18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final void scheduleFinalCleanup(String who, String what) { 18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.scheduleContextCleanup(this, who, what); 18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final void performFinalCleanup(String who, String what) { 18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.i(TAG, "Cleanup up context: " + this); 18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageInfo.removeContextRegistrations(getOuterContext(), who, what); 19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Context getReceiverRestrictedContext() { 19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mReceiverRestrictedContext != null) { 19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mReceiverRestrictedContext; 19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mReceiverRestrictedContext = new ReceiverRestrictedContext(getOuterContext()); 19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final void setOuterContext(Context context) { 19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOuterContext = context; 19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19125f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Context getOuterContext() { 19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mOuterContext; 19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19165f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final IBinder getActivityToken() { 19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mActivityToken; 19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1921d3da44032084b6dd280487280553dcdbd7933e3eBrad Fitzpatrick static void setFilePermissionsFromMode(String name, int mode, 19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int extraPermissions) { 19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int perms = FileUtils.S_IRUSR|FileUtils.S_IWUSR 19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project |FileUtils.S_IRGRP|FileUtils.S_IWGRP 19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project |extraPermissions; 19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mode&MODE_WORLD_READABLE) != 0) { 19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perms |= FileUtils.S_IROTH; 19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mode&MODE_WORLD_WRITEABLE) != 0) { 19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perms |= FileUtils.S_IWOTH; 19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1932569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima if (DEBUG) { 19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(TAG, "File " + name + ": mode=0x" + Integer.toHexString(mode) 19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", perms=0x" + Integer.toHexString(perms)); 19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileUtils.setPermissions(name, perms, -1, -1); 19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1939a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor private File validateFilePath(String name, boolean createDirectory) { 1940a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor File dir; 1941a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor File f; 1942a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor 1943a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor if (name.charAt(0) == File.separatorChar) { 1944a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor String dirPath = name.substring(0, name.lastIndexOf(File.separatorChar)); 1945a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor dir = new File(dirPath); 1946a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor name = name.substring(name.lastIndexOf(File.separatorChar)); 1947a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor f = new File(dir, name); 1948a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor } else { 1949a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor dir = getDatabasesDir(); 1950a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor f = makeFilename(dir, name); 1951a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor } 1952a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor 1953a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor if (createDirectory && !dir.isDirectory() && dir.mkdir()) { 1954a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor FileUtils.setPermissions(dir.getPath(), 1955a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH, 1956a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor -1, -1); 1957a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor } 1958a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor 1959a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor return f; 1960a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor } 1961a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor 19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File makeFilename(File base, String name) { 19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name.indexOf(File.separatorChar) < 0) { 19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new File(base, name); 19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException( 1967a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor "File " + name + " contains a path separator"); 19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ---------------------------------------------------------------------- 19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ---------------------------------------------------------------------- 19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ---------------------------------------------------------------------- 19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final class ApplicationContentResolver extends ContentResolver { 19756d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey private final ActivityThread mMainThread; 19766d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey private final UserHandle mUser; 19776d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey 19786d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey public ApplicationContentResolver( 19796d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey Context context, ActivityThread mainThread, UserHandle user) { 19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context); 19816d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey mMainThread = Preconditions.checkNotNull(mainThread); 19826d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey mUser = Preconditions.checkNotNull(user); 19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 19866d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey protected IContentProvider acquireProvider(Context context, String auth) { 19876d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey return mMainThread.acquireProvider(context, auth, mUser.getIdentifier(), true); 19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 19916d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey protected IContentProvider acquireExistingProvider(Context context, String auth) { 19926d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey return mMainThread.acquireExistingProvider(context, auth, mUser.getIdentifier(), true); 1993cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn } 1994cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn 1995cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn @Override 1996cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn public boolean releaseProvider(IContentProvider provider) { 19976ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn return mMainThread.releaseProvider(provider, true); 19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19995f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 2000652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn @Override 20016d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey protected IContentProvider acquireUnstableProvider(Context c, String auth) { 20026d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey return mMainThread.acquireProvider(c, auth, mUser.getIdentifier(), false); 2003652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn } 2004652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn 2005652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn @Override 2006652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn public boolean releaseUnstableProvider(IContentProvider icp) { 20076ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn return mMainThread.releaseProvider(icp, false); 20086ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn } 20096ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn 20106ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn @Override 20116ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn public void unstableProviderDied(IContentProvider icp) { 20126ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn mMainThread.handleUnstableProviderDied(icp.asBinder(), true); 2013652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn } 20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2016