diff options
| author | 2016-04-19 16:41:18 -0700 | |
|---|---|---|
| committer | 2016-04-19 16:41:36 -0700 | |
| commit | 751f33f8c73892a34f99eb0f4c8266b87a331283 (patch) | |
| tree | e1c33ba79daf6f2a8f9f45ba4efb6a99920f9025 | |
| parent | 6ed4e35e49fb9d1e485f53b4ce309865d98a6058 (diff) | |
Fix NPE in WallpaperDrawable
Fixes: 28272898
Change-Id: I0377a341c253c79f5179b3a9c8eadcf51f9ffad3
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java | 48 | ||||
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java | 3 |
2 files changed, 44 insertions, 7 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java index 92f3585f43ef..15cf5525f7f1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.phone; +import android.annotation.Nullable; import android.app.ActivityManager; import android.app.IWallpaperManager; import android.app.IWallpaperManagerCallback; @@ -26,6 +27,7 @@ import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Rect; import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; import android.graphics.drawable.DrawableWrapper; import android.os.Bundle; import android.os.Handler; @@ -161,12 +163,16 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen */ public static class WallpaperDrawable extends DrawableWrapper { - private Bitmap mBackground; - private Rect mTmpRect = new Rect(); + private final ConstantState mState; + private final Rect mTmpRect = new Rect(); public WallpaperDrawable(Resources r, Bitmap b) { - super(new BitmapDrawable(r, b)); - mBackground = b; + this(r, new ConstantState(b)); + } + + private WallpaperDrawable(Resources r, ConstantState state) { + super(new BitmapDrawable(r, state.mBackground)); + mState = state; } @Override @@ -183,8 +189,8 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen protected void onBoundsChange(Rect bounds) { int vwidth = getBounds().width(); int vheight = getBounds().height(); - int dwidth = mBackground.getWidth(); - int dheight = mBackground.getHeight(); + int dwidth = mState.mBackground.getWidth(); + int dheight = mState.mBackground.getHeight(); float scale; float dx = 0, dy = 0; @@ -207,5 +213,35 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen super.onBoundsChange(mTmpRect); } + + @Override + public ConstantState getConstantState() { + return mState; + } + + static class ConstantState extends Drawable.ConstantState { + + private final Bitmap mBackground; + + ConstantState(Bitmap background) { + mBackground = background; + } + + @Override + public Drawable newDrawable() { + return newDrawable(null); + } + + @Override + public Drawable newDrawable(@Nullable Resources res) { + return new WallpaperDrawable(res, this); + } + + @Override + public int getChangingConfigurations() { + // DrawableWrapper already handles this for us. + return 0; + } + } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index d3f3b2d58e1e..712f8143cbc5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -2021,7 +2021,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, if (metaDataChanged) { if (mBackdropBack.getDrawable() != null) { Drawable drawable = - mBackdropBack.getDrawable().getConstantState().newDrawable().mutate(); + mBackdropBack.getDrawable().getConstantState() + .newDrawable(mBackdropFront.getResources()).mutate(); mBackdropFront.setImageDrawable(drawable); if (mScrimSrcModeEnabled) { mBackdropFront.getDrawable().mutate().setXfermode(mSrcOverXferMode); |