diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2010-06-15 09:59:15 -0700 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2010-06-15 09:59:15 -0700 |
commit | a191eb013a491a6319b4f7ac51d4b0b16b3a8f70 (patch) | |
tree | 6f63fbceff7f97a563c6bb3c78a07e676d6da03a /core | |
parent | 9629d42c1966e56b75d7bdea909f9fb1a439ff67 (diff) | |
download | frameworks_base-a191eb013a491a6319b4f7ac51d4b0b16b3a8f70.zip frameworks_base-a191eb013a491a6319b4f7ac51d4b0b16b3a8f70.tar.gz frameworks_base-a191eb013a491a6319b4f7ac51d4b0b16b3a8f70.tar.bz2 |
Fix build
This file was brought back to life by mistaken when merging from
a branch where it was modified into a branch where it had been
deleted
Change-Id: I406c6ced978abfdd59684f14bc9dd53ee7968aae
Diffstat (limited to 'core')
-rw-r--r-- | core/java/android/app/ApplicationContext.java | 2781 |
1 files changed, 0 insertions, 2781 deletions
diff --git a/core/java/android/app/ApplicationContext.java b/core/java/android/app/ApplicationContext.java deleted file mode 100644 index 4c8e8ff..0000000 --- a/core/java/android/app/ApplicationContext.java +++ /dev/null @@ -1,2781 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.app; - -import com.android.internal.policy.PolicyManager; -import com.android.internal.util.XmlUtils; -import com.google.android.collect.Maps; - -import org.xmlpull.v1.XmlPullParserException; - -import android.content.BroadcastReceiver; -import android.content.ComponentName; -import android.content.ContentResolver; -import android.content.Context; -import android.content.ContextWrapper; -import android.content.IContentProvider; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.IIntentReceiver; -import android.content.IntentSender; -import android.content.ReceiverCallNotAllowedException; -import android.content.ServiceConnection; -import android.content.SharedPreferences; -import android.content.pm.ActivityInfo; -import android.content.pm.ApplicationInfo; -import android.content.pm.ComponentInfo; -import android.content.pm.FeatureInfo; -import android.content.pm.IPackageDataObserver; -import android.content.pm.IPackageDeleteObserver; -import android.content.pm.IPackageInstallObserver; -import android.content.pm.IPackageManager; -import android.content.pm.IPackageStatsObserver; -import android.content.pm.InstrumentationInfo; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; -import android.content.pm.PermissionGroupInfo; -import android.content.pm.PermissionInfo; -import android.content.pm.ProviderInfo; -import android.content.pm.ResolveInfo; -import android.content.pm.ServiceInfo; -import android.content.res.AssetManager; -import android.content.res.Resources; -import android.content.res.XmlResourceParser; -import android.database.sqlite.SQLiteDatabase; -import android.database.sqlite.SQLiteDatabase.CursorFactory; -import android.graphics.Bitmap; -import android.graphics.drawable.Drawable; -import android.hardware.SensorManager; -import android.location.ILocationManager; -import android.location.LocationManager; -import android.media.AudioManager; -import android.net.ConnectivityManager; -import android.net.IConnectivityManager; -import android.net.Uri; -import android.net.wifi.IWifiManager; -import android.net.wifi.WifiManager; -import android.os.Binder; -import android.os.Bundle; -import android.os.FileUtils; -import android.os.Handler; -import android.os.IBinder; -import android.os.IPowerManager; -import android.os.Looper; -import android.os.PowerManager; -import android.os.Process; -import android.os.RemoteException; -import android.os.ServiceManager; -import android.os.Vibrator; -import android.os.FileUtils.FileStatus; -import android.telephony.TelephonyManager; -import android.text.ClipboardManager; -import android.util.AndroidRuntimeException; -import android.util.Log; -import android.view.ContextThemeWrapper; -import android.view.LayoutInflater; -import android.view.WindowManagerImpl; -import android.view.accessibility.AccessibilityManager; -import android.view.inputmethod.InputMethodManager; -import android.accounts.AccountManager; -import android.accounts.IAccountManager; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.lang.ref.WeakReference; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.WeakHashMap; -import java.util.Map.Entry; - -class ReceiverRestrictedContext extends ContextWrapper { - ReceiverRestrictedContext(Context base) { - super(base); - } - - @Override - public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) { - return registerReceiver(receiver, filter, null, null); - } - - @Override - public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, - String broadcastPermission, Handler scheduler) { - throw new ReceiverCallNotAllowedException( - "IntentReceiver components are not allowed to register to receive intents"); - //ex.fillInStackTrace(); - //Log.e("IntentReceiver", ex.getMessage(), ex); - //return mContext.registerReceiver(receiver, filter, broadcastPermission, - // scheduler); - } - - @Override - public boolean bindService(Intent service, ServiceConnection conn, int flags) { - throw new ReceiverCallNotAllowedException( - "IntentReceiver components are not allowed to bind to services"); - //ex.fillInStackTrace(); - //Log.e("IntentReceiver", ex.getMessage(), ex); - //return mContext.bindService(service, interfaceName, conn, flags); - } -} - -/** - * Common implementation of Context API, which Activity and other application - * classes inherit. - */ -class ApplicationContext extends Context { - private final static String TAG = "ApplicationContext"; - private final static boolean DEBUG = false; - private final static boolean DEBUG_ICONS = false; - - private static final Object sSync = new Object(); - private static AlarmManager sAlarmManager; - private static PowerManager sPowerManager; - private static ConnectivityManager sConnectivityManager; - private static WifiManager sWifiManager; - private static LocationManager sLocationManager; - private static final HashMap<File, SharedPreferencesImpl> sSharedPrefs = - new HashMap<File, SharedPreferencesImpl>(); - - private AudioManager mAudioManager; - /*package*/ ActivityThread.PackageInfo mPackageInfo; - private Resources mResources; - /*package*/ ActivityThread mMainThread; - private Context mOuterContext; - private IBinder mActivityToken = null; - private ApplicationContentResolver mContentResolver; - private int mThemeResource = 0; - private Resources.Theme mTheme = null; - private PackageManager mPackageManager; - private NotificationManager mNotificationManager = null; - private ActivityManager mActivityManager = null; - private WallpaperManager mWallpaperManager = null; - private Context mReceiverRestrictedContext = null; - private SearchManager mSearchManager = null; - private SensorManager mSensorManager = null; - private Vibrator mVibrator = null; - private LayoutInflater mLayoutInflater = null; - private StatusBarManager mStatusBarManager = null; - private TelephonyManager mTelephonyManager = null; - private ClipboardManager mClipboardManager = null; - private boolean mRestricted; - private AccountManager mAccountManager; // protected by mSync - - private final Object mSync = new Object(); - - private File mDatabasesDir; - private File mPreferencesDir; - private File mFilesDir; - - - private File mCacheDir; - - private static long sInstanceCount = 0; - - private static final String[] EMPTY_FILE_LIST = {}; - - @Override - protected void finalize() throws Throwable { - super.finalize(); - --sInstanceCount; - } - - public static long getInstanceCount() { - return sInstanceCount; - } - - @Override - public AssetManager getAssets() { - return mResources.getAssets(); - } - - @Override - public Resources getResources() { - return mResources; - } - - @Override - public PackageManager getPackageManager() { - if (mPackageManager != null) { - return mPackageManager; - } - - IPackageManager pm = ActivityThread.getPackageManager(); - if (pm != null) { - // Doesn't matter if we make more than one instance. - return (mPackageManager = new ApplicationPackageManager(this, pm)); - } - - return null; - } - - @Override - public ContentResolver getContentResolver() { - return mContentResolver; - } - - @Override - public Looper getMainLooper() { - return mMainThread.getLooper(); - } - - @Override - public Context getApplicationContext() { - return mMainThread.getApplication(); - } - - @Override - public void setTheme(int resid) { - mThemeResource = resid; - } - - @Override - public Resources.Theme getTheme() { - if (mTheme == null) { - if (mThemeResource == 0) { - mThemeResource = com.android.internal.R.style.Theme; - } - mTheme = mResources.newTheme(); - mTheme.applyStyle(mThemeResource, true); - } - return mTheme; - } - - @Override - public ClassLoader getClassLoader() { - return mPackageInfo != null ? - mPackageInfo.getClassLoader() : ClassLoader.getSystemClassLoader(); - } - - @Override - public String getPackageName() { - if (mPackageInfo != null) { - return mPackageInfo.getPackageName(); - } - throw new RuntimeException("Not supported in system context"); - } - - @Override - public ApplicationInfo getApplicationInfo() { - if (mPackageInfo != null) { - return mPackageInfo.getApplicationInfo(); - } - throw new RuntimeException("Not supported in system context"); - } - - @Override - public String getPackageResourcePath() { - if (mPackageInfo != null) { - return mPackageInfo.getResDir(); - } - throw new RuntimeException("Not supported in system context"); - } - - @Override - public String getPackageCodePath() { - if (mPackageInfo != null) { - return mPackageInfo.getAppDir(); - } - throw new RuntimeException("Not supported in system context"); - } - - private static File makeBackupFile(File prefsFile) { - return new File(prefsFile.getPath() + ".bak"); - } - - public File getSharedPrefsFile(String name) { - return makeFilename(getPreferencesDir(), name + ".xml"); - } - - @Override - public SharedPreferences getSharedPreferences(String name, int mode) { - SharedPreferencesImpl sp; - File f = getSharedPrefsFile(name); - synchronized (sSharedPrefs) { - sp = sSharedPrefs.get(f); - if (sp != null && !sp.hasFileChanged()) { - //Log.i(TAG, "Returning existing prefs " + name + ": " + sp); - return sp; - } - } - - FileInputStream str = null; - File backup = makeBackupFile(f); - if (backup.exists()) { - f.delete(); - backup.renameTo(f); - } - - // Debugging - if (f.exists() && !f.canRead()) { - Log.w(TAG, "Attempt to read preferences file " + f + " without permission"); - } - - Map map = null; - if (f.exists() && f.canRead()) { - try { - str = new FileInputStream(f); - map = XmlUtils.readMapXml(str); - str.close(); - } catch (org.xmlpull.v1.XmlPullParserException e) { - Log.w(TAG, "getSharedPreferences", e); - } catch (FileNotFoundException e) { - Log.w(TAG, "getSharedPreferences", e); - } catch (IOException e) { - Log.w(TAG, "getSharedPreferences", e); - } - } - - synchronized (sSharedPrefs) { - if (sp != null) { - //Log.i(TAG, "Updating existing prefs " + name + " " + sp + ": " + map); - sp.replace(map); - } else { - sp = sSharedPrefs.get(f); - if (sp == null) { - sp = new SharedPreferencesImpl(f, mode, map); - sSharedPrefs.put(f, sp); - } - } - return sp; - } - } - - private File getPreferencesDir() { - synchronized (mSync) { - if (mPreferencesDir == null) { - mPreferencesDir = new File(getDataDirFile(), "shared_prefs"); - } - return mPreferencesDir; - } - } - - @Override - public FileInputStream openFileInput(String name) - throws FileNotFoundException { - File f = makeFilename(getFilesDir(), name); - return new FileInputStream(f); - } - - @Override - public FileOutputStream openFileOutput(String name, int mode) - throws FileNotFoundException { - final boolean append = (mode&MODE_APPEND) != 0; - File f = makeFilename(getFilesDir(), name); - try { - FileOutputStream fos = new FileOutputStream(f, append); - setFilePermissionsFromMode(f.getPath(), mode, 0); - return fos; - } catch (FileNotFoundException e) { - } - - File parent = f.getParentFile(); - parent.mkdir(); - FileUtils.setPermissions( - parent.getPath(), - FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH, - -1, -1); - FileOutputStream fos = new FileOutputStream(f, append); - setFilePermissionsFromMode(f.getPath(), mode, 0); - return fos; - } - - @Override - public boolean deleteFile(String name) { - File f = makeFilename(getFilesDir(), name); - return f.delete(); - } - - @Override - public File getFilesDir() { - synchronized (mSync) { - if (mFilesDir == null) { - mFilesDir = new File(getDataDirFile(), "files"); - } - if (!mFilesDir.exists()) { - if(!mFilesDir.mkdirs()) { - Log.w(TAG, "Unable to create files directory"); - return null; - } - FileUtils.setPermissions( - mFilesDir.getPath(), - FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH, - -1, -1); - } - return mFilesDir; - } - } - - @Override - public File getCacheDir() { - synchronized (mSync) { - if (mCacheDir == null) { - mCacheDir = new File(getDataDirFile(), "cache"); - } - if (!mCacheDir.exists()) { - if(!mCacheDir.mkdirs()) { - Log.w(TAG, "Unable to create cache directory"); - return null; - } - FileUtils.setPermissions( - mCacheDir.getPath(), - FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH, - -1, -1); - } - } - return mCacheDir; - } - - - @Override - public File getFileStreamPath(String name) { - return makeFilename(getFilesDir(), name); - } - - @Override - public String[] fileList() { - final String[] list = getFilesDir().list(); - return (list != null) ? list : EMPTY_FILE_LIST; - } - - @Override - public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory) { - File dir = getDatabasesDir(); - if (!dir.isDirectory() && dir.mkdir()) { - FileUtils.setPermissions(dir.getPath(), - FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH, - -1, -1); - } - - File f = makeFilename(dir, name); - SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(f, factory); - setFilePermissionsFromMode(f.getPath(), mode, 0); - return db; - } - - @Override - public boolean deleteDatabase(String name) { - try { - File f = makeFilename(getDatabasesDir(), name); - return f.delete(); - } catch (Exception e) { - } - return false; - } - - @Override - public File getDatabasePath(String name) { - return makeFilename(getDatabasesDir(), name); - } - - @Override - public String[] databaseList() { - final String[] list = getDatabasesDir().list(); - return (list != null) ? list : EMPTY_FILE_LIST; - } - - - private File getDatabasesDir() { - synchronized (mSync) { - if (mDatabasesDir == null) { - mDatabasesDir = new File(getDataDirFile(), "databases"); - } - if (mDatabasesDir.getPath().equals("databases")) { - mDatabasesDir = new File("/data/system"); - } - return mDatabasesDir; - } - } - - @Override - public Drawable getWallpaper() { - return getWallpaperManager().getDrawable(); - } - - @Override - public Drawable peekWallpaper() { - return getWallpaperManager().peekDrawable(); - } - - @Override - public int getWallpaperDesiredMinimumWidth() { - return getWallpaperManager().getDesiredMinimumWidth(); - } - - @Override - public int getWallpaperDesiredMinimumHeight() { - return getWallpaperManager().getDesiredMinimumHeight(); - } - - @Override - public void setWallpaper(Bitmap bitmap) throws IOException { - getWallpaperManager().setBitmap(bitmap); - } - - @Override - public void setWallpaper(InputStream data) throws IOException { - getWallpaperManager().setStream(data); - } - - @Override - public void clearWallpaper() throws IOException { - getWallpaperManager().clear(); - } - - @Override - public void startActivity(Intent intent) { - if ((intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { - throw new AndroidRuntimeException( - "Calling startActivity() from outside of an Activity " - + " context requires the FLAG_ACTIVITY_NEW_TASK flag." - + " Is this really what you want?"); - } - mMainThread.getInstrumentation().execStartActivity( - getOuterContext(), mMainThread.getApplicationThread(), null, null, intent, -1); - } - - @Override - public void startIntentSender(IntentSender intent, - Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags) - throws IntentSender.SendIntentException { - try { - String resolvedType = null; - if (fillInIntent != null) { - resolvedType = fillInIntent.resolveTypeIfNeeded(getContentResolver()); - } - int result = ActivityManagerNative.getDefault() - .startActivityIntentSender(mMainThread.getApplicationThread(), intent, - fillInIntent, resolvedType, null, null, - 0, flagsMask, flagsValues); - if (result == IActivityManager.START_CANCELED) { - throw new IntentSender.SendIntentException(); - } - Instrumentation.checkStartActivityResult(result, null); - } catch (RemoteException e) { - } - } - - @Override - public void sendBroadcast(Intent intent) { - String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); - try { - ActivityManagerNative.getDefault().broadcastIntent( - mMainThread.getApplicationThread(), intent, resolvedType, null, - Activity.RESULT_OK, null, null, null, false, false); - } catch (RemoteException e) { - } - } - - @Override - public void sendBroadcast(Intent intent, String receiverPermission) { - String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); - try { - ActivityManagerNative.getDefault().broadcastIntent( - mMainThread.getApplicationThread(), intent, resolvedType, null, - Activity.RESULT_OK, null, null, receiverPermission, false, false); - } catch (RemoteException e) { - } - } - - @Override - public void sendOrderedBroadcast(Intent intent, - String receiverPermission) { - String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); - try { - ActivityManagerNative.getDefault().broadcastIntent( - mMainThread.getApplicationThread(), intent, resolvedType, null, - Activity.RESULT_OK, null, null, receiverPermission, true, false); - } catch (RemoteException e) { - } - } - - @Override - public void sendOrderedBroadcast(Intent intent, - String receiverPermission, BroadcastReceiver resultReceiver, - Handler scheduler, int initialCode, String initialData, - Bundle initialExtras) { - IIntentReceiver rd = null; - if (resultReceiver != null) { - if (mPackageInfo != null) { - if (scheduler == null) { - scheduler = mMainThread.getHandler(); - } - rd = mPackageInfo.getReceiverDispatcher( - resultReceiver, getOuterContext(), scheduler, - mMainThread.getInstrumentation(), false); - } else { - if (scheduler == null) { - scheduler = mMainThread.getHandler(); - } - rd = new ActivityThread.PackageInfo.ReceiverDispatcher( - resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver(); - } - } - String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); - try { - ActivityManagerNative.getDefault().broadcastIntent( - mMainThread.getApplicationThread(), intent, resolvedType, rd, - initialCode, initialData, initialExtras, receiverPermission, - true, false); - } catch (RemoteException e) { - } - } - - @Override - public void sendStickyBroadcast(Intent intent) { - String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); - try { - ActivityManagerNative.getDefault().broadcastIntent( - mMainThread.getApplicationThread(), intent, resolvedType, null, - Activity.RESULT_OK, null, null, null, false, true); - } catch (RemoteException e) { - } - } - - @Override - public void sendStickyOrderedBroadcast(Intent intent, - BroadcastReceiver resultReceiver, - Handler scheduler, int initialCode, String initialData, - Bundle initialExtras) { - IIntentReceiver rd = null; - if (resultReceiver != null) { - if (mPackageInfo != null) { - if (scheduler == null) { - scheduler = mMainThread.getHandler(); - } - rd = mPackageInfo.getReceiverDispatcher( - resultReceiver, getOuterContext(), scheduler, - mMainThread.getInstrumentation(), false); - } else { - if (scheduler == null) { - scheduler = mMainThread.getHandler(); - } - rd = new ActivityThread.PackageInfo.ReceiverDispatcher( - resultReceiver, getOuterContext(), scheduler, null, false).getIIntentReceiver(); - } - } - String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); - try { - ActivityManagerNative.getDefault().broadcastIntent( - mMainThread.getApplicationThread(), intent, resolvedType, rd, - initialCode, initialData, initialExtras, null, - true, true); - } catch (RemoteException e) { - } - } - - @Override - public void removeStickyBroadcast(Intent intent) { - String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); - if (resolvedType != null) { - intent = new Intent(intent); - intent.setDataAndType(intent.getData(), resolvedType); - } - try { - ActivityManagerNative.getDefault().unbroadcastIntent( - mMainThread.getApplicationThread(), intent); - } catch (RemoteException e) { - } - } - - @Override - public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) { - return registerReceiver(receiver, filter, null, null); - } - - @Override - public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, - String broadcastPermission, Handler scheduler) { - return registerReceiverInternal(receiver, filter, broadcastPermission, - scheduler, getOuterContext()); - } - - private Intent registerReceiverInternal(BroadcastReceiver receiver, - IntentFilter filter, String broadcastPermission, - Handler scheduler, Context context) { - IIntentReceiver rd = null; - if (receiver != null) { - if (mPackageInfo != null && context != null) { - if (scheduler == null) { - scheduler = mMainThread.getHandler(); - } - rd = mPackageInfo.getReceiverDispatcher( - receiver, context, scheduler, - mMainThread.getInstrumentation(), true); - } else { - if (scheduler == null) { - scheduler = mMainThread.getHandler(); - } - rd = new ActivityThread.PackageInfo.ReceiverDispatcher( - receiver, context, scheduler, null, false).getIIntentReceiver(); - } - } - try { - return ActivityManagerNative.getDefault().registerReceiver( - mMainThread.getApplicationThread(), - rd, filter, broadcastPermission); - } catch (RemoteException e) { - return null; - } - } - - @Override - public void unregisterReceiver(BroadcastReceiver receiver) { - if (mPackageInfo != null) { - IIntentReceiver rd = mPackageInfo.forgetReceiverDispatcher( - getOuterContext(), receiver); - try { - ActivityManagerNative.getDefault().unregisterReceiver(rd); - } catch (RemoteException e) { - } - } else { - throw new RuntimeException("Not supported in system context"); - } - } - - @Override - public ComponentName startService(Intent service) { - try { - ComponentName cn = ActivityManagerNative.getDefault().startService( - mMainThread.getApplicationThread(), service, - service.resolveTypeIfNeeded(getContentResolver())); - if (cn != null && cn.getPackageName().equals("!")) { - throw new SecurityException( - "Not allowed to start service " + service - + " without permission " + cn.getClassName()); - } - return cn; - } catch (RemoteException e) { - return null; - } - } - - @Override - public boolean stopService(Intent service) { - try { - int res = ActivityManagerNative.getDefault().stopService( - mMainThread.getApplicationThread(), service, - service.resolveTypeIfNeeded(getContentResolver())); - if (res < 0) { - throw new SecurityException( - "Not allowed to stop service " + service); - } - return res != 0; - } catch (RemoteException e) { - return false; - } - } - - @Override - public boolean bindService(Intent service, ServiceConnection conn, - int flags) { - IServiceConnection sd; - if (mPackageInfo != null) { - sd = mPackageInfo.getServiceDispatcher(conn, getOuterContext(), - mMainThread.getHandler(), flags); - } else { - throw new RuntimeException("Not supported in system context"); - } - try { - int res = ActivityManagerNative.getDefault().bindService( - mMainThread.getApplicationThread(), getActivityToken(), - service, service.resolveTypeIfNeeded(getContentResolver()), - sd, flags); - if (res < 0) { - throw new SecurityException( - "Not allowed to bind to service " + service); - } - return res != 0; - } catch (RemoteException e) { - return false; - } - } - - @Override - public void unbindService(ServiceConnection conn) { - if (mPackageInfo != null) { - IServiceConnection sd = mPackageInfo.forgetServiceDispatcher( - getOuterContext(), conn); - try { - ActivityManagerNative.getDefault().unbindService(sd); - } catch (RemoteException e) { - } - } else { - throw new RuntimeException("Not supported in system context"); - } - } - - @Override - public boolean startInstrumentation(ComponentName className, - String profileFile, Bundle arguments) { - try { - return ActivityManagerNative.getDefault().startInstrumentation( - className, profileFile, 0, arguments, null); - } catch (RemoteException e) { - // System has crashed, nothing we can do. - } - return false; - } - - @Override - public Object getSystemService(String name) { - if (WINDOW_SERVICE.equals(name)) { - return WindowManagerImpl.getDefault(); - } else if (LAYOUT_INFLATER_SERVICE.equals(name)) { - synchronized (mSync) { - LayoutInflater inflater = mLayoutInflater; - if (inflater != null) { - return inflater; - } - mLayoutInflater = inflater = - PolicyManager.makeNewLayoutInflater(getOuterContext()); - return inflater; - } - } else if (ACTIVITY_SERVICE.equals(name)) { - return getActivityManager(); - } else if (INPUT_METHOD_SERVICE.equals(name)) { - return InputMethodManager.getInstance(this); - } else if (ALARM_SERVICE.equals(name)) { - return getAlarmManager(); - } else if (ACCOUNT_SERVICE.equals(name)) { - return getAccountManager(); - } else if (POWER_SERVICE.equals(name)) { - return getPowerManager(); - } else if (CONNECTIVITY_SERVICE.equals(name)) { - return getConnectivityManager(); - } else if (WIFI_SERVICE.equals(name)) { - return getWifiManager(); - } else if (NOTIFICATION_SERVICE.equals(name)) { - return getNotificationManager(); - } else if (KEYGUARD_SERVICE.equals(name)) { - return new KeyguardManager(); - } else if (ACCESSIBILITY_SERVICE.equals(name)) { - return AccessibilityManager.getInstance(this); - } else if (LOCATION_SERVICE.equals(name)) { - return getLocationManager(); - } else if (SEARCH_SERVICE.equals(name)) { - return getSearchManager(); - } else if (SENSOR_SERVICE.equals(name)) { - return getSensorManager(); - } else if (VIBRATOR_SERVICE.equals(name)) { - return getVibrator(); - } else if (STATUS_BAR_SERVICE.equals(name)) { - synchronized (mSync) { - if (mStatusBarManager == null) { - mStatusBarManager = new StatusBarManager(getOuterContext()); - } - return mStatusBarManager; - } - } else if (AUDIO_SERVICE.equals(name)) { - return getAudioManager(); - } else if (TELEPHONY_SERVICE.equals(name)) { - return getTelephonyManager(); - } else if (CLIPBOARD_SERVICE.equals(name)) { - return getClipboardManager(); - } else if (WALLPAPER_SERVICE.equals(name)) { - return getWallpaperManager(); - } - - return null; - } - - private AccountManager getAccountManager() { - synchronized (mSync) { - if (mAccountManager == null) { - IBinder b = ServiceManager.getService(ACCOUNT_SERVICE); - IAccountManager service = IAccountManager.Stub.asInterface(b); - mAccountManager = new AccountManager(this, service); - } - return mAccountManager; - } - } - - private ActivityManager getActivityManager() { - synchronized (mSync) { - if (mActivityManager == null) { - mActivityManager = new ActivityManager(getOuterContext(), - mMainThread.getHandler()); - } - } - return mActivityManager; - } - - private AlarmManager getAlarmManager() { - synchronized (sSync) { - if (sAlarmManager == null) { - IBinder b = ServiceManager.getService(ALARM_SERVICE); - IAlarmManager service = IAlarmManager.Stub.asInterface(b); - sAlarmManager = new AlarmManager(service); - } - } - return sAlarmManager; - } - - private PowerManager getPowerManager() { - synchronized (sSync) { - if (sPowerManager == null) { - IBinder b = ServiceManager.getService(POWER_SERVICE); - IPowerManager service = IPowerManager.Stub.asInterface(b); - sPowerManager = new PowerManager(service, mMainThread.getHandler()); - } - } - return sPowerManager; - } - - private ConnectivityManager getConnectivityManager() - { - synchronized (sSync) { - if (sConnectivityManager == null) { - IBinder b = ServiceManager.getService(CONNECTIVITY_SERVICE); - IConnectivityManager service = IConnectivityManager.Stub.asInterface(b); - sConnectivityManager = new ConnectivityManager(service); - } - } - return sConnectivityManager; - } - - private WifiManager getWifiManager() - { - synchronized (sSync) { - if (sWifiManager == null) { - IBinder b = ServiceManager.getService(WIFI_SERVICE); - IWifiManager service = IWifiManager.Stub.asInterface(b); - sWifiManager = new WifiManager(service, mMainThread.getHandler()); - } - } - return sWifiManager; - } - - private NotificationManager getNotificationManager() { - synchronized (mSync) { - if (mNotificationManager == null) { - mNotificationManager = new NotificationManager( - new ContextThemeWrapper(getOuterContext(), com.android.internal.R.style.Theme_Dialog), - mMainThread.getHandler()); - } - } - return mNotificationManager; - } - - private WallpaperManager getWallpaperManager() { - synchronized (mSync) { - if (mWallpaperManager == null) { - mWallpaperManager = new WallpaperManager(getOuterContext(), - mMainThread.getHandler()); - } - } - return mWallpaperManager; - } - - private TelephonyManager getTelephonyManager() { - synchronized (mSync) { - if (mTelephonyManager == null) { - mTelephonyManager = new TelephonyManager(getOuterContext()); - } - } - return mTelephonyManager; - } - - private ClipboardManager getClipboardManager() { - synchronized (mSync) { - if (mClipboardManager == null) { - mClipboardManager = new ClipboardManager(getOuterContext(), - mMainThread.getHandler()); - } - } - return mClipboardManager; - } - - private LocationManager getLocationManager() { - synchronized (sSync) { - if (sLocationManager == null) { - IBinder b = ServiceManager.getService(LOCATION_SERVICE); - ILocationManager service = ILocationManager.Stub.asInterface(b); - sLocationManager = new LocationManager(service); - } - } - return sLocationManager; - } - - private SearchManager getSearchManager() { - synchronized (mSync) { - if (mSearchManager == null) { - mSearchManager = new SearchManager(getOuterContext(), mMainThread.getHandler()); - } - } - return mSearchManager; - } - - private SensorManager getSensorManager() { - synchronized (mSync) { - if (mSensorManager == null) { - mSensorManager = new SensorManager(mMainThread.getHandler().getLooper()); - } - } - return mSensorManager; - } - - private Vibrator getVibrator() { - synchronized (mSync) { - if (mVibrator == null) { - mVibrator = new Vibrator(); - } - } - return mVibrator; - } - - private AudioManager getAudioManager() - { - if (mAudioManager == null) { - mAudioManager = new AudioManager(this); - } - return mAudioManager; - } - - @Override - public int checkPermission(String permission, int pid, int uid) { - if (permission == null) { - throw new IllegalArgumentException("permission is null"); - } - - if (!Process.supportsProcesses()) { - return PackageManager.PERMISSION_GRANTED; - } - try { - return ActivityManagerNative.getDefault().checkPermission( - permission, pid, uid); - } catch (RemoteException e) { - return PackageManager.PERMISSION_DENIED; - } - } - - @Override - public int checkCallingPermission(String permission) { - if (permission == null) { - throw new IllegalArgumentException("permission is null"); - } - - if (!Process.supportsProcesses()) { - return PackageManager.PERMISSION_GRANTED; - } - int pid = Binder.getCallingPid(); - if (pid != Process.myPid()) { - return checkPermission(permission, pid, - Binder.getCallingUid()); - } - return PackageManager.PERMISSION_DENIED; - } - - @Override - public int checkCallingOrSelfPermission(String permission) { - if (permission == null) { - throw new IllegalArgumentException("permission is null"); - } - - return checkPermission(permission, Binder.getCallingPid(), - Binder.getCallingUid()); - } - - private void enforce( - String permission, int resultOfCheck, - boolean selfToo, int uid, String message) { - if (resultOfCheck != PackageManager.PERMISSION_GRANTED) { - throw new SecurityException( - (message != null ? (message + ": ") : "") + - (selfToo - ? "Neither user " + uid + " nor current process has " - : "User " + uid + " does not have ") + - permission + - "."); - } - } - - public void enforcePermission( - String permission, int pid, int uid, String message) { - enforce(permission, - checkPermission(permission, pid, uid), - false, - uid, - message); - } - - public void enforceCallingPermission(String permission, String message) { - enforce(permission, - checkCallingPermission(permission), - false, - Binder.getCallingUid(), - message); - } - - public void enforceCallingOrSelfPermission( - String permission, String message) { - enforce(permission, - checkCallingOrSelfPermission(permission), - true, - Binder.getCallingUid(), - message); - } - - @Override - public void grantUriPermission(String toPackage, Uri uri, int modeFlags) { - try { - ActivityManagerNative.getDefault().grantUriPermission( - mMainThread.getApplicationThread(), toPackage, uri, - modeFlags); - } catch (RemoteException e) { - } - } - - @Override - public void revokeUriPermission(Uri uri, int modeFlags) { - try { - ActivityManagerNative.getDefault().revokeUriPermission( - mMainThread.getApplicationThread(), uri, - modeFlags); - } catch (RemoteException e) { - } - } - - @Override - public int checkUriPermission(Uri uri, int pid, int uid, int modeFlags) { - if (!Process.supportsProcesses()) { - return PackageManager.PERMISSION_GRANTED; - } - try { - return ActivityManagerNative.getDefault().checkUriPermission( - uri, pid, uid, modeFlags); - } catch (RemoteException e) { - return PackageManager.PERMISSION_DENIED; - } - } - - @Override - public int checkCallingUriPermission(Uri uri, int modeFlags) { - if (!Process.supportsProcesses()) { - return PackageManager.PERMISSION_GRANTED; - } - int pid = Binder.getCallingPid(); - if (pid != Process.myPid()) { - return checkUriPermission(uri, pid, - Binder.getCallingUid(), modeFlags); - } - return PackageManager.PERMISSION_DENIED; - } - - @Override - public int checkCallingOrSelfUriPermission(Uri uri, int modeFlags) { - return checkUriPermission(uri, Binder.getCallingPid(), - Binder.getCallingUid(), modeFlags); - } - - @Override - public int checkUriPermission(Uri uri, String readPermission, - String writePermission, int pid, int uid, int modeFlags) { - if (DEBUG) { - Log.i("foo", "checkUriPermission: uri=" + uri + "readPermission=" - + readPermission + " writePermission=" + writePermission - + " pid=" + pid + " uid=" + uid + " mode" + modeFlags); - } - if ((modeFlags&Intent.FLAG_GRANT_READ_URI_PERMISSION) != 0) { - if (readPermission == null - || checkPermission(readPermission, pid, uid) - == PackageManager.PERMISSION_GRANTED) { - return PackageManager.PERMISSION_GRANTED; - } - } - if ((modeFlags&Intent.FLAG_GRANT_WRITE_URI_PERMISSION) != 0) { - if (writePermission == null - || checkPermission(writePermission, pid, uid) - == PackageManager.PERMISSION_GRANTED) { - return PackageManager.PERMISSION_GRANTED; - } - } - return uri != null ? checkUriPermission(uri, pid, uid, modeFlags) - : PackageManager.PERMISSION_DENIED; - } - - private String uriModeFlagToString(int uriModeFlags) { - switch (uriModeFlags) { - case Intent.FLAG_GRANT_READ_URI_PERMISSION | - Intent.FLAG_GRANT_WRITE_URI_PERMISSION: - return "read and write"; - case Intent.FLAG_GRANT_READ_URI_PERMISSION: - return "read"; - case Intent.FLAG_GRANT_WRITE_URI_PERMISSION: - return "write"; - } - throw new IllegalArgumentException( - "Unknown permission mode flags: " + uriModeFlags); - } - - private void enforceForUri( - int modeFlags, int resultOfCheck, boolean selfToo, - int uid, Uri uri, String message) { - if (resultOfCheck != PackageManager.PERMISSION_GRANTED) { - throw new SecurityException( - (message != null ? (message + ": ") : "") + - (selfToo - ? "Neither user " + uid + " nor current process has " - : "User " + uid + " does not have ") + - uriModeFlagToString(modeFlags) + - " permission on " + - uri + - "."); - } - } - - public void enforceUriPermission( - Uri uri, int pid, int uid, int modeFlags, String message) { - enforceForUri( - modeFlags, checkUriPermission(uri, pid, uid, modeFlags), - false, uid, uri, message); - } - - public void enforceCallingUriPermission( - Uri uri, int modeFlags, String message) { - enforceForUri( - modeFlags, checkCallingUriPermission(uri, modeFlags), - false, Binder.getCallingUid(), uri, message); - } - - public void enforceCallingOrSelfUriPermission( - Uri uri, int modeFlags, String message) { - enforceForUri( - modeFlags, - checkCallingOrSelfUriPermission(uri, modeFlags), true, - Binder.getCallingUid(), uri, message); - } - - public void enforceUriPermission( - Uri uri, String readPermission, String writePermission, - int pid, int uid, int modeFlags, String message) { - enforceForUri(modeFlags, - checkUriPermission( - uri, readPermission, writePermission, pid, uid, - modeFlags), - false, - uid, - uri, - message); - } - - @Override - public Context createPackageContext(String packageName, int flags) - throws PackageManager.NameNotFoundException { - if (packageName.equals("system") || packageName.equals("android")) { - return new ApplicationContext(mMainThread.getSystemContext()); - } - - ActivityThread.PackageInfo pi = - mMainThread.getPackageInfo(packageName, flags); - if (pi != null) { - ApplicationContext c = new ApplicationContext(); - c.mRestricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED; - c.init(pi, null, mMainThread, mResources); - if (c.mResources != null) { - return c; - } - } - - // Should be a better exception. - throw new PackageManager.NameNotFoundException( - "Application package " + packageName + " not found"); - } - - @Override - public boolean isRestricted() { - return mRestricted; - } - - private File getDataDirFile() { - if (mPackageInfo != null) { - return mPackageInfo.getDataDirFile(); - } - throw new RuntimeException("Not supported in system context"); - } - - @Override - public File getDir(String name, int mode) { - name = "app_" + name; - File file = makeFilename(getDataDirFile(), name); - if (!file.exists()) { - file.mkdir(); - setFilePermissionsFromMode(file.getPath(), mode, - FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH); - } - return file; - } - - static ApplicationContext createSystemContext(ActivityThread mainThread) { - ApplicationContext context = new ApplicationContext(); - context.init(Resources.getSystem(), mainThread); - return context; - } - - ApplicationContext() { - ++sInstanceCount; - mOuterContext = this; - } - - /** - * Create a new ApplicationContext from an existing one. The new one - * works and operates the same as the one it is copying. - * - * @param context Existing application context. - */ - public ApplicationContext(ApplicationContext context) { - ++sInstanceCount; - mPackageInfo = context.mPackageInfo; - mResources = context.mResources; - mMainThread = context.mMainThread; - mContentResolver = context.mContentResolver; - mOuterContext = this; - } - - final void init(ActivityThread.PackageInfo packageInfo, - IBinder activityToken, ActivityThread mainThread) { - init(packageInfo, activityToken, mainThread, null); - } - - final void init(ActivityThread.PackageInfo packageInfo, - IBinder activityToken, ActivityThread mainThread, - Resources container) { - mPackageInfo = packageInfo; - mResources = mPackageInfo.getResources(mainThread); - - if (container != null && container.getCompatibilityInfo().applicationScale != - mResources.getCompatibilityInfo().applicationScale) { - if (DEBUG) { - Log.d(TAG, "loaded context has different scaling. Using container's" + - " compatiblity info:" + container.getDisplayMetrics()); - } - mResources = mainThread.getTopLevelResources( - mPackageInfo.getResDir(), container.getCompatibilityInfo().copy()); - } - mMainThread = mainThread; - mContentResolver = new ApplicationContentResolver(this, mainThread); - - setActivityToken(activityToken); - } - - final void init(Resources resources, ActivityThread mainThread) { - mPackageInfo = null; - mResources = resources; - mMainThread = mainThread; - mContentResolver = new ApplicationContentResolver(this, mainThread); - } - - final void scheduleFinalCleanup(String who, String what) { - mMainThread.scheduleContextCleanup(this, who, what); - } - - final void performFinalCleanup(String who, String what) { - //Log.i(TAG, "Cleanup up context: " + this); - mPackageInfo.removeContextRegistrations(getOuterContext(), who, what); - } - - final Context getReceiverRestrictedContext() { - if (mReceiverRestrictedContext != null) { - return mReceiverRestrictedContext; - } - return mReceiverRestrictedContext = new ReceiverRestrictedContext(getOuterContext()); - } - - final void setActivityToken(IBinder token) { - mActivityToken = token; - } - - final void setOuterContext(Context context) { - mOuterContext = context; - } - - final Context getOuterContext() { - return mOuterContext; - } - - final IBinder getActivityToken() { - return mActivityToken; - } - - private static void setFilePermissionsFromMode(String name, int mode, - int extraPermissions) { - int perms = FileUtils.S_IRUSR|FileUtils.S_IWUSR - |FileUtils.S_IRGRP|FileUtils.S_IWGRP - |extraPermissions; - if ((mode&MODE_WORLD_READABLE) != 0) { - perms |= FileUtils.S_IROTH; - } - if ((mode&MODE_WORLD_WRITEABLE) != 0) { - perms |= FileUtils.S_IWOTH; - } - if (DEBUG) { - Log.i(TAG, "File " + name + ": mode=0x" + Integer.toHexString(mode) - + ", perms=0x" + Integer.toHexString(perms)); - } - FileUtils.setPermissions(name, perms, -1, -1); - } - - private File makeFilename(File base, String name) { - if (name.indexOf(File.separatorChar) < 0) { - return new File(base, name); - } - throw new IllegalArgumentException( - "File " + name + " contains a path separator"); - } - - // ---------------------------------------------------------------------- - // ---------------------------------------------------------------------- - // ---------------------------------------------------------------------- - - private static final class ApplicationContentResolver extends ContentResolver { - public ApplicationContentResolver(Context context, - ActivityThread mainThread) - { - super(context); - mMainThread = mainThread; - } - - @Override - protected IContentProvider acquireProvider(Context context, String name) - { - return mMainThread.acquireProvider(context, name); - } - - @Override - public boolean releaseProvider(IContentProvider provider) - { - return mMainThread.releaseProvider(provider); - } - - private final ActivityThread mMainThread; - } - - // ---------------------------------------------------------------------- - // ---------------------------------------------------------------------- - // ---------------------------------------------------------------------- - - /*package*/ - static final class ApplicationPackageManager extends PackageManager { - @Override - public PackageInfo getPackageInfo(String packageName, int flags) - throws NameNotFoundException { - try { - PackageInfo pi = mPM.getPackageInfo(packageName, flags); - if (pi != null) { - return pi; - } - } catch (RemoteException e) { - throw new RuntimeException("Package manager has died", e); - } - - throw new NameNotFoundException(packageName); - } - - @Override - public Intent getLaunchIntentForPackage(String packageName) { - // First see if the package has an INFO activity; the existence of - // such an activity is implied to be the desired front-door for the - // overall package (such as if it has multiple launcher entries). - Intent intentToResolve = new Intent(Intent.ACTION_MAIN); - intentToResolve.addCategory(Intent.CATEGORY_INFO); - intentToResolve.setPackage(packageName); - ResolveInfo resolveInfo = resolveActivity(intentToResolve, 0); - - // Otherwise, try to find a main launcher activity. - if (resolveInfo == null) { - // reuse the intent instance - intentToResolve.removeCategory(Intent.CATEGORY_INFO); - intentToResolve.addCategory(Intent.CATEGORY_LAUNCHER); - intentToResolve.setPackage(packageName); - resolveInfo = resolveActivity(intentToResolve, 0); - } - if (resolveInfo == null) { - return null; - } - Intent intent = new Intent(Intent.ACTION_MAIN); - intent.setClassName(packageName, resolveInfo.activityInfo.name); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - return intent; - } - - @Override - public int[] getPackageGids(String packageName) - throws NameNotFoundException { - try { - int[] gids = mPM.getPackageGids(packageName); - if (gids == null || gids.length > 0) { - return gids; - } - } catch (RemoteException e) { - throw new RuntimeException("Package manager has died", e); - } - - throw new NameNotFoundException(packageName); - } - - @Override - public PermissionInfo getPermissionInfo(String name, int flags) - throws NameNotFoundException { - try { - PermissionInfo pi = mPM.getPermissionInfo(name, flags); - if (pi != null) { - return pi; - } - } catch (RemoteException e) { - throw new RuntimeException("Package manager has died", e); - } - - throw new NameNotFoundException(name); - } - - @Override - public List<PermissionInfo> queryPermissionsByGroup(String group, int flags) - throws NameNotFoundException { - try { - List<PermissionInfo> pi = mPM.queryPermissionsByGroup(group, flags); - if (pi != null) { - return pi; - } - } catch (RemoteException e) { - throw new RuntimeException("Package manager has died", e); - } - - throw new NameNotFoundException(group); - } - - @Override - public PermissionGroupInfo getPermissionGroupInfo(String name, - int flags) throws NameNotFoundException { - try { - PermissionGroupInfo pgi = mPM.getPermissionGroupInfo(name, flags); - if (pgi != null) { - return pgi; - } - } catch (RemoteException e) { - throw new RuntimeException("Package manager has died", e); - } - - throw new NameNotFoundException(name); - } - - @Override - public List<PermissionGroupInfo> getAllPermissionGroups(int flags) { - try { - return mPM.getAllPermissionGroups(flags); - } catch (RemoteException e) { - throw new RuntimeException("Package manager has died", e); - } - } - - @Override - public ApplicationInfo getApplicationInfo(String packageName, int flags) - throws NameNotFoundException { - try { - ApplicationInfo ai = mPM.getApplicationInfo(packageName, flags); - if (ai != null) { - return ai; - } - } catch (RemoteException e) { - throw new RuntimeException("Package manager has died", e); - } - - throw new NameNotFoundException(packageName); - } - - @Override - public ActivityInfo getActivityInfo(ComponentName className, int flags) - throws NameNotFoundException { - try { - ActivityInfo ai = mPM.getActivityInfo(className, flags); - if (ai != null) { - return ai; - } - } catch (RemoteException e) { - throw new RuntimeException("Package manager has died", e); - } - - throw new NameNotFoundException(className.toString()); - } - - @Override - public ActivityInfo getReceiverInfo(ComponentName className, int flags) - throws NameNotFoundException { - try { - ActivityInfo ai = mPM.getReceiverInfo(className, flags); - if (ai != null) { - return ai; - } - } catch (RemoteException e) { - throw new RuntimeException("Package manager has died", e); - } - - throw new NameNotFoundException(className.toString()); - } - - @Override - public ServiceInfo getServiceInfo(ComponentName className, int flags) - throws NameNotFoundException { - try { - ServiceInfo si = mPM.getServiceInfo(className, flags); - if (si != null) { - return si; - } - } catch (RemoteException e) { - throw new RuntimeException("Package manager has died", e); - } - - throw new NameNotFoundException(className.toString()); - } - - @Override - public String[] getSystemSharedLibraryNames() { - try { - return mPM.getSystemSharedLibraryNames(); - } catch (RemoteException e) { - throw new RuntimeException("Package manager has died", e); - } - } - - @Override - public FeatureInfo[] getSystemAvailableFeatures() { - try { - return mPM.getSystemAvailableFeatures(); - } catch (RemoteException e) { - throw new RuntimeException("Package manager has died", e); - } - } - - @Override - public boolean hasSystemFeature(String name) { - try { - return mPM.hasSystemFeature(name); - } catch (RemoteException e) { - throw new RuntimeException("Package manager has died", e); - } - } - - @Override - public int checkPermission(String permName, String pkgName) { - try { - return mPM.checkPermission(permName, pkgName); - } catch (RemoteException e) { - throw new RuntimeException("Package manager has died", e); - } - } - - @Override - public boolean addPermission(PermissionInfo info) { - try { - return mPM.addPermission(info); - } catch (RemoteException e) { - throw new RuntimeException("Package manager has died", e); - } - } - - @Override - public void removePermission(String name) { - try { - mPM.removePermission(name); - } catch (RemoteException e) { - throw new RuntimeException("Package manager has died", e); - } - } - - @Override - public int checkSignatures(String pkg1, String pkg2) { - try { - return mPM.checkSignatures(pkg1, pkg2); - } catch (RemoteException e) { - throw new RuntimeException("Package manager has died", e); - } - } - - @Override - public int checkSignatures(int uid1, int uid2) { - try { - return mPM.checkUidSignatures(uid1, uid2); - } catch (RemoteException e) { - throw new RuntimeException("Package manager has died", e); - } - } - - @Override - public String[] getPackagesForUid(int uid) { - try { - return mPM.getPackagesForUid(uid); - } catch (RemoteException e) { - throw new RuntimeException("Package manager has died", e); - } - } - - @Override - public String getNameForUid(int uid) { - try { - return mPM.getNameForUid(uid); - } catch (RemoteException e) { - throw new RuntimeException("Package manager has died", e); - } - } - - @Override - public int getUidForSharedUser(String sharedUserName) - throws NameNotFoundException { - try { - int uid = mPM.getUidForSharedUser(sharedUserName); - if(uid != -1) { - return uid; - } - } catch (RemoteException e) { - throw new RuntimeException("Package manager has died", e); - } - throw new NameNotFoundException("No shared userid for user:"+sharedUserName); - } - - @Override - public List<PackageInfo> getInstalledPackages(int flags) { - try { - return mPM.getInstalledPackages(flags); - } catch (RemoteException e) { - throw new RuntimeException("Package manager has died", e); - } - } - - @Override - public List<ApplicationInfo> getInstalledApplications(int flags) { - try { - return mPM.getInstalledApplications(flags); - } catch (RemoteException e) { - throw new RuntimeException("Package manager has died", e); - } - } - - @Override - public ResolveInfo resolveActivity(Intent intent, int flags) { - try { - return mPM.resolveIntent( - intent, - intent.resolveTypeIfNeeded(mContext.getContentResolver()), - flags); - } catch (RemoteException e) { - throw new RuntimeException("Package manager has died", e); - } - } - - @Override - public List<ResolveInfo> queryIntentActivities(Intent intent, - int flags) { - try { - return mPM.queryIntentActivities( - intent, - intent.resolveTypeIfNeeded(mContext.getContentResolver()), - flags); - } catch (RemoteException e) { - throw new RuntimeException("Package manager has died", e); - } - } - - @Override - public List<ResolveInfo> queryIntentActivityOptions( - ComponentName caller, Intent[] specifics, Intent intent, - int flags) { - final ContentResolver resolver = mContext.getContentResolver(); - - String[] specificTypes = null; - if (specifics != null) { - final int N = specifics.length; - for (int i=0; i<N; i++) { - Intent sp = specifics[i]; - if (sp != null) { - String t = sp.resolveTypeIfNeeded(resolver); - if (t != null) { - if (specificTypes == null) { - specificTypes = new String[N]; - } - specificTypes[i] = t; - } - } - } - } - - try { - return mPM.queryIntentActivityOptions(caller, specifics, - specificTypes, intent, intent.resolveTypeIfNeeded(resolver), - flags); - } catch (RemoteException e) { - throw new RuntimeException("Package manager has died", e); - } - } - - @Override - public List<ResolveInfo> queryBroadcastReceivers(Intent intent, int flags) { - try { - return mPM.queryIntentReceivers( - intent, - intent.resolveTypeIfNeeded(mContext.getContentResolver()), - flags); - } catch (RemoteException e) { - throw new RuntimeException("Package manager has died", e); - } - } - - @Override - public ResolveInfo resolveService(Intent intent, int flags) { - try { - return mPM.resolveService( - intent, - intent.resolveTypeIfNeeded(mContext.getContentResolver()), - flags); - } catch (RemoteException e) { - throw new RuntimeException("Package manager has died", e); - } - } - - @Override - public List<ResolveInfo> queryIntentServices(Intent intent, int flags) { - try { - return mPM.queryIntentServices( - intent, - intent.resolveTypeIfNeeded(mContext.getContentResolver()), - flags); - } catch (RemoteException e) { - throw new RuntimeException("Package manager has died", e); - } - } - - @Override - public ProviderInfo resolveContentProvider(String name, - int flags) { - try { - return mPM.resolveContentProvider(name, flags); - } catch (RemoteException e) { - throw new RuntimeException("Package manager has died", e); - } - } - - @Override - public List<ProviderInfo> queryContentProviders(String processName, - int uid, int flags) { - try { - return mPM.queryContentProviders(processName, uid, flags); - } catch (RemoteException e) { - throw new RuntimeException("Package manager has died", e); - } - } - - @Override - public InstrumentationInfo getInstrumentationInfo( - ComponentName className, int flags) - throws NameNotFoundException { - try { - InstrumentationInfo ii = mPM.getInstrumentationInfo( - className, flags); - if (ii != null) { - return ii; - } - } catch (RemoteException e) { - throw new RuntimeException("Package manager has died", e); - } - - throw new NameNotFoundException(className.toString()); - } - - @Override - public List<InstrumentationInfo> queryInstrumentation( - String targetPackage, int flags) { - try { - return mPM.queryInstrumentation(targetPackage, flags); - } catch (RemoteException e) { - throw new RuntimeException("Package manager has died", e); - } - } - - @Override public Drawable getDrawable(String packageName, int resid, - ApplicationInfo appInfo) { - ResourceName name = new ResourceName(packageName, resid); - Drawable dr = getCachedIcon(name); - if (dr != null) { - return dr; - } - if (appInfo == null) { - try { - appInfo = getApplicationInfo(packageName, 0); - } catch (NameNotFoundException e) { - return null; - } - } - try { - Resources r = getResourcesForApplication(appInfo); - dr = r.getDrawable(resid); - if (false) { - RuntimeException e = new RuntimeException("here"); - e.fillInStackTrace(); - Log.w(TAG, "Getting drawable 0x" + Integer.toHexString(resid) - + " from package " + packageName - + ": app scale=" + r.getCompatibilityInfo().applicationScale - + ", caller scale=" + mContext.getResources().getCompatibilityInfo().applicationScale, - e); - } - if (DEBUG_ICONS) Log.v(TAG, "Getting drawable 0x" - + Integer.toHexString(resid) + " from " + r - + ": " + dr); - putCachedIcon(name, dr); - return dr; - } catch (NameNotFoundException e) { - Log.w("PackageManager", "Failure retrieving resources for" - + appInfo.packageName); - } catch (RuntimeException e) { - // If an exception was thrown, fall through to return - // default icon. - Log.w("PackageManager", "Failure retrieving icon 0x" - + Integer.toHexString(resid) + " in package " - + packageName, e); - } - return null; - } - - @Override public Drawable getActivityIcon(ComponentName activityName) - throws NameNotFoundException { - return getActivityInfo(activityName, 0).loadIcon(this); - } - - @Override public Drawable getActivityIcon(Intent intent) - throws NameNotFoundException { - if (intent.getComponent() != null) { - return getActivityIcon(intent.getComponent()); - } - - ResolveInfo info = resolveActivity( - intent, PackageManager.MATCH_DEFAULT_ONLY); - if (info != null) { - return info.activityInfo.loadIcon(this); - } - - throw new NameNotFoundException(intent.toUri(0)); - } - - @Override public Drawable getDefaultActivityIcon() { - return Resources.getSystem().getDrawable( - com.android.internal.R.drawable.sym_def_app_icon); - } - - @Override public Drawable getApplicationIcon(ApplicationInfo info) { - final int icon = info.icon; - if (icon != 0) { - ResourceName name = new ResourceName(info, icon); - Drawable dr = getCachedIcon(name); - if (dr != null) { - return dr; - } - try { - Resources r = getResourcesForApplication(info); - dr = r.getDrawable(icon); - if (DEBUG_ICONS) Log.v(TAG, "Getting drawable 0x" - + Integer.toHexString(icon) + " from " + r - + ": " + dr); - putCachedIcon(name, dr); - return dr; - } catch (NameNotFoundException e) { - Log.w("PackageManager", "Failure retrieving resources for" - + info.packageName); - } catch (RuntimeException e) { - // If an exception was thrown, fall through to return - // default icon. - Log.w("PackageManager", "Failure retrieving app icon", e); - } - } - return getDefaultActivityIcon(); - } - - @Override public Drawable getApplicationIcon(String packageName) - throws NameNotFoundException { - return getApplicationIcon(getApplicationInfo(packageName, 0)); - } - - @Override public Resources getResourcesForActivity( - ComponentName activityName) throws NameNotFoundException { - return getResourcesForApplication( - getActivityInfo(activityName, 0).applicationInfo); - } - - @Override public Resources getResourcesForApplication( - ApplicationInfo app) throws NameNotFoundException { - if (app.packageName.equals("system")) { - return mContext.mMainThread.getSystemContext().getResources(); - } - Resources r = mContext.mMainThread.getTopLevelResources( - app.uid == Process.myUid() ? app.sourceDir - : app.publicSourceDir, mContext.mPackageInfo); - if (r != null) { - return r; - } - throw new NameNotFoundException("Unable to open " + app.publicSourceDir); - } - - @Override public Resources getResourcesForApplication( - String appPackageName) throws NameNotFoundException { - return getResourcesForApplication( - getApplicationInfo(appPackageName, 0)); - } - - int mCachedSafeMode = -1; - @Override public boolean isSafeMode() { - try { - if (mCachedSafeMode < 0) { - mCachedSafeMode = mPM.isSafeMode() ? 1 : 0; - } - return mCachedSafeMode != 0; - } catch (RemoteException e) { - throw new RuntimeException("Package manager has died", e); - } - } - - static void configurationChanged() { - synchronized (sSync) { - sIconCache.clear(); - sStringCache.clear(); - } - } - - ApplicationPackageManager(ApplicationContext context, - IPackageManager pm) { - mContext = context; - mPM = pm; - } - - private Drawable getCachedIcon(ResourceName name) { - synchronized (sSync) { - WeakReference<Drawable> wr = sIconCache.get(name); - if (DEBUG_ICONS) Log.v(TAG, "Get cached weak drawable ref for " - + name + ": " + wr); - if (wr != null) { // we have the activity - Drawable dr = wr.get(); - if (dr != null) { - if (DEBUG_ICONS) Log.v(TAG, "Get cached drawable for " - + name + ": " + dr); - return dr; - } - // our entry has been purged - sIconCache.remove(name); - } - } - return null; - } - - private void establishPackageRemovedReceiver() { - // mContext.registerReceiverInternal() winds up acquiring the - // main ActivityManagerService.this lock. If we hold our usual - // sSync global lock at the same time, we impose a required ordering - // on those two locks, which is not good for deadlock prevention. - // Use a dedicated lock around initialization of - // sPackageRemovedReceiver to avoid this. - synchronized (sPackageRemovedSync) { - if (sPackageRemovedReceiver == null) { - sPackageRemovedReceiver = new PackageRemovedReceiver(); - IntentFilter filter = new IntentFilter( - Intent.ACTION_PACKAGE_REMOVED); - filter.addDataScheme("package"); - mContext.registerReceiverInternal(sPackageRemovedReceiver, - filter, null, null, null); - } - } - } - - private void putCachedIcon(ResourceName name, Drawable dr) { - establishPackageRemovedReceiver(); - - synchronized (sSync) { - sIconCache.put(name, new WeakReference<Drawable>(dr)); - if (DEBUG_ICONS) Log.v(TAG, "Added cached drawable for " - + name + ": " + dr); - } - } - - private static final class PackageRemovedReceiver extends BroadcastReceiver { - @Override - public void onReceive(Context context, Intent intent) { - Uri data = intent.getData(); - String ssp; - if (data != null && (ssp=data.getSchemeSpecificPart()) != null) { - boolean needCleanup = false; - synchronized (sSync) { - Iterator<ResourceName> it = sIconCache.keySet().iterator(); - while (it.hasNext()) { - ResourceName nm = it.next(); - if (nm.packageName.equals(ssp)) { - //Log.i(TAG, "Removing cached drawable for " + nm); - it.remove(); - needCleanup = true; - } - } - it = sStringCache.keySet().iterator(); - while (it.hasNext()) { - ResourceName nm = it.next(); - if (nm.packageName.equals(ssp)) { - //Log.i(TAG, "Removing cached string for " + nm); - it.remove(); - needCleanup = true; - } - } - } - if (needCleanup || ActivityThread.currentActivityThread().hasPackageInfo(ssp)) { - ActivityThread.currentActivityThread().scheduleGcIdler(); - } - } - } - } - - private static final class ResourceName { - final String packageName; - final int iconId; - - ResourceName(String _packageName, int _iconId) { - packageName = _packageName; - iconId = _iconId; - } - - ResourceName(ApplicationInfo aInfo, int _iconId) { - this(aInfo.packageName, _iconId); - } - - ResourceName(ComponentInfo cInfo, int _iconId) { - this(cInfo.applicationInfo.packageName, _iconId); - } - - ResourceName(ResolveInfo rInfo, int _iconId) { - this(rInfo.activityInfo.applicationInfo.packageName, _iconId); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - ResourceName that = (ResourceName) o; - - if (iconId != that.iconId) return false; - return !(packageName != null ? - !packageName.equals(that.packageName) : that.packageName != null); - - } - - @Override - public int hashCode() { - int result; - result = packageName.hashCode(); - result = 31 * result + iconId; - return result; - } - - @Override - public String toString() { - return "{ResourceName " + packageName + " / " + iconId + "}"; - } - } - - private CharSequence getCachedString(ResourceName name) { - synchronized (sSync) { - WeakReference<CharSequence> wr = sStringCache.get(name); - if (wr != null) { // we have the activity - CharSequence cs = wr.get(); - if (cs != null) { - return cs; - } - // our entry has been purged - sStringCache.remove(name); - } - } - return null; - } - - private void putCachedString(ResourceName name, CharSequence cs) { - establishPackageRemovedReceiver(); - - synchronized (sSync) { - sStringCache.put(name, new WeakReference<CharSequence>(cs)); - } - } - - private CharSequence getLabel(ResourceName name, ApplicationInfo app, int id) { - CharSequence cs = getCachedString(name); - if (cs != null) { - return cs; - } - try { - Resources r = getResourcesForApplication(app); - cs = r.getText(id); - putCachedString(name, cs); - } catch (NameNotFoundException e) { - Log.w("PackageManager", "Failure retrieving resources for" - + app.packageName); - } catch (RuntimeException e) { - // If an exception was thrown, fall through to return null - Log.w("ApplicationInfo", "Failure retrieving activity name", e); - } - return cs; - } - - @Override - public CharSequence getText(String packageName, int resid, - ApplicationInfo appInfo) { - ResourceName name = new ResourceName(packageName, resid); - CharSequence text = getCachedString(name); - if (text != null) { - return text; - } - if (appInfo == null) { - try { - appInfo = getApplicationInfo(packageName, 0); - } catch (NameNotFoundException e) { - return null; - } - } - try { - Resources r = getResourcesForApplication(appInfo); - text = r.getText(resid); - putCachedString(name, text); - return text; - } catch (NameNotFoundException e) { - Log.w("PackageManager", "Failure retrieving resources for" - + appInfo.packageName); - } catch (RuntimeException e) { - // If an exception was thrown, fall through to return - // default icon. - Log.w("PackageManager", "Failure retrieving text 0x" - + Integer.toHexString(resid) + " in package " - + packageName, e); - } - return null; - } - - @Override - public XmlResourceParser getXml(String packageName, int resid, - ApplicationInfo appInfo) { - if (appInfo == null) { - try { - appInfo = getApplicationInfo(packageName, 0); - } catch (NameNotFoundException e) { - return null; - } - } - try { - Resources r = getResourcesForApplication(appInfo); - return r.getXml(resid); - } catch (RuntimeException e) { - // If an exception was thrown, fall through to return - // default icon. - Log.w("PackageManager", "Failure retrieving xml 0x" - + Integer.toHexString(resid) + " in package " - + packageName, e); - } catch (NameNotFoundException e) { - Log.w("PackageManager", "Failure retrieving resources for" - + appInfo.packageName); - } - return null; - } - - @Override - public CharSequence getApplicationLabel(ApplicationInfo info) { - if (info.nonLocalizedLabel != null) { - return info.nonLocalizedLabel; - } - final int id = info.labelRes; - if (id != 0) { - CharSequence cs = getLabel(new ResourceName(info, id), info, id); - if (cs != null) { - return cs; - } - } - return info.packageName; - } - - @Override - public void installPackage(Uri packageURI, IPackageInstallObserver observer, int flags, - String installerPackageName) { - try { - mPM.installPackage(packageURI, observer, flags, installerPackageName); - } catch (RemoteException e) { - // Should never happen! - } - } - - @Override - public String getInstallerPackageName(String packageName) { - try { - return mPM.getInstallerPackageName(packageName); - } catch (RemoteException e) { - // Should never happen! - } - return null; - } - - @Override - public void deletePackage(String packageName, IPackageDeleteObserver observer, int flags) { - try { - mPM.deletePackage(packageName, observer, flags); - } catch (RemoteException e) { - // Should never happen! - } - } - @Override - public void clearApplicationUserData(String packageName, - IPackageDataObserver observer) { - try { - mPM.clearApplicationUserData(packageName, observer); - } catch (RemoteException e) { - // Should never happen! - } - } - @Override - public void deleteApplicationCacheFiles(String packageName, - IPackageDataObserver observer) { - try { - mPM.deleteApplicationCacheFiles(packageName, observer); - } catch (RemoteException e) { - // Should never happen! - } - } - @Override - public void freeStorageAndNotify(long idealStorageSize, IPackageDataObserver observer) { - try { - mPM.freeStorageAndNotify(idealStorageSize, observer); - } catch (RemoteException e) { - // Should never happen! - } - } - - @Override - public void freeStorage(long freeStorageSize, IntentSender pi) { - try { - mPM.freeStorage(freeStorageSize, pi); - } catch (RemoteException e) { - // Should never happen! - } - } - - @Override - public void getPackageSizeInfo(String packageName, - IPackageStatsObserver observer) { - try { - mPM.getPackageSizeInfo(packageName, observer); - } catch (RemoteException e) { - // Should never happen! - } - } - @Override - public void addPackageToPreferred(String packageName) { - try { - mPM.addPackageToPreferred(packageName); - } catch (RemoteException e) { - // Should never happen! - } - } - - @Override - public void removePackageFromPreferred(String packageName) { - try { - mPM.removePackageFromPreferred(packageName); - } catch (RemoteException e) { - // Should never happen! - } - } - - @Override - public List<PackageInfo> getPreferredPackages(int flags) { - try { - return mPM.getPreferredPackages(flags); - } catch (RemoteException e) { - // Should never happen! - } - return new ArrayList<PackageInfo>(); - } - - @Override - public void addPreferredActivity(IntentFilter filter, - int match, ComponentName[] set, ComponentName activity) { - try { - mPM.addPreferredActivity(filter, match, set, activity); - } catch (RemoteException e) { - // Should never happen! - } - } - - @Override - public void replacePreferredActivity(IntentFilter filter, - int match, ComponentName[] set, ComponentName activity) { - try { - mPM.replacePreferredActivity(filter, match, set, activity); - } catch (RemoteException e) { - // Should never happen! - } - } - - @Override - public void clearPackagePreferredActivities(String packageName) { - try { - mPM.clearPackagePreferredActivities(packageName); - } catch (RemoteException e) { - // Should never happen! - } - } - - @Override - public int getPreferredActivities(List<IntentFilter> outFilters, - List<ComponentName> outActivities, String packageName) { - try { - return mPM.getPreferredActivities(outFilters, outActivities, packageName); - } catch (RemoteException e) { - // Should never happen! - } - return 0; - } - - @Override - public void setComponentEnabledSetting(ComponentName componentName, - int newState, int flags) { - try { - mPM.setComponentEnabledSetting(componentName, newState, flags); - } catch (RemoteException e) { - // Should never happen! - } - } - - @Override - public int getComponentEnabledSetting(ComponentName componentName) { - try { - return mPM.getComponentEnabledSetting(componentName); - } catch (RemoteException e) { - // Should never happen! - } - return PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; - } - - @Override - public void setApplicationEnabledSetting(String packageName, - int newState, int flags) { - try { - mPM.setApplicationEnabledSetting(packageName, newState, flags); - } catch (RemoteException e) { - // Should never happen! - } - } - - @Override - public int getApplicationEnabledSetting(String packageName) { - try { - return mPM.getApplicationEnabledSetting(packageName); - } catch (RemoteException e) { - // Should never happen! - } - return PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; - } - - private final ApplicationContext mContext; - private final IPackageManager mPM; - - private static final Object sSync = new Object(); - private static final Object sPackageRemovedSync = new Object(); - private static BroadcastReceiver sPackageRemovedReceiver; - private static HashMap<ResourceName, WeakReference<Drawable> > sIconCache - = new HashMap<ResourceName, WeakReference<Drawable> >(); - private static HashMap<ResourceName, WeakReference<CharSequence> > sStringCache - = new HashMap<ResourceName, WeakReference<CharSequence> >(); - } - - // ---------------------------------------------------------------------- - // ---------------------------------------------------------------------- - // ---------------------------------------------------------------------- - - private static final class SharedPreferencesImpl implements SharedPreferences { - - private final File mFile; - private final File mBackupFile; - private final int mMode; - private Map mMap; - private final FileStatus mFileStatus = new FileStatus(); - private long mTimestamp; - - private static final Object mContent = new Object(); - private WeakHashMap<OnSharedPreferenceChangeListener, Object> mListeners; - - SharedPreferencesImpl( - File file, int mode, Map initialContents) { - mFile = file; - mBackupFile = makeBackupFile(file); - mMode = mode; - mMap = initialContents != null ? initialContents : new HashMap(); - if (FileUtils.getFileStatus(file.getPath(), mFileStatus)) { - mTimestamp = mFileStatus.mtime; - } - mListeners = new WeakHashMap<OnSharedPreferenceChangeListener, Object>(); - } - - public boolean hasFileChanged() { - synchronized (this) { - if (!FileUtils.getFileStatus(mFile.getPath(), mFileStatus)) { - return true; - } - return mTimestamp != mFileStatus.mtime; - } - } - - public void replace(Map newContents) { - if (newContents != null) { - synchronized (this) { - mMap = newContents; - } - } - } - - public void registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) { - synchronized(this) { - mListeners.put(listener, mContent); - } - } - - public void unregisterOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) { - synchronized(this) { - mListeners.remove(listener); - } - } - - public Map<String, ?> getAll() { - synchronized(this) { - //noinspection unchecked - return new HashMap(mMap); - } - } - - public String getString(String key, String defValue) { - synchronized (this) { - String v = (String)mMap.get(key); - return v != null ? v : defValue; - } - } - - public int getInt(String key, int defValue) { - synchronized (this) { - Integer v = (Integer)mMap.get(key); - return v != null ? v : defValue; - } - } - public long getLong(String key, long defValue) { - synchronized (this) { - Long v = (Long) mMap.get(key); - return v != null ? v : defValue; - } - } - public float getFloat(String key, float defValue) { - synchronized (this) { - Float v = (Float)mMap.get(key); - return v != null ? v : defValue; - } - } - public boolean getBoolean(String key, boolean defValue) { - synchronized (this) { - Boolean v = (Boolean)mMap.get(key); - return v != null ? v : defValue; - } - } - - public boolean contains(String key) { - synchronized (this) { - return mMap.containsKey(key); - } - } - - public final class EditorImpl implements Editor { - private final Map<String, Object> mModified = Maps.newHashMap(); - private boolean mClear = false; - - public Editor putString(String key, String value) { - synchronized (this) { - mModified.put(key, value); - return this; - } - } - public Editor putInt(String key, int value) { - synchronized (this) { - mModified.put(key, value); - return this; - } - } - public Editor putLong(String key, long value) { - synchronized (this) { - mModified.put(key, value); - return this; - } - } - public Editor putFloat(String key, float value) { - synchronized (this) { - mModified.put(key, value); - return this; - } - } - public Editor putBoolean(String key, boolean value) { - synchronized (this) { - mModified.put(key, value); - return this; - } - } - - public Editor remove(String key) { - synchronized (this) { - mModified.put(key, this); - return this; - } - } - - public Editor clear() { - synchronized (this) { - mClear = true; - return this; - } - } - - public boolean commit() { - boolean returnValue; - - boolean hasListeners; - List<String> keysModified = null; - Set<OnSharedPreferenceChangeListener> listeners = null; - - synchronized (SharedPreferencesImpl.this) { - hasListeners = mListeners.size() > 0; - if (hasListeners) { - keysModified = new ArrayList<String>(); - listeners = - new HashSet<OnSharedPreferenceChangeListener>(mListeners.keySet()); - } - - synchronized (this) { - if (mClear) { - mMap.clear(); - mClear = false; - } - - for (Entry<String, Object> e : mModified.entrySet()) { - String k = e.getKey(); - Object v = e.getValue(); - if (v == this) { - mMap.remove(k); - } else { - mMap.put(k, v); - } - - if (hasListeners) { - keysModified.add(k); - } - } - - mModified.clear(); - } - - returnValue = writeFileLocked(); - } - - if (hasListeners) { - for (int i = keysModified.size() - 1; i >= 0; i--) { - final String key = keysModified.get(i); - for (OnSharedPreferenceChangeListener listener : listeners) { - if (listener != null) { - listener.onSharedPreferenceChanged(SharedPreferencesImpl.this, key); - } - } - } - } - - return returnValue; - } - } - - public Editor edit() { - return new EditorImpl(); - } - - private FileOutputStream createFileOutputStream(File file) { - FileOutputStream str = null; - try { - str = new FileOutputStream(file); - } catch (FileNotFoundException e) { - File parent = file.getParentFile(); - if (!parent.mkdir()) { - Log.e(TAG, "Couldn't create directory for SharedPreferences file " + file); - return null; - } - FileUtils.setPermissions( - parent.getPath(), - FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH, - -1, -1); - try { - str = new FileOutputStream(file); - } catch (FileNotFoundException e2) { - Log.e(TAG, "Couldn't create SharedPreferences file " + file, e2); - } - } - return str; - } - - private boolean writeFileLocked() { - // Rename the current file so it may be used as a backup during the next read - if (mFile.exists()) { - if (!mFile.renameTo(mBackupFile)) { - Log.e(TAG, "Couldn't rename file " + mFile + " to backup file " + mBackupFile); - return false; - } - } - - // Attempt to write the file, delete the backup and return true as atomically as - // possible. If any exception occurs, delete the new file; next time we will restore - // from the backup. - try { - FileOutputStream str = createFileOutputStream(mFile); - if (str == null) { - return false; - } - XmlUtils.writeMapXml(mMap, str); - str.close(); - setFilePermissionsFromMode(mFile.getPath(), mMode, 0); - if (FileUtils.getFileStatus(mFile.getPath(), mFileStatus)) { - mTimestamp = mFileStatus.mtime; - } - - // Writing was successful, delete the backup file if there is one. - mBackupFile.delete(); - return true; - } catch (XmlPullParserException e) { - Log.w(TAG, "writeFileLocked: Got exception:", e); - } catch (IOException e) { - Log.w(TAG, "writeFileLocked: Got exception:", e); - } - // Clean up an unsuccessfully written file - if (mFile.exists()) { - if (!mFile.delete()) { - Log.e(TAG, "Couldn't clean up partially-written file " + mFile); - } - } - return false; - } - } -} |