diff options
Diffstat (limited to 'core/java/android/app/ApplicationContext.java')
-rw-r--r-- | core/java/android/app/ApplicationContext.java | 290 |
1 files changed, 123 insertions, 167 deletions
diff --git a/core/java/android/app/ApplicationContext.java b/core/java/android/app/ApplicationContext.java index 92929ea..f48f150 100644 --- a/core/java/android/app/ApplicationContext.java +++ b/core/java/android/app/ApplicationContext.java @@ -22,8 +22,6 @@ import com.google.android.collect.Maps; import org.xmlpull.v1.XmlPullParserException; -import android.bluetooth.BluetoothDevice; -import android.bluetooth.IBluetoothDevice; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.ContentResolver; @@ -40,6 +38,7 @@ 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; @@ -59,8 +58,6 @@ import android.content.res.XmlResourceParser; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.hardware.SensorManager; import android.location.ILocationManager; @@ -78,7 +75,6 @@ import android.os.Handler; import android.os.IBinder; import android.os.IPowerManager; import android.os.Looper; -import android.os.ParcelFileDescriptor; import android.os.PowerManager; import android.os.Process; import android.os.RemoteException; @@ -88,14 +84,14 @@ import android.os.FileUtils.FileStatus; import android.telephony.TelephonyManager; import android.text.ClipboardManager; import android.util.AndroidRuntimeException; -import android.util.DisplayMetrics; import android.util.Log; import android.view.ContextThemeWrapper; -import android.view.Display; 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; @@ -160,9 +156,6 @@ class ApplicationContext extends Context { private static ConnectivityManager sConnectivityManager; private static WifiManager sWifiManager; private static LocationManager sLocationManager; - private static boolean sIsBluetoothDeviceCached = false; - private static BluetoothDevice sBluetoothDevice; - private static IWallpaperService sWallpaperService; private static final HashMap<File, SharedPreferencesImpl> sSharedPrefs = new HashMap<File, SharedPreferencesImpl>(); @@ -177,8 +170,8 @@ class ApplicationContext extends Context { private Resources.Theme mTheme = null; private PackageManager mPackageManager; private NotificationManager mNotificationManager = null; - private AccessibilityManager mAccessibilityManager = null; private ActivityManager mActivityManager = null; + private WallpaperManager mWallpaperManager = null; private Context mReceiverRestrictedContext = null; private SearchManager mSearchManager = null; private SensorManager mSensorManager = null; @@ -188,6 +181,7 @@ class ApplicationContext extends Context { private TelephonyManager mTelephonyManager = null; private ClipboardManager mClipboardManager = null; private boolean mRestricted; + private AccountManager mAccountManager; // protected by mSync private final Object mSync = new Object(); @@ -198,9 +192,6 @@ class ApplicationContext extends Context { private File mCacheDir; - private Drawable mWallpaper; - private IWallpaperServiceCallback mWallpaperCallback = null; - private static long sInstanceCount = 0; private static final String[] EMPTY_FILE_LIST = {}; @@ -520,127 +511,37 @@ class ApplicationContext extends Context { @Override public Drawable getWallpaper() { - Drawable dr = peekWallpaper(); - return dr != null ? dr : getResources().getDrawable( - com.android.internal.R.drawable.default_wallpaper); + return getWallpaperManager().getDrawable(); } @Override - public synchronized Drawable peekWallpaper() { - if (mWallpaper != null) { - return mWallpaper; - } - mWallpaperCallback = new WallpaperCallback(this); - mWallpaper = getCurrentWallpaperLocked(); - return mWallpaper; - } - - private Drawable getCurrentWallpaperLocked() { - try { - ParcelFileDescriptor fd = getWallpaperService().getWallpaper(mWallpaperCallback); - if (fd != null) { - Bitmap bm = BitmapFactory.decodeFileDescriptor(fd.getFileDescriptor()); - if (bm != null) { - // For now clear the density until we figure out how - // to deal with it for wallpapers. - bm.setDensity(0); - return new BitmapDrawable(getResources(), bm); - } - } - } catch (RemoteException e) { - } - return null; + public Drawable peekWallpaper() { + return getWallpaperManager().peekDrawable(); } @Override public int getWallpaperDesiredMinimumWidth() { - try { - return getWallpaperService().getWidthHint(); - } catch (RemoteException e) { - // Shouldn't happen! - return 0; - } + return getWallpaperManager().getDesiredMinimumWidth(); } @Override public int getWallpaperDesiredMinimumHeight() { - try { - return getWallpaperService().getHeightHint(); - } catch (RemoteException e) { - // Shouldn't happen! - return 0; - } + return getWallpaperManager().getDesiredMinimumHeight(); } @Override public void setWallpaper(Bitmap bitmap) throws IOException { - try { - ParcelFileDescriptor fd = getWallpaperService().setWallpaper(); - if (fd == null) { - return; - } - FileOutputStream fos = null; - try { - fos = new ParcelFileDescriptor.AutoCloseOutputStream(fd); - bitmap.compress(Bitmap.CompressFormat.PNG, 90, fos); - } finally { - if (fos != null) { - fos.close(); - } - } - } catch (RemoteException e) { - } + getWallpaperManager().setBitmap(bitmap); } @Override public void setWallpaper(InputStream data) throws IOException { - try { - ParcelFileDescriptor fd = getWallpaperService().setWallpaper(); - if (fd == null) { - return; - } - FileOutputStream fos = null; - try { - fos = new ParcelFileDescriptor.AutoCloseOutputStream(fd); - setWallpaper(data, fos); - } finally { - if (fos != null) { - fos.close(); - } - } - } catch (RemoteException e) { - } - } - - private void setWallpaper(InputStream data, FileOutputStream fos) - throws IOException { - byte[] buffer = new byte[32768]; - int amt; - while ((amt=data.read(buffer)) > 0) { - fos.write(buffer, 0, amt); - } + getWallpaperManager().setStream(data); } @Override public void clearWallpaper() throws IOException { - try { - /* Set the wallpaper to the default values */ - ParcelFileDescriptor fd = getWallpaperService().setWallpaper(); - if (fd != null) { - FileOutputStream fos = null; - try { - fos = new ParcelFileDescriptor.AutoCloseOutputStream(fd); - setWallpaper(getResources().openRawResource( - com.android.internal.R.drawable.default_wallpaper), - fos); - } finally { - if (fos != null) { - fos.close(); - } - } - } - } catch (RemoteException e) { - } + getWallpaperManager().clear(); } @Override @@ -656,6 +557,27 @@ class ApplicationContext extends Context { } @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 { @@ -733,6 +655,38 @@ class ApplicationContext extends Context { } @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) { @@ -901,8 +855,12 @@ class ApplicationContext extends Context { } } 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)) { @@ -919,10 +877,8 @@ class ApplicationContext extends Context { return getLocationManager(); } else if (SEARCH_SERVICE.equals(name)) { return getSearchManager(); - } else if ( SENSOR_SERVICE.equals(name)) { + } else if (SENSOR_SERVICE.equals(name)) { return getSensorManager(); - } else if (BLUETOOTH_SERVICE.equals(name)) { - return getBluetoothDevice(); } else if (VIBRATOR_SERVICE.equals(name)) { return getVibrator(); } else if (STATUS_BAR_SERVICE.equals(name)) { @@ -938,13 +894,24 @@ class ApplicationContext extends Context { return getTelephonyManager(); } else if (CLIPBOARD_SERVICE.equals(name)) { return getClipboardManager(); - } else if (INPUT_METHOD_SERVICE.equals(name)) { - return InputMethodManager.getInstance(this); + } 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) { @@ -1001,8 +968,7 @@ class ApplicationContext extends Context { return sWifiManager; } - private NotificationManager getNotificationManager() - { + private NotificationManager getNotificationManager() { synchronized (mSync) { if (mNotificationManager == null) { mNotificationManager = new NotificationManager( @@ -1013,6 +979,16 @@ class ApplicationContext extends Context { 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) { @@ -1052,23 +1028,6 @@ class ApplicationContext extends Context { return mSearchManager; } - private BluetoothDevice getBluetoothDevice() { - if (sIsBluetoothDeviceCached) { - return sBluetoothDevice; - } - synchronized (sSync) { - IBinder b = ServiceManager.getService(BLUETOOTH_SERVICE); - if (b == null) { - sBluetoothDevice = null; - } else { - IBluetoothDevice service = IBluetoothDevice.Stub.asInterface(b); - sBluetoothDevice = new BluetoothDevice(service); - } - sIsBluetoothDeviceCached = true; - } - return sBluetoothDevice; - } - private SensorManager getSensorManager() { synchronized (mSync) { if (mSensorManager == null) { @@ -1087,16 +1046,6 @@ class ApplicationContext extends Context { return mVibrator; } - private IWallpaperService getWallpaperService() { - synchronized (sSync) { - if (sWallpaperService == null) { - IBinder b = ServiceManager.getService(WALLPAPER_SERVICE); - sWallpaperService = IWallpaperService.Stub.asInterface(b); - } - } - return sWallpaperService; - } - private AudioManager getAudioManager() { if (mAudioManager == null) { @@ -1710,6 +1659,24 @@ class ApplicationContext extends Context { } @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); @@ -1746,6 +1713,15 @@ class ApplicationContext extends Context { } @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); @@ -2766,6 +2742,7 @@ class ApplicationContext extends Context { if (mFile.exists()) { if (!mFile.renameTo(mBackupFile)) { Log.e(TAG, "Couldn't rename file " + mFile + " to backup file " + mBackupFile); + return false; } } @@ -2801,25 +2778,4 @@ class ApplicationContext extends Context { return false; } } - - private static class WallpaperCallback extends IWallpaperServiceCallback.Stub { - private WeakReference<ApplicationContext> mContext; - - public WallpaperCallback(ApplicationContext context) { - mContext = new WeakReference<ApplicationContext>(context); - } - - public synchronized void onWallpaperChanged() { - - /* The wallpaper has changed but we shouldn't eagerly load the - * wallpaper as that would be inefficient. Reset the cached wallpaper - * to null so if the user requests the wallpaper again then we'll - * fetch it. - */ - final ApplicationContext applicationContext = mContext.get(); - if (applicationContext != null) { - applicationContext.mWallpaper = null; - } - } - } } |