ContextImpl.java revision c63806d852a550d82bbe6cadff8a2139d78ed559
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.app; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport com.android.internal.policy.PolicyManager; 202269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackbornimport com.android.internal.util.XmlUtils; 2175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport com.google.android.collect.Maps; 2275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov 2375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport org.xmlpull.v1.XmlPullParserException; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.BroadcastReceiver; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentResolver; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContextWrapper; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IContentProvider; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IntentFilter; 331ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.content.IIntentReceiver; 341ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.content.IntentSender; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ReceiverCallNotAllowedException; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ServiceConnection; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.SharedPreferences; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ActivityInfo; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ApplicationInfo; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ComponentInfo; 4149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackbornimport android.content.pm.FeatureInfo; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.IPackageDataObserver; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.IPackageDeleteObserver; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.IPackageInstallObserver; 458946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapuimport android.content.pm.IPackageMoveObserver; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.IPackageManager; 4775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.content.pm.IPackageStatsObserver; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.InstrumentationInfo; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageInfo; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PermissionGroupInfo; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PermissionInfo; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ProviderInfo; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ResolveInfo; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ServiceInfo; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.AssetManager; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.XmlResourceParser; 5974f170f9468d3cf6d7d0ef453320141a3e63571bVasu Noriimport android.database.DatabaseErrorHandler; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.sqlite.SQLiteDatabase; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.sqlite.SQLiteDatabase.CursorFactory; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Bitmap; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.hardware.SensorManager; 65a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.location.CountryDetector; 66a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.location.ICountryDetector; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.location.ILocationManager; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.location.LocationManager; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.AudioManager; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.ConnectivityManager; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.IConnectivityManager; 72a2709360665f77ed8bebccb2df86f08e8c83a701Steve Howardimport android.net.DownloadManager; 73c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriffimport android.net.ThrottleManager; 74c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriffimport android.net.IThrottleManager; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.wifi.IWifiManager; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.wifi.WifiManager; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder; 79c63806d852a550d82bbe6cadff8a2139d78ed559Adam Powellimport android.os.Build; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 81f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnorimport android.os.DropBoxManager; 82539d3c475f44b1499499a8b70375a192545cf113Oscar Montemayorimport android.os.Environment; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.FileUtils; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IPowerManager; 8775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.Looper; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.PowerManager; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process; 9075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.RemoteException; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Vibrator; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.FileUtils.FileStatus; 94b104340496e3a531e26c8f428c808eca0e039f50San Mehatimport android.os.storage.StorageManager; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.TelephonyManager; 969f53119b72e6da865bcd53173d3dacd1eba01aeeDianne Hackbornimport android.content.ClipboardManager; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AndroidRuntimeException; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ContextThemeWrapper; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.LayoutInflater; 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManagerImpl; 10275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.view.accessibility.AccessibilityManager; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.InputMethodManager; 104603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintanaimport android.accounts.AccountManager; 105603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintanaimport android.accounts.IAccountManager; 10687bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackbornimport android.app.admin.DevicePolicyManager; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 108f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnorimport com.android.internal.os.IDropBoxManagerService; 109952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileNotFoundException; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.ref.WeakReference; 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap; 11975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport java.util.HashSet; 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Iterator; 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map; 123333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrickimport java.util.Map.Entry; 124105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Projectimport java.util.Set; 12575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport java.util.WeakHashMap; 126333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrickimport java.util.concurrent.CountDownLatch; 127333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrickimport java.util.concurrent.ExecutorService; 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass ReceiverRestrictedContext extends ContextWrapper { 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ReceiverRestrictedContext(Context base) { 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(base); 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) { 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return registerReceiver(receiver, filter, null, null); 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String broadcastPermission, Handler scheduler) { 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ReceiverCallNotAllowedException( 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "IntentReceiver components are not allowed to register to receive intents"); 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //ex.fillInStackTrace(); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.e("IntentReceiver", ex.getMessage(), ex); 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //return mContext.registerReceiver(receiver, filter, broadcastPermission, 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // scheduler); 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean bindService(Intent service, ServiceConnection conn, int flags) { 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ReceiverCallNotAllowedException( 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "IntentReceiver components are not allowed to bind to services"); 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //ex.fillInStackTrace(); 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.e("IntentReceiver", ex.getMessage(), ex); 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //return mContext.bindService(service, interfaceName, conn, flags); 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 1612155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn * Common implementation of Context API, which provides the base 1622155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn * context object for Activity and other application components. 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1642155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackbornclass ContextImpl extends Context { 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final static String TAG = "ApplicationContext"; 166569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima private final static boolean DEBUG = false; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final static boolean DEBUG_ICONS = false; 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final Object sSync = new Object(); 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static AlarmManager sAlarmManager; 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static PowerManager sPowerManager; 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static ConnectivityManager sConnectivityManager; 173c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff private static ThrottleManager sThrottleManager; 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static WifiManager sWifiManager; 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static LocationManager sLocationManager; 176a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao private static CountryDetector sCountryDetector; 177333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick private static final HashMap<String, SharedPreferencesImpl> sSharedPrefs = 178333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick new HashMap<String, SharedPreferencesImpl>(); 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private AudioManager mAudioManager; 18101e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn /*package*/ LoadedApk mPackageInfo; 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Resources mResources; 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ ActivityThread mMainThread; 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Context mOuterContext; 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private IBinder mActivityToken = null; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ApplicationContentResolver mContentResolver; 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mThemeResource = 0; 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Resources.Theme mTheme = null; 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private PackageManager mPackageManager; 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private NotificationManager mNotificationManager = null; 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ActivityManager mActivityManager = null; 1928cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn private WallpaperManager mWallpaperManager = null; 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Context mReceiverRestrictedContext = null; 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private SearchManager mSearchManager = null; 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private SensorManager mSensorManager = null; 196c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat private StorageManager mStorageManager = null; 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Vibrator mVibrator = null; 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private LayoutInflater mLayoutInflater = null; 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private StatusBarManager mStatusBarManager = null; 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private TelephonyManager mTelephonyManager = null; 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ClipboardManager mClipboardManager = null; 202870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy private boolean mRestricted; 203e00a31155b95686eecc6e1999e904472f8f300caFred Quintana private AccountManager mAccountManager; // protected by mSync 204f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor private DropBoxManager mDropBoxManager = null; 205d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn private DevicePolicyManager mDevicePolicyManager = null; 20653332883543868fb83e111a07306368b7772b340Tobias Haamel private UiModeManager mUiModeManager = null; 207a2709360665f77ed8bebccb2df86f08e8c83a701Steve Howard private DownloadManager mDownloadManager = null; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Object mSync = new Object(); 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File mDatabasesDir; 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File mPreferencesDir; 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File mFilesDir; 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File mCacheDir; 215e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn private File mExternalFilesDir; 216e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn private File mExternalCacheDir; 2175f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String[] EMPTY_FILE_LIST = {}; 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AssetManager getAssets() { 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mResources.getAssets(); 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Resources getResources() { 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mResources; 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PackageManager getPackageManager() { 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageManager != null) { 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackageManager; 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IPackageManager pm = ActivityThread.getPackageManager(); 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pm != null) { 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Doesn't matter if we make more than one instance. 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (mPackageManager = new ApplicationPackageManager(this, pm)); 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ContentResolver getContentResolver() { 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mContentResolver; 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Looper getMainLooper() { 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMainThread.getLooper(); 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2545f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Context getApplicationContext() { 257eb9e9ec06167b0caa459f2fb3f3fae094bb8d8f7Christopher Tate return (mPackageInfo != null) ? 258eb9e9ec06167b0caa459f2fb3f3fae094bb8d8f7Christopher Tate mPackageInfo.getApplication() : mMainThread.getApplication(); 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2605f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setTheme(int resid) { 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mThemeResource = resid; 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2655f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Resources.Theme getTheme() { 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTheme == null) { 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mThemeResource == 0) { 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mThemeResource = com.android.internal.R.style.Theme; 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTheme = mResources.newTheme(); 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTheme.applyStyle(mThemeResource, true); 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mTheme; 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ClassLoader getClassLoader() { 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackageInfo != null ? 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageInfo.getClassLoader() : ClassLoader.getSystemClassLoader(); 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getPackageName() { 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackageInfo.getPackageName(); 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Not supported in system context"); 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2935c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn public ApplicationInfo getApplicationInfo() { 2945c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn if (mPackageInfo != null) { 2955c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn return mPackageInfo.getApplicationInfo(); 2965c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn } 2975c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn throw new RuntimeException("Not supported in system context"); 2985c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn } 2995c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn 3005c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn @Override 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getPackageResourcePath() { 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackageInfo.getResDir(); 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Not supported in system context"); 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getPackageCodePath() { 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackageInfo.getAppDir(); 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Not supported in system context"); 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3155f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static File makeBackupFile(File prefsFile) { 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new File(prefsFile.getPath() + ".bak"); 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32023ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato public File getSharedPrefsFile(String name) { 32123ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato return makeFilename(getPreferencesDir(), name + ".xml"); 32223ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato } 32323ecae3bbb60c5af940f3a22170d75eb6ac05b69Joe Onorato 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SharedPreferences getSharedPreferences(String name, int mode) { 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SharedPreferencesImpl sp; 3276194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick File prefsFile; 3286194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick boolean needInitialLoad = false; 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (sSharedPrefs) { 330333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick sp = sSharedPrefs.get(name); 3316194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick if (sp != null && !sp.hasFileChangedUnexpectedly()) { 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sp; 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3346194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick prefsFile = getSharedPrefsFile(name); 3356194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick if (sp == null) { 3366194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick sp = new SharedPreferencesImpl(prefsFile, mode, null); 3376194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick sSharedPrefs.put(name, sp); 3386194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick needInitialLoad = true; 3396194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick } 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3426194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick synchronized (sp) { 3436194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick if (needInitialLoad && sp.isLoaded()) { 3446194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick // lost the race to load; another thread handled it 3456194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick return sp; 3466194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick } 3476194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick File backup = makeBackupFile(prefsFile); 3486194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick if (backup.exists()) { 3496194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick prefsFile.delete(); 3506194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick backup.renameTo(prefsFile); 3516194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick } 3525f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 3536194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick // Debugging 3546194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick if (prefsFile.exists() && !prefsFile.canRead()) { 3556194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick Log.w(TAG, "Attempt to read preferences file " + prefsFile + " without permission"); 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3586194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick Map map = null; 3596194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick if (prefsFile.exists() && prefsFile.canRead()) { 3606194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick try { 3616194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick FileInputStream str = new FileInputStream(prefsFile); 3626194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick map = XmlUtils.readMapXml(str); 3636194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick str.close(); 3646194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick } catch (org.xmlpull.v1.XmlPullParserException e) { 3656194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick Log.w(TAG, "getSharedPreferences", e); 3666194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick } catch (FileNotFoundException e) { 3676194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick Log.w(TAG, "getSharedPreferences", e); 3686194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick } catch (IOException e) { 3696194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick Log.w(TAG, "getSharedPreferences", e); 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3726194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick sp.replace(map); 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3746194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick return sp; 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File getPreferencesDir() { 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPreferencesDir == null) { 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPreferencesDir = new File(getDataDirFile(), "shared_prefs"); 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPreferencesDir; 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public FileInputStream openFileInput(String name) 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws FileNotFoundException { 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project File f = makeFilename(getFilesDir(), name); 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new FileInputStream(f); 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public FileOutputStream openFileOutput(String name, int mode) 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws FileNotFoundException { 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean append = (mode&MODE_APPEND) != 0; 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project File f = makeFilename(getFilesDir(), name); 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileOutputStream fos = new FileOutputStream(f, append); 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setFilePermissionsFromMode(f.getPath(), mode, 0); 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return fos; 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (FileNotFoundException e) { 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project File parent = f.getParentFile(); 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parent.mkdir(); 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileUtils.setPermissions( 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parent.getPath(), 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH, 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project -1, -1); 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileOutputStream fos = new FileOutputStream(f, append); 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setFilePermissionsFromMode(f.getPath(), mode, 0); 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return fos; 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean deleteFile(String name) { 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project File f = makeFilename(getFilesDir(), name); 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return f.delete(); 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public File getFilesDir() { 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFilesDir == null) { 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFilesDir = new File(getDataDirFile(), "files"); 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mFilesDir.exists()) { 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(!mFilesDir.mkdirs()) { 4305f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer Log.w(TAG, "Unable to create files directory " + mFilesDir.getPath()); 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileUtils.setPermissions( 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFilesDir.getPath(), 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH, 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project -1, -1); 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFilesDir; 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4415f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 443e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn public File getExternalFilesDir(String type) { 444e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn synchronized (mSync) { 445e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn if (mExternalFilesDir == null) { 446e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn mExternalFilesDir = Environment.getExternalStorageAppFilesDirectory( 447e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn getPackageName()); 448e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 449e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn if (!mExternalFilesDir.exists()) { 450e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn try { 451e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn (new File(Environment.getExternalStorageAndroidDataDir(), 452e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn ".nomedia")).createNewFile(); 453e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } catch (IOException e) { 454e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 455e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn if (!mExternalFilesDir.mkdirs()) { 456e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn Log.w(TAG, "Unable to create external files directory"); 457e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn return null; 458e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 459e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 460e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn if (type == null) { 461e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn return mExternalFilesDir; 462e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 463e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn File dir = new File(mExternalFilesDir, type); 464e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn if (!dir.exists()) { 465e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn if (!dir.mkdirs()) { 466e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn Log.w(TAG, "Unable to create external media directory " + dir); 467e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn return null; 468e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 469e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 470e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn return dir; 471e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 472e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 4735f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 474e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn @Override 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public File getCacheDir() { 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCacheDir == null) { 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheDir = new File(getDataDirFile(), "cache"); 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mCacheDir.exists()) { 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(!mCacheDir.mkdirs()) { 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unable to create cache directory"); 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileUtils.setPermissions( 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCacheDir.getPath(), 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH, 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project -1, -1); 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCacheDir; 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4935f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 494e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn @Override 495e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn public File getExternalCacheDir() { 496e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn synchronized (mSync) { 497e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn if (mExternalCacheDir == null) { 498e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn mExternalCacheDir = Environment.getExternalStorageAppCacheDirectory( 499e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn getPackageName()); 500e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 501e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn if (!mExternalCacheDir.exists()) { 502e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn try { 503e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn (new File(Environment.getExternalStorageAndroidDataDir(), 504e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn ".nomedia")).createNewFile(); 505e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } catch (IOException e) { 506e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 507e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn if (!mExternalCacheDir.mkdirs()) { 508e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn Log.w(TAG, "Unable to create external cache directory"); 509e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn return null; 510e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 511e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 512e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn return mExternalCacheDir; 513e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 514e83cefcef07f9ac025642c1ffec76b4c7ab39cf2Dianne Hackborn } 5155f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public File getFileStreamPath(String name) { 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return makeFilename(getFilesDir(), name); 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String[] fileList() { 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String[] list = getFilesDir().list(); 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (list != null) ? list : EMPTY_FILE_LIST; 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory) { 529a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor File f = validateFilePath(name, true); 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(f, factory); 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setFilePermissionsFromMode(f.getPath(), mode, 0); 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return db; 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 53674f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory, 53774f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori DatabaseErrorHandler errorHandler) { 53874f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori File f = validateFilePath(name, true); 53974f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(f.getPath(), factory, errorHandler); 54074f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori setFilePermissionsFromMode(f.getPath(), mode, 0); 54174f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori return db; 54274f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori } 54374f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori 54474f170f9468d3cf6d7d0ef453320141a3e63571bVasu Nori @Override 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean deleteDatabase(String name) { 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 547a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor File f = validateFilePath(name, false); 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return f.delete(); 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public File getDatabasePath(String name) { 556a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor return validateFilePath(name, false); 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String[] databaseList() { 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String[] list = getDatabasesDir().list(); 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (list != null) ? list : EMPTY_FILE_LIST; 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5655f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File getDatabasesDir() { 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDatabasesDir == null) { 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabasesDir = new File(getDataDirFile(), "databases"); 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDatabasesDir.getPath().equals("databases")) { 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDatabasesDir = new File("/data/system"); 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDatabasesDir; 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5775f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable getWallpaper() { 5804c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn return getWallpaperManager().getDrawable(); 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5848cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn public Drawable peekWallpaper() { 5854c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn return getWallpaperManager().peekDrawable(); 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getWallpaperDesiredMinimumWidth() { 5908cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn return getWallpaperManager().getDesiredMinimumWidth(); 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getWallpaperDesiredMinimumHeight() { 5958cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn return getWallpaperManager().getDesiredMinimumHeight(); 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setWallpaper(Bitmap bitmap) throws IOException { 6004c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn getWallpaperManager().setBitmap(bitmap); 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setWallpaper(InputStream data) throws IOException { 6054c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn getWallpaperManager().setStream(data); 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void clearWallpaper() throws IOException { 6108cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn getWallpaperManager().clear(); 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startActivity(Intent intent) { 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new AndroidRuntimeException( 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Calling startActivity() from outside of an Activity " 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " context requires the FLAG_ACTIVITY_NEW_TASK flag." 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " Is this really what you want?"); 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getInstrumentation().execStartActivity( 6226e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn getOuterContext(), mMainThread.getApplicationThread(), null, 6236e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn (Activity)null, intent, -1); 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 627fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn public void startIntentSender(IntentSender intent, 628fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags) 629fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn throws IntentSender.SendIntentException { 630fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn try { 631fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn String resolvedType = null; 632fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn if (fillInIntent != null) { 633fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn resolvedType = fillInIntent.resolveTypeIfNeeded(getContentResolver()); 634fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn } 635fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn int result = ActivityManagerNative.getDefault() 636fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn .startActivityIntentSender(mMainThread.getApplicationThread(), intent, 637fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn fillInIntent, resolvedType, null, null, 638fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn 0, flagsMask, flagsValues); 639fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn if (result == IActivityManager.START_CANCELED) { 640fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn throw new IntentSender.SendIntentException(); 641fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn } 642fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn Instrumentation.checkStartActivityResult(result, null); 643fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn } catch (RemoteException e) { 644fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn } 645fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn } 6465f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 647fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn @Override 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void sendBroadcast(Intent intent) { 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().broadcastIntent( 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), intent, resolvedType, null, 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Activity.RESULT_OK, null, null, null, false, false); 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void sendBroadcast(Intent intent, String receiverPermission) { 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().broadcastIntent( 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), intent, resolvedType, null, 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Activity.RESULT_OK, null, null, receiverPermission, false, false); 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void sendOrderedBroadcast(Intent intent, 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String receiverPermission) { 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().broadcastIntent( 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), intent, resolvedType, null, 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Activity.RESULT_OK, null, null, receiverPermission, true, false); 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void sendOrderedBroadcast(Intent intent, 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String receiverPermission, BroadcastReceiver resultReceiver, 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Handler scheduler, int initialCode, String initialData, 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle initialExtras) { 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IIntentReceiver rd = null; 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resultReceiver != null) { 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scheduler == null) { 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scheduler = mMainThread.getHandler(); 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rd = mPackageInfo.getReceiverDispatcher( 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resultReceiver, getOuterContext(), scheduler, 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getInstrumentation(), false); 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scheduler == null) { 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scheduler = mMainThread.getHandler(); 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 69901e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn rd = new LoadedApk.ReceiverDispatcher( 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver(); 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().broadcastIntent( 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), intent, resolvedType, rd, 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project initialCode, initialData, initialExtras, receiverPermission, 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project true, false); 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void sendStickyBroadcast(Intent intent) { 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().broadcastIntent( 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), intent, resolvedType, null, 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Activity.RESULT_OK, null, null, null, false, true); 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 725efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn public void sendStickyOrderedBroadcast(Intent intent, 726efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn BroadcastReceiver resultReceiver, 727efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn Handler scheduler, int initialCode, String initialData, 728efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn Bundle initialExtras) { 729efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn IIntentReceiver rd = null; 730efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn if (resultReceiver != null) { 731efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn if (mPackageInfo != null) { 732efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn if (scheduler == null) { 733efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn scheduler = mMainThread.getHandler(); 734efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } 735efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn rd = mPackageInfo.getReceiverDispatcher( 736efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn resultReceiver, getOuterContext(), scheduler, 737efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn mMainThread.getInstrumentation(), false); 738efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } else { 739efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn if (scheduler == null) { 740efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn scheduler = mMainThread.getHandler(); 741efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } 74201e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn rd = new LoadedApk.ReceiverDispatcher( 743efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver(); 744efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } 745efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } 746efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 747efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn try { 748efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn ActivityManagerNative.getDefault().broadcastIntent( 749efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn mMainThread.getApplicationThread(), intent, resolvedType, rd, 750efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn initialCode, initialData, initialExtras, null, 751efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn true, true); 752efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } catch (RemoteException e) { 753efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } 754efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn } 755efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn 756efa199f016985b0a9d0471e42c803ee9f7941f0eDianne Hackborn @Override 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeStickyBroadcast(Intent intent) { 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resolvedType != null) { 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent = new Intent(intent); 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.setDataAndType(intent.getData(), resolvedType); 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().unbroadcastIntent( 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), intent); 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) { 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return registerReceiver(receiver, filter, null, null); 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String broadcastPermission, Handler scheduler) { 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return registerReceiverInternal(receiver, filter, broadcastPermission, 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scheduler, getOuterContext()); 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Intent registerReceiverInternal(BroadcastReceiver receiver, 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IntentFilter filter, String broadcastPermission, 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Handler scheduler, Context context) { 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IIntentReceiver rd = null; 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (receiver != null) { 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null && context != null) { 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scheduler == null) { 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scheduler = mMainThread.getHandler(); 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rd = mPackageInfo.getReceiverDispatcher( 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project receiver, context, scheduler, 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getInstrumentation(), true); 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scheduler == null) { 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scheduler = mMainThread.getHandler(); 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 79801e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn rd = new LoadedApk.ReceiverDispatcher( 799399cccb85749e02f6d3e12d1d2846310e7cbfdf1Dianne Hackborn receiver, context, scheduler, null, true).getIIntentReceiver(); 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ActivityManagerNative.getDefault().registerReceiver( 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rd, filter, broadcastPermission); 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unregisterReceiver(BroadcastReceiver receiver) { 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IIntentReceiver rd = mPackageInfo.forgetReceiverDispatcher( 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getOuterContext(), receiver); 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().unregisterReceiver(rd); 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Not supported in system context"); 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ComponentName startService(Intent service) { 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ComponentName cn = ActivityManagerNative.getDefault().startService( 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), service, 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project service.resolveTypeIfNeeded(getContentResolver())); 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cn != null && cn.getPackageName().equals("!")) { 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException( 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Not allowed to start service " + service 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " without permission " + cn.getClassName()); 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return cn; 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean stopService(Intent service) { 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int res = ActivityManagerNative.getDefault().stopService( 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), service, 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project service.resolveTypeIfNeeded(getContentResolver())); 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res < 0) { 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException( 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Not allowed to stop service " + service); 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res != 0; 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean bindService(Intent service, ServiceConnection conn, 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags) { 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IServiceConnection sd; 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sd = mPackageInfo.getServiceDispatcher(conn, getOuterContext(), 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getHandler(), flags); 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Not supported in system context"); 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int res = ActivityManagerNative.getDefault().bindService( 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), getActivityToken(), 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project service, service.resolveTypeIfNeeded(getContentResolver()), 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sd, flags); 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res < 0) { 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException( 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Not allowed to bind to service " + service); 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res != 0; 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unbindService(ServiceConnection conn) { 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IServiceConnection sd = mPackageInfo.forgetServiceDispatcher( 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getOuterContext(), conn); 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().unbindService(sd); 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Not supported in system context"); 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean startInstrumentation(ComponentName className, 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String profileFile, Bundle arguments) { 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ActivityManagerNative.getDefault().startInstrumentation( 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project className, profileFile, 0, arguments, null); 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // System has crashed, nothing we can do. 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Object getSystemService(String name) { 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (WINDOW_SERVICE.equals(name)) { 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return WindowManagerImpl.getDefault(); 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (LAYOUT_INFLATER_SERVICE.equals(name)) { 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LayoutInflater inflater = mLayoutInflater; 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (inflater != null) { 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return inflater; 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutInflater = inflater = 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PolicyManager.makeNewLayoutInflater(getOuterContext()); 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return inflater; 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (ACTIVITY_SERVICE.equals(name)) { 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getActivityManager(); 9258cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn } else if (INPUT_METHOD_SERVICE.equals(name)) { 9268cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn return InputMethodManager.getInstance(this); 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (ALARM_SERVICE.equals(name)) { 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getAlarmManager(); 929603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana } else if (ACCOUNT_SERVICE.equals(name)) { 930603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana return getAccountManager(); 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (POWER_SERVICE.equals(name)) { 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getPowerManager(); 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (CONNECTIVITY_SERVICE.equals(name)) { 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getConnectivityManager(); 935c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff } else if (THROTTLE_SERVICE.equals(name)) { 936c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff return getThrottleManager(); 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (WIFI_SERVICE.equals(name)) { 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getWifiManager(); 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (NOTIFICATION_SERVICE.equals(name)) { 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getNotificationManager(); 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (KEYGUARD_SERVICE.equals(name)) { 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new KeyguardManager(); 94375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov } else if (ACCESSIBILITY_SERVICE.equals(name)) { 94475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov return AccessibilityManager.getInstance(this); 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (LOCATION_SERVICE.equals(name)) { 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getLocationManager(); 947a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } else if (COUNTRY_DETECTOR.equals(name)) { 948a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao return getCountryDetector(); 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (SEARCH_SERVICE.equals(name)) { 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getSearchManager(); 9518cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn } else if (SENSOR_SERVICE.equals(name)) { 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getSensorManager(); 953c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat } else if (STORAGE_SERVICE.equals(name)) { 954c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat return getStorageManager(); 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (VIBRATOR_SERVICE.equals(name)) { 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getVibrator(); 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (STATUS_BAR_SERVICE.equals(name)) { 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mStatusBarManager == null) { 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStatusBarManager = new StatusBarManager(getOuterContext()); 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStatusBarManager; 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (AUDIO_SERVICE.equals(name)) { 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getAudioManager(); 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (TELEPHONY_SERVICE.equals(name)) { 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getTelephonyManager(); 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (CLIPBOARD_SERVICE.equals(name)) { 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getClipboardManager(); 9708cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn } else if (WALLPAPER_SERVICE.equals(name)) { 9718cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn return getWallpaperManager(); 972952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor } else if (DROPBOX_SERVICE.equals(name)) { 973f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor return getDropBoxManager(); 974d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } else if (DEVICE_POLICY_SERVICE.equals(name)) { 975d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn return getDevicePolicyManager(); 97669fb574e294ed07404d515a66fccd046e974d32fTobias Haamel } else if (UI_MODE_SERVICE.equals(name)) { 97753332883543868fb83e111a07306368b7772b340Tobias Haamel return getUiModeManager(); 978a2709360665f77ed8bebccb2df86f08e8c83a701Steve Howard } else if (DOWNLOAD_SERVICE.equals(name)) { 979a2709360665f77ed8bebccb2df86f08e8c83a701Steve Howard return getDownloadManager(); 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 985603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana private AccountManager getAccountManager() { 986e00a31155b95686eecc6e1999e904472f8f300caFred Quintana synchronized (mSync) { 987e00a31155b95686eecc6e1999e904472f8f300caFred Quintana if (mAccountManager == null) { 988603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana IBinder b = ServiceManager.getService(ACCOUNT_SERVICE); 989603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana IAccountManager service = IAccountManager.Stub.asInterface(b); 990e00a31155b95686eecc6e1999e904472f8f300caFred Quintana mAccountManager = new AccountManager(this, service); 991603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana } 992e00a31155b95686eecc6e1999e904472f8f300caFred Quintana return mAccountManager; 993603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana } 994603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana } 995603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ActivityManager getActivityManager() { 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mActivityManager == null) { 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivityManager = new ActivityManager(getOuterContext(), 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getHandler()); 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mActivityManager; 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private AlarmManager getAlarmManager() { 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (sSync) { 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sAlarmManager == null) { 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder b = ServiceManager.getService(ALARM_SERVICE); 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IAlarmManager service = IAlarmManager.Stub.asInterface(b); 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sAlarmManager = new AlarmManager(service); 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sAlarmManager; 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private PowerManager getPowerManager() { 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (sSync) { 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sPowerManager == null) { 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder b = ServiceManager.getService(POWER_SERVICE); 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IPowerManager service = IPowerManager.Stub.asInterface(b); 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sPowerManager = new PowerManager(service, mMainThread.getHandler()); 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sPowerManager; 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ConnectivityManager getConnectivityManager() 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (sSync) { 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sConnectivityManager == null) { 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder b = ServiceManager.getService(CONNECTIVITY_SERVICE); 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IConnectivityManager service = IConnectivityManager.Stub.asInterface(b); 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sConnectivityManager = new ConnectivityManager(service); 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sConnectivityManager; 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1040c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff private ThrottleManager getThrottleManager() 1041c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff { 1042c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff synchronized (sSync) { 1043c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff if (sThrottleManager == null) { 1044c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff IBinder b = ServiceManager.getService(THROTTLE_SERVICE); 1045c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff IThrottleManager service = IThrottleManager.Stub.asInterface(b); 1046c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff sThrottleManager = new ThrottleManager(service); 1047c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff } 1048c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff } 1049c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff return sThrottleManager; 1050c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff } 1051c9b6851af68bdc20c4903b16c344e9f116647219Irfan Sheriff 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private WifiManager getWifiManager() 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (sSync) { 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sWifiManager == null) { 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder b = ServiceManager.getService(WIFI_SERVICE); 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IWifiManager service = IWifiManager.Stub.asInterface(b); 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sWifiManager = new WifiManager(service, mMainThread.getHandler()); 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sWifiManager; 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10648cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn private NotificationManager getNotificationManager() { 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNotificationManager == null) { 1067c63806d852a550d82bbe6cadff8a2139d78ed559Adam Powell final Context outerContext = getOuterContext(); 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNotificationManager = new NotificationManager( 1069c63806d852a550d82bbe6cadff8a2139d78ed559Adam Powell new ContextThemeWrapper(outerContext, 1070c63806d852a550d82bbe6cadff8a2139d78ed559Adam Powell outerContext.getApplicationInfo().targetSdkVersion >= 1071c63806d852a550d82bbe6cadff8a2139d78ed559Adam Powell Build.VERSION_CODES.HONEYCOMB 1072c63806d852a550d82bbe6cadff8a2139d78ed559Adam Powell ? com.android.internal.R.style.Theme_Holo_Dialog 1073c63806d852a550d82bbe6cadff8a2139d78ed559Adam Powell : com.android.internal.R.style.Theme_Dialog), 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getHandler()); 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mNotificationManager; 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10808cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn private WallpaperManager getWallpaperManager() { 10818cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn synchronized (mSync) { 10828cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn if (mWallpaperManager == null) { 10838cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn mWallpaperManager = new WallpaperManager(getOuterContext(), 10848cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn mMainThread.getHandler()); 10858cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn } 10868cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn } 10878cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn return mWallpaperManager; 10888cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn } 10898cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private TelephonyManager getTelephonyManager() { 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTelephonyManager == null) { 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTelephonyManager = new TelephonyManager(getOuterContext()); 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mTelephonyManager; 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ClipboardManager getClipboardManager() { 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mClipboardManager == null) { 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClipboardManager = new ClipboardManager(getOuterContext(), 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getHandler()); 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mClipboardManager; 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private LocationManager getLocationManager() { 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (sSync) { 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sLocationManager == null) { 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder b = ServiceManager.getService(LOCATION_SERVICE); 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ILocationManager service = ILocationManager.Stub.asInterface(b); 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sLocationManager = new LocationManager(service); 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sLocationManager; 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1120a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao private CountryDetector getCountryDetector() { 1121a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao synchronized (sSync) { 1122a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao if (sCountryDetector == null) { 1123a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao IBinder b = ServiceManager.getService(COUNTRY_DETECTOR); 1124a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao ICountryDetector service = ICountryDetector.Stub.asInterface(b); 1125a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao sCountryDetector = new CountryDetector(service); 1126a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 1127a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 1128a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao return sCountryDetector; 1129a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 1130a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private SearchManager getSearchManager() { 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSearchManager == null) { 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSearchManager = new SearchManager(getOuterContext(), mMainThread.getHandler()); 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSearchManager; 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private SensorManager getSensorManager() { 11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSensorManager == null) { 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSensorManager = new SensorManager(mMainThread.getHandler().getLooper()); 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSensorManager; 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1149c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat private StorageManager getStorageManager() { 1150c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat synchronized (mSync) { 1151c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat if (mStorageManager == null) { 1152c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat try { 1153c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat mStorageManager = new StorageManager(mMainThread.getHandler().getLooper()); 1154c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat } catch (RemoteException rex) { 1155c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat Log.e(TAG, "Failed to create StorageManager", rex); 1156c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat mStorageManager = null; 1157c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat } 1158c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat } 1159c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat } 1160c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat return mStorageManager; 1161c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat } 1162c9d8175f40691228e25f0dd924cc2453a6f08e10San Mehat 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Vibrator getVibrator() { 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mVibrator == null) { 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVibrator = new Vibrator(); 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mVibrator; 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1171952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private AudioManager getAudioManager() 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAudioManager == null) { 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAudioManager = new AudioManager(this); 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mAudioManager; 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1180438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick /* package */ static DropBoxManager createDropBoxManager() { 1181438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick IBinder b = ServiceManager.getService(DROPBOX_SERVICE); 1182438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick IDropBoxManagerService service = IDropBoxManagerService.Stub.asInterface(b); 1183438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick return new DropBoxManager(service); 1184438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick } 1185438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick 1186f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor private DropBoxManager getDropBoxManager() { 1187952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor synchronized (mSync) { 1188f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor if (mDropBoxManager == null) { 1189438d0595121a7a2cdf19741e76e3c0e21a5c173dBrad Fitzpatrick mDropBoxManager = createDropBoxManager(); 1190952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor } 1191952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor } 1192f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor return mDropBoxManager; 1193952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor } 1194952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 1195d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn private DevicePolicyManager getDevicePolicyManager() { 1196d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn synchronized (mSync) { 1197d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn if (mDevicePolicyManager == null) { 119821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn mDevicePolicyManager = DevicePolicyManager.create(this, 1199d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn mMainThread.getHandler()); 1200d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 1201d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 1202d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn return mDevicePolicyManager; 1203d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn } 1204d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn 120553332883543868fb83e111a07306368b7772b340Tobias Haamel private UiModeManager getUiModeManager() { 120653332883543868fb83e111a07306368b7772b340Tobias Haamel synchronized (mSync) { 120753332883543868fb83e111a07306368b7772b340Tobias Haamel if (mUiModeManager == null) { 120853332883543868fb83e111a07306368b7772b340Tobias Haamel mUiModeManager = new UiModeManager(); 120953332883543868fb83e111a07306368b7772b340Tobias Haamel } 121053332883543868fb83e111a07306368b7772b340Tobias Haamel } 121153332883543868fb83e111a07306368b7772b340Tobias Haamel return mUiModeManager; 121253332883543868fb83e111a07306368b7772b340Tobias Haamel } 121353332883543868fb83e111a07306368b7772b340Tobias Haamel 1214a2709360665f77ed8bebccb2df86f08e8c83a701Steve Howard private DownloadManager getDownloadManager() { 1215a2709360665f77ed8bebccb2df86f08e8c83a701Steve Howard synchronized (mSync) { 1216a2709360665f77ed8bebccb2df86f08e8c83a701Steve Howard if (mDownloadManager == null) { 1217b8e07a51c1849d6894c5773a3daacedd01294218Steve Howard mDownloadManager = new DownloadManager(getContentResolver(), getPackageName()); 1218a2709360665f77ed8bebccb2df86f08e8c83a701Steve Howard } 1219a2709360665f77ed8bebccb2df86f08e8c83a701Steve Howard } 1220a2709360665f77ed8bebccb2df86f08e8c83a701Steve Howard return mDownloadManager; 1221a2709360665f77ed8bebccb2df86f08e8c83a701Steve Howard } 1222a2709360665f77ed8bebccb2df86f08e8c83a701Steve Howard 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int checkPermission(String permission, int pid, int uid) { 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (permission == null) { 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("permission is null"); 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!Process.supportsProcesses()) { 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.PERMISSION_GRANTED; 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ActivityManagerNative.getDefault().checkPermission( 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project permission, pid, uid); 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.PERMISSION_DENIED; 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int checkCallingPermission(String permission) { 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (permission == null) { 12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("permission is null"); 12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!Process.supportsProcesses()) { 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.PERMISSION_GRANTED; 12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pid = Binder.getCallingPid(); 12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pid != Process.myPid()) { 12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return checkPermission(permission, pid, 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingUid()); 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.PERMISSION_DENIED; 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int checkCallingOrSelfPermission(String permission) { 12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (permission == null) { 12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("permission is null"); 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return checkPermission(permission, Binder.getCallingPid(), 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingUid()); 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void enforce( 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String permission, int resultOfCheck, 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean selfToo, int uid, String message) { 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resultOfCheck != PackageManager.PERMISSION_GRANTED) { 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException( 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (message != null ? (message + ": ") : "") + 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (selfToo 12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? "Neither user " + uid + " nor current process has " 12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : "User " + uid + " does not have ") + 12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project permission + 12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "."); 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforcePermission( 12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String permission, int pid, int uid, String message) { 12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforce(permission, 12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkPermission(permission, pid, uid), 12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false, 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uid, 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project message); 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceCallingPermission(String permission, String message) { 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforce(permission, 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkCallingPermission(permission), 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false, 12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingUid(), 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project message); 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceCallingOrSelfPermission( 12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String permission, String message) { 13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforce(permission, 13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkCallingOrSelfPermission(permission), 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project true, 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingUid(), 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project message); 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void grantUriPermission(String toPackage, Uri uri, int modeFlags) { 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().grantUriPermission( 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), toPackage, uri, 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project modeFlags); 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void revokeUriPermission(Uri uri, int modeFlags) { 13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityManagerNative.getDefault().revokeUriPermission( 13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getApplicationThread(), uri, 13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project modeFlags); 13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int checkUriPermission(Uri uri, int pid, int uid, int modeFlags) { 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!Process.supportsProcesses()) { 13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.PERMISSION_GRANTED; 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ActivityManagerNative.getDefault().checkUriPermission( 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uri, pid, uid, modeFlags); 13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.PERMISSION_DENIED; 13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int checkCallingUriPermission(Uri uri, int modeFlags) { 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!Process.supportsProcesses()) { 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.PERMISSION_GRANTED; 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pid = Binder.getCallingPid(); 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pid != Process.myPid()) { 13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return checkUriPermission(uri, pid, 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingUid(), modeFlags); 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.PERMISSION_DENIED; 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int checkCallingOrSelfUriPermission(Uri uri, int modeFlags) { 13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return checkUriPermission(uri, Binder.getCallingPid(), 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingUid(), modeFlags); 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int checkUriPermission(Uri uri, String readPermission, 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String writePermission, int pid, int uid, int modeFlags) { 1362569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima if (DEBUG) { 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i("foo", "checkUriPermission: uri=" + uri + "readPermission=" 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + readPermission + " writePermission=" + writePermission 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " pid=" + pid + " uid=" + uid + " mode" + modeFlags); 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((modeFlags&Intent.FLAG_GRANT_READ_URI_PERMISSION) != 0) { 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (readPermission == null 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || checkPermission(readPermission, pid, uid) 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project == PackageManager.PERMISSION_GRANTED) { 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.PERMISSION_GRANTED; 13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((modeFlags&Intent.FLAG_GRANT_WRITE_URI_PERMISSION) != 0) { 13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (writePermission == null 13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || checkPermission(writePermission, pid, uid) 13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project == PackageManager.PERMISSION_GRANTED) { 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.PERMISSION_GRANTED; 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return uri != null ? checkUriPermission(uri, pid, uid, modeFlags) 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : PackageManager.PERMISSION_DENIED; 13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String uriModeFlagToString(int uriModeFlags) { 13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (uriModeFlags) { 13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case Intent.FLAG_GRANT_READ_URI_PERMISSION | 13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent.FLAG_GRANT_WRITE_URI_PERMISSION: 13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "read and write"; 13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case Intent.FLAG_GRANT_READ_URI_PERMISSION: 13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "read"; 13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case Intent.FLAG_GRANT_WRITE_URI_PERMISSION: 13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "write"; 13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException( 13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Unknown permission mode flags: " + uriModeFlags); 13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void enforceForUri( 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int modeFlags, int resultOfCheck, boolean selfToo, 14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int uid, Uri uri, String message) { 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resultOfCheck != PackageManager.PERMISSION_GRANTED) { 14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException( 14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (message != null ? (message + ": ") : "") + 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (selfToo 14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? "Neither user " + uid + " nor current process has " 14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : "User " + uid + " does not have ") + 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uriModeFlagToString(modeFlags) + 14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " permission on " + 14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uri + 14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "."); 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceUriPermission( 14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri uri, int pid, int uid, int modeFlags, String message) { 14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceForUri( 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project modeFlags, checkUriPermission(uri, pid, uid, modeFlags), 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false, uid, uri, message); 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceCallingUriPermission( 14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri uri, int modeFlags, String message) { 14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceForUri( 14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project modeFlags, checkCallingUriPermission(uri, modeFlags), 14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false, Binder.getCallingUid(), uri, message); 14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceCallingOrSelfUriPermission( 14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri uri, int modeFlags, String message) { 14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceForUri( 14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project modeFlags, 14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkCallingOrSelfUriPermission(uri, modeFlags), true, 14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingUid(), uri, message); 14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceUriPermission( 14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri uri, String readPermission, String writePermission, 14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pid, int uid, int modeFlags, String message) { 14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceForUri(modeFlags, 14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkUriPermission( 14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uri, readPermission, writePermission, pid, uid, 14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project modeFlags), 14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false, 14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uid, 14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uri, 14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project message); 14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Context createPackageContext(String packageName, int flags) 14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws PackageManager.NameNotFoundException { 14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (packageName.equals("system") || packageName.equals("android")) { 14542155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn return new ContextImpl(mMainThread.getSystemContext()); 14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 145701e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn LoadedApk pi = 14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.getPackageInfo(packageName, flags); 14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pi != null) { 14602155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn ContextImpl c = new ContextImpl(); 1461870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy c.mRestricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED; 1462ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima c.init(pi, null, mMainThread, mResources); 14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c.mResources != null) { 14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return c; 14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Should be a better exception. 14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new PackageManager.NameNotFoundException( 14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Application package " + packageName + " not found"); 14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1473870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy @Override 1474870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy public boolean isRestricted() { 1475870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy return mRestricted; 1476870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy } 1477870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy 14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File getDataDirFile() { 14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackageInfo != null) { 14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackageInfo.getDataDirFile(); 14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Not supported in system context"); 14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public File getDir(String name, int mode) { 14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project name = "app_" + name; 14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project File file = makeFilename(getDataDirFile(), name); 14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!file.exists()) { 14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project file.mkdir(); 14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setFilePermissionsFromMode(file.getPath(), mode, 14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH); 14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return file; 14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14972155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn static ContextImpl createSystemContext(ActivityThread mainThread) { 14982155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn ContextImpl context = new ContextImpl(); 14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project context.init(Resources.getSystem(), mainThread); 15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return context; 15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15032155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn ContextImpl() { 15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOuterContext = this; 15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a new ApplicationContext from an existing one. The new one 15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * works and operates the same as the one it is copying. 15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context Existing application context. 15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15132155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn public ContextImpl(ContextImpl context) { 15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageInfo = context.mPackageInfo; 15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResources = context.mResources; 15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread = context.mMainThread; 15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContentResolver = context.mContentResolver; 15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOuterContext = this; 15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 152101e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn final void init(LoadedApk packageInfo, 15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder activityToken, ActivityThread mainThread) { 1523ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima init(packageInfo, activityToken, mainThread, null); 1524ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima } 1525ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima 152601e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn final void init(LoadedApk packageInfo, 1527ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima IBinder activityToken, ActivityThread mainThread, 1528ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima Resources container) { 15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageInfo = packageInfo; 15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResources = mPackageInfo.getResources(mainThread); 1531ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima 1532559a78753165f20d5973b958791056154baecc43Dianne Hackborn if (mResources != null && container != null 1533559a78753165f20d5973b958791056154baecc43Dianne Hackborn && container.getCompatibilityInfo().applicationScale != 1534559a78753165f20d5973b958791056154baecc43Dianne Hackborn mResources.getCompatibilityInfo().applicationScale) { 1535ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima if (DEBUG) { 1536ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima Log.d(TAG, "loaded context has different scaling. Using container's" + 1537ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima " compatiblity info:" + container.getDisplayMetrics()); 1538ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima } 1539ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima mResources = mainThread.getTopLevelResources( 1540ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima mPackageInfo.getResDir(), container.getCompatibilityInfo().copy()); 1541ba3ba57921dedaaef669719c0359c0caf60e008bMitsuru Oshima } 15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread = mainThread; 15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContentResolver = new ApplicationContentResolver(this, mainThread); 15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setActivityToken(activityToken); 15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final void init(Resources resources, ActivityThread mainThread) { 15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageInfo = null; 15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResources = resources; 15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread = mainThread; 15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContentResolver = new ApplicationContentResolver(this, mainThread); 15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final void scheduleFinalCleanup(String who, String what) { 15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread.scheduleContextCleanup(this, who, what); 15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final void performFinalCleanup(String who, String what) { 15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.i(TAG, "Cleanup up context: " + this); 15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageInfo.removeContextRegistrations(getOuterContext(), who, what); 15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Context getReceiverRestrictedContext() { 15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mReceiverRestrictedContext != null) { 15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mReceiverRestrictedContext; 15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mReceiverRestrictedContext = new ReceiverRestrictedContext(getOuterContext()); 15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final void setActivityToken(IBinder token) { 15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivityToken = token; 15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15745f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final void setOuterContext(Context context) { 15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOuterContext = context; 15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15785f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Context getOuterContext() { 15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mOuterContext; 15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15825f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final IBinder getActivityToken() { 15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mActivityToken; 15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static void setFilePermissionsFromMode(String name, int mode, 15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int extraPermissions) { 15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int perms = FileUtils.S_IRUSR|FileUtils.S_IWUSR 15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project |FileUtils.S_IRGRP|FileUtils.S_IWGRP 15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project |extraPermissions; 15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mode&MODE_WORLD_READABLE) != 0) { 15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perms |= FileUtils.S_IROTH; 15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mode&MODE_WORLD_WRITEABLE) != 0) { 15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perms |= FileUtils.S_IWOTH; 15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1598569076c9f6bdadb4d3285a26e069634a839b5b87Mitsuru Oshima if (DEBUG) { 15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(TAG, "File " + name + ": mode=0x" + Integer.toHexString(mode) 16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", perms=0x" + Integer.toHexString(perms)); 16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileUtils.setPermissions(name, perms, -1, -1); 16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1605a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor private File validateFilePath(String name, boolean createDirectory) { 1606a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor File dir; 1607a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor File f; 1608a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor 1609a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor if (name.charAt(0) == File.separatorChar) { 1610a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor String dirPath = name.substring(0, name.lastIndexOf(File.separatorChar)); 1611a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor dir = new File(dirPath); 1612a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor name = name.substring(name.lastIndexOf(File.separatorChar)); 1613a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor f = new File(dir, name); 1614a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor } else { 1615a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor dir = getDatabasesDir(); 1616a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor f = makeFilename(dir, name); 1617a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor } 1618a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor 1619a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor if (createDirectory && !dir.isDirectory() && dir.mkdir()) { 1620a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor FileUtils.setPermissions(dir.getPath(), 1621a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH, 1622a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor -1, -1); 1623a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor } 1624a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor 1625a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor return f; 1626a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor } 1627a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor 16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private File makeFilename(File base, String name) { 16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name.indexOf(File.separatorChar) < 0) { 16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new File(base, name); 16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException( 1633a8529f68671a8a118751cb6ad577f44eaf076b96Oscar Montemayor "File " + name + " contains a path separator"); 16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ---------------------------------------------------------------------- 16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ---------------------------------------------------------------------- 16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ---------------------------------------------------------------------- 16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final class ApplicationContentResolver extends ContentResolver { 16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ApplicationContentResolver(Context context, 16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityThread mainThread) 16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context); 16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMainThread = mainThread; 16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected IContentProvider acquireProvider(Context context, String name) 16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMainThread.acquireProvider(context, name); 16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean releaseProvider(IContentProvider provider) 16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMainThread.releaseProvider(provider); 16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16595f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final ActivityThread mMainThread; 16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ---------------------------------------------------------------------- 16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ---------------------------------------------------------------------- 16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ---------------------------------------------------------------------- 16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ 16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final class ApplicationPackageManager extends PackageManager { 16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PackageInfo getPackageInfo(String packageName, int flags) 16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws NameNotFoundException { 16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PackageInfo pi = mPM.getPackageInfo(packageName, flags); 16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pi != null) { 16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pi; 16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Package manager has died", e); 16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NameNotFoundException(packageName); 16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1684eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda @Override 1685470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn public String[] currentToCanonicalPackageNames(String[] names) { 1686470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn try { 1687470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn return mPM.currentToCanonicalPackageNames(names); 1688470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn } catch (RemoteException e) { 1689470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn throw new RuntimeException("Package manager has died", e); 1690470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn } 1691470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn } 16925f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 1693470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn @Override 1694470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn public String[] canonicalToCurrentPackageNames(String[] names) { 1695470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn try { 1696470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn return mPM.canonicalToCurrentPackageNames(names); 1697470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn } catch (RemoteException e) { 1698470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn throw new RuntimeException("Package manager has died", e); 1699470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn } 1700470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn } 17015f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 1702470969346d7958f859d97d1a136b4ecc11e2a464Dianne Hackborn @Override 1703eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda public Intent getLaunchIntentForPackage(String packageName) { 17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // First see if the package has an INFO activity; the existence of 17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // such an activity is implied to be the desired front-door for the 17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // overall package (such as if it has multiple launcher entries). 1707eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda Intent intentToResolve = new Intent(Intent.ACTION_MAIN); 1708eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda intentToResolve.addCategory(Intent.CATEGORY_INFO); 1709c14b9ccdf13163cae5ce5d21bcf377010b37594bDianne Hackborn intentToResolve.setPackage(packageName); 1710c14b9ccdf13163cae5ce5d21bcf377010b37594bDianne Hackborn ResolveInfo resolveInfo = resolveActivity(intentToResolve, 0); 1711eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda 17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Otherwise, try to find a main launcher activity. 1713eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda if (resolveInfo == null) { 1714eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda // reuse the intent instance 1715eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda intentToResolve.removeCategory(Intent.CATEGORY_INFO); 1716eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda intentToResolve.addCategory(Intent.CATEGORY_LAUNCHER); 1717c14b9ccdf13163cae5ce5d21bcf377010b37594bDianne Hackborn intentToResolve.setPackage(packageName); 1718c14b9ccdf13163cae5ce5d21bcf377010b37594bDianne Hackborn resolveInfo = resolveActivity(intentToResolve, 0); 1719eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda } 1720eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda if (resolveInfo == null) { 1721eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda return null; 1722eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda } 1723df4cfa3664e06132c2e2cc26cade06a881f5e529Johan Erlandsson Intent intent = new Intent(intentToResolve); 1724df4cfa3664e06132c2e2cc26cade06a881f5e529Johan Erlandsson intent.setClassName(resolveInfo.activityInfo.applicationInfo.packageName, 1725df4cfa3664e06132c2e2cc26cade06a881f5e529Johan Erlandsson resolveInfo.activityInfo.name); 17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 1727eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda return intent; 17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1729eae850cefe7e149f396c9e8ca1f34ec02b20a3f0Mihai Preda 17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int[] getPackageGids(String packageName) 17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws NameNotFoundException { 17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] gids = mPM.getPackageGids(packageName); 17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (gids == null || gids.length > 0) { 17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return gids; 17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Package manager has died", e); 17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NameNotFoundException(packageName); 17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PermissionInfo getPermissionInfo(String name, int flags) 17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws NameNotFoundException { 17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo pi = mPM.getPermissionInfo(name, flags); 17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pi != null) { 17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pi; 17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Package manager has died", e); 17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NameNotFoundException(name); 17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public List<PermissionInfo> queryPermissionsByGroup(String group, int flags) 17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws NameNotFoundException { 17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<PermissionInfo> pi = mPM.queryPermissionsByGroup(group, flags); 17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pi != null) { 17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pi; 17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Package manager has died", e); 17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NameNotFoundException(group); 17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PermissionGroupInfo getPermissionGroupInfo(String name, 17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags) throws NameNotFoundException { 17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionGroupInfo pgi = mPM.getPermissionGroupInfo(name, flags); 17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pgi != null) { 17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pgi; 17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Package manager has died", e); 17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NameNotFoundException(name); 17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public List<PermissionGroupInfo> getAllPermissionGroups(int flags) { 17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPM.getAllPermissionGroups(flags); 17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Package manager has died", e); 17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ApplicationInfo getApplicationInfo(String packageName, int flags) 18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws NameNotFoundException { 18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ApplicationInfo ai = mPM.getApplicationInfo(packageName, flags); 18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ai != null) { 18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ai; 18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Package manager has died", e); 18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NameNotFoundException(packageName); 18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ActivityInfo getActivityInfo(ComponentName className, int flags) 18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws NameNotFoundException { 18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityInfo ai = mPM.getActivityInfo(className, flags); 18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ai != null) { 18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ai; 18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Package manager has died", e); 18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NameNotFoundException(className.toString()); 18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ActivityInfo getReceiverInfo(ComponentName className, int flags) 18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws NameNotFoundException { 18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityInfo ai = mPM.getReceiverInfo(className, flags); 18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ai != null) { 18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ai; 18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Package manager has died", e); 18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NameNotFoundException(className.toString()); 18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ServiceInfo getServiceInfo(ComponentName className, int flags) 18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws NameNotFoundException { 18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ServiceInfo si = mPM.getServiceInfo(className, flags); 18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (si != null) { 18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return si; 18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Package manager has died", e); 18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NameNotFoundException(className.toString()); 18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1860361199b5e742c6635d4d7a03de6cf37b31cf442cDianne Hackborn public ProviderInfo getProviderInfo(ComponentName className, int flags) 1861361199b5e742c6635d4d7a03de6cf37b31cf442cDianne Hackborn throws NameNotFoundException { 1862361199b5e742c6635d4d7a03de6cf37b31cf442cDianne Hackborn try { 1863361199b5e742c6635d4d7a03de6cf37b31cf442cDianne Hackborn ProviderInfo pi = mPM.getProviderInfo(className, flags); 1864361199b5e742c6635d4d7a03de6cf37b31cf442cDianne Hackborn if (pi != null) { 1865361199b5e742c6635d4d7a03de6cf37b31cf442cDianne Hackborn return pi; 1866361199b5e742c6635d4d7a03de6cf37b31cf442cDianne Hackborn } 1867361199b5e742c6635d4d7a03de6cf37b31cf442cDianne Hackborn } catch (RemoteException e) { 1868361199b5e742c6635d4d7a03de6cf37b31cf442cDianne Hackborn throw new RuntimeException("Package manager has died", e); 1869361199b5e742c6635d4d7a03de6cf37b31cf442cDianne Hackborn } 1870361199b5e742c6635d4d7a03de6cf37b31cf442cDianne Hackborn 1871361199b5e742c6635d4d7a03de6cf37b31cf442cDianne Hackborn throw new NameNotFoundException(className.toString()); 1872361199b5e742c6635d4d7a03de6cf37b31cf442cDianne Hackborn } 1873361199b5e742c6635d4d7a03de6cf37b31cf442cDianne Hackborn 1874361199b5e742c6635d4d7a03de6cf37b31cf442cDianne Hackborn @Override 18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String[] getSystemSharedLibraryNames() { 18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPM.getSystemSharedLibraryNames(); 18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Package manager has died", e); 18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 188449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn public FeatureInfo[] getSystemAvailableFeatures() { 188549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn try { 188649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn return mPM.getSystemAvailableFeatures(); 188749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } catch (RemoteException e) { 188849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn throw new RuntimeException("Package manager has died", e); 188949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 189049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 18915f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 189249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn @Override 1893039c68e75606e837cf021815a0210836724574adDianne Hackborn public boolean hasSystemFeature(String name) { 1894039c68e75606e837cf021815a0210836724574adDianne Hackborn try { 1895039c68e75606e837cf021815a0210836724574adDianne Hackborn return mPM.hasSystemFeature(name); 1896039c68e75606e837cf021815a0210836724574adDianne Hackborn } catch (RemoteException e) { 1897039c68e75606e837cf021815a0210836724574adDianne Hackborn throw new RuntimeException("Package manager has died", e); 1898039c68e75606e837cf021815a0210836724574adDianne Hackborn } 1899039c68e75606e837cf021815a0210836724574adDianne Hackborn } 19005f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 1901039c68e75606e837cf021815a0210836724574adDianne Hackborn @Override 19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int checkPermission(String permName, String pkgName) { 19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPM.checkPermission(permName, pkgName); 19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Package manager has died", e); 19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean addPermission(PermissionInfo info) { 19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPM.addPermission(info); 19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Package manager has died", e); 19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1920d7c096845dee7616095eda0fe9e7aa08f0ba9c20Dianne Hackborn public boolean addPermissionAsync(PermissionInfo info) { 1921d7c096845dee7616095eda0fe9e7aa08f0ba9c20Dianne Hackborn try { 1922d7c096845dee7616095eda0fe9e7aa08f0ba9c20Dianne Hackborn return mPM.addPermissionAsync(info); 1923d7c096845dee7616095eda0fe9e7aa08f0ba9c20Dianne Hackborn } catch (RemoteException e) { 1924d7c096845dee7616095eda0fe9e7aa08f0ba9c20Dianne Hackborn throw new RuntimeException("Package manager has died", e); 1925d7c096845dee7616095eda0fe9e7aa08f0ba9c20Dianne Hackborn } 1926d7c096845dee7616095eda0fe9e7aa08f0ba9c20Dianne Hackborn } 1927d7c096845dee7616095eda0fe9e7aa08f0ba9c20Dianne Hackborn 1928d7c096845dee7616095eda0fe9e7aa08f0ba9c20Dianne Hackborn @Override 19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removePermission(String name) { 19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPM.removePermission(name); 19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Package manager has died", e); 19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int checkSignatures(String pkg1, String pkg2) { 19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPM.checkSignatures(pkg1, pkg2); 19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Package manager has died", e); 19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1947766cbfe44be3c5013a6a22bd6cd8ad1055a37256Dianne Hackborn public int checkSignatures(int uid1, int uid2) { 1948766cbfe44be3c5013a6a22bd6cd8ad1055a37256Dianne Hackborn try { 1949766cbfe44be3c5013a6a22bd6cd8ad1055a37256Dianne Hackborn return mPM.checkUidSignatures(uid1, uid2); 1950766cbfe44be3c5013a6a22bd6cd8ad1055a37256Dianne Hackborn } catch (RemoteException e) { 1951766cbfe44be3c5013a6a22bd6cd8ad1055a37256Dianne Hackborn throw new RuntimeException("Package manager has died", e); 1952766cbfe44be3c5013a6a22bd6cd8ad1055a37256Dianne Hackborn } 1953766cbfe44be3c5013a6a22bd6cd8ad1055a37256Dianne Hackborn } 1954766cbfe44be3c5013a6a22bd6cd8ad1055a37256Dianne Hackborn 1955766cbfe44be3c5013a6a22bd6cd8ad1055a37256Dianne Hackborn @Override 19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String[] getPackagesForUid(int uid) { 19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPM.getPackagesForUid(uid); 19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Package manager has died", e); 19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getNameForUid(int uid) { 19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPM.getNameForUid(uid); 19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Package manager has died", e); 19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19725f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 19745f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer public int getUidForSharedUser(String sharedUserName) 19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws NameNotFoundException { 19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int uid = mPM.getUidForSharedUser(sharedUserName); 19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(uid != -1) { 19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return uid; 19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Package manager has died", e); 19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NameNotFoundException("No shared userid for user:"+sharedUserName); 19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public List<PackageInfo> getInstalledPackages(int flags) { 19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPM.getInstalledPackages(flags); 19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Package manager has died", e); 19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public List<ApplicationInfo> getInstalledApplications(int flags) { 19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPM.getInstalledApplications(flags); 20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Package manager has died", e); 20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ResolveInfo resolveActivity(Intent intent, int flags) { 20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPM.resolveIntent( 20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent, 20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.resolveTypeIfNeeded(mContext.getContentResolver()), 20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flags); 20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Package manager has died", e); 20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public List<ResolveInfo> queryIntentActivities(Intent intent, 20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags) { 20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPM.queryIntentActivities( 20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent, 20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.resolveTypeIfNeeded(mContext.getContentResolver()), 20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flags); 20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Package manager has died", e); 20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public List<ResolveInfo> queryIntentActivityOptions( 20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ComponentName caller, Intent[] specifics, Intent intent, 20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags) { 20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ContentResolver resolver = mContext.getContentResolver(); 20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] specificTypes = null; 20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (specifics != null) { 20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = specifics.length; 20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent sp = specifics[i]; 20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sp != null) { 20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String t = sp.resolveTypeIfNeeded(resolver); 20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (specificTypes == null) { 20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project specificTypes = new String[N]; 20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project specificTypes[i] = t; 20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPM.queryIntentActivityOptions(caller, specifics, 20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project specificTypes, intent, intent.resolveTypeIfNeeded(resolver), 20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flags); 20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Package manager has died", e); 20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public List<ResolveInfo> queryBroadcastReceivers(Intent intent, int flags) { 20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPM.queryIntentReceivers( 20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent, 20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.resolveTypeIfNeeded(mContext.getContentResolver()), 20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flags); 20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Package manager has died", e); 20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ResolveInfo resolveService(Intent intent, int flags) { 20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPM.resolveService( 20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent, 20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.resolveTypeIfNeeded(mContext.getContentResolver()), 20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flags); 20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Package manager has died", e); 20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public List<ResolveInfo> queryIntentServices(Intent intent, int flags) { 20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPM.queryIntentServices( 20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent, 20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.resolveTypeIfNeeded(mContext.getContentResolver()), 20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flags); 20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Package manager has died", e); 20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ProviderInfo resolveContentProvider(String name, 21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags) { 21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPM.resolveContentProvider(name, flags); 21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Package manager has died", e); 21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public List<ProviderInfo> queryContentProviders(String processName, 21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int uid, int flags) { 21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPM.queryContentProviders(processName, uid, flags); 21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Package manager has died", e); 21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public InstrumentationInfo getInstrumentationInfo( 21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ComponentName className, int flags) 21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws NameNotFoundException { 21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InstrumentationInfo ii = mPM.getInstrumentationInfo( 21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project className, flags); 21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ii != null) { 21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ii; 21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Package manager has died", e); 21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NameNotFoundException(className.toString()); 21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public List<InstrumentationInfo> queryInstrumentation( 21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String targetPackage, int flags) { 21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPM.queryInstrumentation(targetPackage, flags); 21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Package manager has died", e); 21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public Drawable getDrawable(String packageName, int resid, 21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ApplicationInfo appInfo) { 21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResourceName name = new ResourceName(packageName, resid); 21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable dr = getCachedIcon(name); 21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dr != null) { 21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return dr; 21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (appInfo == null) { 21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project appInfo = getApplicationInfo(packageName, 0); 21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (NameNotFoundException e) { 21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources r = getResourcesForApplication(appInfo); 21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dr = r.getDrawable(resid); 216211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn if (false) { 216311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn RuntimeException e = new RuntimeException("here"); 216411ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn e.fillInStackTrace(); 216511ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn Log.w(TAG, "Getting drawable 0x" + Integer.toHexString(resid) 216611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn + " from package " + packageName 216711ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn + ": app scale=" + r.getCompatibilityInfo().applicationScale 216811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn + ", caller scale=" + mContext.getResources().getCompatibilityInfo().applicationScale, 216911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn e); 217011ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn } 21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_ICONS) Log.v(TAG, "Getting drawable 0x" 21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(resid) + " from " + r 21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": " + dr); 21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project putCachedIcon(name, dr); 21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return dr; 21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (NameNotFoundException e) { 21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w("PackageManager", "Failure retrieving resources for" 21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + appInfo.packageName); 21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException e) { 21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If an exception was thrown, fall through to return 21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // default icon. 21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w("PackageManager", "Failure retrieving icon 0x" 21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(resid) + " in package " 21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + packageName, e); 21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public Drawable getActivityIcon(ComponentName activityName) 21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws NameNotFoundException { 21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getActivityInfo(activityName, 0).loadIcon(this); 21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public Drawable getActivityIcon(Intent intent) 21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws NameNotFoundException { 21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (intent.getComponent() != null) { 21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getActivityIcon(intent.getComponent()); 21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResolveInfo info = resolveActivity( 22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent, PackageManager.MATCH_DEFAULT_ONLY); 22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (info != null) { 22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return info.activityInfo.loadIcon(this); 22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NameNotFoundException(intent.toURI()); 22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public Drawable getDefaultActivityIcon() { 22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Resources.getSystem().getDrawable( 22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.drawable.sym_def_app_icon); 22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public Drawable getApplicationIcon(ApplicationInfo info) { 221507330791116513710d879c45b2f095cd314cbfd0Jeff Brown return info.loadIcon(this); 22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public Drawable getApplicationIcon(String packageName) 22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws NameNotFoundException { 22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getApplicationIcon(getApplicationInfo(packageName, 0)); 22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 222281cd2e90ccdda498234384c8207afe2213714e60Adam Powell 222381cd2e90ccdda498234384c8207afe2213714e60Adam Powell @Override 222481cd2e90ccdda498234384c8207afe2213714e60Adam Powell public Drawable getActivityLogo(ComponentName activityName) 222581cd2e90ccdda498234384c8207afe2213714e60Adam Powell throws NameNotFoundException { 222681cd2e90ccdda498234384c8207afe2213714e60Adam Powell return getActivityInfo(activityName, 0).loadLogo(this); 222781cd2e90ccdda498234384c8207afe2213714e60Adam Powell } 222881cd2e90ccdda498234384c8207afe2213714e60Adam Powell 222981cd2e90ccdda498234384c8207afe2213714e60Adam Powell @Override 223081cd2e90ccdda498234384c8207afe2213714e60Adam Powell public Drawable getActivityLogo(Intent intent) 223181cd2e90ccdda498234384c8207afe2213714e60Adam Powell throws NameNotFoundException { 223281cd2e90ccdda498234384c8207afe2213714e60Adam Powell if (intent.getComponent() != null) { 223381cd2e90ccdda498234384c8207afe2213714e60Adam Powell return getActivityLogo(intent.getComponent()); 223481cd2e90ccdda498234384c8207afe2213714e60Adam Powell } 223581cd2e90ccdda498234384c8207afe2213714e60Adam Powell 223681cd2e90ccdda498234384c8207afe2213714e60Adam Powell ResolveInfo info = resolveActivity( 223781cd2e90ccdda498234384c8207afe2213714e60Adam Powell intent, PackageManager.MATCH_DEFAULT_ONLY); 223881cd2e90ccdda498234384c8207afe2213714e60Adam Powell if (info != null) { 223981cd2e90ccdda498234384c8207afe2213714e60Adam Powell return info.activityInfo.loadLogo(this); 224081cd2e90ccdda498234384c8207afe2213714e60Adam Powell } 224181cd2e90ccdda498234384c8207afe2213714e60Adam Powell 224281cd2e90ccdda498234384c8207afe2213714e60Adam Powell throw new NameNotFoundException(intent.toUri(0)); 224381cd2e90ccdda498234384c8207afe2213714e60Adam Powell } 224481cd2e90ccdda498234384c8207afe2213714e60Adam Powell 224581cd2e90ccdda498234384c8207afe2213714e60Adam Powell @Override 224681cd2e90ccdda498234384c8207afe2213714e60Adam Powell public Drawable getApplicationLogo(ApplicationInfo info) { 224781cd2e90ccdda498234384c8207afe2213714e60Adam Powell return info.loadLogo(this); 224881cd2e90ccdda498234384c8207afe2213714e60Adam Powell } 224981cd2e90ccdda498234384c8207afe2213714e60Adam Powell 225081cd2e90ccdda498234384c8207afe2213714e60Adam Powell @Override 225181cd2e90ccdda498234384c8207afe2213714e60Adam Powell public Drawable getApplicationLogo(String packageName) 225281cd2e90ccdda498234384c8207afe2213714e60Adam Powell throws NameNotFoundException { 225381cd2e90ccdda498234384c8207afe2213714e60Adam Powell return getApplicationLogo(getApplicationInfo(packageName, 0)); 225481cd2e90ccdda498234384c8207afe2213714e60Adam Powell } 22559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public Resources getResourcesForActivity( 22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ComponentName activityName) throws NameNotFoundException { 22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getResourcesForApplication( 22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getActivityInfo(activityName, 0).applicationInfo); 22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public Resources getResourcesForApplication( 22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ApplicationInfo app) throws NameNotFoundException { 22649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (app.packageName.equals("system")) { 22659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mContext.mMainThread.getSystemContext().getResources(); 22669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources r = mContext.mMainThread.getTopLevelResources( 22689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project app.uid == Process.myUid() ? app.sourceDir 226911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn : app.publicSourceDir, mContext.mPackageInfo); 22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (r != null) { 22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return r; 22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NameNotFoundException("Unable to open " + app.publicSourceDir); 22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public Resources getResourcesForApplication( 22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String appPackageName) throws NameNotFoundException { 22789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getResourcesForApplication( 22799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getApplicationInfo(appPackageName, 0)); 22809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mCachedSafeMode = -1; 22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public boolean isSafeMode() { 22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCachedSafeMode < 0) { 22869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCachedSafeMode = mPM.isSafeMode() ? 1 : 0; 22879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCachedSafeMode != 0; 22899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 22909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Package manager has died", e); 22919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void configurationChanged() { 22959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (sSync) { 22969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sIconCache.clear(); 22979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sStringCache.clear(); 22989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23012155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn ApplicationPackageManager(ContextImpl context, 23029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IPackageManager pm) { 23039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 23049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPM = pm; 23059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable getCachedIcon(ResourceName name) { 23089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (sSync) { 23099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WeakReference<Drawable> wr = sIconCache.get(name); 23109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_ICONS) Log.v(TAG, "Get cached weak drawable ref for " 23119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + name + ": " + wr); 23129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wr != null) { // we have the activity 23139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable dr = wr.get(); 23149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dr != null) { 23159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_ICONS) Log.v(TAG, "Get cached drawable for " 23169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + name + ": " + dr); 23179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return dr; 23189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // our entry has been purged 23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sIconCache.remove(name); 23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void putCachedIcon(ResourceName name, Drawable dr) { 23279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (sSync) { 23289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sIconCache.put(name, new WeakReference<Drawable>(dr)); 23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_ICONS) Log.v(TAG, "Added cached drawable for " 23309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + name + ": " + dr); 23319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23344416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn static final void handlePackageBroadcast(int cmd, String[] pkgList, 23354416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn boolean hasPkgInfo) { 23364416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn boolean immediateGc = false; 23374416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn if (cmd == IApplicationThread.EXTERNAL_STORAGE_UNAVAILABLE) { 23384416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn immediateGc = true; 23394416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn } 23404416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn if (pkgList != null && (pkgList.length > 0)) { 23414416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn boolean needCleanup = false; 23424416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn for (String ssp : pkgList) { 23434416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn synchronized (sSync) { 23444416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn if (sIconCache.size() > 0) { 234508675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu Iterator<ResourceName> it = sIconCache.keySet().iterator(); 234608675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu while (it.hasNext()) { 234708675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu ResourceName nm = it.next(); 234808675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu if (nm.packageName.equals(ssp)) { 234908675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu //Log.i(TAG, "Removing cached drawable for " + nm); 235008675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu it.remove(); 235108675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu needCleanup = true; 235208675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu } 23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23544416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn } 23554416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn if (sStringCache.size() > 0) { 23564416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn Iterator<ResourceName> it = sStringCache.keySet().iterator(); 235708675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu while (it.hasNext()) { 235808675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu ResourceName nm = it.next(); 235908675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu if (nm.packageName.equals(ssp)) { 236008675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu //Log.i(TAG, "Removing cached string for " + nm); 236108675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu it.remove(); 236208675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu needCleanup = true; 236308675a3376819a82aa5ab344bc3e7b1635c30b05Suchi Amalapurapu } 23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23674416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn } 23684416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn if (needCleanup || hasPkgInfo) { 23694416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn if (immediateGc) { 23704416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn // Schedule an immediate gc. 23714416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn Runtime.getRuntime().gc(); 23724416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn } else { 23734416c3d6e4becd9ed39b89a03db0239c8225a135Dianne Hackborn ActivityThread.currentActivityThread().scheduleGcIdler(); 23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23785f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final class ResourceName { 23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String packageName; 23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int iconId; 23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResourceName(String _packageName, int _iconId) { 23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project packageName = _packageName; 23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project iconId = _iconId; 23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResourceName(ApplicationInfo aInfo, int _iconId) { 23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(aInfo.packageName, _iconId); 23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResourceName(ComponentInfo cInfo, int _iconId) { 23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(cInfo.applicationInfo.packageName, _iconId); 23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResourceName(ResolveInfo rInfo, int _iconId) { 23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(rInfo.activityInfo.applicationInfo.packageName, _iconId); 23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean equals(Object o) { 24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (this == o) return true; 24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (o == null || getClass() != o.getClass()) return false; 24049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResourceName that = (ResourceName) o; 24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (iconId != that.iconId) return false; 24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return !(packageName != null ? 24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project !packageName.equals(that.packageName) : that.packageName != null); 24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int hashCode() { 24159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = packageName.hashCode(); 24179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = 31 * result + iconId; 24189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 24199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 24229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 24239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "{ResourceName " + packageName + " / " + iconId + "}"; 24249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private CharSequence getCachedString(ResourceName name) { 24289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (sSync) { 24299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WeakReference<CharSequence> wr = sStringCache.get(name); 24309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wr != null) { // we have the activity 24319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence cs = wr.get(); 24329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cs != null) { 24339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return cs; 24349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // our entry has been purged 24369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sStringCache.remove(name); 24379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 24409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void putCachedString(ResourceName name, CharSequence cs) { 24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (sSync) { 24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sStringCache.put(name, new WeakReference<CharSequence>(cs)); 24459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CharSequence getText(String packageName, int resid, 24509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ApplicationInfo appInfo) { 24519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResourceName name = new ResourceName(packageName, resid); 24529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence text = getCachedString(name); 24539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (text != null) { 24549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return text; 24559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (appInfo == null) { 24579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project appInfo = getApplicationInfo(packageName, 0); 24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (NameNotFoundException e) { 24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources r = getResourcesForApplication(appInfo); 24659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project text = r.getText(resid); 24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project putCachedString(name, text); 24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return text; 24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (NameNotFoundException e) { 24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w("PackageManager", "Failure retrieving resources for" 24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + appInfo.packageName); 24719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException e) { 24729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If an exception was thrown, fall through to return 24739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // default icon. 24749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w("PackageManager", "Failure retrieving text 0x" 24759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(resid) + " in package " 24769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + packageName, e); 24779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public XmlResourceParser getXml(String packageName, int resid, 24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ApplicationInfo appInfo) { 24849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (appInfo == null) { 24859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 24869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project appInfo = getApplicationInfo(packageName, 0); 24879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (NameNotFoundException e) { 24889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 24899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 24929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources r = getResourcesForApplication(appInfo); 24939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return r.getXml(resid); 24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException e) { 24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If an exception was thrown, fall through to return 24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // default icon. 24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w("PackageManager", "Failure retrieving xml 0x" 24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(resid) + " in package " 24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + packageName, e); 25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (NameNotFoundException e) { 25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w("PackageManager", "Failure retrieving resources for" 25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + appInfo.packageName); 25039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CharSequence getApplicationLabel(ApplicationInfo info) { 250907330791116513710d879c45b2f095cd314cbfd0Jeff Brown return info.loadLabel(this); 25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 251365e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski public void installPackage(Uri packageURI, IPackageInstallObserver observer, int flags, 251465e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski String installerPackageName) { 25159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 251665e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski mPM.installPackage(packageURI, observer, flags, installerPackageName); 25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Should never happen! 25199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 25238946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu public void movePackage(String packageName, IPackageMoveObserver observer, int flags) { 25248946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu try { 25258946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu mPM.movePackage(packageName, observer, flags); 25268946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } catch (RemoteException e) { 25278946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu // Should never happen! 25288946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 25298946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 25308946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu 25318946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu @Override 253265e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski public String getInstallerPackageName(String packageName) { 253365e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski try { 253465e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski return mPM.getInstallerPackageName(packageName); 253565e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski } catch (RemoteException e) { 253665e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski // Should never happen! 253765e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski } 253865e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski return null; 253965e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski } 254065e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski 254165e13171e12cb9e9fc2f608d0c8a92cd3c098648Jacek Surazski @Override 25429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void deletePackage(String packageName, IPackageDeleteObserver observer, int flags) { 25439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 25449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPM.deletePackage(packageName, observer, flags); 25459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Should never happen! 25479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 25505f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer public void clearApplicationUserData(String packageName, 25519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IPackageDataObserver observer) { 25529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 25539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPM.clearApplicationUserData(packageName, observer); 25549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 25559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Should never happen! 25569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 25595f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer public void deleteApplicationCacheFiles(String packageName, 25609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IPackageDataObserver observer) { 25619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 25629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPM.deleteApplicationCacheFiles(packageName, observer); 25639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 25649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Should never happen! 25659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 25689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void freeStorageAndNotify(long idealStorageSize, IPackageDataObserver observer) { 25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPM.freeStorageAndNotify(idealStorageSize, observer); 25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 25729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Should never happen! 25739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25751ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu 25761ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu @Override 2577bc806f65edc33f6eda0f475ac84e5e037a013a90Suchi Amalapurapu public void freeStorage(long freeStorageSize, IntentSender pi) { 25781ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu try { 25791ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu mPM.freeStorage(freeStorageSize, pi); 25801ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu } catch (RemoteException e) { 25811ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu // Should never happen! 25821ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu } 25831ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu } 25845f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 25859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 25865f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer public void getPackageSizeInfo(String packageName, 25879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IPackageStatsObserver observer) { 25889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPM.getPackageSizeInfo(packageName, observer); 25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Should never happen! 25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 25959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addPackageToPreferred(String packageName) { 25969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 25979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPM.addPackageToPreferred(packageName); 25989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Should never happen! 26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removePackageFromPreferred(String packageName) { 26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPM.removePackageFromPreferred(packageName); 26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Should never happen! 26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public List<PackageInfo> getPreferredPackages(int flags) { 26149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPM.getPreferredPackages(flags); 26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 26179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Should never happen! 26189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new ArrayList<PackageInfo>(); 26209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addPreferredActivity(IntentFilter filter, 26249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int match, ComponentName[] set, ComponentName activity) { 26259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 26269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPM.addPreferredActivity(filter, match, set, activity); 26279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Should never happen! 26299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26315f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 26329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 26338dbe612dc60526d635e57257b58627b33a099678Satish Sampath public void replacePreferredActivity(IntentFilter filter, 26348dbe612dc60526d635e57257b58627b33a099678Satish Sampath int match, ComponentName[] set, ComponentName activity) { 26358dbe612dc60526d635e57257b58627b33a099678Satish Sampath try { 26368dbe612dc60526d635e57257b58627b33a099678Satish Sampath mPM.replacePreferredActivity(filter, match, set, activity); 26378dbe612dc60526d635e57257b58627b33a099678Satish Sampath } catch (RemoteException e) { 26388dbe612dc60526d635e57257b58627b33a099678Satish Sampath // Should never happen! 26398dbe612dc60526d635e57257b58627b33a099678Satish Sampath } 26408dbe612dc60526d635e57257b58627b33a099678Satish Sampath } 26418dbe612dc60526d635e57257b58627b33a099678Satish Sampath 26428dbe612dc60526d635e57257b58627b33a099678Satish Sampath @Override 26439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void clearPackagePreferredActivities(String packageName) { 26449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 26459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPM.clearPackagePreferredActivities(packageName); 26469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 26479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Should never happen! 26489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26505f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 26519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 26529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getPreferredActivities(List<IntentFilter> outFilters, 26539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<ComponentName> outActivities, String packageName) { 26549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 26559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPM.getPreferredActivities(outFilters, outActivities, packageName); 26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 26579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Should never happen! 26589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 26609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26615f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 26629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 26639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setComponentEnabledSetting(ComponentName componentName, 26649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int newState, int flags) { 26659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 26669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPM.setComponentEnabledSetting(componentName, newState, flags); 26679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 26689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Should never happen! 26699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 26739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getComponentEnabledSetting(ComponentName componentName) { 26749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 26759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPM.getComponentEnabledSetting(componentName); 26769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 26779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Should never happen! 26789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; 26809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 26839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setApplicationEnabledSetting(String packageName, 26849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int newState, int flags) { 26859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 26869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPM.setApplicationEnabledSetting(packageName, newState, flags); 26879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 26889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Should never happen! 26899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26915f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 26929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 26939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getApplicationEnabledSetting(String packageName) { 26949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 26959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPM.getApplicationEnabledSetting(packageName); 26969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 26979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Should never happen! 26989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; 27009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 270293565c4b3265c16aee4a82d7556f811776c17db8Kenny Root @Override 270393565c4b3265c16aee4a82d7556f811776c17db8Kenny Root public void setPackageObbPath(String packageName, String path) { 270493565c4b3265c16aee4a82d7556f811776c17db8Kenny Root try { 270593565c4b3265c16aee4a82d7556f811776c17db8Kenny Root mPM.setPackageObbPath(packageName, path); 270693565c4b3265c16aee4a82d7556f811776c17db8Kenny Root } catch (RemoteException e) { 270793565c4b3265c16aee4a82d7556f811776c17db8Kenny Root // Should never happen! 270893565c4b3265c16aee4a82d7556f811776c17db8Kenny Root } 270993565c4b3265c16aee4a82d7556f811776c17db8Kenny Root } 271093565c4b3265c16aee4a82d7556f811776c17db8Kenny Root 27112155637d0028e87ebaaf71b9a77f3c43853e8f2fDianne Hackborn private final ContextImpl mContext; 27129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final IPackageManager mPM; 27139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final Object sSync = new Object(); 27159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static HashMap<ResourceName, WeakReference<Drawable> > sIconCache 27169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = new HashMap<ResourceName, WeakReference<Drawable> >(); 27179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static HashMap<ResourceName, WeakReference<CharSequence> > sStringCache 27189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = new HashMap<ResourceName, WeakReference<CharSequence> >(); 27199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ---------------------------------------------------------------------- 27229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ---------------------------------------------------------------------- 27239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ---------------------------------------------------------------------- 27249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final class SharedPreferencesImpl implements SharedPreferences { 27269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27276194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick // Lock ordering rules: 27286194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick // - acquire SharedPreferencesImpl.this before EditorImpl.this 27296194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick // - acquire mWritingToDiskLock before EditorImpl.this 27306194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick 27319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final File mFile; 27329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final File mBackupFile; 27339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final int mMode; 27349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2735333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick private Map<String, Object> mMap; // guarded by 'this' 2736333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick private long mTimestamp; // guarded by 'this' 2737333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick private int mDiskWritesInFlight = 0; // guarded by 'this' 27386194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick private boolean mLoaded = false; // guarded by 'this' 2739333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick 2740333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick private final Object mWritingToDiskLock = new Object(); 2741105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project private static final Object mContent = new Object(); 2742105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project private WeakHashMap<OnSharedPreferenceChangeListener, Object> mListeners; 27439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SharedPreferencesImpl( 27459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project File file, int mode, Map initialContents) { 27469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFile = file; 27479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBackupFile = makeBackupFile(file); 27489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMode = mode; 27496194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick mLoaded = initialContents != null; 2750333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick mMap = initialContents != null ? initialContents : new HashMap<String, Object>(); 2751333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick FileStatus stat = new FileStatus(); 2752333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick if (FileUtils.getFileStatus(file.getPath(), stat)) { 2753333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick mTimestamp = stat.mtime; 27549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2755105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mListeners = new WeakHashMap<OnSharedPreferenceChangeListener, Object>(); 27569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27586194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick // Has this SharedPreferences ever had values assigned to it? 27596194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick boolean isLoaded() { 27606194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick synchronized (this) { 27616194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick return mLoaded; 27626194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick } 27636194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick } 27646194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick 27656194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick // Has the file changed out from under us? i.e. writes that 27666194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick // we didn't instigate. 27676194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick public boolean hasFileChangedUnexpectedly() { 27686194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick synchronized (this) { 27696194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick if (mDiskWritesInFlight > 0) { 27706194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick // If we know we caused it, it's not unexpected. 27716194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick Log.d(TAG, "disk write in flight, not unexpected."); 27726194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick return false; 27736194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick } 27746194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick } 2775333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick FileStatus stat = new FileStatus(); 2776333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick if (!FileUtils.getFileStatus(mFile.getPath(), stat)) { 2777333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick return true; 2778333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick } 27799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 2780333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick return mTimestamp != stat.mtime; 27819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27835f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 27849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void replace(Map newContents) { 27856194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick synchronized (this) { 27866194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick mLoaded = true; 27876194c53754e1bae2c09267ad474d4e2f376e34c0Brad Fitzpatrick if (newContents != null) { 27889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMap = newContents; 27899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27925f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 27939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) { 27949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(this) { 2795105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mListeners.put(listener, mContent); 27969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unregisterOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) { 28009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(this) { 28019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mListeners.remove(listener); 28029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Map<String, ?> getAll() { 28069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(this) { 28079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //noinspection unchecked 2808333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick return new HashMap<String, Object>(mMap); 28099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getString(String key, String defValue) { 28139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 28149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String v = (String)mMap.get(key); 28159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return v != null ? v : defValue; 28169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2818212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell 2819212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell public Set<String> getStringSet(String key, Set<String> defValues) { 2820212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell synchronized (this) { 2821212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell Set<String> v = (Set<String>) mMap.get(key); 2822212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell return v != null ? v : defValues; 2823212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 2824212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 28259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getInt(String key, int defValue) { 28279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 28289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Integer v = (Integer)mMap.get(key); 28299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return v != null ? v : defValue; 28309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getLong(String key, long defValue) { 28339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 2834333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick Long v = (Long)mMap.get(key); 28359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return v != null ? v : defValue; 28369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float getFloat(String key, float defValue) { 28399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 28409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Float v = (Float)mMap.get(key); 28419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return v != null ? v : defValue; 28429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean getBoolean(String key, boolean defValue) { 28459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 28469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Boolean v = (Boolean)mMap.get(key); 28479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return v != null ? v : defValue; 28489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean contains(String key) { 28529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 28539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMap.containsKey(key); 28549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2857333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick public Editor edit() { 2858333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick return new EditorImpl(); 2859333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick } 2860333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick 2861333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick // Return value from EditorImpl#commitToMemory() 2862333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick private static class MemoryCommitResult { 2863333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick public boolean changesMade; // any keys different? 2864333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick public List<String> keysModified; // may be null 2865333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick public Set<OnSharedPreferenceChangeListener> listeners; // may be null 2866333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick public Map<?, ?> mapToWriteToDisk; 2867333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick public final CountDownLatch writtenToDiskLatch = new CountDownLatch(1); 2868333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick public volatile boolean writeToDiskResult = false; 2869333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick 2870333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick public void setDiskWriteResult(boolean result) { 2871333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick writeToDiskResult = result; 2872333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick writtenToDiskLatch.countDown(); 2873333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick } 2874333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick } 2875333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick 28769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class EditorImpl implements Editor { 28779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Map<String, Object> mModified = Maps.newHashMap(); 28789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mClear = false; 28799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Editor putString(String key, String value) { 28819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 28829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mModified.put(key, value); 28839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 28849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2886212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell public Editor putStringSet(String key, Set<String> values) { 2887212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell synchronized (this) { 2888212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell mModified.put(key, values); 2889212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell return this; 2890212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 2891212db7d3f8ce5297f4a556234a9c0675c697f1cfAdam Powell } 28929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Editor putInt(String key, int value) { 28939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 28949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mModified.put(key, value); 28959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 28969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Editor putLong(String key, long value) { 28999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 29009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mModified.put(key, value); 29019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 29029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Editor putFloat(String key, float value) { 29059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 29069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mModified.put(key, value); 29079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 29089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Editor putBoolean(String key, boolean value) { 29119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 29129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mModified.put(key, value); 29139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 29149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Editor remove(String key) { 29189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 29199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mModified.put(key, this); 29209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 29219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Editor clear() { 29259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 29269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClear = true; 29279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 29289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 293166fce5068a8a3aeb28aaf713843891b286a75280Brad Fitzpatrick public void apply() { 2932333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick final MemoryCommitResult mcr = commitToMemory(); 2933333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick final Runnable awaitCommit = new Runnable() { 2934333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick public void run() { 2935333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick try { 2936333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick mcr.writtenToDiskLatch.await(); 2937333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick } catch (InterruptedException ignored) { 2938333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick } 2939333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick } 2940333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick }; 29419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2942333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick QueuedWork.add(awaitCommit); 29439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2944333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick Runnable postWriteRunnable = new Runnable() { 2945333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick public void run() { 2946333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick awaitCommit.run(); 2947333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick QueuedWork.remove(awaitCommit); 2948333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick } 2949333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick }; 29509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2951333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick SharedPreferencesImpl.this.enqueueDiskWrite(mcr, postWriteRunnable); 29529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2953333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick // Okay to notify the listeners before it's hit disk 2954333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick // because the listeners should always get the same 2955333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick // SharedPreferences instance back, which has the 2956333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick // changes reflected in memory. 2957333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick notifyListeners(mcr); 2958333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick } 2959333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick 2960333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick // Returns true if any changes were made 2961333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick private MemoryCommitResult commitToMemory() { 2962333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick MemoryCommitResult mcr = new MemoryCommitResult(); 29639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (SharedPreferencesImpl.this) { 2964333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick // We optimistically don't make a deep copy until 2965333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick // a memory commit comes in when we're already 2966333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick // writing to disk. 2967333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick if (mDiskWritesInFlight > 0) { 2968333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick // We can't modify our mMap as a currently 2969333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick // in-flight write owns it. Clone it before 2970333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick // modifying it. 2971333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick // noinspection unchecked 2972333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick mMap = new HashMap<String, Object>(mMap); 2973333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick } 2974333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick mcr.mapToWriteToDisk = mMap; 2975333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick mDiskWritesInFlight++; 2976333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick 2977333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick boolean hasListeners = mListeners.size() > 0; 29789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hasListeners) { 2979333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick mcr.keysModified = new ArrayList<String>(); 2980333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick mcr.listeners = 2981333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick new HashSet<OnSharedPreferenceChangeListener>(mListeners.keySet()); 29829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 29859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mClear) { 298667fed01522ad26c850b20d2c960e4d392dc401d1Brad Fitzpatrick if (!mMap.isEmpty()) { 2987333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick mcr.changesMade = true; 298867fed01522ad26c850b20d2c960e4d392dc401d1Brad Fitzpatrick mMap.clear(); 298967fed01522ad26c850b20d2c960e4d392dc401d1Brad Fitzpatrick } 29909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClear = false; 29919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2993105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project for (Entry<String, Object> e : mModified.entrySet()) { 29949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String k = e.getKey(); 29959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object v = e.getValue(); 299667fed01522ad26c850b20d2c960e4d392dc401d1Brad Fitzpatrick if (v == this) { // magic value for a removal mutation 2997333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick if (!mMap.containsKey(k)) { 2998333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick continue; 299967fed01522ad26c850b20d2c960e4d392dc401d1Brad Fitzpatrick } 3000333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick mMap.remove(k); 30019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 300267fed01522ad26c850b20d2c960e4d392dc401d1Brad Fitzpatrick boolean isSame = false; 300367fed01522ad26c850b20d2c960e4d392dc401d1Brad Fitzpatrick if (mMap.containsKey(k)) { 300467fed01522ad26c850b20d2c960e4d392dc401d1Brad Fitzpatrick Object existingValue = mMap.get(k); 3005333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick if (existingValue != null && existingValue.equals(v)) { 3006333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick continue; 3007333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick } 300867fed01522ad26c850b20d2c960e4d392dc401d1Brad Fitzpatrick } 3009333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick mMap.put(k, v); 30109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3012333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick mcr.changesMade = true; 30139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hasListeners) { 3014333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick mcr.keysModified.add(k); 30159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mModified.clear(); 30199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3020333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick } 3021333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick return mcr; 3022333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick } 30239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3024333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick public boolean commit() { 3025333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick MemoryCommitResult mcr = commitToMemory(); 3026333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick SharedPreferencesImpl.this.enqueueDiskWrite( 3027333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick mcr, null /* sync write on this thread okay */); 3028333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick try { 3029333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick mcr.writtenToDiskLatch.await(); 3030333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick } catch (InterruptedException e) { 3031333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick return false; 30329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3033333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick notifyListeners(mcr); 3034333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick return mcr.writeToDiskResult; 3035333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick } 30369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3037333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick private void notifyListeners(final MemoryCommitResult mcr) { 3038333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick if (mcr.listeners == null || mcr.keysModified == null || 3039333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick mcr.keysModified.size() == 0) { 3040333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick return; 3041333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick } 3042333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick if (Looper.myLooper() == Looper.getMainLooper()) { 3043333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick for (int i = mcr.keysModified.size() - 1; i >= 0; i--) { 3044333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick final String key = mcr.keysModified.get(i); 3045333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick for (OnSharedPreferenceChangeListener listener : mcr.listeners) { 3046105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (listener != null) { 3047105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project listener.onSharedPreferenceChanged(SharedPreferencesImpl.this, key); 3048105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 30499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3051333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick } else { 3052333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick // Run this function on the main thread. 3053333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick ActivityThread.sMainThreadHandler.post(new Runnable() { 3054333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick public void run() { 3055333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick notifyListeners(mcr); 3056333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick } 3057333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick }); 30589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3062333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick /** 3063333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick * Enqueue an already-committed-to-memory result to be written 3064333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick * to disk. 3065333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick * 3066333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick * They will be written to disk one-at-a-time in the order 3067333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick * that they're enqueued. 3068333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick * 3069333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick * @param postWriteRunnable if non-null, we're being called 307066fce5068a8a3aeb28aaf713843891b286a75280Brad Fitzpatrick * from apply() and this is the runnable to run after 3071333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick * the write proceeds. if null (from a regular commit()), 3072333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick * then we're allowed to do this disk write on the main 3073333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick * thread (which in addition to reducing allocations and 3074333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick * creating a background thread, this has the advantage that 3075333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick * we catch them in userdebug StrictMode reports to convert 307666fce5068a8a3aeb28aaf713843891b286a75280Brad Fitzpatrick * them where possible to apply() ...) 3077333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick */ 3078333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick private void enqueueDiskWrite(final MemoryCommitResult mcr, 3079333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick final Runnable postWriteRunnable) { 3080333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick final Runnable writeToDiskRunnable = new Runnable() { 3081333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick public void run() { 3082333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick synchronized (mWritingToDiskLock) { 3083333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick writeToFile(mcr); 3084333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick } 3085333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick synchronized (SharedPreferencesImpl.this) { 3086333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick mDiskWritesInFlight--; 3087333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick } 3088333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick if (postWriteRunnable != null) { 3089333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick postWriteRunnable.run(); 3090333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick } 3091333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick } 3092333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick }; 3093333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick 3094333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick final boolean isFromSyncCommit = (postWriteRunnable == null); 3095333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick 3096333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick // Typical #commit() path with fewer allocations, doing a write on 3097333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick // the current thread. 3098333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick if (isFromSyncCommit) { 3099333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick boolean wasEmpty = false; 3100333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick synchronized (SharedPreferencesImpl.this) { 3101333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick wasEmpty = mDiskWritesInFlight == 1; 3102333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick } 3103333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick if (wasEmpty) { 3104333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick writeToDiskRunnable.run(); 3105333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick return; 3106333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick } 3107333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick } 3108333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick 3109333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick QueuedWork.singleThreadExecutor().execute(writeToDiskRunnable); 31109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31115f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 3112333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick private static FileOutputStream createFileOutputStream(File file) { 31139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileOutputStream str = null; 31149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 31159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = new FileOutputStream(file); 31169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (FileNotFoundException e) { 31179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project File parent = file.getParentFile(); 31189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parent.mkdir()) { 31199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Couldn't create directory for SharedPreferences file " + file); 31209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 31219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileUtils.setPermissions( 31239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parent.getPath(), 31249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH, 31259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project -1, -1); 31269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 31279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = new FileOutputStream(file); 31289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (FileNotFoundException e2) { 31299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Couldn't create SharedPreferences file " + file, e2); 31309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return str; 31339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3135333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick // Note: must hold mWritingToDiskLock 3136333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick private void writeToFile(MemoryCommitResult mcr) { 31379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Rename the current file so it may be used as a backup during the next read 31389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFile.exists()) { 3139333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick if (!mcr.changesMade) { 314067fed01522ad26c850b20d2c960e4d392dc401d1Brad Fitzpatrick // If the file already exists, but no changes were 314167fed01522ad26c850b20d2c960e4d392dc401d1Brad Fitzpatrick // made to the underlying map, it's wasteful to 314267fed01522ad26c850b20d2c960e4d392dc401d1Brad Fitzpatrick // re-write the file. Return as if we wrote it 314367fed01522ad26c850b20d2c960e4d392dc401d1Brad Fitzpatrick // out. 3144333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick mcr.setDiskWriteResult(true); 3145333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick return; 314667fed01522ad26c850b20d2c960e4d392dc401d1Brad Fitzpatrick } 31471afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn if (!mBackupFile.exists()) { 31481afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn if (!mFile.renameTo(mBackupFile)) { 31491afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Log.e(TAG, "Couldn't rename file " + mFile 31501afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn + " to backup file " + mBackupFile); 3151333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick mcr.setDiskWriteResult(false); 3152333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick return; 31531afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn } 31541afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn } else { 31551afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn mFile.delete(); 31569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31585f5acca334bbff89b3801d2970d64b06e36614baChristian Mehlmauer 31599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Attempt to write the file, delete the backup and return true as atomically as 31609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // possible. If any exception occurs, delete the new file; next time we will restore 31619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // from the backup. 31629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 31639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileOutputStream str = createFileOutputStream(mFile); 31649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == null) { 3165333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick mcr.setDiskWriteResult(false); 3166333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick return; 31679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3168333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick XmlUtils.writeMapXml(mcr.mapToWriteToDisk, str); 31699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str.close(); 31709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setFilePermissionsFromMode(mFile.getPath(), mMode, 0); 3171333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick FileStatus stat = new FileStatus(); 3172333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick if (FileUtils.getFileStatus(mFile.getPath(), stat)) { 3173333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick synchronized (this) { 3174333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick mTimestamp = stat.mtime; 3175333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick } 31769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 317751bf077883df4f5cc816fbfec6d19eedffc26d70Dianne Hackborn // Writing was successful, delete the backup file if there is one. 317851bf077883df4f5cc816fbfec6d19eedffc26d70Dianne Hackborn mBackupFile.delete(); 3179333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick mcr.setDiskWriteResult(true); 3180333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick return; 31819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (XmlPullParserException e) { 3182333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick Log.w(TAG, "writeToFile: Got exception:", e); 31839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 3184333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick Log.w(TAG, "writeToFile: Got exception:", e); 31859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Clean up an unsuccessfully written file 31879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFile.exists()) { 31889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mFile.delete()) { 31899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Couldn't clean up partially-written file " + mFile); 31909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3192333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick mcr.setDiskWriteResult(false); 31939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3196