summaryrefslogtreecommitdiffstats
path: root/policy/src/com/android/internal
diff options
context:
space:
mode:
authorDianne Hackborn <hackbod@google.com>2011-09-20 11:20:31 -0700
committerDianne Hackborn <hackbod@google.com>2011-09-20 11:20:31 -0700
commitbc1aa7bbc753ebcd32da4507fa23215489b6d314 (patch)
tree30bd8e78d30370a7c4997543c9925699f52c4675 /policy/src/com/android/internal
parent2ee1ffb144800802c566bebe062f324297a791ba (diff)
downloadframeworks_base-bc1aa7bbc753ebcd32da4507fa23215489b6d314.zip
frameworks_base-bc1aa7bbc753ebcd32da4507fa23215489b6d314.tar.gz
frameworks_base-bc1aa7bbc753ebcd32da4507fa23215489b6d314.tar.bz2
Fix issue #5312624: Lock screen very flickery
The key thing was to fix isVisibleOrBehindKeyguardLw() so that it wouldn't count a window as not visible if it was just currently in the process of drawing due to an orientation change. Also improve logic in deciding when to turn screen on to better ensure the screen is in a stable state, in particular treating screen off as a frozen screen and not allowing it to turn on until the update of the screen due to any config change is done. Change-Id: If82199f3773270b2d07f9c7de9da2dad8c7b28d7
Diffstat (limited to 'policy/src/com/android/internal')
-rwxr-xr-xpolicy/src/com/android/internal/policy/impl/PhoneWindowManager.java51
1 files changed, 33 insertions, 18 deletions
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index b229615..c8c0041 100755
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -127,7 +127,6 @@ import static android.view.WindowManager.LayoutParams.TYPE_BOOT_PROGRESS;
import android.view.WindowManagerImpl;
import android.view.WindowManagerPolicy;
import android.view.KeyCharacterMap.FallbackAction;
-import android.view.WindowManagerPolicy.ScreenOnListener;
import android.view.accessibility.AccessibilityEvent;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
@@ -287,7 +286,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
int mLidKeyboardAccessibility;
int mLidNavigationAccessibility;
int mLongPressOnPowerBehavior = -1;
- boolean mScreenOn = false;
+ boolean mScreenOnEarly = false;
+ boolean mScreenOnFully = false;
boolean mOrientationSensorEnabled = false;
int mCurrentAppOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
static final int DEFAULT_ACCELEROMETER_ROTATION = 0;
@@ -547,11 +547,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
//Could have been invoked due to screen turning on or off or
//change of the currently visible window's orientation
- if (localLOGV) Log.v(TAG, "Screen status="+mScreenOn+
+ if (localLOGV) Log.v(TAG, "Screen status="+mScreenOnEarly+
", current orientation="+mCurrentAppOrientation+
", SensorEnabled="+mOrientationSensorEnabled);
boolean disable = true;
- if (mScreenOn) {
+ if (mScreenOnEarly) {
if (needSensorRunningLp()) {
disable = false;
//enable listener if not already enabled
@@ -2094,11 +2094,13 @@ public class PhoneWindowManager implements WindowManagerPolicy {
/** {@inheritDoc} */
public void animatingWindowLw(WindowState win,
WindowManager.LayoutParams attrs) {
+ if (DEBUG_LAYOUT) Slog.i(TAG, "Win " + win + ": isVisibleOrBehindKeyguardLw="
+ + win.isVisibleOrBehindKeyguardLw());
if (mTopFullscreenOpaqueWindowState == null &&
win.isVisibleOrBehindKeyguardLw()) {
if ((attrs.flags & FLAG_FORCE_NOT_FULLSCREEN) != 0) {
mForceStatusBar = true;
- }
+ }
if (attrs.type >= FIRST_APPLICATION_WINDOW
&& attrs.type <= LAST_APPLICATION_WINDOW
&& attrs.x == 0 && attrs.y == 0
@@ -2137,10 +2139,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {
: null;
if (mStatusBar != null) {
- if (localLOGV) Log.i(TAG, "force=" + mForceStatusBar
+ if (DEBUG_LAYOUT) Log.i(TAG, "force=" + mForceStatusBar
+ " top=" + mTopFullscreenOpaqueWindowState);
if (mForceStatusBar) {
- if (DEBUG_LAYOUT) Log.v(TAG, "Showing status bar");
+ if (DEBUG_LAYOUT) Log.v(TAG, "Showing status bar: forced");
if (mStatusBar.showLw(true)) changes |= FINISH_LAYOUT_REDO_LAYOUT;
} else if (mTopFullscreenOpaqueWindowState != null) {
if (localLOGV) {
@@ -2168,11 +2170,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
}});
}
- } else if (localLOGV) {
+ } else if (DEBUG_LAYOUT) {
Log.v(TAG, "Preventing status bar from hiding by policy");
}
} else {
- if (DEBUG_LAYOUT) Log.v(TAG, "Showing status bar");
+ if (DEBUG_LAYOUT) Log.v(TAG, "Showing status bar: top is not fullscreen");
if (mStatusBar.showLw(true)) changes |= FINISH_LAYOUT_REDO_LAYOUT;
}
}
@@ -2809,7 +2811,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
public void screenTurnedOff(int why) {
EventLog.writeEvent(70000, 0);
synchronized (mLock) {
- mScreenOn = false;
+ mScreenOnEarly = false;
+ mScreenOnFully = false;
}
mKeyguardMediator.onScreenTurnedOff(why);
synchronized (mLock) {
@@ -2831,6 +2834,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
@Override public void sendResult(Bundle data) {
Slog.i(TAG, "Lock screen displayed!");
screenOnListener.onScreenOn();
+ synchronized (mLock) {
+ mScreenOnFully = true;
+ }
}
});
} catch (RemoteException e) {
@@ -2838,11 +2844,14 @@ public class PhoneWindowManager implements WindowManagerPolicy {
} else {
Slog.i(TAG, "No lock screen!");
screenOnListener.onScreenOn();
+ synchronized (mLock) {
+ mScreenOnFully = true;
+ }
}
}
});
synchronized (mLock) {
- mScreenOn = true;
+ mScreenOnEarly = true;
updateOrientationListenerLp();
updateLockScreenTimeout();
updateScreenSaverTimeoutLocked();
@@ -2850,8 +2859,13 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
/** {@inheritDoc} */
- public boolean isScreenOn() {
- return mScreenOn;
+ public boolean isScreenOnEarly() {
+ return mScreenOnEarly;
+ }
+
+ /** {@inheritDoc} */
+ public boolean isScreenOnFully() {
+ return mScreenOnFully;
}
/** {@inheritDoc} */
@@ -3238,7 +3252,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
synchronized (mScreenSaverActivator) {
mHandler.removeCallbacks(mScreenSaverActivator);
- if (mScreenSaverEnabled && mScreenOn && mScreenSaverTimeout > 0) {
+ if (mScreenSaverEnabled && mScreenOnEarly && mScreenSaverTimeout > 0) {
if (localLOGV)
Log.v(TAG, "scheduling screensaver for " + mScreenSaverTimeout + "ms from now");
mHandler.postDelayed(mScreenSaverActivator, mScreenSaverTimeout);
@@ -3246,7 +3260,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
if (localLOGV) {
if (mScreenSaverTimeout == 0)
Log.v(TAG, "screen saver disabled by user");
- else if (!mScreenOn)
+ else if (!mScreenOnEarly)
Log.v(TAG, "screen saver disabled while screen off");
else
Log.v(TAG, "screen saver disabled by wakelock");
@@ -3267,7 +3281,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
private void updateLockScreenTimeout() {
synchronized (mScreenLockTimeout) {
- boolean enable = (mAllowLockscreenWhenOn && mScreenOn && mKeyguardMediator.isSecure());
+ boolean enable = (mAllowLockscreenWhenOn && mScreenOnEarly && mKeyguardMediator.isSecure());
if (mLockScreenTimerActive != enable) {
if (enable) {
if (localLOGV) Log.v(TAG, "setting lockscreen timer");
@@ -3476,7 +3490,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
public boolean allowKeyRepeat() {
// disable key repeat when screen is off
- return mScreenOn;
+ return mScreenOnEarly;
}
private void updateSystemUiVisibility() {
@@ -3532,7 +3546,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
pw.print(mLidKeyboardAccessibility);
pw.print(" mLidNavigationAccessibility="); pw.print(mLidNavigationAccessibility);
pw.print(" mLongPressOnPowerBehavior="); pw.println(mLongPressOnPowerBehavior);
- pw.print(prefix); pw.print("mScreenOn="); pw.print(mScreenOn);
+ pw.print(prefix); pw.print("mScreenOnEarly="); pw.print(mScreenOnEarly);
+ pw.print(" mScreenOnFully="); pw.print(mScreenOnFully);
pw.print(" mOrientationSensorEnabled="); pw.print(mOrientationSensorEnabled);
pw.print(" mHasSoftInput="); pw.println(mHasSoftInput);
pw.print(prefix); pw.print("mUnrestrictedScreen=("); pw.print(mUnrestrictedScreenLeft);