summaryrefslogtreecommitdiffstats
path: root/core/java/android/view/ViewRootImpl.java
diff options
context:
space:
mode:
authorDianne Hackborn <hackbod@google.com>2011-10-06 11:51:27 -0700
committerDianne Hackborn <hackbod@google.com>2011-10-06 14:57:37 -0700
commit9a230e01a1237749a8a19a5de8d46531b0c8ca6a (patch)
treec62734c0dcd00cc9add7c70bd60e8946e0915735 /core/java/android/view/ViewRootImpl.java
parentfe7fcd23d5b306db7b1fb31c901cbcbb6b66db1d (diff)
downloadframeworks_base-9a230e01a1237749a8a19a5de8d46531b0c8ca6a.zip
frameworks_base-9a230e01a1237749a8a19a5de8d46531b0c8ca6a.tar.gz
frameworks_base-9a230e01a1237749a8a19a5de8d46531b0c8ca6a.tar.bz2
Fix issue #5371530: SYSTEMUI_FLAG_HIDE_NAVIGATION reasserts itself immediately
This cleans up how ui flags are managed between the client and window manager. It still reports the global UI mode state to the callback, but we now only clear certain flags when the system goes out of a state (currently this just means the hide nav bar mode), and don't corrupt other flags in the application when the global state changes. Also introduces a sequence number between the app and window manager, to avoid using bad old data coming from the app during these transitions. Change-Id: I40bbd12d9b7b69fc0ff1c7dc0cb58a933d4dfb23
Diffstat (limited to 'core/java/android/view/ViewRootImpl.java')
-rw-r--r--core/java/android/view/ViewRootImpl.java65
1 files changed, 50 insertions, 15 deletions
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index e7c91f9..bc60b44 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -165,6 +165,8 @@ public final class ViewRootImpl extends Handler implements ViewParent,
final int mTargetSdkVersion;
+ int mSeq;
+
View mView;
View mFocusedView;
View mRealFocusedView; // this is not set to null in touch mode
@@ -308,6 +310,13 @@ public final class ViewRootImpl extends Handler implements ViewParent,
return sWindowSession;
}
}
+
+ static final class SystemUiVisibilityInfo {
+ int seq;
+ int globalVisibility;
+ int localValue;
+ int localChanges;
+ }
public ViewRootImpl(Context context) {
super();
@@ -465,7 +474,7 @@ public final class ViewRootImpl extends Handler implements ViewParent,
}
try {
mOrigWindowType = mWindowAttributes.type;
- res = sWindowSession.add(mWindow, mWindowAttributes,
+ res = sWindowSession.add(mWindow, mSeq, mWindowAttributes,
getHostVisibility(), mAttachInfo.mContentInsets,
mInputChannel);
} catch (RemoteException e) {
@@ -1045,16 +1054,21 @@ public final class ViewRootImpl extends Handler implements ViewParent,
attachInfo.mRecomputeGlobalAttributes = false;
boolean oldScreenOn = attachInfo.mKeepScreenOn;
int oldVis = attachInfo.mSystemUiVisibility;
+ boolean oldHasSystemUiListeners = attachInfo.mHasSystemUiListeners;
attachInfo.mKeepScreenOn = false;
attachInfo.mSystemUiVisibility = 0;
attachInfo.mHasSystemUiListeners = false;
host.dispatchCollectViewAttributes(0);
if (attachInfo.mKeepScreenOn != oldScreenOn
|| attachInfo.mSystemUiVisibility != oldVis
- || attachInfo.mHasSystemUiListeners) {
+ || attachInfo.mHasSystemUiListeners != oldHasSystemUiListeners) {
params = lp;
}
}
+ if (attachInfo.mForceReportNewAttributes) {
+ attachInfo.mForceReportNewAttributes = false;
+ params = lp;
+ }
if (mFirst || attachInfo.mViewVisibilityChanged) {
attachInfo.mViewVisibilityChanged = false;
@@ -1136,9 +1150,7 @@ public final class ViewRootImpl extends Handler implements ViewParent,
params.flags |= WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
}
params.subtreeSystemUiVisibility = attachInfo.mSystemUiVisibility;
- params.hasSystemUiListeners = attachInfo.mHasSystemUiListeners
- || params.subtreeSystemUiVisibility != 0
- || params.systemUiVisibility != 0;
+ params.hasSystemUiListeners = attachInfo.mHasSystemUiListeners;
}
if (DEBUG_LAYOUT) {
Log.i(TAG, "host=w:" + host.getMeasuredWidth() + ", h:" +
@@ -2545,7 +2557,7 @@ public final class ViewRootImpl extends Handler implements ViewParent,
handleDragEvent(event);
} break;
case DISPATCH_SYSTEM_UI_VISIBILITY: {
- handleDispatchSystemUiVisibilityChanged(msg.arg1);
+ handleDispatchSystemUiVisibilityChanged((SystemUiVisibilityInfo)msg.obj);
} break;
case UPDATE_CONFIGURATION: {
Configuration config = (Configuration)msg.obj;
@@ -3429,12 +3441,27 @@ public final class ViewRootImpl extends Handler implements ViewParent,
event.recycle();
}
- public void handleDispatchSystemUiVisibilityChanged(int visibility) {
+ public void handleDispatchSystemUiVisibilityChanged(SystemUiVisibilityInfo args) {
+ if (mSeq != args.seq) {
+ // The sequence has changed, so we need to update our value and make
+ // sure to do a traversal afterward so the window manager is given our
+ // most recent data.
+ mSeq = args.seq;
+ mAttachInfo.mForceReportNewAttributes = true;
+ scheduleTraversals();
+ }
if (mView == null) return;
- if (mAttachInfo != null) {
- mAttachInfo.mSystemUiVisibility = visibility;
+ if (args.localChanges != 0) {
+ if (mAttachInfo != null) {
+ mAttachInfo.mSystemUiVisibility =
+ (mAttachInfo.mSystemUiVisibility&~args.localChanges)
+ | (args.localValue&args.localChanges);
+ }
+ mView.updateLocalSystemUiVisibility(args.localValue, args.localChanges);
+ mAttachInfo.mRecomputeGlobalAttributes = true;
+ scheduleTraversals();
}
- mView.dispatchSystemUiVisibilityChanged(visibility);
+ mView.dispatchSystemUiVisibilityChanged(args.globalVisibility);
}
public void getLastTouchPoint(Point outLocation) {
@@ -3493,7 +3520,7 @@ public final class ViewRootImpl extends Handler implements ViewParent,
}
}
int relayoutResult = sWindowSession.relayout(
- mWindow, params,
+ mWindow, mSeq, params,
(int) (mView.getMeasuredWidth() * appScale + 0.5f),
(int) (mView.getMeasuredHeight() * appScale + 0.5f),
viewVisibility, insetsPending, mWinFrame,
@@ -3796,8 +3823,14 @@ public final class ViewRootImpl extends Handler implements ViewParent,
sendMessage(msg);
}
- public void dispatchSystemUiVisibilityChanged(int visibility) {
- sendMessage(obtainMessage(DISPATCH_SYSTEM_UI_VISIBILITY, visibility, 0));
+ public void dispatchSystemUiVisibilityChanged(int seq, int globalVisibility,
+ int localValue, int localChanges) {
+ SystemUiVisibilityInfo args = new SystemUiVisibilityInfo();
+ args.seq = seq;
+ args.globalVisibility = globalVisibility;
+ args.localValue = localValue;
+ args.localChanges = localChanges;
+ sendMessage(obtainMessage(DISPATCH_SYSTEM_UI_VISIBILITY, args));
}
/**
@@ -4052,10 +4085,12 @@ public final class ViewRootImpl extends Handler implements ViewParent,
}
}
- public void dispatchSystemUiVisibilityChanged(int visibility) {
+ public void dispatchSystemUiVisibilityChanged(int seq, int globalVisibility,
+ int localValue, int localChanges) {
final ViewRootImpl viewAncestor = mViewAncestor.get();
if (viewAncestor != null) {
- viewAncestor.dispatchSystemUiVisibilityChanged(visibility);
+ viewAncestor.dispatchSystemUiVisibilityChanged(seq, globalVisibility,
+ localValue, localChanges);
}
}
}