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 190debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinskiimport android.app.usage.IUsageStatsManager; 200debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinskiimport android.app.usage.UsageStatsManager; 21976e8bd2017d0263216c62111454438cc0f130e3Svetoslavimport android.appwidget.AppWidgetManager; 22ff32f353f8f6974de80cd6979ce3047dc7133d96Dianne Hackbornimport android.os.Build; 2368d4acd205e8c2da524e62734ca42847306cc029Andres Moralesimport android.service.persistentdata.IPersistentDataBlockService; 2468d4acd205e8c2da524e62734ca42847306cc029Andres Moralesimport android.service.persistentdata.PersistentDataBlockManager; 25d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville 26976e8bd2017d0263216c62111454438cc0f130e3Svetoslavimport com.android.internal.appwidget.IAppWidgetService; 2775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport com.android.internal.policy.PolicyManager; 286d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkeyimport com.android.internal.util.Preconditions; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xieimport android.bluetooth.BluetoothManager; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.BroadcastReceiver; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName; 33d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevotimport android.content.ContentProvider; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentResolver; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContextWrapper; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IContentProvider; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IntentFilter; 401ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.content.IIntentReceiver; 411ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.content.IntentSender; 42f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasaniimport android.content.IRestrictionsManager; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ReceiverCallNotAllowedException; 44f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasaniimport android.content.RestrictionsManager; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ServiceConnection; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.SharedPreferences; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ApplicationInfo; 484f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.content.pm.ILauncherApps; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.IPackageManager; 504f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasaniimport android.content.pm.LauncherApps; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager; 526d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkeyimport android.content.pm.PackageManager.NameNotFoundException; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.AssetManager; 545be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackbornimport android.content.res.CompatibilityInfo; 55756220bd1912535840388a6743830d2e59ad4964Dianne Hackbornimport android.content.res.Configuration; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources; 5774f170f9468d3cf6d7d0ef453320141a3e63571bVasu Noriimport android.database.DatabaseErrorHandler; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.sqlite.SQLiteDatabase; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.sqlite.SQLiteDatabase.CursorFactory; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Bitmap; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable; 6251e95df8f24e9ea30775686b9e324b9a671213dcErik Gillingimport android.hardware.ConsumerIrManager; 63b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodimport android.hardware.ISerialManager; 64b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodimport android.hardware.SerialManager; 6525157e458d6e10b027d1ba6b78b0487156c9f57aJeff Brownimport android.hardware.SystemSensorManager; 667f01f8e76ffec6f6006759ebf6ac5bd689004e9bJinsuk Kimimport android.hardware.hdmi.HdmiControlManager; 677f01f8e76ffec6f6006759ebf6ac5bd689004e9bJinsuk Kimimport android.hardware.hdmi.IHdmiControlService; 682f1a2e423e0fbb64467d6fcfa4e82c6384f31210Eino-Ville Talvalaimport android.hardware.camera2.CameraManager; 69fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownimport android.hardware.display.DisplayManager; 709df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brownimport android.hardware.input.InputManager; 71c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodimport android.hardware.usb.IUsbManager; 72c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodimport android.hardware.usb.UsbManager; 73a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.location.CountryDetector; 74a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.location.ICountryDetector; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.location.ILocationManager; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.location.LocationManager; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.AudioManager; 78b58b8f832d06b0ffa8886eba5a4916578a3b8743Dianne Hackbornimport android.media.MediaRouter; 79c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightimport android.media.projection.MediaProjectionManager; 8042ea7eecd149161ed192d3029f0d77d1d08a4aa5RoboErikimport android.media.session.MediaSessionManager; 81d5cc4a281e7ce29d1e8687ff3394b57a3a549260Jae Seoimport android.media.tv.ITvInputManager; 82d5cc4a281e7ce29d1e8687ff3394b57a3a549260Jae Seoimport android.media.tv.TvInputManager; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.ConnectivityManager; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.IConnectivityManager; 85f9ff2c9ae5595a20d77b10a41386932de1fc2da2Lorenzo Colittiimport android.net.EthernetManager; 86f9ff2c9ae5595a20d77b10a41386932de1fc2da2Lorenzo Colittiimport android.net.IEthernetManager; 871a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkeyimport android.net.INetworkPolicyManager; 881a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkeyimport android.net.NetworkPolicyManager; 89b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidsonimport android.net.NetworkScoreManager; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 917d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.net.nsd.INsdManager; 927d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.net.nsd.NsdManager; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.wifi.IWifiManager; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.wifi.WifiManager; 9555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.net.wifi.p2p.IWifiP2pManager; 9655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.net.wifi.p2p.WifiP2pManager; 977686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpandeimport android.net.wifi.IWifiScanner; 987686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpandeimport android.net.wifi.WifiScanner; 997686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpandeimport android.net.wifi.IRttManager; 1007686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpandeimport android.net.wifi.RttManager; 10150b4d8f643f31b37e9872f562fb869059cf79c8aNick Pellyimport android.nfc.NfcManager; 102e35872da97ac6bd07d2d9ac5af8a7c18ad290718Todd Poynorimport android.os.BatteryManager; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 105cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasaniimport android.os.Debug; 106f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnorimport android.os.DropBoxManager; 107539d3c475f44b1499499a8b70375a192545cf113Oscar Montemayorimport android.os.Environment; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.FileUtils; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler; 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IPowerManager; 112258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasaniimport android.os.IUserManager; 11375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.Looper; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.PowerManager; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process; 11675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.RemoteException; 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 118f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackbornimport android.os.UserHandle; 119c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brownimport android.os.SystemVibrator; 120258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasaniimport android.os.UserManager; 1212d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkeyimport android.os.storage.IMountService; 122b104340496e3a531e26c8f428c808eca0e039f50San Mehatimport android.os.storage.StorageManager; 1234b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganovimport android.print.IPrintManager; 1244b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganovimport android.print.PrintManager; 125a7596147b43940cad3f76c53ed154ef088b9269bJim Millerimport android.service.fingerprint.IFingerprintService; 12608fa40c5cb5229b7969b2a5146855a337870f45aJim Millerimport android.service.fingerprint.FingerprintManager; 127ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunnimport android.telecom.TelecomManager; 128d09c4cad65c708f2c4810d24295456708a2000d2Wink Savilleimport android.telephony.SubscriptionManager; 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.TelephonyManager; 1309f53119b72e6da865bcd53173d3dacd1eba01aeeDianne Hackbornimport android.content.ClipboardManager; 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AndroidRuntimeException; 1328e3ddab1fcc246442484c1b443810a1ba6f35296Jeff Sharkeyimport android.util.ArrayMap; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 134cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasaniimport android.util.Slog; 13548d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautnerimport android.view.DisplayAdjustments; 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ContextThemeWrapper; 13798365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.view.Display; 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManagerImpl; 13975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.view.accessibility.AccessibilityManager; 14069ce69b0e1500bcf0bfa87eaf0b89ae47f552f5cAlan Viveretteimport android.view.accessibility.CaptioningManager; 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.InputMethodManager; 142988323c57bd25a58f05dfa492d9b9c8ab62c5153satokimport android.view.textservice.TextServicesManager; 143603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintanaimport android.accounts.AccountManager; 144603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintanaimport android.accounts.IAccountManager; 14587bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackbornimport android.app.admin.DevicePolicyManager; 1467060b04f6d92351b67222e636ab378a0273bf3e7Christopher Tateimport android.app.job.IJobScheduler; 14782142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roosimport android.app.trust.TrustManager; 148a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 1491abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkeyimport com.android.internal.annotations.GuardedBy; 150a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornimport com.android.internal.app.IAppOpsService; 151f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnorimport com.android.internal.os.IDropBoxManagerService; 152952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream; 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileNotFoundException; 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream; 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream; 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap; 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass ReceiverRestrictedContext extends ContextWrapper { 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ReceiverRestrictedContext(Context base) { 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(base); 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) { 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return registerReceiver(receiver, filter, null, null); 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String broadcastPermission, Handler scheduler) { 17527bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey if (receiver == null) { 17627bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey // Allow retrieving current sticky broadcast; this is safe since we 17727bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey // aren't actually registering a receiver. 17827bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey return super.registerReceiver(null, filter, broadcastPermission, scheduler); 17927bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey } else { 18027bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey throw new ReceiverCallNotAllowedException( 18127bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey "BroadcastReceiver components are not allowed to register to receive intents"); 18227bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey } 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 18620e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user, 18720e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn IntentFilter filter, String broadcastPermission, Handler scheduler) { 18827bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey if (receiver == null) { 18927bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey // Allow retrieving current sticky broadcast; this is safe since we 19027bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey // aren't actually registering a receiver. 19127bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey return super.registerReceiverAsUser(null, user, filter, broadcastPermission, scheduler); 19227bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey } else { 19327bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey throw new ReceiverCallNotAllowedException( 19427bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey "BroadcastReceiver components are not allowed to register to receive intents"); 19527bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey } 19620e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn } 19720e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn 19820e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn @Override 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean bindService(Intent service, ServiceConnection conn, int flags) { 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ReceiverCallNotAllowedException( 20127bd34d9d9fe99f11b80aa0bbdb402fb47ef4158Jeff Sharkey "BroadcastReceiver components are not allowed to bind to services"); 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 2062155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn * Common implementation of Context API, which provides the base 2072155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn * context object for Activity and other application components. 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2092155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackbornclass ContextImpl extends Context { 21040e9f2922cae76ffcbc521481e5be8e80e8744efDianne Hackborn private final static String TAG = "ContextImpl"; 211569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima private final static boolean DEBUG = false; 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2138e3ddab1fcc246442484c1b443810a1ba6f35296Jeff Sharkey /** 2148e3ddab1fcc246442484c1b443810a1ba6f35296Jeff Sharkey * Map from package name, to preference name, to cached preferences. 2158e3ddab1fcc246442484c1b443810a1ba6f35296Jeff Sharkey */ 2168e3ddab1fcc246442484c1b443810a1ba6f35296Jeff Sharkey private static ArrayMap<String, ArrayMap<String, SharedPreferencesImpl>> sSharedPrefs; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 218defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown final ActivityThread mMainThread; 219defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown final LoadedApk mPackageInfo; 220defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown 221defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown private final IBinder mActivityToken; 222defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown 223defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown private final UserHandle mUser; 224defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown 225defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown private final ApplicationContentResolver mContentResolver; 226defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown 227defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown private final String mBasePackageName; 228defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown private final String mOpPackageName; 229defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown 230defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown private final ResourcesManager mResourcesManager; 231defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown private final Resources mResources; 232defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown private final Display mDisplay; // may be null if default display 233defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown private final DisplayAdjustments mDisplayAdjustments = new DisplayAdjustments(); 234defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown private final Configuration mOverrideConfiguration; 235defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown 236defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown private final boolean mRestricted; 237defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Context mOuterContext; 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mThemeResource = 0; 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Resources.Theme mTheme = null; 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private PackageManager mPackageManager; 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Context mReceiverRestrictedContext = null; 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Object mSync = new Object(); 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2461abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey @GuardedBy("mSync") 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File mDatabasesDir; 2481abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey @GuardedBy("mSync") 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File mPreferencesDir; 2501abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey @GuardedBy("mSync") 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File mFilesDir; 2521abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey @GuardedBy("mSync") 253a7835b6b6b00923b608a6bc3194e7840f67de7a8Christopher Tate private File mNoBackupFilesDir; 254a7835b6b6b00923b608a6bc3194e7840f67de7a8Christopher Tate @GuardedBy("mSync") 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File mCacheDir; 2564ed745d359ada6986ac15d8718452e5c55f40170Jeff Sharkey @GuardedBy("mSync") 2574ed745d359ada6986ac15d8718452e5c55f40170Jeff Sharkey private File mCodeCacheDir; 2581abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey 2591abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey @GuardedBy("mSync") 2601abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey private File[] mExternalObbDirs; 2611abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey @GuardedBy("mSync") 2621abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey private File[] mExternalFilesDirs; 2631abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey @GuardedBy("mSync") 2641abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey private File[] mExternalCacheDirs; 2652ee3c1e189819cc6efb4d7de24f1438bdb824087Jeff Sharkey @GuardedBy("mSync") 2662ee3c1e189819cc6efb4d7de24f1438bdb824087Jeff Sharkey private File[] mExternalMediaDirs; 2675f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String[] EMPTY_FILE_LIST = {}; 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 270224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick /** 271224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick * Override this class when the system service constructor needs a 272224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick * ContextImpl. Else, use StaticServiceFetcher below. 273224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick */ 274224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick /*package*/ static class ServiceFetcher { 275224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick int mContextCacheIndex = -1; 276224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 277224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick /** 278224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick * Main entrypoint; only override if you don't need caching. 279224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick */ 280224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object getService(ContextImpl ctx) { 281224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick ArrayList<Object> cache = ctx.mServiceCache; 282224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick Object service; 283224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick synchronized (cache) { 284224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick if (cache.size() == 0) { 285224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // Initialize the cache vector on first access. 286224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // At this point sNextPerContextServiceCacheIndex 287224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // is the number of potential services that are 288224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // cached per-Context. 289224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick for (int i = 0; i < sNextPerContextServiceCacheIndex; i++) { 290224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick cache.add(null); 291224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 292224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } else { 293224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick service = cache.get(mContextCacheIndex); 294224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick if (service != null) { 295224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return service; 296224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 297224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 298224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick service = createService(ctx); 299224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick cache.set(mContextCacheIndex, service); 300224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return service; 301224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 302224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 303224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 304224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick /** 305224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick * Override this to create a new per-Context instance of the 306224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick * service. getService() will handle locking and caching. 307224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick */ 308224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 309224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick throw new RuntimeException("Not implemented"); 310224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 311224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 312224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 313224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick /** 314224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick * Override this class for services to be cached process-wide. 315224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick */ 316224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick abstract static class StaticServiceFetcher extends ServiceFetcher { 317224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick private Object mCachedInstance; 318224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 319224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick @Override 320224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public final Object getService(ContextImpl unused) { 321224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick synchronized (StaticServiceFetcher.this) { 322224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick Object service = mCachedInstance; 323224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick if (service != null) { 324224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return service; 325224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 326224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return mCachedInstance = createStaticService(); 327224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 328224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 329224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 330224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public abstract Object createStaticService(); 331224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 332224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 333224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick private static final HashMap<String, ServiceFetcher> SYSTEM_SERVICE_MAP = 334224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick new HashMap<String, ServiceFetcher>(); 335224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 336224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick private static int sNextPerContextServiceCacheIndex = 0; 337224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick private static void registerService(String serviceName, ServiceFetcher fetcher) { 338224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick if (!(fetcher instanceof StaticServiceFetcher)) { 339224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick fetcher.mContextCacheIndex = sNextPerContextServiceCacheIndex++; 340224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 341224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick SYSTEM_SERVICE_MAP.put(serviceName, fetcher); 342224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 343224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 344224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // This one's defined separately and given a variable name so it 345224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // can be re-used by getWallpaperManager(), avoiding a HashMap 346224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // lookup. 347224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick private static ServiceFetcher WALLPAPER_FETCHER = new ServiceFetcher() { 348224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 349224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new WallpaperManager(ctx.getOuterContext(), 350224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick ctx.mMainThread.getHandler()); 351224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}; 352224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 353224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick static { 354224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(ACCESSIBILITY_SERVICE, new ServiceFetcher() { 355224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object getService(ContextImpl ctx) { 356224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return AccessibilityManager.getInstance(ctx); 357224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 358224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 35969ce69b0e1500bcf0bfa87eaf0b89ae47f552f5cAlan Viverette registerService(CAPTIONING_SERVICE, new ServiceFetcher() { 36069ce69b0e1500bcf0bfa87eaf0b89ae47f552f5cAlan Viverette public Object getService(ContextImpl ctx) { 36169ce69b0e1500bcf0bfa87eaf0b89ae47f552f5cAlan Viverette return new CaptioningManager(ctx); 36269ce69b0e1500bcf0bfa87eaf0b89ae47f552f5cAlan Viverette }}); 36369ce69b0e1500bcf0bfa87eaf0b89ae47f552f5cAlan Viverette 364224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(ACCOUNT_SERVICE, new ServiceFetcher() { 365224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 366224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IBinder b = ServiceManager.getService(ACCOUNT_SERVICE); 367224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IAccountManager service = IAccountManager.Stub.asInterface(b); 368224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new AccountManager(ctx, service); 369224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 370224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 371224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(ACTIVITY_SERVICE, new ServiceFetcher() { 372224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 373224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new ActivityManager(ctx.getOuterContext(), ctx.mMainThread.getHandler()); 374224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 375224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 376e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate registerService(ALARM_SERVICE, new ServiceFetcher() { 377e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate public Object createService(ContextImpl ctx) { 378224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IBinder b = ServiceManager.getService(ALARM_SERVICE); 379224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IAlarmManager service = IAlarmManager.Stub.asInterface(b); 380e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate return new AlarmManager(service, ctx); 381224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 382224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 383224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(AUDIO_SERVICE, new ServiceFetcher() { 384224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 385224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new AudioManager(ctx); 386224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 387224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 388b58b8f832d06b0ffa8886eba5a4916578a3b8743Dianne Hackborn registerService(MEDIA_ROUTER_SERVICE, new ServiceFetcher() { 389b58b8f832d06b0ffa8886eba5a4916578a3b8743Dianne Hackborn public Object createService(ContextImpl ctx) { 390b58b8f832d06b0ffa8886eba5a4916578a3b8743Dianne Hackborn return new MediaRouter(ctx); 391b58b8f832d06b0ffa8886eba5a4916578a3b8743Dianne Hackborn }}); 392b58b8f832d06b0ffa8886eba5a4916578a3b8743Dianne Hackborn 3931abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh registerService(BLUETOOTH_SERVICE, new ServiceFetcher() { 3941abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh public Object createService(ContextImpl ctx) { 395ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie return new BluetoothManager(ctx); 3961abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh }}); 3971abb1cb3a8fe17f7866150604c2fd73751da787eJaikumar Ganesh 3987f01f8e76ffec6f6006759ebf6ac5bd689004e9bJinsuk Kim registerService(HDMI_CONTROL_SERVICE, new StaticServiceFetcher() { 3997f01f8e76ffec6f6006759ebf6ac5bd689004e9bJinsuk Kim public Object createStaticService() { 4007f01f8e76ffec6f6006759ebf6ac5bd689004e9bJinsuk Kim IBinder b = ServiceManager.getService(HDMI_CONTROL_SERVICE); 4017f01f8e76ffec6f6006759ebf6ac5bd689004e9bJinsuk Kim return new HdmiControlManager(IHdmiControlService.Stub.asInterface(b)); 4027f01f8e76ffec6f6006759ebf6ac5bd689004e9bJinsuk Kim }}); 403fbcd503645d9527fd7c700b3e4e8f170c46a7ebaJinsuk Kim 404224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(CLIPBOARD_SERVICE, new ServiceFetcher() { 405224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 406224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new ClipboardManager(ctx.getOuterContext(), 407224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick ctx.mMainThread.getHandler()); 408224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 409224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 410f81daa986e3a2d75c6f2398a59b965790484e0a2Chad Brubaker registerService(CONNECTIVITY_SERVICE, new ServiceFetcher() { 411f81daa986e3a2d75c6f2398a59b965790484e0a2Chad Brubaker public Object createService(ContextImpl ctx) { 412224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IBinder b = ServiceManager.getService(CONNECTIVITY_SERVICE); 41303666c705ddabe0e7c5869ab69c2ca8b964164e9Sreeram Ramachandran return new ConnectivityManager(IConnectivityManager.Stub.asInterface(b)); 414224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 415224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 416224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(COUNTRY_DETECTOR, new StaticServiceFetcher() { 417224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createStaticService() { 418224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IBinder b = ServiceManager.getService(COUNTRY_DETECTOR); 419224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new CountryDetector(ICountryDetector.Stub.asInterface(b)); 420224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 421224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 422224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(DEVICE_POLICY_SERVICE, new ServiceFetcher() { 423224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 424224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return DevicePolicyManager.create(ctx, ctx.mMainThread.getHandler()); 425224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 426224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 427224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(DOWNLOAD_SERVICE, new ServiceFetcher() { 428224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 429224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new DownloadManager(ctx.getContentResolver(), ctx.getPackageName()); 430224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 431224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 432e35872da97ac6bd07d2d9ac5af8a7c18ad290718Todd Poynor registerService(BATTERY_SERVICE, new ServiceFetcher() { 433e35872da97ac6bd07d2d9ac5af8a7c18ad290718Todd Poynor public Object createService(ContextImpl ctx) { 434e35872da97ac6bd07d2d9ac5af8a7c18ad290718Todd Poynor return new BatteryManager(); 435e35872da97ac6bd07d2d9ac5af8a7c18ad290718Todd Poynor }}); 436e35872da97ac6bd07d2d9ac5af8a7c18ad290718Todd Poynor 437d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly registerService(NFC_SERVICE, new ServiceFetcher() { 438d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly public Object createService(ContextImpl ctx) { 439d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly return new NfcManager(ctx); 440d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly }}); 441d250746716305717d7cde64032d2d25cda14e6c9Nick Pelly 442224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(DROPBOX_SERVICE, new StaticServiceFetcher() { 443224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createStaticService() { 444224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return createDropBoxManager(); 445224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 446224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 4479f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown registerService(INPUT_SERVICE, new StaticServiceFetcher() { 4489f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown public Object createStaticService() { 4499f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown return InputManager.getInstance(); 450ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown }}); 4519df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown 452bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown registerService(DISPLAY_SERVICE, new ServiceFetcher() { 453bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown @Override 454bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown public Object createService(ContextImpl ctx) { 455bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown return new DisplayManager(ctx.getOuterContext()); 456bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown }}); 457fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown 458f9e989d5f09e72f5c9a59d713521f37d3fdd93ddJeff Brown registerService(INPUT_METHOD_SERVICE, new StaticServiceFetcher() { 459f9e989d5f09e72f5c9a59d713521f37d3fdd93ddJeff Brown public Object createStaticService() { 460f9e989d5f09e72f5c9a59d713521f37d3fdd93ddJeff Brown return InputMethodManager.getInstance(); 461224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 462224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 463988323c57bd25a58f05dfa492d9b9c8ab62c5153satok registerService(TEXT_SERVICES_MANAGER_SERVICE, new ServiceFetcher() { 464988323c57bd25a58f05dfa492d9b9c8ab62c5153satok public Object createService(ContextImpl ctx) { 465988323c57bd25a58f05dfa492d9b9c8ab62c5153satok return TextServicesManager.getInstance(); 466988323c57bd25a58f05dfa492d9b9c8ab62c5153satok }}); 467988323c57bd25a58f05dfa492d9b9c8ab62c5153satok 468224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(KEYGUARD_SERVICE, new ServiceFetcher() { 469224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object getService(ContextImpl ctx) { 470224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // TODO: why isn't this caching it? It wasn't 471224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // before, so I'm preserving the old behavior and 472224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // using getService(), instead of createService() 473224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // which would do the caching. 474224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new KeyguardManager(); 475224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 476224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 477224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(LAYOUT_INFLATER_SERVICE, new ServiceFetcher() { 478224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 479224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return PolicyManager.makeNewLayoutInflater(ctx.getOuterContext()); 480224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 481224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 482e0fd693c6098f59004f9e96ad75c058e26c337b0Nick Pelly registerService(LOCATION_SERVICE, new ServiceFetcher() { 483e0fd693c6098f59004f9e96ad75c058e26c337b0Nick Pelly public Object createService(ContextImpl ctx) { 484224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IBinder b = ServiceManager.getService(LOCATION_SERVICE); 485e0fd693c6098f59004f9e96ad75c058e26c337b0Nick Pelly return new LocationManager(ctx, ILocationManager.Stub.asInterface(b)); 486224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 487224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 4881a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey registerService(NETWORK_POLICY_SERVICE, new ServiceFetcher() { 4891a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey @Override 4901a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey public Object createService(ContextImpl ctx) { 4911a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey return new NetworkPolicyManager(INetworkPolicyManager.Stub.asInterface( 4921a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey ServiceManager.getService(NETWORK_POLICY_SERVICE))); 4931a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey } 4941a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey }); 4951a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey 496224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(NOTIFICATION_SERVICE, new ServiceFetcher() { 497224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 498224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick final Context outerContext = ctx.getOuterContext(); 499224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new NotificationManager( 500224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick new ContextThemeWrapper(outerContext, 5015effd7e89f83824ac8982a6cbcebbf5cc331e436Alan Viverette Resources.selectSystemTheme(0, 502d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn outerContext.getApplicationInfo().targetSdkVersion, 5035effd7e89f83824ac8982a6cbcebbf5cc331e436Alan Viverette com.android.internal.R.style.Theme_Dialog, 5045effd7e89f83824ac8982a6cbcebbf5cc331e436Alan Viverette com.android.internal.R.style.Theme_Holo_Dialog, 5055effd7e89f83824ac8982a6cbcebbf5cc331e436Alan Viverette com.android.internal.R.style.Theme_DeviceDefault_Dialog, 5065effd7e89f83824ac8982a6cbcebbf5cc331e436Alan Viverette com.android.internal.R.style.Theme_DeviceDefault_Light_Dialog)), 507224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick ctx.mMainThread.getHandler()); 508224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 509224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 5107d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff registerService(NSD_SERVICE, new ServiceFetcher() { 5117d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff @Override 5127d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public Object createService(ContextImpl ctx) { 5137d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff IBinder b = ServiceManager.getService(NSD_SERVICE); 5147d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff INsdManager service = INsdManager.Stub.asInterface(b); 51522af38c5261d2c03796b496e6edb125327cace16Irfan Sheriff return new NsdManager(ctx.getOuterContext(), service); 5167d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff }}); 5177d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 518224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // Note: this was previously cached in a static variable, but 519224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // constructed using mMainThread.getHandler(), so converting 520224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // it to be a regular Context-cached service... 521224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(POWER_SERVICE, new ServiceFetcher() { 522224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 523224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IBinder b = ServiceManager.getService(POWER_SERVICE); 524224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IPowerManager service = IPowerManager.Stub.asInterface(b); 5252c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown if (service == null) { 5262c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown Log.wtf(TAG, "Failed to get power manager service."); 5272c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown } 5289630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown return new PowerManager(ctx.getOuterContext(), 5299630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown service, ctx.mMainThread.getHandler()); 530224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 531224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 532224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(SEARCH_SERVICE, new ServiceFetcher() { 533224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 534224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new SearchManager(ctx.getOuterContext(), 535224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick ctx.mMainThread.getHandler()); 536224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 537224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 538224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(SENSOR_SERVICE, new ServiceFetcher() { 539224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 5406d0c1d78f121d4f1b72973740e8b120c7def1dc0Jaikumar Ganesh return new SystemSensorManager(ctx.getOuterContext(), 5416d0c1d78f121d4f1b72973740e8b120c7def1dc0Jaikumar Ganesh ctx.mMainThread.getHandler().getLooper()); 542224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 543224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 544224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(STATUS_BAR_SERVICE, new ServiceFetcher() { 545224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 546224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new StatusBarManager(ctx.getOuterContext()); 547224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 548224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 549224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(STORAGE_SERVICE, new ServiceFetcher() { 550224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 551224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick try { 552be72215c39916af9ae42332260c04b696bc73d7fJeff Sharkey return new StorageManager( 553be72215c39916af9ae42332260c04b696bc73d7fJeff Sharkey ctx.getContentResolver(), ctx.mMainThread.getHandler().getLooper()); 554224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } catch (RemoteException rex) { 555224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick Log.e(TAG, "Failed to create StorageManager", rex); 556224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return null; 557224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 558224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 559224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 560224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(TELEPHONY_SERVICE, new ServiceFetcher() { 561224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 562224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new TelephonyManager(ctx.getOuterContext()); 563224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 564224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 565d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville registerService(TELEPHONY_SUBSCRIPTION_SERVICE, new ServiceFetcher() { 566d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville public Object createService(ContextImpl ctx) { 567d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville return new SubscriptionManager(ctx.getOuterContext()); 568d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville }}); 569d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville 570ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn registerService(TELECOM_SERVICE, new ServiceFetcher() { 571b4ce1432c62a691111f1c355d744998a48b55a93Yorke Lee public Object createService(ContextImpl ctx) { 572ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn return new TelecomManager(ctx.getOuterContext()); 573b4ce1432c62a691111f1c355d744998a48b55a93Yorke Lee }}); 574b4ce1432c62a691111f1c355d744998a48b55a93Yorke Lee 575224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(UI_MODE_SERVICE, new ServiceFetcher() { 576224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 577224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return new UiModeManager(); 578224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 579224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 5803a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood registerService(USB_SERVICE, new ServiceFetcher() { 5813a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public Object createService(ContextImpl ctx) { 582e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood IBinder b = ServiceManager.getService(USB_SERVICE); 5833a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood return new UsbManager(ctx, IUsbManager.Stub.asInterface(b)); 584e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood }}); 585e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood 586b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood registerService(SERIAL_SERVICE, new ServiceFetcher() { 587b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood public Object createService(ContextImpl ctx) { 588b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood IBinder b = ServiceManager.getService(SERIAL_SERVICE); 589b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood return new SerialManager(ctx, ISerialManager.Stub.asInterface(b)); 590b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood }}); 591b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood 592224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(VIBRATOR_SERVICE, new ServiceFetcher() { 593224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 594a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return new SystemVibrator(ctx); 595224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 596224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 597224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(WALLPAPER_SERVICE, WALLPAPER_FETCHER); 598224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 599224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(WIFI_SERVICE, new ServiceFetcher() { 600224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object createService(ContextImpl ctx) { 601224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IBinder b = ServiceManager.getService(WIFI_SERVICE); 602224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick IWifiManager service = IWifiManager.Stub.asInterface(b); 60388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff return new WifiManager(ctx.getOuterContext(), service); 604224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 605224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 60655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync registerService(WIFI_P2P_SERVICE, new ServiceFetcher() { 60755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public Object createService(ContextImpl ctx) { 60855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync IBinder b = ServiceManager.getService(WIFI_P2P_SERVICE); 60955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync IWifiP2pManager service = IWifiP2pManager.Stub.asInterface(b); 61055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return new WifiP2pManager(service); 61155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync }}); 61255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 613011e1b35a64180d6f0234af8a3c2b70777eb9f39Vinit Deshapnde registerService(WIFI_SCANNING_SERVICE, new ServiceFetcher() { 614011e1b35a64180d6f0234af8a3c2b70777eb9f39Vinit Deshapnde public Object createService(ContextImpl ctx) { 615011e1b35a64180d6f0234af8a3c2b70777eb9f39Vinit Deshapnde IBinder b = ServiceManager.getService(WIFI_SCANNING_SERVICE); 616011e1b35a64180d6f0234af8a3c2b70777eb9f39Vinit Deshapnde IWifiScanner service = IWifiScanner.Stub.asInterface(b); 617011e1b35a64180d6f0234af8a3c2b70777eb9f39Vinit Deshapnde return new WifiScanner(ctx.getOuterContext(), service); 618011e1b35a64180d6f0234af8a3c2b70777eb9f39Vinit Deshapnde }}); 619011e1b35a64180d6f0234af8a3c2b70777eb9f39Vinit Deshapnde 6207686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande registerService(WIFI_RTT_SERVICE, new ServiceFetcher() { 6217686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande public Object createService(ContextImpl ctx) { 6227686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande IBinder b = ServiceManager.getService(WIFI_RTT_SERVICE); 6237686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande IRttManager service = IRttManager.Stub.asInterface(b); 6247686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande return new RttManager(ctx.getOuterContext(), service); 6257686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande }}); 6267686c061b7c5c981c79e566e3b31f68b9e21c730Vinit Deshpande 627f9ff2c9ae5595a20d77b10a41386932de1fc2da2Lorenzo Colitti registerService(ETHERNET_SERVICE, new ServiceFetcher() { 628f9ff2c9ae5595a20d77b10a41386932de1fc2da2Lorenzo Colitti public Object createService(ContextImpl ctx) { 629f9ff2c9ae5595a20d77b10a41386932de1fc2da2Lorenzo Colitti IBinder b = ServiceManager.getService(ETHERNET_SERVICE); 630f9ff2c9ae5595a20d77b10a41386932de1fc2da2Lorenzo Colitti IEthernetManager service = IEthernetManager.Stub.asInterface(b); 631f9ff2c9ae5595a20d77b10a41386932de1fc2da2Lorenzo Colitti return new EthernetManager(ctx.getOuterContext(), service); 632f9ff2c9ae5595a20d77b10a41386932de1fc2da2Lorenzo Colitti }}); 633f9ff2c9ae5595a20d77b10a41386932de1fc2da2Lorenzo Colitti 634224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick registerService(WINDOW_SERVICE, new ServiceFetcher() { 635e50848bfba085e6836a5526dfa64261d1ee46e64Romain Guy Display mDefaultDisplay; 636224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick public Object getService(ContextImpl ctx) { 637a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown Display display = ctx.mDisplay; 638a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown if (display == null) { 639e50848bfba085e6836a5526dfa64261d1ee46e64Romain Guy if (mDefaultDisplay == null) { 640e50848bfba085e6836a5526dfa64261d1ee46e64Romain Guy DisplayManager dm = (DisplayManager)ctx.getOuterContext(). 641e50848bfba085e6836a5526dfa64261d1ee46e64Romain Guy getSystemService(Context.DISPLAY_SERVICE); 642e50848bfba085e6836a5526dfa64261d1ee46e64Romain Guy mDefaultDisplay = dm.getDisplay(Display.DEFAULT_DISPLAY); 643e50848bfba085e6836a5526dfa64261d1ee46e64Romain Guy } 644e50848bfba085e6836a5526dfa64261d1ee46e64Romain Guy display = mDefaultDisplay; 645a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown } 646a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown return new WindowManagerImpl(display); 647224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick }}); 648258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani 649258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani registerService(USER_SERVICE, new ServiceFetcher() { 650a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public Object createService(ContextImpl ctx) { 651258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani IBinder b = ServiceManager.getService(USER_SERVICE); 652258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani IUserManager service = IUserManager.Stub.asInterface(b); 653258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani return new UserManager(ctx, service); 654258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani }}); 655a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 656a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn registerService(APP_OPS_SERVICE, new ServiceFetcher() { 657a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public Object createService(ContextImpl ctx) { 658a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn IBinder b = ServiceManager.getService(APP_OPS_SERVICE); 659a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn IAppOpsService service = IAppOpsService.Stub.asInterface(b); 660a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return new AppOpsManager(ctx, service); 661a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn }}); 662b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala 663e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin registerService(CAMERA_SERVICE, new ServiceFetcher() { 664e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin public Object createService(ContextImpl ctx) { 665e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin return new CameraManager(ctx); 6664b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov } 6674b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov }); 6684b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov 6694f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani registerService(LAUNCHER_APPS_SERVICE, new ServiceFetcher() { 6704f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani public Object createService(ContextImpl ctx) { 6714f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani IBinder b = ServiceManager.getService(LAUNCHER_APPS_SERVICE); 6724f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani ILauncherApps service = ILauncherApps.Stub.asInterface(b); 6734f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani return new LauncherApps(ctx, service); 6744f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani } 6754f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani }); 6764f58263d02f296430a9653126d28501e95c7bb6cAmith Yamasani 677f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani registerService(RESTRICTIONS_SERVICE, new ServiceFetcher() { 678f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani public Object createService(ContextImpl ctx) { 679f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani IBinder b = ServiceManager.getService(RESTRICTIONS_SERVICE); 680f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani IRestrictionsManager service = IRestrictionsManager.Stub.asInterface(b); 681f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani return new RestrictionsManager(ctx, service); 682f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani } 683f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani }); 6844b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov registerService(PRINT_SERVICE, new ServiceFetcher() { 6854b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov public Object createService(ContextImpl ctx) { 6864b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov IBinder iBinder = ServiceManager.getService(Context.PRINT_SERVICE); 6874b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov IPrintManager service = IPrintManager.Stub.asInterface(iBinder); 6884b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov return new PrintManager(ctx.getOuterContext(), service, UserHandle.myUserId(), 6894b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov UserHandle.getAppId(Process.myUid())); 690b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala }}); 69151e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling 69251e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling registerService(CONSUMER_IR_SERVICE, new ServiceFetcher() { 69351e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling public Object createService(ContextImpl ctx) { 69451e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling return new ConsumerIrManager(ctx); 69551e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling }}); 69601fe661ae5da3739215d93922412df4b24c859a2RoboErik 69701fe661ae5da3739215d93922412df4b24c859a2RoboErik registerService(MEDIA_SESSION_SERVICE, new ServiceFetcher() { 69801fe661ae5da3739215d93922412df4b24c859a2RoboErik public Object createService(ContextImpl ctx) { 69942ea7eecd149161ed192d3029f0d77d1d08a4aa5RoboErik return new MediaSessionManager(ctx); 70001fe661ae5da3739215d93922412df4b24c859a2RoboErik } 70101fe661ae5da3739215d93922412df4b24c859a2RoboErik }); 702a7596147b43940cad3f76c53ed154ef088b9269bJim Miller 70382142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos registerService(TRUST_SERVICE, new ServiceFetcher() { 70482142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos public Object createService(ContextImpl ctx) { 70582142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos IBinder b = ServiceManager.getService(TRUST_SERVICE); 70682142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos return new TrustManager(b); 70782142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos } 70882142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos }); 7093957091ba8f08c02b5e781098cb955a5f697a1ffJae Seo 710a7596147b43940cad3f76c53ed154ef088b9269bJim Miller registerService(FINGERPRINT_SERVICE, new ServiceFetcher() { 711a7596147b43940cad3f76c53ed154ef088b9269bJim Miller public Object createService(ContextImpl ctx) { 71206e658f324a937bec1c5ddbe9c3100c3d2fec371Jim Miller IBinder binder = ServiceManager.getService(FINGERPRINT_SERVICE); 71306e658f324a937bec1c5ddbe9c3100c3d2fec371Jim Miller IFingerprintService service = IFingerprintService.Stub.asInterface(binder); 714a7596147b43940cad3f76c53ed154ef088b9269bJim Miller return new FingerprintManager(ctx.getOuterContext(), service); 715a7596147b43940cad3f76c53ed154ef088b9269bJim Miller } 716a7596147b43940cad3f76c53ed154ef088b9269bJim Miller }); 717a7596147b43940cad3f76c53ed154ef088b9269bJim Miller 7183957091ba8f08c02b5e781098cb955a5f697a1ffJae Seo registerService(TV_INPUT_SERVICE, new ServiceFetcher() { 7193957091ba8f08c02b5e781098cb955a5f697a1ffJae Seo public Object createService(ContextImpl ctx) { 7203957091ba8f08c02b5e781098cb955a5f697a1ffJae Seo IBinder iBinder = ServiceManager.getService(TV_INPUT_SERVICE); 7213957091ba8f08c02b5e781098cb955a5f697a1ffJae Seo ITvInputManager service = ITvInputManager.Stub.asInterface(iBinder); 7223957091ba8f08c02b5e781098cb955a5f697a1ffJae Seo return new TvInputManager(service, UserHandle.myUserId()); 7230debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 7240debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski }); 725b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson 726b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson registerService(NETWORK_SCORE_SERVICE, new ServiceFetcher() { 727b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson public Object createService(ContextImpl ctx) { 728b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson return new NetworkScoreManager(ctx); 729b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson } 730b51e0a6c4b249e0d6f404fafef007645221be0d3Jeff Davidson }); 731e22b3b143240f0f18e3d6d3c06686ad3c23b131bDianne Hackborn 732e22b3b143240f0f18e3d6d3c06686ad3c23b131bDianne Hackborn registerService(USAGE_STATS_SERVICE, new ServiceFetcher() { 7330debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public Object createService(ContextImpl ctx) { 7340debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski IBinder iBinder = ServiceManager.getService(USAGE_STATS_SERVICE); 7350debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski IUsageStatsManager service = IUsageStatsManager.Stub.asInterface(iBinder); 7360debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski return new UsageStatsManager(ctx.getOuterContext(), service); 7370debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 7380debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski }); 7398f64f80888ab6cc2a4e3f8a65d8b54650e07fc5cChristopher Tate 7407060b04f6d92351b67222e636ab378a0273bf3e7Christopher Tate registerService(JOB_SCHEDULER_SERVICE, new ServiceFetcher() { 7418f64f80888ab6cc2a4e3f8a65d8b54650e07fc5cChristopher Tate public Object createService(ContextImpl ctx) { 7427060b04f6d92351b67222e636ab378a0273bf3e7Christopher Tate IBinder b = ServiceManager.getService(JOB_SCHEDULER_SERVICE); 7437060b04f6d92351b67222e636ab378a0273bf3e7Christopher Tate return new JobSchedulerImpl(IJobScheduler.Stub.asInterface(b)); 74468d4acd205e8c2da524e62734ca42847306cc029Andres Morales }}); 74568d4acd205e8c2da524e62734ca42847306cc029Andres Morales 74668d4acd205e8c2da524e62734ca42847306cc029Andres Morales registerService(PERSISTENT_DATA_BLOCK_SERVICE, new ServiceFetcher() { 74768d4acd205e8c2da524e62734ca42847306cc029Andres Morales public Object createService(ContextImpl ctx) { 74868d4acd205e8c2da524e62734ca42847306cc029Andres Morales IBinder b = ServiceManager.getService(PERSISTENT_DATA_BLOCK_SERVICE); 7491e586e08bfcac5c5edafd9ec31e76930449bbee7Andres Morales IPersistentDataBlockService persistentDataBlockService = 7501e586e08bfcac5c5edafd9ec31e76930449bbee7Andres Morales IPersistentDataBlockService.Stub.asInterface(b); 7511e586e08bfcac5c5edafd9ec31e76930449bbee7Andres Morales if (persistentDataBlockService != null) { 7521e586e08bfcac5c5edafd9ec31e76930449bbee7Andres Morales return new PersistentDataBlockManager(persistentDataBlockService); 7531e586e08bfcac5c5edafd9ec31e76930449bbee7Andres Morales } else { 7541e586e08bfcac5c5edafd9ec31e76930449bbee7Andres Morales // not supported 7551e586e08bfcac5c5edafd9ec31e76930449bbee7Andres Morales return null; 7561e586e08bfcac5c5edafd9ec31e76930449bbee7Andres Morales } 7571e586e08bfcac5c5edafd9ec31e76930449bbee7Andres Morales } 7581e586e08bfcac5c5edafd9ec31e76930449bbee7Andres Morales }); 759c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright 760c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright registerService(MEDIA_PROJECTION_SERVICE, new ServiceFetcher() { 761c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright public Object createService(ContextImpl ctx) { 762c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright return new MediaProjectionManager(ctx); 763c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright } 764c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright }); 765976e8bd2017d0263216c62111454438cc0f130e3Svetoslav 766976e8bd2017d0263216c62111454438cc0f130e3Svetoslav registerService(APPWIDGET_SERVICE, new ServiceFetcher() { 767976e8bd2017d0263216c62111454438cc0f130e3Svetoslav public Object createService(ContextImpl ctx) { 768976e8bd2017d0263216c62111454438cc0f130e3Svetoslav IBinder b = ServiceManager.getService(APPWIDGET_SERVICE); 769976e8bd2017d0263216c62111454438cc0f130e3Svetoslav return new AppWidgetManager(ctx, IAppWidgetService.Stub.asInterface(b)); 770976e8bd2017d0263216c62111454438cc0f130e3Svetoslav }}); 771224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick } 772224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 7735fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn static ContextImpl getImpl(Context context) { 7745fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn Context nextContext; 7755fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn while ((context instanceof ContextWrapper) && 7765fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn (nextContext=((ContextWrapper)context).getBaseContext()) != null) { 7775fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn context = nextContext; 7785fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn } 7795fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn return (ContextImpl)context; 7805fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn } 7815fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn 782224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // The system service cache for the system services that are 783224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // cached per-ContextImpl. Package-scoped to avoid accessor 784224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick // methods. 785224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick final ArrayList<Object> mServiceCache = new ArrayList<Object>(); 786224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AssetManager getAssets() { 789756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn return getResources().getAssets(); 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Resources getResources() { 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mResources; 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PackageManager getPackageManager() { 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageManager != null) { 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackageManager; 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IPackageManager pm = ActivityThread.getPackageManager(); 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pm != null) { 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Doesn't matter if we make more than one instance. 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (mPackageManager = new ApplicationPackageManager(this, pm)); 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ContentResolver getContentResolver() { 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mContentResolver; 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Looper getMainLooper() { 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMainThread.getLooper(); 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8215f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Context getApplicationContext() { 824eb9e9ec06167b0caa459f2fb3f3fae094bb8d8f7Christopher Tate return (mPackageInfo != null) ? 825eb9e9ec06167b0caa459f2fb3f3fae094bb8d8f7Christopher Tate mPackageInfo.getApplication() : mMainThread.getApplication(); 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8275f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setTheme(int resid) { 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mThemeResource = resid; 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8325f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 834247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn public int getThemeResId() { 835247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn return mThemeResource; 836247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn } 837247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn 838247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn @Override 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Resources.Theme getTheme() { 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTheme == null) { 8415effd7e89f83824ac8982a6cbcebbf5cc331e436Alan Viverette mThemeResource = Resources.selectDefaultTheme(mThemeResource, 842d922ae01ca99a2b6d39a9393f86776a1d10ebd14Dianne Hackborn getOuterContext().getApplicationInfo().targetSdkVersion); 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTheme = mResources.newTheme(); 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTheme.applyStyle(mThemeResource, true); 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mTheme; 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ClassLoader getClassLoader() { 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackageInfo != null ? 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageInfo.getClassLoader() : ClassLoader.getSystemClassLoader(); 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getPackageName() { 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackageInfo.getPackageName(); 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 86035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn // No mPackageInfo means this is a Context for the system itself, 86135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn // and this here is its name. 86235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return "android"; 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 865d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn /** @hide */ 866d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn @Override 867d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn public String getBasePackageName() { 868d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn return mBasePackageName != null ? mBasePackageName : getPackageName(); 869d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn } 870d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn 87195d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn /** @hide */ 87295d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn @Override 87395d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn public String getOpPackageName() { 87495d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn return mOpPackageName != null ? mOpPackageName : getBasePackageName(); 87595d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn } 87695d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8785c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn public ApplicationInfo getApplicationInfo() { 8795c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn if (mPackageInfo != null) { 8805c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn return mPackageInfo.getApplicationInfo(); 8815c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn } 8825c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn throw new RuntimeException("Not supported in system context"); 8835c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn } 8845c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn 8855c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn @Override 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getPackageResourcePath() { 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackageInfo.getResDir(); 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Not supported in system context"); 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getPackageCodePath() { 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackageInfo.getAppDir(); 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Not supported in system context"); 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9005f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 90123ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato public File getSharedPrefsFile(String name) { 90223ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato return makeFilename(getPreferencesDir(), name + ".xml"); 90323ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato } 90423ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SharedPreferences getSharedPreferences(String name, int mode) { 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SharedPreferencesImpl sp; 908f6913597247dfbfc0a1c387c976ec9004cb1cccbDianne Hackborn synchronized (ContextImpl.class) { 9098e3ddab1fcc246442484c1b443810a1ba6f35296Jeff Sharkey if (sSharedPrefs == null) { 9108e3ddab1fcc246442484c1b443810a1ba6f35296Jeff Sharkey sSharedPrefs = new ArrayMap<String, ArrayMap<String, SharedPreferencesImpl>>(); 9118e3ddab1fcc246442484c1b443810a1ba6f35296Jeff Sharkey } 9128e3ddab1fcc246442484c1b443810a1ba6f35296Jeff Sharkey 9138e3ddab1fcc246442484c1b443810a1ba6f35296Jeff Sharkey final String packageName = getPackageName(); 9148e3ddab1fcc246442484c1b443810a1ba6f35296Jeff Sharkey ArrayMap<String, SharedPreferencesImpl> packagePrefs = sSharedPrefs.get(packageName); 9158e3ddab1fcc246442484c1b443810a1ba6f35296Jeff Sharkey if (packagePrefs == null) { 9168e3ddab1fcc246442484c1b443810a1ba6f35296Jeff Sharkey packagePrefs = new ArrayMap<String, SharedPreferencesImpl>(); 9178e3ddab1fcc246442484c1b443810a1ba6f35296Jeff Sharkey sSharedPrefs.put(packageName, packagePrefs); 9188e3ddab1fcc246442484c1b443810a1ba6f35296Jeff Sharkey } 9198e3ddab1fcc246442484c1b443810a1ba6f35296Jeff Sharkey 920ff32f353f8f6974de80cd6979ce3047dc7133d96Dianne Hackborn // At least one application in the world actually passes in a null 921ff32f353f8f6974de80cd6979ce3047dc7133d96Dianne Hackborn // name. This happened to work because when we generated the file name 922ff32f353f8f6974de80cd6979ce3047dc7133d96Dianne Hackborn // we would stringify it to "null.xml". Nice. 923ff32f353f8f6974de80cd6979ce3047dc7133d96Dianne Hackborn if (mPackageInfo.getApplicationInfo().targetSdkVersion < 924e8222dddaf2e3da14380101e818d4254899e0c0dChet Haase Build.VERSION_CODES.KITKAT) { 925ff32f353f8f6974de80cd6979ce3047dc7133d96Dianne Hackborn if (name == null) { 926ff32f353f8f6974de80cd6979ce3047dc7133d96Dianne Hackborn name = "null"; 927ff32f353f8f6974de80cd6979ce3047dc7133d96Dianne Hackborn } 928ff32f353f8f6974de80cd6979ce3047dc7133d96Dianne Hackborn } 929ff32f353f8f6974de80cd6979ce3047dc7133d96Dianne Hackborn 9308e3ddab1fcc246442484c1b443810a1ba6f35296Jeff Sharkey sp = packagePrefs.get(name); 9316194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick if (sp == null) { 9324cd50b8d76e08d75df1a2e9d4902bcdc880bd1c1Brad Fitzpatrick File prefsFile = getSharedPrefsFile(name); 9334cd50b8d76e08d75df1a2e9d4902bcdc880bd1c1Brad Fitzpatrick sp = new SharedPreferencesImpl(prefsFile, mode); 9348e3ddab1fcc246442484c1b443810a1ba6f35296Jeff Sharkey packagePrefs.put(name, sp); 9356194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick return sp; 9366194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick } 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9384e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick if ((mode & Context.MODE_MULTI_PROCESS) != 0 || 9394e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick getApplicationInfo().targetSdkVersion < android.os.Build.VERSION_CODES.HONEYCOMB) { 9404e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick // If somebody else (some other process) changed the prefs 9414e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick // file behind our back, we reload it. This has been the 9424e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick // historical (if undocumented) behavior. 9434e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick sp.startReloadIfChangedUnexpectedly(); 9444e920f70f38d52d3a74c6a3133388a2e2cb6c175Brad Fitzpatrick } 9456194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick return sp; 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File getPreferencesDir() { 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPreferencesDir == null) { 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPreferencesDir = new File(getDataDirFile(), "shared_prefs"); 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPreferencesDir; 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public FileInputStream openFileInput(String name) 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws FileNotFoundException { 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project File f = makeFilename(getFilesDir(), name); 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new FileInputStream(f); 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public FileOutputStream openFileOutput(String name, int mode) 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws FileNotFoundException { 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean append = (mode&MODE_APPEND) != 0; 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project File f = makeFilename(getFilesDir(), name); 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileOutputStream fos = new FileOutputStream(f, append); 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setFilePermissionsFromMode(f.getPath(), mode, 0); 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return fos; 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (FileNotFoundException e) { 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project File parent = f.getParentFile(); 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parent.mkdir(); 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileUtils.setPermissions( 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parent.getPath(), 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH, 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project -1, -1); 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileOutputStream fos = new FileOutputStream(f, append); 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setFilePermissionsFromMode(f.getPath(), mode, 0); 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return fos; 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean deleteFile(String name) { 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project File f = makeFilename(getFilesDir(), name); 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return f.delete(); 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 993a7835b6b6b00923b608a6bc3194e7840f67de7a8Christopher Tate // Common-path handling of app data dir creation 994a7835b6b6b00923b608a6bc3194e7840f67de7a8Christopher Tate private static File createFilesDirLocked(File file) { 995a7835b6b6b00923b608a6bc3194e7840f67de7a8Christopher Tate if (!file.exists()) { 996a7835b6b6b00923b608a6bc3194e7840f67de7a8Christopher Tate if (!file.mkdirs()) { 997a7835b6b6b00923b608a6bc3194e7840f67de7a8Christopher Tate if (file.exists()) { 998a7835b6b6b00923b608a6bc3194e7840f67de7a8Christopher Tate // spurious failure; probably racing with another process for this app 999a7835b6b6b00923b608a6bc3194e7840f67de7a8Christopher Tate return file; 1000a7835b6b6b00923b608a6bc3194e7840f67de7a8Christopher Tate } 1001a7835b6b6b00923b608a6bc3194e7840f67de7a8Christopher Tate Log.w(TAG, "Unable to create files subdir " + file.getPath()); 1002a7835b6b6b00923b608a6bc3194e7840f67de7a8Christopher Tate return null; 1003a7835b6b6b00923b608a6bc3194e7840f67de7a8Christopher Tate } 1004a7835b6b6b00923b608a6bc3194e7840f67de7a8Christopher Tate FileUtils.setPermissions( 1005a7835b6b6b00923b608a6bc3194e7840f67de7a8Christopher Tate file.getPath(), 1006a7835b6b6b00923b608a6bc3194e7840f67de7a8Christopher Tate FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH, 1007a7835b6b6b00923b608a6bc3194e7840f67de7a8Christopher Tate -1, -1); 1008a7835b6b6b00923b608a6bc3194e7840f67de7a8Christopher Tate } 1009a7835b6b6b00923b608a6bc3194e7840f67de7a8Christopher Tate return file; 1010a7835b6b6b00923b608a6bc3194e7840f67de7a8Christopher Tate } 1011a7835b6b6b00923b608a6bc3194e7840f67de7a8Christopher Tate 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public File getFilesDir() { 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFilesDir == null) { 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFilesDir = new File(getDataDirFile(), "files"); 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1018a7835b6b6b00923b608a6bc3194e7840f67de7a8Christopher Tate return createFilesDirLocked(mFilesDir); 1019a7835b6b6b00923b608a6bc3194e7840f67de7a8Christopher Tate } 1020a7835b6b6b00923b608a6bc3194e7840f67de7a8Christopher Tate } 1021a7835b6b6b00923b608a6bc3194e7840f67de7a8Christopher Tate 1022a7835b6b6b00923b608a6bc3194e7840f67de7a8Christopher Tate @Override 1023a7835b6b6b00923b608a6bc3194e7840f67de7a8Christopher Tate public File getNoBackupFilesDir() { 1024a7835b6b6b00923b608a6bc3194e7840f67de7a8Christopher Tate synchronized (mSync) { 1025a7835b6b6b00923b608a6bc3194e7840f67de7a8Christopher Tate if (mNoBackupFilesDir == null) { 1026a7835b6b6b00923b608a6bc3194e7840f67de7a8Christopher Tate mNoBackupFilesDir = new File(getDataDirFile(), "no_backup"); 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1028a7835b6b6b00923b608a6bc3194e7840f67de7a8Christopher Tate return createFilesDirLocked(mNoBackupFilesDir); 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10315f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1033e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn public File getExternalFilesDir(String type) { 10341abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey // Operates on primary external storage 10351abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey return getExternalFilesDirs(type)[0]; 10361abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey } 10371abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey 10381abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey @Override 10391abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey public File[] getExternalFilesDirs(String type) { 1040e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn synchronized (mSync) { 10411abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey if (mExternalFilesDirs == null) { 10421abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey mExternalFilesDirs = Environment.buildExternalStorageAppFilesDirs(getPackageName()); 1043e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 10441abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey 10451abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey // Splice in requested type, if any 10461abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey File[] dirs = mExternalFilesDirs; 10471abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey if (type != null) { 10481abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey dirs = Environment.buildPaths(dirs, type); 1049e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 10501abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey 10511abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey // Create dirs if needed 10521abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey return ensureDirsExistOrFilter(dirs); 1053e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 1054e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 10555f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 1056e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn @Override 1057805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn public File getObbDir() { 10581abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey // Operates on primary external storage 10591abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey return getObbDirs()[0]; 10601abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey } 10611abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey 10621abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey @Override 10631abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey public File[] getObbDirs() { 1064805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn synchronized (mSync) { 10651abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey if (mExternalObbDirs == null) { 10661abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey mExternalObbDirs = Environment.buildExternalStorageAppObbDirs(getPackageName()); 1067805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn } 10682d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey 10692d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey // Create dirs if needed 10702d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey return ensureDirsExistOrFilter(mExternalObbDirs); 1071805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn } 1072805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn } 1073805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn 1074805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn @Override 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public File getCacheDir() { 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCacheDir == null) { 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheDir = new File(getDataDirFile(), "cache"); 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1080a7835b6b6b00923b608a6bc3194e7840f67de7a8Christopher Tate return createFilesDirLocked(mCacheDir); 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10835f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 1084e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn @Override 10854ed745d359ada6986ac15d8718452e5c55f40170Jeff Sharkey public File getCodeCacheDir() { 10864ed745d359ada6986ac15d8718452e5c55f40170Jeff Sharkey synchronized (mSync) { 10874ed745d359ada6986ac15d8718452e5c55f40170Jeff Sharkey if (mCodeCacheDir == null) { 10884ed745d359ada6986ac15d8718452e5c55f40170Jeff Sharkey mCodeCacheDir = new File(getDataDirFile(), "code_cache"); 10894ed745d359ada6986ac15d8718452e5c55f40170Jeff Sharkey } 10904ed745d359ada6986ac15d8718452e5c55f40170Jeff Sharkey return createFilesDirLocked(mCodeCacheDir); 10914ed745d359ada6986ac15d8718452e5c55f40170Jeff Sharkey } 10924ed745d359ada6986ac15d8718452e5c55f40170Jeff Sharkey } 10934ed745d359ada6986ac15d8718452e5c55f40170Jeff Sharkey 10944ed745d359ada6986ac15d8718452e5c55f40170Jeff Sharkey @Override 1095e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn public File getExternalCacheDir() { 10961abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey // Operates on primary external storage 10971abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey return getExternalCacheDirs()[0]; 10981abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey } 10991abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey 11001abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey @Override 11011abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey public File[] getExternalCacheDirs() { 1102e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn synchronized (mSync) { 11031abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey if (mExternalCacheDirs == null) { 11041abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey mExternalCacheDirs = Environment.buildExternalStorageAppCacheDirs(getPackageName()); 1105e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 11061abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey 11071abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey // Create dirs if needed 11081abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey return ensureDirsExistOrFilter(mExternalCacheDirs); 1109e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 1110e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 11115f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 11132ee3c1e189819cc6efb4d7de24f1438bdb824087Jeff Sharkey public File[] getExternalMediaDirs() { 11142ee3c1e189819cc6efb4d7de24f1438bdb824087Jeff Sharkey synchronized (mSync) { 11152ee3c1e189819cc6efb4d7de24f1438bdb824087Jeff Sharkey if (mExternalMediaDirs == null) { 11162ee3c1e189819cc6efb4d7de24f1438bdb824087Jeff Sharkey mExternalMediaDirs = Environment.buildExternalStorageAppMediaDirs(getPackageName()); 11172ee3c1e189819cc6efb4d7de24f1438bdb824087Jeff Sharkey } 11182ee3c1e189819cc6efb4d7de24f1438bdb824087Jeff Sharkey 11192ee3c1e189819cc6efb4d7de24f1438bdb824087Jeff Sharkey // Create dirs if needed 11202ee3c1e189819cc6efb4d7de24f1438bdb824087Jeff Sharkey return ensureDirsExistOrFilter(mExternalMediaDirs); 11212ee3c1e189819cc6efb4d7de24f1438bdb824087Jeff Sharkey } 11222ee3c1e189819cc6efb4d7de24f1438bdb824087Jeff Sharkey } 11232ee3c1e189819cc6efb4d7de24f1438bdb824087Jeff Sharkey 11242ee3c1e189819cc6efb4d7de24f1438bdb824087Jeff Sharkey @Override 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public File getFileStreamPath(String name) { 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return makeFilename(getFilesDir(), name); 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String[] fileList() { 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String[] list = getFilesDir().list(); 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (list != null) ? list : EMPTY_FILE_LIST; 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory) { 113747847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown return openOrCreateDatabase(name, mode, factory, null); 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 114174f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory, 114274f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori DatabaseErrorHandler errorHandler) { 114374f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori File f = validateFilePath(name, true); 114447847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown int flags = SQLiteDatabase.CREATE_IF_NECESSARY; 114547847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown if ((mode & MODE_ENABLE_WRITE_AHEAD_LOGGING) != 0) { 114647847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown flags |= SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING; 114747847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown } 114847847f3f4dcf2a0dbea0bc0e4f02528e21d37a88Jeff Brown SQLiteDatabase db = SQLiteDatabase.openDatabase(f.getPath(), factory, flags, errorHandler); 114974f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori setFilePermissionsFromMode(f.getPath(), mode, 0); 115074f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori return db; 115174f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori } 115274f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori 115374f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori @Override 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean deleteDatabase(String name) { 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1156a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor File f = validateFilePath(name, false); 115779087e4b967d8af26c488c41b8c1a087a12da84dJeff Brown return SQLiteDatabase.deleteDatabase(f); 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public File getDatabasePath(String name) { 1165a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor return validateFilePath(name, false); 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String[] databaseList() { 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String[] list = getDatabasesDir().list(); 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (list != null) ? list : EMPTY_FILE_LIST; 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11745f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File getDatabasesDir() { 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDatabasesDir == null) { 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabasesDir = new File(getDataDirFile(), "databases"); 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDatabasesDir.getPath().equals("databases")) { 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabasesDir = new File("/data/system"); 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDatabasesDir; 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11865f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable getWallpaper() { 11894c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn return getWallpaperManager().getDrawable(); 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 11938cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn public Drawable peekWallpaper() { 11944c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn return getWallpaperManager().peekDrawable(); 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getWallpaperDesiredMinimumWidth() { 11998cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn return getWallpaperManager().getDesiredMinimumWidth(); 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getWallpaperDesiredMinimumHeight() { 12048cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn return getWallpaperManager().getDesiredMinimumHeight(); 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setWallpaper(Bitmap bitmap) throws IOException { 12094c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn getWallpaperManager().setBitmap(bitmap); 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setWallpaper(InputStream data) throws IOException { 12144c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn getWallpaperManager().setStream(data); 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void clearWallpaper() throws IOException { 12198cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn getWallpaperManager().clear(); 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startActivity(Intent intent) { 1224cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani warnIfCallingFromSystemProcess(); 1225a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn startActivity(intent, null); 1226a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn } 1227a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn 12288264408f5995534f8e3147b001664ea0df52aaa5Amith Yamasani /** @hide */ 12298264408f5995534f8e3147b001664ea0df52aaa5Amith Yamasani @Override 123079af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn public void startActivityAsUser(Intent intent, UserHandle user) { 1231f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn startActivityAsUser(intent, null, user); 12328264408f5995534f8e3147b001664ea0df52aaa5Amith Yamasani } 12338264408f5995534f8e3147b001664ea0df52aaa5Amith Yamasani 1234a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn @Override 1235a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn public void startActivity(Intent intent, Bundle options) { 1236cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani warnIfCallingFromSystemProcess(); 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new AndroidRuntimeException( 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Calling startActivity() from outside of an Activity " 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " context requires the FLAG_ACTIVITY_NEW_TASK flag." 12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " Is this really what you want?"); 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getInstrumentation().execStartActivity( 12446e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn getOuterContext(), mMainThread.getApplicationThread(), null, 1245a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn (Activity)null, intent, -1, options); 12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1248258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani /** @hide */ 1249258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani @Override 125079af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn public void startActivityAsUser(Intent intent, Bundle options, UserHandle user) { 1251258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani try { 1252258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani ActivityManagerNative.getDefault().startActivityAsUser( 1253f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn mMainThread.getApplicationThread(), getBasePackageName(), intent, 1254258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani intent.resolveTypeIfNeeded(getContentResolver()), 12551b012d302b56b4adf950035136d1d191a1936d5aJeff Hao null, null, 0, Intent.FLAG_ACTIVITY_NEW_TASK, null, options, 125679af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn user.getIdentifier()); 1257258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } catch (RemoteException re) { 1258258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } 1259258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } 1260258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1262621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn public void startActivities(Intent[] intents) { 1263cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani warnIfCallingFromSystemProcess(); 1264a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn startActivities(intents, null); 1265a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn } 1266a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn 1267ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani /** @hide */ 1268ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani @Override 1269ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani public void startActivitiesAsUser(Intent[] intents, Bundle options, UserHandle userHandle) { 1270ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani if ((intents[0].getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { 1271ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani throw new AndroidRuntimeException( 1272ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani "Calling startActivities() from outside of an Activity " 1273ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani + " context requires the FLAG_ACTIVITY_NEW_TASK flag on first Intent." 1274ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani + " Is this really what you want?"); 1275ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani } 1276ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani mMainThread.getInstrumentation().execStartActivitiesAsUser( 1277ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani getOuterContext(), mMainThread.getApplicationThread(), null, 1278ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani (Activity)null, intents, options, userHandle.getIdentifier()); 1279ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani } 1280ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani 1281a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn @Override 1282a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn public void startActivities(Intent[] intents, Bundle options) { 1283cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani warnIfCallingFromSystemProcess(); 1284621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if ((intents[0].getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { 1285621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn throw new AndroidRuntimeException( 1286621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn "Calling startActivities() from outside of an Activity " 1287621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn + " context requires the FLAG_ACTIVITY_NEW_TASK flag on first Intent." 1288621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn + " Is this really what you want?"); 1289621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 1290621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn mMainThread.getInstrumentation().execStartActivities( 1291621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn getOuterContext(), mMainThread.getApplicationThread(), null, 1292a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn (Activity)null, intents, options); 1293621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 1294621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 1295621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn @Override 1296fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn public void startIntentSender(IntentSender intent, 1297fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags) 1298fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn throws IntentSender.SendIntentException { 1299a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn startIntentSender(intent, fillInIntent, flagsMask, flagsValues, extraFlags, null); 1300a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn } 1301a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn 1302a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn @Override 1303a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn public void startIntentSender(IntentSender intent, Intent fillInIntent, 1304a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn int flagsMask, int flagsValues, int extraFlags, Bundle options) 1305a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn throws IntentSender.SendIntentException { 1306fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn try { 1307fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn String resolvedType = null; 1308fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn if (fillInIntent != null) { 1309a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey fillInIntent.migrateExtraStreamToClipData(); 1310a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey fillInIntent.prepareToLeaveProcess(); 1311fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn resolvedType = fillInIntent.resolveTypeIfNeeded(getContentResolver()); 1312fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn } 1313fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn int result = ActivityManagerNative.getDefault() 1314fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn .startActivityIntentSender(mMainThread.getApplicationThread(), intent, 1315fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn fillInIntent, resolvedType, null, null, 1316a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn 0, flagsMask, flagsValues, options); 1317a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn if (result == ActivityManager.START_CANCELED) { 1318fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn throw new IntentSender.SendIntentException(); 1319fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn } 1320fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn Instrumentation.checkStartActivityResult(result, null); 1321fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn } catch (RemoteException e) { 1322fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn } 1323fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn } 13245f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 1325fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn @Override 13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void sendBroadcast(Intent intent) { 1327cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani warnIfCallingFromSystemProcess(); 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1330a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey intent.prepareToLeaveProcess(); 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().broadcastIntent( 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), intent, resolvedType, null, 1333f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, false, false, 1334ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey getUserId()); 13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 133967cf7d314b5b94db1a9f1c57140b6615b0ea8291Amith Yamasani @Override 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void sendBroadcast(Intent intent, String receiverPermission) { 1341cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani warnIfCallingFromSystemProcess(); 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1344a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey intent.prepareToLeaveProcess(); 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().broadcastIntent( 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), intent, resolvedType, null, 1347f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn Activity.RESULT_OK, null, null, receiverPermission, AppOpsManager.OP_NONE, 1348f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn false, false, getUserId()); 1349f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn } catch (RemoteException e) { 1350f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn } 1351f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn } 1352f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn 1353f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn @Override 1354f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public void sendBroadcast(Intent intent, String receiverPermission, int appOp) { 1355f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn warnIfCallingFromSystemProcess(); 1356f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 1357f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn try { 1358a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey intent.prepareToLeaveProcess(); 1359f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn ActivityManagerNative.getDefault().broadcastIntent( 1360f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn mMainThread.getApplicationThread(), intent, resolvedType, null, 1361f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn Activity.RESULT_OK, null, null, receiverPermission, appOp, false, false, 1362ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey getUserId()); 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void sendOrderedBroadcast(Intent intent, 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String receiverPermission) { 1370cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani warnIfCallingFromSystemProcess(); 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1373a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey intent.prepareToLeaveProcess(); 13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().broadcastIntent( 13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), intent, resolvedType, null, 1376f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn Activity.RESULT_OK, null, null, receiverPermission, AppOpsManager.OP_NONE, true, false, 1377ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey getUserId()); 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void sendOrderedBroadcast(Intent intent, 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String receiverPermission, BroadcastReceiver resultReceiver, 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Handler scheduler, int initialCode, String initialData, 13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle initialExtras) { 1387f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn sendOrderedBroadcast(intent, receiverPermission, AppOpsManager.OP_NONE, 1388f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn resultReceiver, scheduler, initialCode, initialData, initialExtras); 1389f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn } 1390f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn 1391f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn @Override 1392f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public void sendOrderedBroadcast(Intent intent, 1393f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn String receiverPermission, int appOp, BroadcastReceiver resultReceiver, 1394f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn Handler scheduler, int initialCode, String initialData, 1395f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn Bundle initialExtras) { 1396cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani warnIfCallingFromSystemProcess(); 13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IIntentReceiver rd = null; 13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resultReceiver != null) { 13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scheduler == null) { 14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scheduler = mMainThread.getHandler(); 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rd = mPackageInfo.getReceiverDispatcher( 14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resultReceiver, getOuterContext(), scheduler, 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getInstrumentation(), false); 14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scheduler == null) { 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scheduler = mMainThread.getHandler(); 14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 141001e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn rd = new LoadedApk.ReceiverDispatcher( 14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver(); 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1416a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey intent.prepareToLeaveProcess(); 14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().broadcastIntent( 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), intent, resolvedType, rd, 1419f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn initialCode, initialData, initialExtras, receiverPermission, appOp, 1420f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn true, false, getUserId()); 14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 142679af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn public void sendBroadcastAsUser(Intent intent, UserHandle user) { 14277d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 14287d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn try { 1429a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey intent.prepareToLeaveProcess(); 14307d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn ActivityManagerNative.getDefault().broadcastIntent(mMainThread.getApplicationThread(), 1431f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn intent, resolvedType, null, Activity.RESULT_OK, null, null, null, 1432f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn AppOpsManager.OP_NONE, false, false, user.getIdentifier()); 14337d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn } catch (RemoteException e) { 14347d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn } 14357d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn } 14367d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn 14377d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn @Override 14385ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn public void sendBroadcastAsUser(Intent intent, UserHandle user, 14395ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn String receiverPermission) { 14405ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 14415ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn try { 1442a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey intent.prepareToLeaveProcess(); 14435ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn ActivityManagerNative.getDefault().broadcastIntent( 14445ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mMainThread.getApplicationThread(), intent, resolvedType, null, 1445f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn Activity.RESULT_OK, null, null, receiverPermission, AppOpsManager.OP_NONE, false, false, 14465ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn user.getIdentifier()); 14475ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn } catch (RemoteException e) { 14485ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn } 14495ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn } 14505ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn 14515ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn @Override 145279af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, 14535ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, 14547d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn int initialCode, String initialData, Bundle initialExtras) { 14553cf75729d5a27b8ddd1ea174626dbcf0349a1d07Amith Yamasani sendOrderedBroadcastAsUser(intent, user, receiverPermission, AppOpsManager.OP_NONE, 14563cf75729d5a27b8ddd1ea174626dbcf0349a1d07Amith Yamasani resultReceiver, scheduler, initialCode, initialData, initialExtras); 14573cf75729d5a27b8ddd1ea174626dbcf0349a1d07Amith Yamasani } 14583cf75729d5a27b8ddd1ea174626dbcf0349a1d07Amith Yamasani 14593cf75729d5a27b8ddd1ea174626dbcf0349a1d07Amith Yamasani @Override 14603cf75729d5a27b8ddd1ea174626dbcf0349a1d07Amith Yamasani public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, 14613cf75729d5a27b8ddd1ea174626dbcf0349a1d07Amith Yamasani String receiverPermission, int appOp, BroadcastReceiver resultReceiver, 14623cf75729d5a27b8ddd1ea174626dbcf0349a1d07Amith Yamasani Handler scheduler, 14633cf75729d5a27b8ddd1ea174626dbcf0349a1d07Amith Yamasani int initialCode, String initialData, Bundle initialExtras) { 14647d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn IIntentReceiver rd = null; 14657d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn if (resultReceiver != null) { 14667d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn if (mPackageInfo != null) { 14677d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn if (scheduler == null) { 14687d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn scheduler = mMainThread.getHandler(); 14697d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn } 14707d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn rd = mPackageInfo.getReceiverDispatcher( 14717d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn resultReceiver, getOuterContext(), scheduler, 14727d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn mMainThread.getInstrumentation(), false); 14737d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn } else { 14747d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn if (scheduler == null) { 14757d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn scheduler = mMainThread.getHandler(); 14767d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn } 14777d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn rd = new LoadedApk.ReceiverDispatcher( 14787d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver(); 14797d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn } 14807d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn } 14817d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 14827d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn try { 1483a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey intent.prepareToLeaveProcess(); 14847d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn ActivityManagerNative.getDefault().broadcastIntent( 14857d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn mMainThread.getApplicationThread(), intent, resolvedType, rd, 14865ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn initialCode, initialData, initialExtras, receiverPermission, 14870261b9b1cc580f9ca238c33a9b87803f260fe73aAmith Yamasani appOp, true, false, user.getIdentifier()); 14887d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn } catch (RemoteException e) { 14897d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn } 14907d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn } 14917d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn 14927d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn @Override 14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void sendStickyBroadcast(Intent intent) { 1494cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani warnIfCallingFromSystemProcess(); 14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1497a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey intent.prepareToLeaveProcess(); 14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().broadcastIntent( 14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), intent, resolvedType, null, 1500f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, false, true, 1501ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey getUserId()); 15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1507efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn public void sendStickyOrderedBroadcast(Intent intent, 1508efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn BroadcastReceiver resultReceiver, 1509efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn Handler scheduler, int initialCode, String initialData, 1510efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn Bundle initialExtras) { 1511cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani warnIfCallingFromSystemProcess(); 1512efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn IIntentReceiver rd = null; 1513efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn if (resultReceiver != null) { 1514efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn if (mPackageInfo != null) { 1515efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn if (scheduler == null) { 1516efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn scheduler = mMainThread.getHandler(); 1517efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } 1518efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn rd = mPackageInfo.getReceiverDispatcher( 1519efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn resultReceiver, getOuterContext(), scheduler, 1520efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn mMainThread.getInstrumentation(), false); 1521efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } else { 1522efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn if (scheduler == null) { 1523efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn scheduler = mMainThread.getHandler(); 1524efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } 152501e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn rd = new LoadedApk.ReceiverDispatcher( 1526efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver(); 1527efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } 1528efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } 1529efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 1530efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn try { 1531a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey intent.prepareToLeaveProcess(); 1532efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn ActivityManagerNative.getDefault().broadcastIntent( 1533efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn mMainThread.getApplicationThread(), intent, resolvedType, rd, 1534efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn initialCode, initialData, initialExtras, null, 1535f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn AppOpsManager.OP_NONE, true, true, getUserId()); 1536efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } catch (RemoteException e) { 1537efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } 1538efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } 1539efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn 1540efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn @Override 15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeStickyBroadcast(Intent intent) { 15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resolvedType != null) { 15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent = new Intent(intent); 15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.setDataAndType(intent.getData(), resolvedType); 15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1548a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey intent.prepareToLeaveProcess(); 15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().unbroadcastIntent( 1550ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey mMainThread.getApplicationThread(), intent, getUserId()); 15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 15565ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn public void sendStickyBroadcastAsUser(Intent intent, UserHandle user) { 15575ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 15585ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn try { 1559a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey intent.prepareToLeaveProcess(); 15605ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn ActivityManagerNative.getDefault().broadcastIntent( 15615ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mMainThread.getApplicationThread(), intent, resolvedType, null, 1562f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, false, true, user.getIdentifier()); 15635ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn } catch (RemoteException e) { 15645ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn } 15655ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn } 15665ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn 15675ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn @Override 15685ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn public void sendStickyOrderedBroadcastAsUser(Intent intent, 15695ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn UserHandle user, BroadcastReceiver resultReceiver, 15705ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn Handler scheduler, int initialCode, String initialData, 15715ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn Bundle initialExtras) { 15725ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn IIntentReceiver rd = null; 15735ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn if (resultReceiver != null) { 15745ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn if (mPackageInfo != null) { 15755ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn if (scheduler == null) { 15765ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn scheduler = mMainThread.getHandler(); 15775ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn } 15785ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn rd = mPackageInfo.getReceiverDispatcher( 15795ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn resultReceiver, getOuterContext(), scheduler, 15805ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mMainThread.getInstrumentation(), false); 15815ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn } else { 15825ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn if (scheduler == null) { 15835ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn scheduler = mMainThread.getHandler(); 15845ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn } 15855ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn rd = new LoadedApk.ReceiverDispatcher( 15865ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver(); 15875ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn } 15885ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn } 15895ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 15905ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn try { 1591a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey intent.prepareToLeaveProcess(); 15925ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn ActivityManagerNative.getDefault().broadcastIntent( 15935ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mMainThread.getApplicationThread(), intent, resolvedType, rd, 15945ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn initialCode, initialData, initialExtras, null, 1595f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn AppOpsManager.OP_NONE, true, true, user.getIdentifier()); 15965ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn } catch (RemoteException e) { 15975ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn } 15985ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn } 15995ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn 16005ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn @Override 16015ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn public void removeStickyBroadcastAsUser(Intent intent, UserHandle user) { 16025ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 16035ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn if (resolvedType != null) { 16045ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn intent = new Intent(intent); 16055ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn intent.setDataAndType(intent.getData(), resolvedType); 16065ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn } 16075ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn try { 1608a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey intent.prepareToLeaveProcess(); 16095ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn ActivityManagerNative.getDefault().unbroadcastIntent( 16105ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mMainThread.getApplicationThread(), intent, user.getIdentifier()); 16115ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn } catch (RemoteException e) { 16125ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn } 16135ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn } 16145ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn 16155ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn @Override 16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) { 16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return registerReceiver(receiver, filter, null, null); 16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, 16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String broadcastPermission, Handler scheduler) { 1623ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey return registerReceiverInternal(receiver, getUserId(), 162420e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn filter, broadcastPermission, scheduler, getOuterContext()); 162520e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn } 162620e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn 162720e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn @Override 162820e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user, 162920e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn IntentFilter filter, String broadcastPermission, Handler scheduler) { 163020e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn return registerReceiverInternal(receiver, user.getIdentifier(), 163120e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn filter, broadcastPermission, scheduler, getOuterContext()); 16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 163420e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn private Intent registerReceiverInternal(BroadcastReceiver receiver, int userId, 16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IntentFilter filter, String broadcastPermission, 16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Handler scheduler, Context context) { 16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IIntentReceiver rd = null; 16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (receiver != null) { 16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null && context != null) { 16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scheduler == null) { 16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scheduler = mMainThread.getHandler(); 16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rd = mPackageInfo.getReceiverDispatcher( 16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project receiver, context, scheduler, 16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getInstrumentation(), true); 16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scheduler == null) { 16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scheduler = mMainThread.getHandler(); 16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 165001e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn rd = new LoadedApk.ReceiverDispatcher( 1651399cccb85749e02f6d3e12d1d2846310e7cbfdf1Dianne Hackborn receiver, context, scheduler, null, true).getIIntentReceiver(); 16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ActivityManagerNative.getDefault().registerReceiver( 16566c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn mMainThread.getApplicationThread(), mBasePackageName, 165720e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn rd, filter, broadcastPermission, userId); 16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unregisterReceiver(BroadcastReceiver receiver) { 16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IIntentReceiver rd = mPackageInfo.forgetReceiverDispatcher( 16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getOuterContext(), receiver); 16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().unregisterReceiver(rd); 16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Not supported in system context"); 16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1677fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn private void validateServiceIntent(Intent service) { 1678fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn if (service.getComponent() == null && service.getPackage() == null) { 1679955d8d69ea6caabce1461dc25b339b9bf9dc61a6Dianne Hackborn if (getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.LOLLIPOP) { 168010ad98223fd1fabb7b893de55d1384fd012aed7bDianne Hackborn IllegalArgumentException ex = new IllegalArgumentException( 168110ad98223fd1fabb7b893de55d1384fd012aed7bDianne Hackborn "Service Intent must be explicit: " + service); 168210ad98223fd1fabb7b893de55d1384fd012aed7bDianne Hackborn throw ex; 168310ad98223fd1fabb7b893de55d1384fd012aed7bDianne Hackborn } else { 1684fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn Log.w(TAG, "Implicit intents with startService are not safe: " + service 1685fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn + " " + Debug.getCallers(2, 3)); 1686fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn } 1687fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn } 1688fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn } 1689fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn 16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ComponentName startService(Intent service) { 1692cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani warnIfCallingFromSystemProcess(); 1693fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn return startServiceCommon(service, mUser); 16947767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn } 16957767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn 16967767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn @Override 16977767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn public boolean stopService(Intent service) { 1698cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani warnIfCallingFromSystemProcess(); 1699fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn return stopServiceCommon(service, mUser); 17007767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn } 17017767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn 17027767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn @Override 17037767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn public ComponentName startServiceAsUser(Intent service, UserHandle user) { 1704fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn return startServiceCommon(service, user); 1705fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn } 1706fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn 1707fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn private ComponentName startServiceCommon(Intent service, UserHandle user) { 17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1709fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn validateServiceIntent(service); 1710a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey service.prepareToLeaveProcess(); 17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ComponentName cn = ActivityManagerNative.getDefault().startService( 17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), service, 17137767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn service.resolveTypeIfNeeded(getContentResolver()), user.getIdentifier()); 1714c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn if (cn != null) { 1715c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn if (cn.getPackageName().equals("!")) { 1716c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn throw new SecurityException( 1717c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn "Not allowed to start service " + service 1718c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn + " without permission " + cn.getClassName()); 1719c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn } else if (cn.getPackageName().equals("!!")) { 1720c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn throw new SecurityException( 1721c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn "Unable to start service " + service 1722c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn + ": " + cn.getClassName()); 1723c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn } 17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return cn; 17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 17327767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn public boolean stopServiceAsUser(Intent service, UserHandle user) { 1733fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn return stopServiceCommon(service, user); 1734fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn } 1735fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn 1736fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn private boolean stopServiceCommon(Intent service, UserHandle user) { 17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1738fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn validateServiceIntent(service); 1739a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey service.prepareToLeaveProcess(); 17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int res = ActivityManagerNative.getDefault().stopService( 17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), service, 17427767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn service.resolveTypeIfNeeded(getContentResolver()), user.getIdentifier()); 17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res < 0) { 17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException( 17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Not allowed to stop service " + service); 17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res != 0; 17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean bindService(Intent service, ServiceConnection conn, 17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags) { 1756cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani warnIfCallingFromSystemProcess(); 1757fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn return bindServiceCommon(service, conn, flags, Process.myUserHandle()); 175837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani } 175937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani 176037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani /** @hide */ 176137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani @Override 176227b89e6658a0d233a53f5d7ca20dc57fec82d955Amith Yamasani public boolean bindServiceAsUser(Intent service, ServiceConnection conn, int flags, 176327b89e6658a0d233a53f5d7ca20dc57fec82d955Amith Yamasani UserHandle user) { 1764fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn return bindServiceCommon(service, conn, flags, user); 1765fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn } 1766fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn 1767fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn private boolean bindServiceCommon(Intent service, ServiceConnection conn, int flags, 1768fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn UserHandle user) { 17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IServiceConnection sd; 177079b3317b775810bac088b0998c48eb6506e2578cChristopher Tate if (conn == null) { 177179b3317b775810bac088b0998c48eb6506e2578cChristopher Tate throw new IllegalArgumentException("connection is null"); 177279b3317b775810bac088b0998c48eb6506e2578cChristopher Tate } 17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sd = mPackageInfo.getServiceDispatcher(conn, getOuterContext(), 17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getHandler(), flags); 17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Not supported in system context"); 17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1779fd6c7b12c312bef3ab9de2a8fcdeef9260fd85f1Dianne Hackborn validateServiceIntent(service); 17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1781c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn IBinder token = getActivityToken(); 1782c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn if (token == null && (flags&BIND_AUTO_CREATE) == 0 && mPackageInfo != null 1783c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn && mPackageInfo.getApplicationInfo().targetSdkVersion 1784c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn < android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 1785c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn flags |= BIND_WAIVE_PRIORITY; 1786c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn } 1787a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey service.prepareToLeaveProcess(); 17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int res = ActivityManagerNative.getDefault().bindService( 17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), getActivityToken(), 17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project service, service.resolveTypeIfNeeded(getContentResolver()), 179127b89e6658a0d233a53f5d7ca20dc57fec82d955Amith Yamasani sd, flags, user.getIdentifier()); 17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res < 0) { 17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException( 17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Not allowed to bind to service " + service); 17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res != 0; 17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unbindService(ServiceConnection conn) { 180479b3317b775810bac088b0998c48eb6506e2578cChristopher Tate if (conn == null) { 180579b3317b775810bac088b0998c48eb6506e2578cChristopher Tate throw new IllegalArgumentException("connection is null"); 180679b3317b775810bac088b0998c48eb6506e2578cChristopher Tate } 18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IServiceConnection sd = mPackageInfo.forgetServiceDispatcher( 18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getOuterContext(), conn); 18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().unbindService(sd); 18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Not supported in system context"); 18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean startInstrumentation(ComponentName className, 18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String profileFile, Bundle arguments) { 18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 18239ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn if (arguments != null) { 18249ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn arguments.setAllowFds(false); 18259ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn } 18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ActivityManagerNative.getDefault().startInstrumentation( 18278dcfefd652fa2c5612b3acbc4bf842d2dfb1cf21Narayan Kamath className, profileFile, 0, arguments, null, null, getUserId(), 18288dcfefd652fa2c5612b3acbc4bf842d2dfb1cf21Narayan Kamath null /* ABI override */); 18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // System has crashed, nothing we can do. 18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Object getSystemService(String name) { 1837224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name); 1838224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return fetcher == null ? null : fetcher.getService(this); 18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18418cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn private WallpaperManager getWallpaperManager() { 1842224ba0cd065075718947844b117c9fe50a2d9993Brad Fitzpatrick return (WallpaperManager) WALLPAPER_FETCHER.getService(this); 18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1845438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick /* package */ static DropBoxManager createDropBoxManager() { 1846438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick IBinder b = ServiceManager.getService(DROPBOX_SERVICE); 1847438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick IDropBoxManagerService service = IDropBoxManagerService.Stub.asInterface(b); 1848ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick if (service == null) { 1849ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick // Don't return a DropBoxManager that will NPE upon use. 1850ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick // This also avoids caching a broken DropBoxManager in 1851ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick // getDropBoxManager during early boot, before the 1852ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick // DROPBOX_SERVICE is registered. 1853ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick return null; 1854ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick } 1855438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick return new DropBoxManager(service); 1856438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick } 1857438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick 18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int checkPermission(String permission, int pid, int uid) { 18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (permission == null) { 18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("permission is null"); 18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ActivityManagerNative.getDefault().checkPermission( 18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project permission, pid, uid); 18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.PERMISSION_DENIED; 18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1872ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn /** @hide */ 1873ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn @Override 1874ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn public int checkPermission(String permission, int pid, int uid, IBinder callerToken) { 1875ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn if (permission == null) { 1876ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn throw new IllegalArgumentException("permission is null"); 1877ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn } 1878ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn 1879ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn try { 1880ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn return ActivityManagerNative.getDefault().checkPermissionWithToken( 1881ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn permission, pid, uid, callerToken); 1882ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn } catch (RemoteException e) { 1883ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn return PackageManager.PERMISSION_DENIED; 1884ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn } 1885ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn } 1886ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn 18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int checkCallingPermission(String permission) { 18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (permission == null) { 18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("permission is null"); 18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pid = Binder.getCallingPid(); 18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pid != Process.myPid()) { 1895742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani return checkPermission(permission, pid, Binder.getCallingUid()); 18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.PERMISSION_DENIED; 18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int checkCallingOrSelfPermission(String permission) { 19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (permission == null) { 19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("permission is null"); 19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return checkPermission(permission, Binder.getCallingPid(), 19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingUid()); 19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void enforce( 19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String permission, int resultOfCheck, 19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean selfToo, int uid, String message) { 19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resultOfCheck != PackageManager.PERMISSION_GRANTED) { 19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException( 19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (message != null ? (message + ": ") : "") + 19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (selfToo 19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? "Neither user " + uid + " nor current process has " 19184dc7a68dbeaa0edd8815b2105915753310d58343Christopher Tate : "uid " + uid + " does not have ") + 19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project permission + 19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "."); 19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforcePermission( 19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String permission, int pid, int uid, String message) { 19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforce(permission, 19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkPermission(permission, pid, uid), 19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false, 19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uid, 19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project message); 19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceCallingPermission(String permission, String message) { 19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforce(permission, 19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkCallingPermission(permission), 19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false, 19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingUid(), 19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project message); 19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceCallingOrSelfPermission( 19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String permission, String message) { 19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforce(permission, 19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkCallingOrSelfPermission(permission), 19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project true, 19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingUid(), 19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project message); 19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void grantUriPermission(String toPackage, Uri uri, int modeFlags) { 19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().grantUriPermission( 1954d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot mMainThread.getApplicationThread(), toPackage, 1955d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot ContentProvider.getUriWithoutUserId(uri), modeFlags, resolveUserId(uri)); 19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void revokeUriPermission(Uri uri, int modeFlags) { 19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().revokeUriPermission( 1964d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot mMainThread.getApplicationThread(), 1965d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot ContentProvider.getUriWithoutUserId(uri), modeFlags, resolveUserId(uri)); 19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int checkUriPermission(Uri uri, int pid, int uid, int modeFlags) { 19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ActivityManagerNative.getDefault().checkUriPermission( 1974d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot ContentProvider.getUriWithoutUserId(uri), pid, uid, modeFlags, 1975ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn resolveUserId(uri), null); 1976ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn } catch (RemoteException e) { 1977ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn return PackageManager.PERMISSION_DENIED; 1978ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn } 1979ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn } 1980ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn 1981ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn /** @hide */ 1982ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn @Override 1983ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn public int checkUriPermission(Uri uri, int pid, int uid, int modeFlags, IBinder callerToken) { 1984ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn try { 1985ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn return ActivityManagerNative.getDefault().checkUriPermission( 1986ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn ContentProvider.getUriWithoutUserId(uri), pid, uid, modeFlags, 1987ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn resolveUserId(uri), callerToken); 19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.PERMISSION_DENIED; 19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1993d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot private int resolveUserId(Uri uri) { 1994d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot return ContentProvider.getUserIdFromUri(uri, getUserId()); 1995d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot } 1996d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot 19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int checkCallingUriPermission(Uri uri, int modeFlags) { 19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pid = Binder.getCallingPid(); 20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pid != Process.myPid()) { 20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return checkUriPermission(uri, pid, 20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingUid(), modeFlags); 20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.PERMISSION_DENIED; 20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int checkCallingOrSelfUriPermission(Uri uri, int modeFlags) { 20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return checkUriPermission(uri, Binder.getCallingPid(), 20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingUid(), modeFlags); 20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int checkUriPermission(Uri uri, String readPermission, 20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String writePermission, int pid, int uid, int modeFlags) { 2016569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima if (DEBUG) { 20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i("foo", "checkUriPermission: uri=" + uri + "readPermission=" 20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + readPermission + " writePermission=" + writePermission 20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " pid=" + pid + " uid=" + uid + " mode" + modeFlags); 20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((modeFlags&Intent.FLAG_GRANT_READ_URI_PERMISSION) != 0) { 20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (readPermission == null 20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || checkPermission(readPermission, pid, uid) 20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project == PackageManager.PERMISSION_GRANTED) { 20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.PERMISSION_GRANTED; 20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((modeFlags&Intent.FLAG_GRANT_WRITE_URI_PERMISSION) != 0) { 20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (writePermission == null 20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || checkPermission(writePermission, pid, uid) 20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project == PackageManager.PERMISSION_GRANTED) { 20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.PERMISSION_GRANTED; 20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return uri != null ? checkUriPermission(uri, pid, uid, modeFlags) 20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : PackageManager.PERMISSION_DENIED; 20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String uriModeFlagToString(int uriModeFlags) { 2040846318a3250fa95f47a9decfbffb05a31dbd0006Jeff Sharkey StringBuilder builder = new StringBuilder(); 2041846318a3250fa95f47a9decfbffb05a31dbd0006Jeff Sharkey if ((uriModeFlags & Intent.FLAG_GRANT_READ_URI_PERMISSION) != 0) { 2042846318a3250fa95f47a9decfbffb05a31dbd0006Jeff Sharkey builder.append("read and "); 2043846318a3250fa95f47a9decfbffb05a31dbd0006Jeff Sharkey } 2044846318a3250fa95f47a9decfbffb05a31dbd0006Jeff Sharkey if ((uriModeFlags & Intent.FLAG_GRANT_WRITE_URI_PERMISSION) != 0) { 2045846318a3250fa95f47a9decfbffb05a31dbd0006Jeff Sharkey builder.append("write and "); 2046846318a3250fa95f47a9decfbffb05a31dbd0006Jeff Sharkey } 2047846318a3250fa95f47a9decfbffb05a31dbd0006Jeff Sharkey if ((uriModeFlags & Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION) != 0) { 2048846318a3250fa95f47a9decfbffb05a31dbd0006Jeff Sharkey builder.append("persistable and "); 2049846318a3250fa95f47a9decfbffb05a31dbd0006Jeff Sharkey } 2050846318a3250fa95f47a9decfbffb05a31dbd0006Jeff Sharkey if ((uriModeFlags & Intent.FLAG_GRANT_PREFIX_URI_PERMISSION) != 0) { 2051846318a3250fa95f47a9decfbffb05a31dbd0006Jeff Sharkey builder.append("prefix and "); 2052846318a3250fa95f47a9decfbffb05a31dbd0006Jeff Sharkey } 2053846318a3250fa95f47a9decfbffb05a31dbd0006Jeff Sharkey 2054846318a3250fa95f47a9decfbffb05a31dbd0006Jeff Sharkey if (builder.length() > 5) { 2055846318a3250fa95f47a9decfbffb05a31dbd0006Jeff Sharkey builder.setLength(builder.length() - 5); 2056846318a3250fa95f47a9decfbffb05a31dbd0006Jeff Sharkey return builder.toString(); 2057846318a3250fa95f47a9decfbffb05a31dbd0006Jeff Sharkey } else { 2058846318a3250fa95f47a9decfbffb05a31dbd0006Jeff Sharkey throw new IllegalArgumentException("Unknown permission mode flags: " + uriModeFlags); 2059846318a3250fa95f47a9decfbffb05a31dbd0006Jeff Sharkey } 20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void enforceForUri( 20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int modeFlags, int resultOfCheck, boolean selfToo, 20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int uid, Uri uri, String message) { 20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resultOfCheck != PackageManager.PERMISSION_GRANTED) { 20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException( 20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (message != null ? (message + ": ") : "") + 20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (selfToo 20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? "Neither user " + uid + " nor current process has " 20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : "User " + uid + " does not have ") + 20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uriModeFlagToString(modeFlags) + 20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " permission on " + 20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uri + 20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "."); 20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceUriPermission( 20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri uri, int pid, int uid, int modeFlags, String message) { 20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceForUri( 20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project modeFlags, checkUriPermission(uri, pid, uid, modeFlags), 20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false, uid, uri, message); 20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceCallingUriPermission( 20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri uri, int modeFlags, String message) { 20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceForUri( 20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project modeFlags, checkCallingUriPermission(uri, modeFlags), 2089742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani false, 2090742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani Binder.getCallingUid(), uri, message); 20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceCallingOrSelfUriPermission( 20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri uri, int modeFlags, String message) { 20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceForUri( 20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project modeFlags, 20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkCallingOrSelfUriPermission(uri, modeFlags), true, 20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingUid(), uri, message); 20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceUriPermission( 21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri uri, String readPermission, String writePermission, 21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pid, int uid, int modeFlags, String message) { 21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceForUri(modeFlags, 21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkUriPermission( 21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uri, readPermission, writePermission, pid, uid, 21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project modeFlags), 21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false, 21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uid, 21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uri, 21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project message); 21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2114365632e8ee83db7492094292cea0c509c3447d4bTom O'Neill /** 2115365632e8ee83db7492094292cea0c509c3447d4bTom O'Neill * Logs a warning if the system process directly called a method such as 2116365632e8ee83db7492094292cea0c509c3447d4bTom O'Neill * {@link #startService(Intent)} instead of {@link #startServiceAsUser(Intent, UserHandle)}. 2117365632e8ee83db7492094292cea0c509c3447d4bTom O'Neill * The "AsUser" variants allow us to properly enforce the user's restrictions. 2118365632e8ee83db7492094292cea0c509c3447d4bTom O'Neill */ 2119cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani private void warnIfCallingFromSystemProcess() { 2120cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani if (Process.myUid() == Process.SYSTEM_UID) { 2121cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani Slog.w(TAG, "Calling a method in the system process without a qualified user: " 212240e9f2922cae76ffcbc521481e5be8e80e8744efDianne Hackborn + Debug.getCallers(5)); 2123cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani } 2124cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani } 2125cd75706117432e33d11639e675bcff50479a6bb9Amith Yamasani 21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2127976e8bd2017d0263216c62111454438cc0f130e3Svetoslav public Context createApplicationContext(ApplicationInfo application, int flags) 2128976e8bd2017d0263216c62111454438cc0f130e3Svetoslav throws NameNotFoundException { 2129976e8bd2017d0263216c62111454438cc0f130e3Svetoslav LoadedApk pi = mMainThread.getPackageInfo(application, mResources.getCompatibilityInfo(), 2130976e8bd2017d0263216c62111454438cc0f130e3Svetoslav flags | CONTEXT_REGISTER_PACKAGE); 2131976e8bd2017d0263216c62111454438cc0f130e3Svetoslav if (pi != null) { 2132976e8bd2017d0263216c62111454438cc0f130e3Svetoslav final boolean restricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED; 2133976e8bd2017d0263216c62111454438cc0f130e3Svetoslav ContextImpl c = new ContextImpl(this, mMainThread, pi, mActivityToken, 2134976e8bd2017d0263216c62111454438cc0f130e3Svetoslav new UserHandle(UserHandle.getUserId(application.uid)), restricted, 2135976e8bd2017d0263216c62111454438cc0f130e3Svetoslav mDisplay, mOverrideConfiguration); 2136976e8bd2017d0263216c62111454438cc0f130e3Svetoslav if (c.mResources != null) { 2137976e8bd2017d0263216c62111454438cc0f130e3Svetoslav return c; 2138976e8bd2017d0263216c62111454438cc0f130e3Svetoslav } 2139976e8bd2017d0263216c62111454438cc0f130e3Svetoslav } 2140976e8bd2017d0263216c62111454438cc0f130e3Svetoslav 2141976e8bd2017d0263216c62111454438cc0f130e3Svetoslav throw new PackageManager.NameNotFoundException( 2142976e8bd2017d0263216c62111454438cc0f130e3Svetoslav "Application package " + application.packageName + " not found"); 2143976e8bd2017d0263216c62111454438cc0f130e3Svetoslav } 2144976e8bd2017d0263216c62111454438cc0f130e3Svetoslav 2145976e8bd2017d0263216c62111454438cc0f130e3Svetoslav @Override 21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Context createPackageContext(String packageName, int flags) 21476d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey throws NameNotFoundException { 214864442c11555d828a41af0b8a58ab933357889061Amith Yamasani return createPackageContextAsUser(packageName, flags, 214964442c11555d828a41af0b8a58ab933357889061Amith Yamasani mUser != null ? mUser : Process.myUserHandle()); 21506d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey } 21516d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey 21526d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey @Override 21536d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey public Context createPackageContextAsUser(String packageName, int flags, UserHandle user) 21546d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey throws NameNotFoundException { 2155defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown final boolean restricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED; 2156c2a4060005cc55e8261103becbd49607b09ced45Kenny Guy if (packageName.equals("system") || packageName.equals("android")) { 2157defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown return new ContextImpl(this, mMainThread, mPackageInfo, mActivityToken, 2158defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown user, restricted, mDisplay, mOverrideConfiguration); 21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2161defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown LoadedApk pi = mMainThread.getPackageInfo(packageName, mResources.getCompatibilityInfo(), 2162fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn flags | CONTEXT_REGISTER_PACKAGE, user.getIdentifier()); 21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pi != null) { 2164defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown ContextImpl c = new ContextImpl(this, mMainThread, pi, mActivityToken, 2165defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown user, restricted, mDisplay, mOverrideConfiguration); 21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c.mResources != null) { 21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return c; 21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Should be a better exception. 21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new PackageManager.NameNotFoundException( 2173defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown "Application package " + packageName + " not found"); 21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2176870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy @Override 2177756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn public Context createConfigurationContext(Configuration overrideConfiguration) { 2178a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown if (overrideConfiguration == null) { 2179a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown throw new IllegalArgumentException("overrideConfiguration must not be null"); 2180a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown } 2181a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown 2182defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown return new ContextImpl(this, mMainThread, mPackageInfo, mActivityToken, 2183defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown mUser, mRestricted, mDisplay, overrideConfiguration); 2184756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn } 2185756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn 2186756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn @Override 2187a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown public Context createDisplayContext(Display display) { 2188a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown if (display == null) { 2189a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown throw new IllegalArgumentException("display must not be null"); 2190a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown } 2191a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown 2192defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown return new ContextImpl(this, mMainThread, mPackageInfo, mActivityToken, 2193defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown mUser, mRestricted, display, mOverrideConfiguration); 2194a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown } 2195a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown 2196a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown private int getDisplayId() { 2197a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown return mDisplay != null ? mDisplay.getDisplayId() : Display.DEFAULT_DISPLAY; 2198a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown } 2199a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown 2200a492c3a7b2c18426fd0cb4d017eacbc368195dc5Jeff Brown @Override 2201870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy public boolean isRestricted() { 2202870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy return mRestricted; 2203870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy } 2204870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy 220598365d7663cbd82979a5700faf0050220b01084dJeff Brown @Override 220648d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner public DisplayAdjustments getDisplayAdjustments(int displayId) { 220748d0d1886731ff19ed3fb47a5997be5df0d1bba8Craig Mautner return mDisplayAdjustments; 220898365d7663cbd82979a5700faf0050220b01084dJeff Brown } 220998365d7663cbd82979a5700faf0050220b01084dJeff Brown 22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File getDataDirFile() { 22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackageInfo.getDataDirFile(); 22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Not supported in system context"); 22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public File getDir(String name, int mode) { 22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project name = "app_" + name; 22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project File file = makeFilename(getDataDirFile(), name); 22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!file.exists()) { 22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project file.mkdir(); 22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setFilePermissionsFromMode(file.getPath(), mode, 22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH); 22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return file; 22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2229ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey /** {@hide} */ 2230ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey public int getUserId() { 2231ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey return mUser.getIdentifier(); 2232ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey } 2233ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey 22342155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn static ContextImpl createSystemContext(ActivityThread mainThread) { 2235defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown LoadedApk packageInfo = new LoadedApk(mainThread); 2236defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown ContextImpl context = new ContextImpl(null, mainThread, 2237defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown packageInfo, null, null, false, null, null); 2238defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown context.mResources.updateConfiguration(context.mResourcesManager.getConfiguration(), 2239defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown context.mResourcesManager.getDisplayMetricsLocked(Display.DEFAULT_DISPLAY)); 22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return context; 22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2243defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown static ContextImpl createAppContext(ActivityThread mainThread, LoadedApk packageInfo) { 2244defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown if (packageInfo == null) throw new IllegalArgumentException("packageInfo"); 2245defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown return new ContextImpl(null, mainThread, 2246defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown packageInfo, null, null, false, null, null); 22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2249defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown static ContextImpl createActivityContext(ActivityThread mainThread, 2250defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown LoadedApk packageInfo, IBinder activityToken) { 2251defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown if (packageInfo == null) throw new IllegalArgumentException("packageInfo"); 2252defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown if (activityToken == null) throw new IllegalArgumentException("activityInfo"); 2253defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown return new ContextImpl(null, mainThread, 2254defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown packageInfo, activityToken, null, false, null, null); 22559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2257defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown private ContextImpl(ContextImpl container, ActivityThread mainThread, 2258defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown LoadedApk packageInfo, IBinder activityToken, UserHandle user, boolean restricted, 2259defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown Display display, Configuration overrideConfiguration) { 2260defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown mOuterContext = this; 2261defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown 2262defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown mMainThread = mainThread; 2263defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown mActivityToken = activityToken; 2264defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown mRestricted = restricted; 2265defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown 2266defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown if (user == null) { 2267defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown user = Process.myUserHandle(); 2268defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown } 2269defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown mUser = user; 2270ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima 22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageInfo = packageInfo; 2272defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown mResourcesManager = ResourcesManager.getInstance(); 2273defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown mDisplay = display; 2274defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown mOverrideConfiguration = overrideConfiguration; 2275defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown 2276defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown final int displayId = getDisplayId(); 2277defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown CompatibilityInfo compatInfo = null; 2278defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown if (container != null) { 2279defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown compatInfo = container.getDisplayAdjustments(displayId).getCompatibilityInfo(); 2280defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown } 2281defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown if (compatInfo == null && displayId == Display.DEFAULT_DISPLAY) { 2282defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown compatInfo = packageInfo.getCompatibilityInfo(); 2283defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown } 2284defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown mDisplayAdjustments.setCompatibilityInfo(compatInfo); 2285defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown mDisplayAdjustments.setActivityToken(activityToken); 2286defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown 2287defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown Resources resources = packageInfo.getResources(mainThread); 2288defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown if (resources != null) { 2289defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown if (activityToken != null 2290defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown || displayId != Display.DEFAULT_DISPLAY 2291defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown || overrideConfiguration != null 2292defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown || (compatInfo != null && compatInfo.applicationScale 2293defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown != resources.getCompatibilityInfo().applicationScale)) { 22948a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey resources = mResourcesManager.getTopLevelResources(packageInfo.getResDir(), 22958a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey packageInfo.getSplitResDirs(), packageInfo.getOverlayDirs(), 22968a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey packageInfo.getApplicationInfo().sharedLibraryFiles, displayId, 22978a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey overrideConfiguration, compatInfo, activityToken); 2298defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown } 2299defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown } 2300defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown mResources = resources; 2301defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown 2302defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown if (container != null) { 2303defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown mBasePackageName = container.mBasePackageName; 2304defd4a6b0448bf13606695eb086c77aa099684a2Jeff Brown mOpPackageName = container.mOpPackageName; 230595d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn } else { 230695d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn mBasePackageName = packageInfo.mPackageName; 230795d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn ApplicationInfo ainfo = packageInfo.getApplicationInfo(); 230895d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn if (ainfo.uid == Process.SYSTEM_UID && ainfo.uid != Process.myUid()) { 230995d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn // Special case: system components allow themselves to be loaded in to other 231095d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn // processes. For purposes of app ops, we must then consider the context as 231195d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn // belonging to the package of this process, not the system itself, otherwise 231295d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn // the package+uid verifications in app ops will fail. 231395d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn mOpPackageName = ActivityThread.currentPackageName(); 231495d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn } else { 231595d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn mOpPackageName = mBasePackageName; 231695d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn } 231795d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn } 23182bcb97bfb5908f1e843a8d02b5bf6df4d32b1c9fXin Guan 23192bcb97bfb5908f1e843a8d02b5bf6df4d32b1c9fXin Guan mContentResolver = new ApplicationContentResolver(this, mainThread, user); 23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 232229564cd24589867f653cd22cabbaac6493cfc530Narayan Kamath void installSystemApplicationInfo(ApplicationInfo info, ClassLoader classLoader) { 232329564cd24589867f653cd22cabbaac6493cfc530Narayan Kamath mPackageInfo.installSystemApplicationInfo(info, classLoader); 23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final void scheduleFinalCleanup(String who, String what) { 23279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.scheduleContextCleanup(this, who, what); 23289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final void performFinalCleanup(String who, String what) { 23319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.i(TAG, "Cleanup up context: " + this); 23329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageInfo.removeContextRegistrations(getOuterContext(), who, what); 23339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Context getReceiverRestrictedContext() { 23369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mReceiverRestrictedContext != null) { 23379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mReceiverRestrictedContext; 23389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mReceiverRestrictedContext = new ReceiverRestrictedContext(getOuterContext()); 23409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final void setOuterContext(Context context) { 23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOuterContext = context; 23449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23455f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 23469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Context getOuterContext() { 23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mOuterContext; 23489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23495f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 23509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final IBinder getActivityToken() { 23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mActivityToken; 23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2354d3da44032084b6dd280487280553dcdbd7933e3eBrad Fitzpatrick static void setFilePermissionsFromMode(String name, int mode, 23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int extraPermissions) { 23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int perms = FileUtils.S_IRUSR|FileUtils.S_IWUSR 23579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project |FileUtils.S_IRGRP|FileUtils.S_IWGRP 23589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project |extraPermissions; 23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mode&MODE_WORLD_READABLE) != 0) { 23609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perms |= FileUtils.S_IROTH; 23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mode&MODE_WORLD_WRITEABLE) != 0) { 23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perms |= FileUtils.S_IWOTH; 23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2365569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima if (DEBUG) { 23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(TAG, "File " + name + ": mode=0x" + Integer.toHexString(mode) 23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", perms=0x" + Integer.toHexString(perms)); 23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileUtils.setPermissions(name, perms, -1, -1); 23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2372a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor private File validateFilePath(String name, boolean createDirectory) { 2373a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor File dir; 2374a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor File f; 2375a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor 2376a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor if (name.charAt(0) == File.separatorChar) { 2377a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor String dirPath = name.substring(0, name.lastIndexOf(File.separatorChar)); 2378a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor dir = new File(dirPath); 2379a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor name = name.substring(name.lastIndexOf(File.separatorChar)); 2380a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor f = new File(dir, name); 2381a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor } else { 2382a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor dir = getDatabasesDir(); 2383a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor f = makeFilename(dir, name); 2384a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor } 2385a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor 2386a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor if (createDirectory && !dir.isDirectory() && dir.mkdir()) { 2387a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor FileUtils.setPermissions(dir.getPath(), 2388a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH, 2389a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor -1, -1); 2390a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor } 2391a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor 2392a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor return f; 2393a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor } 2394a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor 23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File makeFilename(File base, String name) { 23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name.indexOf(File.separatorChar) < 0) { 23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new File(base, name); 23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException( 2400a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor "File " + name + " contains a path separator"); 24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24031abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey /** 24041abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey * Ensure that given directories exist, trying to create them if missing. If 24051abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey * unable to create, they are filtered by replacing with {@code null}. 24061abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey */ 24072d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey private File[] ensureDirsExistOrFilter(File[] dirs) { 24081abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey File[] result = new File[dirs.length]; 24091abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey for (int i = 0; i < dirs.length; i++) { 24101abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey File dir = dirs[i]; 24111abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey if (!dir.exists()) { 24121abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey if (!dir.mkdirs()) { 2413cc866da37db53df67e9b324815d6377bbd47d71bChristopher Tate // recheck existence in case of cross-process race 2414cc866da37db53df67e9b324815d6377bbd47d71bChristopher Tate if (!dir.exists()) { 2415cc866da37db53df67e9b324815d6377bbd47d71bChristopher Tate // Failing to mkdir() may be okay, since we might not have 2416cc866da37db53df67e9b324815d6377bbd47d71bChristopher Tate // enough permissions; ask vold to create on our behalf. 2417cc866da37db53df67e9b324815d6377bbd47d71bChristopher Tate final IMountService mount = IMountService.Stub.asInterface( 2418cc866da37db53df67e9b324815d6377bbd47d71bChristopher Tate ServiceManager.getService("mount")); 2419cc866da37db53df67e9b324815d6377bbd47d71bChristopher Tate int res = -1; 2420cc866da37db53df67e9b324815d6377bbd47d71bChristopher Tate try { 2421cc866da37db53df67e9b324815d6377bbd47d71bChristopher Tate res = mount.mkdirs(getPackageName(), dir.getAbsolutePath()); 24229708669b2fe8ae6aae4274d78d712c276b6fad40Jeff Sharkey } catch (Exception ignored) { 2423cc866da37db53df67e9b324815d6377bbd47d71bChristopher Tate } 2424cc866da37db53df67e9b324815d6377bbd47d71bChristopher Tate if (res != 0) { 2425cc866da37db53df67e9b324815d6377bbd47d71bChristopher Tate Log.w(TAG, "Failed to ensure directory: " + dir); 2426cc866da37db53df67e9b324815d6377bbd47d71bChristopher Tate dir = null; 2427cc866da37db53df67e9b324815d6377bbd47d71bChristopher Tate } 24282d8b4e801332e02d6aad615b85cc9dd056ef805cJeff Sharkey } 24291abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey } 24301abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey } 24311abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey result[i] = dir; 24321abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey } 24331abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey return result; 24341abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey } 24351abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey 24369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ---------------------------------------------------------------------- 24379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ---------------------------------------------------------------------- 24389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ---------------------------------------------------------------------- 24399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final class ApplicationContentResolver extends ContentResolver { 24416d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey private final ActivityThread mMainThread; 24426d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey private final UserHandle mUser; 24436d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey 24446d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey public ApplicationContentResolver( 24456d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey Context context, ActivityThread mainThread, UserHandle user) { 24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context); 24476d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey mMainThread = Preconditions.checkNotNull(mainThread); 24486d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey mUser = Preconditions.checkNotNull(user); 24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 24526d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey protected IContentProvider acquireProvider(Context context, String auth) { 2453d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot return mMainThread.acquireProvider(context, 2454d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot ContentProvider.getAuthorityWithoutUserId(auth), 2455d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot resolveUserIdFromAuthority(auth), true); 24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 24596d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey protected IContentProvider acquireExistingProvider(Context context, String auth) { 2460d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot return mMainThread.acquireExistingProvider(context, 2461d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot ContentProvider.getAuthorityWithoutUserId(auth), 2462d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot resolveUserIdFromAuthority(auth), true); 2463cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn } 2464cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn 2465cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn @Override 2466cca1f0e3476edd09cdd81b075a6b7780a2959b46Dianne Hackborn public boolean releaseProvider(IContentProvider provider) { 24676ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn return mMainThread.releaseProvider(provider, true); 24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24695f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 2470652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn @Override 24716d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey protected IContentProvider acquireUnstableProvider(Context c, String auth) { 2472d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot return mMainThread.acquireProvider(c, 2473d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot ContentProvider.getAuthorityWithoutUserId(auth), 2474d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot resolveUserIdFromAuthority(auth), false); 2475652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn } 2476652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn 2477652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn @Override 2478652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn public boolean releaseUnstableProvider(IContentProvider icp) { 24796ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn return mMainThread.releaseProvider(icp, false); 24806ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn } 24816ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn 24826ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn @Override 24836ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn public void unstableProviderDied(IContentProvider icp) { 24846ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn mMainThread.handleUnstableProviderDied(icp.asBinder(), true); 2485652b6d1e591f6684cda4b93d4712920f287991b4Dianne Hackborn } 24867aa7601c09ab5d87cc15a0ed9a8f511d494a4cbcJeff Sharkey 24877aa7601c09ab5d87cc15a0ed9a8f511d494a4cbcJeff Sharkey @Override 24887aa7601c09ab5d87cc15a0ed9a8f511d494a4cbcJeff Sharkey public void appNotRespondingViaProvider(IContentProvider icp) { 24897aa7601c09ab5d87cc15a0ed9a8f511d494a4cbcJeff Sharkey mMainThread.appNotRespondingViaProvider(icp.asBinder()); 24907aa7601c09ab5d87cc15a0ed9a8f511d494a4cbcJeff Sharkey } 2491d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot 2492d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot /** @hide */ 2493d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot protected int resolveUserIdFromAuthority(String auth) { 2494d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot return ContentProvider.getUserIdFromAuthority(auth, mUser.getIdentifier()); 2495d85fc72fb810858f7502e7e7f1bad53e1bf03eddNicolas Prevot } 24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2498