summaryrefslogtreecommitdiffstats
path: root/services/java/com/android/server/WallpaperManagerService.java
diff options
context:
space:
mode:
Diffstat (limited to 'services/java/com/android/server/WallpaperManagerService.java')
-rw-r--r--services/java/com/android/server/WallpaperManagerService.java119
1 files changed, 106 insertions, 13 deletions
diff --git a/services/java/com/android/server/WallpaperManagerService.java b/services/java/com/android/server/WallpaperManagerService.java
index 81255ee..481e6a4 100644
--- a/services/java/com/android/server/WallpaperManagerService.java
+++ b/services/java/com/android/server/WallpaperManagerService.java
@@ -65,7 +65,10 @@ import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;
+import com.android.internal.content.PackageMonitor;
import com.android.internal.service.wallpaper.ImageWallpaper;
+import com.android.server.DevicePolicyManagerService.ActiveAdmin;
+import com.android.server.DevicePolicyManagerService.MyPackageMonitor;
import com.android.common.FastXmlSerializer;
class WallpaperManagerService extends IWallpaperManager.Stub {
@@ -122,6 +125,7 @@ class WallpaperManagerService extends IWallpaperManager.Stub {
final Context mContext;
final IWindowManager mIWindowManager;
+ final MyPackageMonitor mMonitor;
int mWidth = -1;
int mHeight = -1;
@@ -150,6 +154,7 @@ class WallpaperManagerService extends IWallpaperManager.Stub {
WallpaperConnection mWallpaperConnection;
long mLastDiedTime;
+ boolean mWallpaperUpdating;
class WallpaperConnection extends IWallpaperConnection.Stub
implements ServiceConnection {
@@ -165,6 +170,7 @@ class WallpaperManagerService extends IWallpaperManager.Stub {
public void onServiceConnected(ComponentName name, IBinder service) {
synchronized (mLock) {
if (mWallpaperConnection == this) {
+ mLastDiedTime = SystemClock.uptimeMillis();
mService = IWallpaperService.Stub.asInterface(service);
attachServiceLocked(this);
// XXX should probably do saveSettingsLocked() later
@@ -182,8 +188,8 @@ class WallpaperManagerService extends IWallpaperManager.Stub {
mEngine = null;
if (mWallpaperConnection == this) {
Log.w(TAG, "Wallpaper service gone: " + mWallpaperComponent);
- if ((mLastDiedTime+MIN_WALLPAPER_CRASH_TIME)
- < SystemClock.uptimeMillis()) {
+ if (!mWallpaperUpdating && (mLastDiedTime+MIN_WALLPAPER_CRASH_TIME)
+ > SystemClock.uptimeMillis()) {
Log.w(TAG, "Reverting to built-in wallpaper!");
bindWallpaperComponentLocked(null);
}
@@ -205,11 +211,92 @@ class WallpaperManagerService extends IWallpaperManager.Stub {
}
}
+ class MyPackageMonitor extends PackageMonitor {
+ @Override
+ public void onPackageUpdateFinished(String packageName, int uid) {
+ synchronized (mLock) {
+ if (mWallpaperComponent != null &&
+ mWallpaperComponent.getPackageName().equals(packageName)) {
+ mWallpaperUpdating = false;
+ ComponentName comp = mWallpaperComponent;
+ clearWallpaperComponentLocked();
+ bindWallpaperComponentLocked(comp);
+ }
+ }
+ }
+
+ @Override
+ public void onPackageUpdateStarted(String packageName, int uid) {
+ synchronized (mLock) {
+ if (mWallpaperComponent != null &&
+ mWallpaperComponent.getPackageName().equals(packageName)) {
+ mWallpaperUpdating = true;
+ }
+ }
+ }
+
+ @Override
+ public boolean onHandleForceStop(Intent intent, String[] packages, int uid, boolean doit) {
+ return doPackagesChanged(doit);
+ }
+
+ @Override
+ public void onSomePackagesChanged() {
+ doPackagesChanged(true);
+ }
+
+ boolean doPackagesChanged(boolean doit) {
+ boolean changed = false;
+ synchronized (mLock) {
+ if (mWallpaperComponent != null) {
+ int change = isPackageDisappearing(mWallpaperComponent.getPackageName());
+ if (change == PACKAGE_PERMANENT_CHANGE
+ || change == PACKAGE_TEMPORARY_CHANGE) {
+ changed = true;
+ if (doit) {
+ Log.w(TAG, "Wallpaper uninstalled, removing: " + mWallpaperComponent);
+ clearWallpaperLocked();
+ }
+ }
+ }
+ if (mNextWallpaperComponent != null) {
+ int change = isPackageDisappearing(mNextWallpaperComponent.getPackageName());
+ if (change == PACKAGE_PERMANENT_CHANGE
+ || change == PACKAGE_TEMPORARY_CHANGE) {
+ mNextWallpaperComponent = null;
+ }
+ }
+ if (mWallpaperComponent != null
+ && isPackageModified(mWallpaperComponent.getPackageName())) {
+ try {
+ mContext.getPackageManager().getServiceInfo(
+ mWallpaperComponent, 0);
+ } catch (NameNotFoundException e) {
+ Log.w(TAG, "Wallpaper component gone, removing: " + mWallpaperComponent);
+ clearWallpaperLocked();
+ }
+ }
+ if (mNextWallpaperComponent != null
+ && isPackageModified(mNextWallpaperComponent.getPackageName())) {
+ try {
+ mContext.getPackageManager().getServiceInfo(
+ mNextWallpaperComponent, 0);
+ } catch (NameNotFoundException e) {
+ mNextWallpaperComponent = null;
+ }
+ }
+ }
+ return changed;
+ }
+ }
+
public WallpaperManagerService(Context context) {
if (DEBUG) Log.v(TAG, "WallpaperService startup");
mContext = context;
mIWindowManager = IWindowManager.Stub.asInterface(
ServiceManager.getService(Context.WINDOW_SERVICE));
+ mMonitor = new MyPackageMonitor();
+ mMonitor.register(context, true);
WALLPAPER_DIR.mkdirs();
loadSettingsLocked();
mWallpaperObserver.startWatching();
@@ -241,16 +328,20 @@ class WallpaperManagerService extends IWallpaperManager.Stub {
public void clearWallpaper() {
if (DEBUG) Log.v(TAG, "clearWallpaper");
synchronized (mLock) {
- File f = WALLPAPER_FILE;
- if (f.exists()) {
- f.delete();
- }
- final long ident = Binder.clearCallingIdentity();
- try {
- bindWallpaperComponentLocked(null);
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
+ clearWallpaperLocked();
+ }
+ }
+
+ public void clearWallpaperLocked() {
+ File f = WALLPAPER_FILE;
+ if (f.exists()) {
+ f.delete();
+ }
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ bindWallpaperComponentLocked(null);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
}
}
@@ -499,7 +590,9 @@ class WallpaperManagerService extends IWallpaperManager.Stub {
mWidth, mHeight);
} catch (RemoteException e) {
Log.w(TAG, "Failed attaching wallpaper; clearing", e);
- bindWallpaperComponentLocked(null);
+ if (!mWallpaperUpdating) {
+ bindWallpaperComponentLocked(null);
+ }
}
}