diff options
| author | 2016-08-17 18:28:59 +0000 | |
|---|---|---|
| committer | 2016-08-17 18:28:59 +0000 | |
| commit | afaf4ac7a9913ac587e6dbd7e6a24f8c0ddd90bf (patch) | |
| tree | 62e8dd054059092b279594a88cc8ba4c0881a991 | |
| parent | b074294332b2d11f97234ad1903a609828f6a61b (diff) | |
| parent | d11d1a9486d44b98e28b70c25711ebfc283b746e (diff) | |
Fix a flicker when returning to the lockscreen
am: d11d1a9486
Change-Id: Ia0b617be2bb00db24115f04f362cd072d59ebe71
9 files changed, 88 insertions, 8 deletions
diff --git a/core/java/com/android/internal/policy/IKeyguardStateCallback.aidl b/core/java/com/android/internal/policy/IKeyguardStateCallback.aidl index 419b1f8feac7..8e454db4cb04 100644 --- a/core/java/com/android/internal/policy/IKeyguardStateCallback.aidl +++ b/core/java/com/android/internal/policy/IKeyguardStateCallback.aidl @@ -20,4 +20,5 @@ interface IKeyguardStateCallback { void onSimSecureStateChanged(boolean simSecure); void onInputRestrictedStateChanged(boolean inputRestricted); void onTrustedChanged(boolean trusted); + void onHasLockscreenWallpaperChanged(boolean hasLockscreenWallpaper); }
\ No newline at end of file diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java index 0a862914b14f..56f37414a0e6 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -178,6 +178,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private boolean mBouncer; private boolean mBootCompleted; private boolean mUserUnlocked; + private boolean mHasLockscreenWallpaper; // Device provisioning state private boolean mDeviceProvisioned; @@ -1173,6 +1174,30 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } /** + * Update the state whether Keyguard currently has a lockscreen wallpaper. + * + * @param hasLockscreenWallpaper Whether Keyguard has a lockscreen wallpaper. + */ + public void setHasLockscreenWallpaper(boolean hasLockscreenWallpaper) { + if (hasLockscreenWallpaper != mHasLockscreenWallpaper) { + mHasLockscreenWallpaper = hasLockscreenWallpaper; + for (int i = mCallbacks.size() - 1; i >= 0; i--) { + KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); + if (cb != null) { + cb.onHasLockscreenWallpaperChanged(hasLockscreenWallpaper); + } + } + } + } + + /** + * @return Whether Keyguard has a lockscreen wallpaper. + */ + public boolean hasLockscreenWallpaper() { + return mHasLockscreenWallpaper; + } + + /** * Handle {@link #MSG_DPM_STATE_CHANGED} */ protected void handleDevicePolicyManagerStateChanged() { diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java index bd6c51c3b89c..4a2d356b6ddd 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java @@ -240,4 +240,9 @@ public class KeyguardUpdateMonitorCallback { * has changed. */ public void onStrongAuthStateChanged(int userId) { } + + /** + * Called when the state whether we have a lockscreen wallpaper has changed. + */ + public void onHasLockscreenWallpaperChanged(boolean hasLockscreenWallpaper) { } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 433fd00b765a..de0c77b8a2d6 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -16,7 +16,11 @@ package com.android.systemui.keyguard; -import android.annotation.UserIdInt; +import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT; +import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.SOME_AUTH_REQUIRED_AFTER_USER_REQUEST; +import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_DPM_LOCK_NOW; +import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_LOCKOUT; + import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManagerNative; @@ -82,12 +86,6 @@ import com.android.systemui.statusbar.phone.StatusBarWindowManager; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; -import java.util.List; - -import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT; -import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.SOME_AUTH_REQUIRED_AFTER_USER_REQUEST; -import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_DPM_LOCK_NOW; -import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_LOCKOUT; /** * Mediates requests related to the keyguard. This includes queries about the @@ -509,7 +507,12 @@ public class KeyguardViewMediator extends SystemUI { } } - + @Override + public void onHasLockscreenWallpaperChanged(boolean hasLockscreenWallpaper) { + synchronized (KeyguardViewMediator.this) { + notifyHasLockscreenWallpaperChanged(hasLockscreenWallpaper); + } + } }; ViewMediatorCallback mViewMediatorCallback = new ViewMediatorCallback() { @@ -2014,6 +2017,21 @@ public class KeyguardViewMediator extends SystemUI { } } + private void notifyHasLockscreenWallpaperChanged(boolean hasLockscreenWallpaper) { + int size = mKeyguardStateCallbacks.size(); + for (int i = size - 1; i >= 0; i--) { + try { + mKeyguardStateCallbacks.get(i).onHasLockscreenWallpaperChanged( + hasLockscreenWallpaper); + } catch (RemoteException e) { + Slog.w(TAG, "Failed to call onHasLockscreenWallpaperChanged", e); + if (e instanceof DeadObjectException) { + mKeyguardStateCallbacks.remove(i); + } + } + } + } + public void addStateMonitorCallback(IKeyguardStateCallback callback) { synchronized (this) { mKeyguardStateCallbacks.add(callback); @@ -2023,6 +2041,7 @@ public class KeyguardViewMediator extends SystemUI { callback.onInputRestrictedStateChanged(mInputRestricted); callback.onTrustedChanged(mUpdateMonitor.getUserHasTrust( KeyguardUpdateMonitor.getCurrentUser())); + callback.onHasLockscreenWallpaperChanged(mUpdateMonitor.hasLockscreenWallpaper()); } catch (RemoteException e) { Slog.w(TAG, "Failed to call to IKeyguardStateCallback", e); } 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 ed8a7e72a11a..2be47e417355 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java @@ -38,6 +38,8 @@ import android.os.ServiceManager; import android.os.UserHandle; import android.util.Log; +import com.android.keyguard.KeyguardUpdateMonitor; + import libcore.io.IoUtils; import java.util.Objects; @@ -52,6 +54,7 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen private final PhoneStatusBar mBar; private final WallpaperManager mWallpaperManager; private final Handler mH; + private final KeyguardUpdateMonitor mUpdateMonitor; private boolean mCached; private Bitmap mCache; @@ -66,6 +69,7 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen mH = h; mWallpaperManager = (WallpaperManager) ctx.getSystemService(Context.WALLPAPER_SERVICE); mCurrentUserId = ActivityManager.getCurrentUser(); + mUpdateMonitor = KeyguardUpdateMonitor.getInstance(ctx); IWallpaperManager service = IWallpaperManager.Stub.asInterface( ServiceManager.getService(Context.WALLPAPER_SERVICE)); @@ -89,6 +93,7 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen LoaderResult result = loadBitmap(mCurrentUserId, mSelectedUser); if (result.success) { mCached = true; + mUpdateMonitor.setHasLockscreenWallpaper(result.bitmap != null); mCache = result.bitmap; } return mCache; @@ -181,6 +186,7 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen if (result.success) { mCached = true; mCache = result.bitmap; + mUpdateMonitor.setHasLockscreenWallpaper(result.bitmap != null); mBar.updateMediaMetaData( true /* metaDataChanged */, true /* allowEnterAnimation */); } diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 2b857d74103e..1c303dc9b62b 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -5401,6 +5401,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { mKeyguardOccluded = false; mKeyguardDelegate.setOccluded(false); mStatusBar.getAttrs().privateFlags |= PRIVATE_FLAG_KEYGUARD; + if (!mKeyguardDelegate.hasLockscreenWallpaper()) { + mStatusBar.getAttrs().flags |= FLAG_SHOW_WALLPAPER; + } return true; } else if (!wasOccluded && isOccluded && showing) { mKeyguardOccluded = true; diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java index d3c592db4099..4fce49e16815 100644 --- a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java +++ b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java @@ -206,6 +206,13 @@ public class KeyguardServiceDelegate { return false; } + public boolean hasLockscreenWallpaper() { + if (mKeyguardService != null) { + return mKeyguardService.hasLockscreenWallpaper(); + } + return false; + } + public boolean isInputRestricted() { if (mKeyguardService != null) { mKeyguardState.inputRestricted = mKeyguardService.isInputRestricted(); diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java index bea31673a58b..55652fe3a4e4 100644 --- a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java +++ b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java @@ -238,6 +238,10 @@ public class KeyguardServiceWrapper implements IKeyguardService { return mKeyguardStateMonitor.isTrusted(); } + public boolean hasLockscreenWallpaper() { + return mKeyguardStateMonitor.hasLockscreenWallpaper(); + } + public boolean isSecure(int userId) { return mKeyguardStateMonitor.isSecure(userId); } diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardStateMonitor.java b/services/core/java/com/android/server/policy/keyguard/KeyguardStateMonitor.java index f3238c824104..08eaaa908d08 100644 --- a/services/core/java/com/android/server/policy/keyguard/KeyguardStateMonitor.java +++ b/services/core/java/com/android/server/policy/keyguard/KeyguardStateMonitor.java @@ -44,6 +44,7 @@ public class KeyguardStateMonitor extends IKeyguardStateCallback.Stub { private volatile boolean mSimSecure = true; private volatile boolean mInputRestricted = true; private volatile boolean mTrusted = false; + private volatile boolean mHasLockscreenWallpaper = false; private int mCurrentUserId; @@ -75,6 +76,10 @@ public class KeyguardStateMonitor extends IKeyguardStateCallback.Stub { return mTrusted; } + public boolean hasLockscreenWallpaper() { + return mHasLockscreenWallpaper; + } + @Override // Binder interface public void onShowingStateChanged(boolean showing) { mIsShowing = showing; @@ -103,6 +108,11 @@ public class KeyguardStateMonitor extends IKeyguardStateCallback.Stub { mTrusted = trusted; } + @Override // Binder interface + public void onHasLockscreenWallpaperChanged(boolean hasLockscreenWallpaper) { + mHasLockscreenWallpaper = hasLockscreenWallpaper; + } + public void dump(String prefix, PrintWriter pw) { pw.println(prefix + TAG); prefix += " "; |