am d912e1f6
: Use the display\'s actual state in the view hierarchy.
* commit 'd912e1f6a111fb33118d116bd72da1a328041bca': Use the display's actual state in the view hierarchy.
This commit is contained in:
@ -50,7 +50,6 @@ oneway interface IWindow {
|
|||||||
void moved(int newX, int newY);
|
void moved(int newX, int newY);
|
||||||
void dispatchAppVisibility(boolean visible);
|
void dispatchAppVisibility(boolean visible);
|
||||||
void dispatchGetNewSurface();
|
void dispatchGetNewSurface();
|
||||||
void dispatchScreenState(boolean on);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tell the window that it is either gaining or losing focus. Keep it up
|
* Tell the window that it is either gaining or losing focus. Keep it up
|
||||||
|
@ -16840,8 +16840,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
|
|||||||
// If the screen is off assume the animation start time is now instead of
|
// If the screen is off assume the animation start time is now instead of
|
||||||
// the next frame we draw. Keeping the START_ON_FIRST_FRAME start time
|
// the next frame we draw. Keeping the START_ON_FIRST_FRAME start time
|
||||||
// would cause the animation to start when the screen turns back on
|
// would cause the animation to start when the screen turns back on
|
||||||
if (mAttachInfo != null && !mAttachInfo.mScreenOn &&
|
if (mAttachInfo != null && mAttachInfo.mDisplayState == Display.STATE_OFF
|
||||||
animation.getStartTime() == Animation.START_ON_FIRST_FRAME) {
|
&& animation.getStartTime() == Animation.START_ON_FIRST_FRAME) {
|
||||||
animation.setStartTime(AnimationUtils.currentAnimationTimeMillis());
|
animation.setStartTime(AnimationUtils.currentAnimationTimeMillis());
|
||||||
}
|
}
|
||||||
animation.reset();
|
animation.reset();
|
||||||
@ -18713,7 +18713,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
|
|||||||
* A set of information given to a view when it is attached to its parent
|
* A set of information given to a view when it is attached to its parent
|
||||||
* window.
|
* window.
|
||||||
*/
|
*/
|
||||||
static class AttachInfo {
|
final static class AttachInfo {
|
||||||
interface Callbacks {
|
interface Callbacks {
|
||||||
void playSoundEffect(int effectId);
|
void playSoundEffect(int effectId);
|
||||||
boolean performHapticFeedback(int effectId, boolean always);
|
boolean performHapticFeedback(int effectId, boolean always);
|
||||||
@ -18779,7 +18779,14 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
|
|||||||
boolean mHardwareAccelerationRequested;
|
boolean mHardwareAccelerationRequested;
|
||||||
HardwareRenderer mHardwareRenderer;
|
HardwareRenderer mHardwareRenderer;
|
||||||
|
|
||||||
boolean mScreenOn;
|
/**
|
||||||
|
* The state of the display to which the window is attached, as reported
|
||||||
|
* by {@link Display#getState()}. Note that the display state constants
|
||||||
|
* declared by {@link Display} do not exactly line up with the screen state
|
||||||
|
* constants declared by {@link View} (there are more display states than
|
||||||
|
* screen states).
|
||||||
|
*/
|
||||||
|
int mDisplayState = Display.STATE_UNKNOWN;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Scale factor used by the compatibility mode
|
* Scale factor used by the compatibility mode
|
||||||
|
@ -36,6 +36,8 @@ import android.graphics.PorterDuff;
|
|||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.graphics.Region;
|
import android.graphics.Region;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
|
import android.hardware.display.DisplayManager;
|
||||||
|
import android.hardware.display.DisplayManager.DisplayListener;
|
||||||
import android.media.AudioManager;
|
import android.media.AudioManager;
|
||||||
import android.os.Binder;
|
import android.os.Binder;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
@ -134,6 +136,7 @@ public final class ViewRootImpl implements ViewParent,
|
|||||||
final Context mContext;
|
final Context mContext;
|
||||||
final IWindowSession mWindowSession;
|
final IWindowSession mWindowSession;
|
||||||
final Display mDisplay;
|
final Display mDisplay;
|
||||||
|
final DisplayManager mDisplayManager;
|
||||||
final String mBasePackageName;
|
final String mBasePackageName;
|
||||||
|
|
||||||
final int[] mTmpLocation = new int[2];
|
final int[] mTmpLocation = new int[2];
|
||||||
@ -368,9 +371,7 @@ public final class ViewRootImpl implements ViewParent,
|
|||||||
mNoncompatDensity = context.getResources().getDisplayMetrics().noncompatDensityDpi;
|
mNoncompatDensity = context.getResources().getDisplayMetrics().noncompatDensityDpi;
|
||||||
mFallbackEventHandler = PolicyManager.makeNewFallbackEventHandler(context);
|
mFallbackEventHandler = PolicyManager.makeNewFallbackEventHandler(context);
|
||||||
mChoreographer = Choreographer.getInstance();
|
mChoreographer = Choreographer.getInstance();
|
||||||
|
mDisplayManager = (DisplayManager)context.getSystemService(Context.DISPLAY_SERVICE);
|
||||||
PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
|
|
||||||
mAttachInfo.mScreenOn = powerManager.isScreenOn();
|
|
||||||
loadSystemProperties();
|
loadSystemProperties();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -425,6 +426,10 @@ public final class ViewRootImpl implements ViewParent,
|
|||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
if (mView == null) {
|
if (mView == null) {
|
||||||
mView = view;
|
mView = view;
|
||||||
|
|
||||||
|
mAttachInfo.mDisplayState = mDisplay.getState();
|
||||||
|
mDisplayManager.registerDisplayListener(mDisplayListener, mHandler);
|
||||||
|
|
||||||
mViewLayoutDirectionInitial = mView.getRawLayoutDirection();
|
mViewLayoutDirectionInitial = mView.getRawLayoutDirection();
|
||||||
mFallbackEventHandler.setView(view);
|
mFallbackEventHandler.setView(view);
|
||||||
mWindowAttributes.copyFrom(attrs);
|
mWindowAttributes.copyFrom(attrs);
|
||||||
@ -794,18 +799,43 @@ public final class ViewRootImpl implements ViewParent,
|
|||||||
scheduleTraversals();
|
scheduleTraversals();
|
||||||
}
|
}
|
||||||
|
|
||||||
void handleScreenStateChange(boolean on) {
|
private final DisplayListener mDisplayListener = new DisplayListener() {
|
||||||
if (on != mAttachInfo.mScreenOn) {
|
@Override
|
||||||
mAttachInfo.mScreenOn = on;
|
public void onDisplayChanged(int displayId) {
|
||||||
if (mView != null) {
|
if (mView != null && mDisplay.getDisplayId() == displayId) {
|
||||||
mView.dispatchScreenStateChanged(on ? View.SCREEN_STATE_ON : View.SCREEN_STATE_OFF);
|
final int oldDisplayState = mAttachInfo.mDisplayState;
|
||||||
}
|
final int newDisplayState = mDisplay.getState();
|
||||||
if (on) {
|
if (oldDisplayState != newDisplayState) {
|
||||||
mFullRedrawNeeded = true;
|
mAttachInfo.mDisplayState = newDisplayState;
|
||||||
scheduleTraversals();
|
if (oldDisplayState != Display.STATE_UNKNOWN) {
|
||||||
|
final int oldScreenState = toViewScreenState(oldDisplayState);
|
||||||
|
final int newScreenState = toViewScreenState(newDisplayState);
|
||||||
|
if (oldScreenState != newScreenState) {
|
||||||
|
mView.dispatchScreenStateChanged(newScreenState);
|
||||||
|
}
|
||||||
|
if (oldDisplayState == Display.STATE_OFF) {
|
||||||
|
// Draw was suppressed so we need to for it to happen here.
|
||||||
|
mFullRedrawNeeded = true;
|
||||||
|
scheduleTraversals();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
@Override
|
||||||
|
public void onDisplayRemoved(int displayId) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDisplayAdded(int displayId) {
|
||||||
|
}
|
||||||
|
|
||||||
|
private int toViewScreenState(int displayState) {
|
||||||
|
return displayState == Display.STATE_OFF ?
|
||||||
|
View.SCREEN_STATE_OFF : View.SCREEN_STATE_ON;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void requestFitSystemWindows() {
|
public void requestFitSystemWindows() {
|
||||||
@ -2236,7 +2266,7 @@ public final class ViewRootImpl implements ViewParent,
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void performDraw() {
|
private void performDraw() {
|
||||||
if (!mAttachInfo.mScreenOn && !mReportNextDraw) {
|
if (mAttachInfo.mDisplayState == Display.STATE_OFF && !mReportNextDraw) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2872,6 +2902,8 @@ public final class ViewRootImpl implements ViewParent,
|
|||||||
mInputChannel = null;
|
mInputChannel = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mDisplayManager.unregisterDisplayListener(mDisplayListener);
|
||||||
|
|
||||||
unscheduleTraversals();
|
unscheduleTraversals();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2951,7 +2983,6 @@ public final class ViewRootImpl implements ViewParent,
|
|||||||
private final static int MSG_DISPATCH_SYSTEM_UI_VISIBILITY = 17;
|
private final static int MSG_DISPATCH_SYSTEM_UI_VISIBILITY = 17;
|
||||||
private final static int MSG_UPDATE_CONFIGURATION = 18;
|
private final static int MSG_UPDATE_CONFIGURATION = 18;
|
||||||
private final static int MSG_PROCESS_INPUT_EVENTS = 19;
|
private final static int MSG_PROCESS_INPUT_EVENTS = 19;
|
||||||
private final static int MSG_DISPATCH_SCREEN_STATE = 20;
|
|
||||||
private final static int MSG_CLEAR_ACCESSIBILITY_FOCUS_HOST = 21;
|
private final static int MSG_CLEAR_ACCESSIBILITY_FOCUS_HOST = 21;
|
||||||
private final static int MSG_DISPATCH_DONE_ANIMATING = 22;
|
private final static int MSG_DISPATCH_DONE_ANIMATING = 22;
|
||||||
private final static int MSG_INVALIDATE_WORLD = 23;
|
private final static int MSG_INVALIDATE_WORLD = 23;
|
||||||
@ -2998,8 +3029,6 @@ public final class ViewRootImpl implements ViewParent,
|
|||||||
return "MSG_UPDATE_CONFIGURATION";
|
return "MSG_UPDATE_CONFIGURATION";
|
||||||
case MSG_PROCESS_INPUT_EVENTS:
|
case MSG_PROCESS_INPUT_EVENTS:
|
||||||
return "MSG_PROCESS_INPUT_EVENTS";
|
return "MSG_PROCESS_INPUT_EVENTS";
|
||||||
case MSG_DISPATCH_SCREEN_STATE:
|
|
||||||
return "MSG_DISPATCH_SCREEN_STATE";
|
|
||||||
case MSG_CLEAR_ACCESSIBILITY_FOCUS_HOST:
|
case MSG_CLEAR_ACCESSIBILITY_FOCUS_HOST:
|
||||||
return "MSG_CLEAR_ACCESSIBILITY_FOCUS_HOST";
|
return "MSG_CLEAR_ACCESSIBILITY_FOCUS_HOST";
|
||||||
case MSG_DISPATCH_DONE_ANIMATING:
|
case MSG_DISPATCH_DONE_ANIMATING:
|
||||||
@ -3215,11 +3244,6 @@ public final class ViewRootImpl implements ViewParent,
|
|||||||
}
|
}
|
||||||
updateConfiguration(config, false);
|
updateConfiguration(config, false);
|
||||||
} break;
|
} break;
|
||||||
case MSG_DISPATCH_SCREEN_STATE: {
|
|
||||||
if (mView != null) {
|
|
||||||
handleScreenStateChange(msg.arg1 == 1);
|
|
||||||
}
|
|
||||||
} break;
|
|
||||||
case MSG_CLEAR_ACCESSIBILITY_FOCUS_HOST: {
|
case MSG_CLEAR_ACCESSIBILITY_FOCUS_HOST: {
|
||||||
setAccessibilityFocus(null, null);
|
setAccessibilityFocus(null, null);
|
||||||
} break;
|
} break;
|
||||||
@ -5805,12 +5829,6 @@ public final class ViewRootImpl implements ViewParent,
|
|||||||
mHandler.sendMessage(msg);
|
mHandler.sendMessage(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void dispatchScreenStateChange(boolean on) {
|
|
||||||
Message msg = mHandler.obtainMessage(MSG_DISPATCH_SCREEN_STATE);
|
|
||||||
msg.arg1 = on ? 1 : 0;
|
|
||||||
mHandler.sendMessage(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void dispatchGetNewSurface() {
|
public void dispatchGetNewSurface() {
|
||||||
Message msg = mHandler.obtainMessage(MSG_DISPATCH_GET_NEW_SURFACE);
|
Message msg = mHandler.obtainMessage(MSG_DISPATCH_GET_NEW_SURFACE);
|
||||||
mHandler.sendMessage(msg);
|
mHandler.sendMessage(msg);
|
||||||
@ -6148,14 +6166,6 @@ public final class ViewRootImpl implements ViewParent,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void dispatchScreenState(boolean on) {
|
|
||||||
final ViewRootImpl viewAncestor = mViewAncestor.get();
|
|
||||||
if (viewAncestor != null) {
|
|
||||||
viewAncestor.dispatchScreenStateChange(on);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void dispatchGetNewSurface() {
|
public void dispatchGetNewSurface() {
|
||||||
final ViewRootImpl viewAncestor = mViewAncestor.get();
|
final ViewRootImpl viewAncestor = mViewAncestor.get();
|
||||||
|
@ -56,10 +56,6 @@ public class BaseIWindow extends IWindow.Stub {
|
|||||||
public void dispatchGetNewSurface() {
|
public void dispatchGetNewSurface() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void dispatchScreenState(boolean on) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void windowFocusChanged(boolean hasFocus, boolean touchEnabled) {
|
public void windowFocusChanged(boolean hasFocus, boolean touchEnabled) {
|
||||||
}
|
}
|
||||||
|
@ -7039,7 +7039,6 @@ public class WindowManagerService extends IWindowManager.Stub
|
|||||||
if (mDisplayEnabled) {
|
if (mDisplayEnabled) {
|
||||||
mInputMonitor.setEventDispatchingLw(enabled);
|
mInputMonitor.setEventDispatchingLw(enabled);
|
||||||
}
|
}
|
||||||
sendScreenStatusToClientsLocked();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -7159,23 +7158,6 @@ public class WindowManagerService extends IWindowManager.Stub
|
|||||||
mPolicy.systemReady();
|
mPolicy.systemReady();
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(multidisplay): Call isScreenOn for each display.
|
|
||||||
private void sendScreenStatusToClientsLocked() {
|
|
||||||
final boolean on = mPowerManager.isScreenOn();
|
|
||||||
final int numDisplays = mDisplayContents.size();
|
|
||||||
for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
|
|
||||||
final WindowList windows = mDisplayContents.valueAt(displayNdx).getWindowList();
|
|
||||||
final int numWindows = windows.size();
|
|
||||||
for (int winNdx = 0; winNdx < numWindows; ++winNdx) {
|
|
||||||
try {
|
|
||||||
windows.get(winNdx).mClient.dispatchScreenState(on);
|
|
||||||
} catch (RemoteException e) {
|
|
||||||
// Ignored
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// -------------------------------------------------------------
|
// -------------------------------------------------------------
|
||||||
// Async Handler
|
// Async Handler
|
||||||
// -------------------------------------------------------------
|
// -------------------------------------------------------------
|
||||||
|
Reference in New Issue
Block a user