Fix a flicker when returning to the lockscreen

If we return to the lockscreen from a FLAG_SHOW_WHEN_LOCKED activity,
there was an additional black flicker as the wallpaper wasn't shown
for a couple of frames. The issue is that we didn't set the wallpaper
flag again, to fix another flicker with lockscreen wallpapers. Now,
we pass the state whether we currently have a lockscreen wallpaper
and if we don't have one, we immediately set the wallpaper flag
again.

Bug: 30829255
Bug: 30883413
Change-Id: I9faeaa77b98eb02058171ce19cf90b43826ebe9e
This commit is contained in:
Jorim Jaggi
2016-08-16 16:02:32 -07:00
parent 8aacc3cf98
commit d11d1a9486
9 changed files with 88 additions and 8 deletions

View File

@@ -20,4 +20,5 @@ interface IKeyguardStateCallback {
void onSimSecureStateChanged(boolean simSecure); void onSimSecureStateChanged(boolean simSecure);
void onInputRestrictedStateChanged(boolean inputRestricted); void onInputRestrictedStateChanged(boolean inputRestricted);
void onTrustedChanged(boolean trusted); void onTrustedChanged(boolean trusted);
void onHasLockscreenWallpaperChanged(boolean hasLockscreenWallpaper);
} }

View File

@@ -178,6 +178,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
private boolean mBouncer; private boolean mBouncer;
private boolean mBootCompleted; private boolean mBootCompleted;
private boolean mUserUnlocked; private boolean mUserUnlocked;
private boolean mHasLockscreenWallpaper;
// Device provisioning state // Device provisioning state
private boolean mDeviceProvisioned; private boolean mDeviceProvisioned;
@@ -1172,6 +1173,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} * Handle {@link #MSG_DPM_STATE_CHANGED}
*/ */

View File

@@ -240,4 +240,9 @@ public class KeyguardUpdateMonitorCallback {
* has changed. * has changed.
*/ */
public void onStrongAuthStateChanged(int userId) { } public void onStrongAuthStateChanged(int userId) { }
/**
* Called when the state whether we have a lockscreen wallpaper has changed.
*/
public void onHasLockscreenWallpaperChanged(boolean hasLockscreenWallpaper) { }
} }

View File

@@ -16,7 +16,11 @@
package com.android.systemui.keyguard; 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.Activity;
import android.app.ActivityManager; import android.app.ActivityManager;
import android.app.ActivityManagerNative; import android.app.ActivityManagerNative;
@@ -82,12 +86,6 @@ import com.android.systemui.statusbar.phone.StatusBarWindowManager;
import java.io.FileDescriptor; import java.io.FileDescriptor;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.util.ArrayList; 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 * 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() { 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) { public void addStateMonitorCallback(IKeyguardStateCallback callback) {
synchronized (this) { synchronized (this) {
mKeyguardStateCallbacks.add(callback); mKeyguardStateCallbacks.add(callback);
@@ -2023,6 +2041,7 @@ public class KeyguardViewMediator extends SystemUI {
callback.onInputRestrictedStateChanged(mInputRestricted); callback.onInputRestrictedStateChanged(mInputRestricted);
callback.onTrustedChanged(mUpdateMonitor.getUserHasTrust( callback.onTrustedChanged(mUpdateMonitor.getUserHasTrust(
KeyguardUpdateMonitor.getCurrentUser())); KeyguardUpdateMonitor.getCurrentUser()));
callback.onHasLockscreenWallpaperChanged(mUpdateMonitor.hasLockscreenWallpaper());
} catch (RemoteException e) { } catch (RemoteException e) {
Slog.w(TAG, "Failed to call to IKeyguardStateCallback", e); Slog.w(TAG, "Failed to call to IKeyguardStateCallback", e);
} }

View File

@@ -38,6 +38,8 @@ import android.os.ServiceManager;
import android.os.UserHandle; import android.os.UserHandle;
import android.util.Log; import android.util.Log;
import com.android.keyguard.KeyguardUpdateMonitor;
import libcore.io.IoUtils; import libcore.io.IoUtils;
import java.util.Objects; import java.util.Objects;
@@ -52,6 +54,7 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen
private final PhoneStatusBar mBar; private final PhoneStatusBar mBar;
private final WallpaperManager mWallpaperManager; private final WallpaperManager mWallpaperManager;
private final Handler mH; private final Handler mH;
private final KeyguardUpdateMonitor mUpdateMonitor;
private boolean mCached; private boolean mCached;
private Bitmap mCache; private Bitmap mCache;
@@ -66,6 +69,7 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen
mH = h; mH = h;
mWallpaperManager = (WallpaperManager) ctx.getSystemService(Context.WALLPAPER_SERVICE); mWallpaperManager = (WallpaperManager) ctx.getSystemService(Context.WALLPAPER_SERVICE);
mCurrentUserId = ActivityManager.getCurrentUser(); mCurrentUserId = ActivityManager.getCurrentUser();
mUpdateMonitor = KeyguardUpdateMonitor.getInstance(ctx);
IWallpaperManager service = IWallpaperManager.Stub.asInterface( IWallpaperManager service = IWallpaperManager.Stub.asInterface(
ServiceManager.getService(Context.WALLPAPER_SERVICE)); ServiceManager.getService(Context.WALLPAPER_SERVICE));
@@ -89,6 +93,7 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen
LoaderResult result = loadBitmap(mCurrentUserId, mSelectedUser); LoaderResult result = loadBitmap(mCurrentUserId, mSelectedUser);
if (result.success) { if (result.success) {
mCached = true; mCached = true;
mUpdateMonitor.setHasLockscreenWallpaper(result.bitmap != null);
mCache = result.bitmap; mCache = result.bitmap;
} }
return mCache; return mCache;
@@ -181,6 +186,7 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen
if (result.success) { if (result.success) {
mCached = true; mCached = true;
mCache = result.bitmap; mCache = result.bitmap;
mUpdateMonitor.setHasLockscreenWallpaper(result.bitmap != null);
mBar.updateMediaMetaData( mBar.updateMediaMetaData(
true /* metaDataChanged */, true /* allowEnterAnimation */); true /* metaDataChanged */, true /* allowEnterAnimation */);
} }

View File

@@ -5319,6 +5319,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mKeyguardOccluded = false; mKeyguardOccluded = false;
mKeyguardDelegate.setOccluded(false); mKeyguardDelegate.setOccluded(false);
mStatusBar.getAttrs().privateFlags |= PRIVATE_FLAG_KEYGUARD; mStatusBar.getAttrs().privateFlags |= PRIVATE_FLAG_KEYGUARD;
if (!mKeyguardDelegate.hasLockscreenWallpaper()) {
mStatusBar.getAttrs().flags |= FLAG_SHOW_WALLPAPER;
}
return true; return true;
} else if (!wasOccluded && isOccluded && showing) { } else if (!wasOccluded && isOccluded && showing) {
mKeyguardOccluded = true; mKeyguardOccluded = true;

View File

@@ -206,6 +206,13 @@ public class KeyguardServiceDelegate {
return false; return false;
} }
public boolean hasLockscreenWallpaper() {
if (mKeyguardService != null) {
return mKeyguardService.hasLockscreenWallpaper();
}
return false;
}
public boolean isInputRestricted() { public boolean isInputRestricted() {
if (mKeyguardService != null) { if (mKeyguardService != null) {
mKeyguardState.inputRestricted = mKeyguardService.isInputRestricted(); mKeyguardState.inputRestricted = mKeyguardService.isInputRestricted();

View File

@@ -238,6 +238,10 @@ public class KeyguardServiceWrapper implements IKeyguardService {
return mKeyguardStateMonitor.isTrusted(); return mKeyguardStateMonitor.isTrusted();
} }
public boolean hasLockscreenWallpaper() {
return mKeyguardStateMonitor.hasLockscreenWallpaper();
}
public boolean isSecure(int userId) { public boolean isSecure(int userId) {
return mKeyguardStateMonitor.isSecure(userId); return mKeyguardStateMonitor.isSecure(userId);
} }

View File

@@ -44,6 +44,7 @@ public class KeyguardStateMonitor extends IKeyguardStateCallback.Stub {
private volatile boolean mSimSecure = true; private volatile boolean mSimSecure = true;
private volatile boolean mInputRestricted = true; private volatile boolean mInputRestricted = true;
private volatile boolean mTrusted = false; private volatile boolean mTrusted = false;
private volatile boolean mHasLockscreenWallpaper = false;
private int mCurrentUserId; private int mCurrentUserId;
@@ -75,6 +76,10 @@ public class KeyguardStateMonitor extends IKeyguardStateCallback.Stub {
return mTrusted; return mTrusted;
} }
public boolean hasLockscreenWallpaper() {
return mHasLockscreenWallpaper;
}
@Override // Binder interface @Override // Binder interface
public void onShowingStateChanged(boolean showing) { public void onShowingStateChanged(boolean showing) {
mIsShowing = showing; mIsShowing = showing;
@@ -103,6 +108,11 @@ public class KeyguardStateMonitor extends IKeyguardStateCallback.Stub {
mTrusted = trusted; mTrusted = trusted;
} }
@Override // Binder interface
public void onHasLockscreenWallpaperChanged(boolean hasLockscreenWallpaper) {
mHasLockscreenWallpaper = hasLockscreenWallpaper;
}
public void dump(String prefix, PrintWriter pw) { public void dump(String prefix, PrintWriter pw) {
pw.println(prefix + TAG); pw.println(prefix + TAG);
prefix += " "; prefix += " ";