summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRomain Guy <romainguy@google.com>2012-03-08 11:14:07 -0800
committerRomain Guy <romainguy@google.com>2012-03-08 15:05:12 -0800
commitbb9908b828a8cfd5965553be66faa6af89973697 (patch)
tree33ab74a9cb8ad69058cece5ae83d4b82f7b51633
parent3bef5e9f3aa90465ee3ab66ef33d7a88d1b0c5c1 (diff)
downloadframeworks_base-bb9908b828a8cfd5965553be66faa6af89973697.zip
frameworks_base-bb9908b828a8cfd5965553be66faa6af89973697.tar.gz
frameworks_base-bb9908b828a8cfd5965553be66faa6af89973697.tar.bz2
Dispatch screen state change events to Views
Bug #6120957 Using this new callback, views can interrupt and resume their animations or other periodic tasks based on the current state of the display. Change-Id: I398f4abd421e9c5f207107bf1009a7b92cf45daa
-rw-r--r--api/current.txt3
-rw-r--r--core/java/android/view/IWindow.aidl2
-rw-r--r--core/java/android/view/View.java33
-rw-r--r--core/java/android/view/ViewGroup.java11
-rw-r--r--core/java/android/view/ViewRootImpl.java21
-rw-r--r--core/java/android/widget/TextView.java30
-rw-r--r--core/java/com/android/internal/view/BaseIWindow.java2
-rw-r--r--services/java/com/android/server/wm/WindowManagerService.java2
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindow.java3
9 files changed, 94 insertions, 13 deletions
diff --git a/api/current.txt b/api/current.txt
index dbe57d1..a18e4f8 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -23370,6 +23370,7 @@ package android.view {
method public void onResolvedTextDirectionReset();
method protected void onRestoreInstanceState(android.os.Parcelable);
method protected android.os.Parcelable onSaveInstanceState();
+ method public void onScreenStateChanged(int);
method protected void onScrollChanged(int, int, int, int);
method protected boolean onSetAlpha(int);
method protected void onSizeChanged(int, int, int, int);
@@ -23579,6 +23580,8 @@ package android.view {
field public static final android.util.Property ROTATION_Y;
field public static final android.util.Property SCALE_X;
field public static final android.util.Property SCALE_Y;
+ field public static final int SCREEN_STATE_OFF = 2; // 0x2
+ field public static final int SCREEN_STATE_ON = 1; // 0x1
field public static final int SCROLLBARS_INSIDE_INSET = 16777216; // 0x1000000
field public static final int SCROLLBARS_INSIDE_OVERLAY = 0; // 0x0
field public static final int SCROLLBARS_OUTSIDE_INSET = 50331648; // 0x3000000
diff --git a/core/java/android/view/IWindow.aidl b/core/java/android/view/IWindow.aidl
index acb1387..497bc90b 100644
--- a/core/java/android/view/IWindow.aidl
+++ b/core/java/android/view/IWindow.aidl
@@ -49,7 +49,7 @@ oneway interface IWindow {
boolean reportDraw, in Configuration newConfig);
void dispatchAppVisibility(boolean visible);
void dispatchGetNewSurface();
- void dispatchScreenStatus(boolean on);
+ void dispatchScreenState(boolean on);
/**
* Tell the window that it is either gaining or losing focus. Keep it up
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 94531c8..14e2d6f 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -1994,6 +1994,20 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal
public static final int FIND_VIEWS_WITH_ACCESSIBILITY_NODE_PROVIDERS = 0x00000004;
/**
+ * Indicates that the screen has changed state and is now off.
+ *
+ * @see #onScreenStateChanged(int)
+ */
+ public static final int SCREEN_STATE_OFF = 0x0;
+
+ /**
+ * Indicates that the screen has changed state and is now on.
+ *
+ * @see #onScreenStateChanged(int
+ */
+ public static final int SCREEN_STATE_ON = 0x1;
+
+ /**
* Controls the over-scroll mode for this view.
* See {@link #overScrollBy(int, int, int, int, int, int, int, int, boolean)},
* {@link #OVER_SCROLL_ALWAYS}, {@link #OVER_SCROLL_IF_CONTENT_SCROLLS},
@@ -9604,6 +9618,25 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal
}
/**
+ * @see #onScreenStateChanged(int)
+ */
+ void dispatchScreenStateChanged(int screenState) {
+ onScreenStateChanged(screenState);
+ }
+
+ /**
+ * This method is called whenever the state of the screen this view is
+ * attached to changes. A state change will usually occurs when the screen
+ * turns on or off (whether it happens automatically or the user does it
+ * manually.)
+ *
+ * @param screenState The new state of the screen. Can be either
+ * {@link #SCREEN_STATE_ON} or {@link #SCREEN_STATE_OFF}
+ */
+ public void onScreenStateChanged(int screenState) {
+ }
+
+ /**
* Resolve and cache the layout direction. LTR is set initially. This is implicitly supposing
* that the parent directionality can and will be resolved before its children.
*/
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index 0c63286..c9e0242 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -2254,6 +2254,17 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
}
@Override
+ void dispatchScreenStateChanged(int screenState) {
+ super.dispatchScreenStateChanged(screenState);
+
+ final int count = mChildrenCount;
+ final View[] children = mChildren;
+ for (int i = 0; i < count; i++) {
+ children[i].dispatchScreenStateChanged(screenState);
+ }
+ }
+
+ @Override
boolean dispatchPopulateAccessibilityEventInternal(AccessibilityEvent event) {
boolean handled = super.dispatchPopulateAccessibilityEventInternal(event);
if (handled) {
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 7fd05c3..9cde153 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -761,9 +761,12 @@ public final class ViewRootImpl implements ViewParent,
scheduleTraversals();
}
- void handleScreenStatusChange(boolean on) {
+ void handleScreenStateChange(boolean on) {
if (on != mAttachInfo.mScreenOn) {
mAttachInfo.mScreenOn = on;
+ if (mView != null) {
+ mView.dispatchScreenStateChanged(on ? View.SCREEN_STATE_ON : View.SCREEN_STATE_OFF);
+ }
if (on) {
mFullRedrawNeeded = true;
scheduleTraversals();
@@ -2500,7 +2503,7 @@ public final class ViewRootImpl implements ViewParent,
private final static int MSG_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_ID = 21;
private final static int MSG_FIND_ACCESSIBLITY_NODE_INFO_BY_TEXT = 22;
private final static int MSG_PROCESS_INPUT_EVENTS = 23;
- private final static int MSG_DISPATCH_SCREEN_STATUS = 24;
+ private final static int MSG_DISPATCH_SCREEN_STATE = 24;
final class ViewRootHandler extends Handler {
@Override
@@ -2757,9 +2760,9 @@ public final class ViewRootImpl implements ViewParent,
.findAccessibilityNodeInfosByTextUiThread(msg);
}
} break;
- case MSG_DISPATCH_SCREEN_STATUS: {
+ case MSG_DISPATCH_SCREEN_STATE: {
if (mView != null) {
- handleScreenStatusChange(msg.arg1 == 1);
+ handleScreenStateChange(msg.arg1 == 1);
}
} break;
}
@@ -4142,8 +4145,8 @@ public final class ViewRootImpl implements ViewParent,
mHandler.sendMessage(msg);
}
- public void dispatchScreenStatusChange(boolean on) {
- Message msg = mHandler.obtainMessage(MSG_DISPATCH_SCREEN_STATUS);
+ public void dispatchScreenStateChange(boolean on) {
+ Message msg = mHandler.obtainMessage(MSG_DISPATCH_SCREEN_STATE);
msg.arg1 = on ? 1 : 0;
mHandler.sendMessage(msg);
}
@@ -4349,13 +4352,13 @@ public final class ViewRootImpl implements ViewParent,
}
}
- public void dispatchScreenStatus(boolean on) {
+ public void dispatchScreenState(boolean on) {
final ViewRootImpl viewAncestor = mViewAncestor.get();
if (viewAncestor != null) {
- viewAncestor.dispatchScreenStatusChange(on);
+ viewAncestor.dispatchScreenStateChange(on);
}
}
-
+
public void dispatchGetNewSurface() {
final ViewRootImpl viewAncestor = mViewAncestor.get();
if (viewAncestor != null) {
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 47e10cc..6ac889a 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -4266,6 +4266,12 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
@Override
+ public void onScreenStateChanged(int screenState) {
+ super.onScreenStateChanged(screenState);
+ if (mEditor != null) getEditor().onScreenStateChanged(screenState);
+ }
+
+ @Override
protected boolean isPaddingOffsetRequired() {
return mShadowRadius != 0 || mDrawables != null;
}
@@ -11386,6 +11392,30 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
hideControllers();
}
+ void onScreenStateChanged(int screenState) {
+ switch (screenState) {
+ case SCREEN_STATE_ON:
+ resumeBlink();
+ break;
+ case SCREEN_STATE_OFF:
+ suspendBlink();
+ break;
+ }
+ }
+
+ private void suspendBlink() {
+ if (mBlink != null) {
+ mBlink.cancel();
+ }
+ }
+
+ private void resumeBlink() {
+ if (mBlink != null) {
+ mBlink.uncancel();
+ makeBlink();
+ }
+ }
+
void adjustInputType(boolean password, boolean passwordInputType,
boolean webPasswordInputType, boolean numberPasswordInputType) {
// mInputType has been set from inputType, possibly modified by mInputMethod.
diff --git a/core/java/com/android/internal/view/BaseIWindow.java b/core/java/com/android/internal/view/BaseIWindow.java
index e695f8e..15d11d8 100644
--- a/core/java/com/android/internal/view/BaseIWindow.java
+++ b/core/java/com/android/internal/view/BaseIWindow.java
@@ -49,7 +49,7 @@ public class BaseIWindow extends IWindow.Stub {
public void dispatchGetNewSurface() {
}
- public void dispatchScreenStatus(boolean on) {
+ public void dispatchScreenState(boolean on) {
}
public void windowFocusChanged(boolean hasFocus, boolean touchEnabled) {
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java
index 023f97d..def22a9 100644
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -6579,7 +6579,7 @@ public class WindowManagerService extends IWindowManager.Stub
for (int i = count - 1; i >= 0; i--) {
WindowState win = mWindows.get(i);
try {
- win.mClient.dispatchScreenStatus(on);
+ win.mClient.dispatchScreenState(on);
} catch (RemoteException e) {
// Ignored
}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindow.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindow.java
index 965f553..7c683c9 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindow.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindow.java
@@ -53,7 +53,8 @@ public final class BridgeWindow implements IWindow {
}
@Override
- public void dispatchScreenStatus(boolean on) throws RemoteException {
+ public void dispatchScreenState(boolean on) throws RemoteException {
+ // pass for now.
}
@Override