diff options
12 files changed, 132 insertions, 41 deletions
diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java index 5d667e1fa3f2..6e28982fe4f8 100644 --- a/core/java/android/inputmethodservice/InputMethodService.java +++ b/core/java/android/inputmethodservice/InputMethodService.java @@ -1979,31 +1979,25 @@ public class InputMethodService extends AbstractInputMethodService { // We want our own movement method to handle the key, so the // cursor will properly move in our own word wrapping. if (count == MOVEMENT_DOWN) { - if (movement.onKeyDown(eet, - (Spannable)eet.getText(), keyCode, event)) { + if (movement.onKeyDown(eet, eet.getText(), keyCode, event)) { reportExtractedMovement(keyCode, 1); return true; } } else if (count == MOVEMENT_UP) { - if (movement.onKeyUp(eet, - (Spannable)eet.getText(), keyCode, event)) { + if (movement.onKeyUp(eet, eet.getText(), keyCode, event)) { return true; } } else { - if (movement.onKeyOther(eet, (Spannable)eet.getText(), event)) { + if (movement.onKeyOther(eet, eet.getText(), event)) { reportExtractedMovement(keyCode, count); } else { KeyEvent down = KeyEvent.changeAction(event, KeyEvent.ACTION_DOWN); - if (movement.onKeyDown(eet, - (Spannable)eet.getText(), keyCode, down)) { + if (movement.onKeyDown(eet, eet.getText(), keyCode, down)) { KeyEvent up = KeyEvent.changeAction(event, KeyEvent.ACTION_UP); - movement.onKeyUp(eet, - (Spannable)eet.getText(), keyCode, up); + movement.onKeyUp(eet, eet.getText(), keyCode, up); while (--count > 0) { - movement.onKeyDown(eet, - (Spannable)eet.getText(), keyCode, down); - movement.onKeyUp(eet, - (Spannable)eet.getText(), keyCode, up); + movement.onKeyDown(eet, eet.getText(), keyCode, down); + movement.onKeyUp(eet, eet.getText(), keyCode, up); } reportExtractedMovement(keyCode, count); } @@ -2119,7 +2113,7 @@ public class InputMethodService extends AbstractInputMethodService { } else { InputConnection ic = getCurrentInputConnection(); if (ic != null) { - ic.commitText(String.valueOf((char) charCode), 1); + ic.commitText(String.valueOf(charCode), 1); } } break; diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 0be3069c51c2..3514c5de0d09 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -75,6 +75,8 @@ import com.android.systemui.statusbar.phone.ScrimController; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.statusbar.phone.StatusBarWindowManager; +import java.io.FileDescriptor; +import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; @@ -1641,6 +1643,30 @@ public class KeyguardViewMediator extends SystemUI { return mViewMediatorCallback; } + @Override + public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + pw.print(" mSystemReady: "); pw.println(mSystemReady); + pw.print(" mBootCompleted: "); pw.println(mBootCompleted); + pw.print(" mBootSendUserPresent: "); pw.println(mBootSendUserPresent); + pw.print(" mExternallyEnabled: "); pw.println(mExternallyEnabled); + pw.print(" mNeedToReshowWhenReenabled: "); pw.println(mNeedToReshowWhenReenabled); + pw.print(" mShowing: "); pw.println(mShowing); + pw.print(" mInputRestricted: "); pw.println(mInputRestricted); + pw.print(" mOccluded: "); pw.println(mOccluded); + pw.print(" mDelayedShowingSequence: "); pw.println(mDelayedShowingSequence); + pw.print(" mExitSecureCallback: "); pw.println(mExitSecureCallback); + pw.print(" mDeviceInteractive: "); pw.println(mDeviceInteractive); + pw.print(" mGoingToSleep: "); pw.println(mGoingToSleep); + pw.print(" mHiding: "); pw.println(mHiding); + pw.print(" mWaitingUntilKeyguardVisible: "); pw.println(mWaitingUntilKeyguardVisible); + pw.print(" mKeyguardDonePending: "); pw.println(mKeyguardDonePending); + pw.print(" mHideAnimationRun: "); pw.println(mHideAnimationRun); + pw.print(" mPendingReset: "); pw.println(mPendingReset); + pw.print(" mPendingLock: "); pw.println(mPendingLock); + pw.print(" mWakeAndUnlocking: "); pw.println(mWakeAndUnlocking); + pw.print(" mDrawnCallback: "); pw.println(mDrawnCallback); + } + private static class StartKeyguardExitAnimParams { long startTime; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java index a1d73d28901d..51c22081f46c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java @@ -2156,6 +2156,7 @@ public class NotificationStackScrollLayout extends ViewGroup case MotionEvent.ACTION_DOWN: { final int y = (int) ev.getY(); + mScrolledToTopOnFirstDown = isScrolledToTop(); if (getChildAtPosition(ev.getX(), y) == null) { setIsBeingDragged(false); recycleVelocityTracker(); @@ -2169,7 +2170,6 @@ public class NotificationStackScrollLayout extends ViewGroup mLastMotionY = y; mDownX = (int) ev.getX(); mActivePointerId = ev.getPointerId(0); - mScrolledToTopOnFirstDown = isScrolledToTop(); initOrResetVelocityTracker(); mVelocityTracker.addMovement(ev); diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 751acb6c19f0..a8a007378d53 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -1400,16 +1400,14 @@ final class ActivityStack { // If the top activity is not fullscreen, then we need to // make sure any activities under it are now visible. boolean aboveTop = true; - boolean behindFullscreen = !isStackVisibleLocked(); + final boolean stackInvisible = !isStackVisibleLocked(); + boolean behindFullscreenActivity = stackInvisible; boolean noStackActivityResumed = (isInStackLocked(starting) == null); for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) { final TaskRecord task = mTaskHistory.get(taskNdx); final ArrayList<ActivityRecord> activities = task.mActivities; - // Set to true if an activity in this task is fullscreen thereby hiding other - // activities in the same task. Initialized to the same value as behindFullscreen - // which represent if the entire task/stack is behind another fullscreen task/stack. - boolean behindFullscreenActivity = behindFullscreen; + for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) { final ActivityRecord r = activities.get(activityNdx); if (r.finishing) { @@ -1507,18 +1505,18 @@ final class ActivityStack { // At this point, nothing else needs to be shown in this task. behindFullscreenActivity = true; if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Fullscreen: at " + r - + " behindFullscreen=" + behindFullscreen + + " stackInvisible=" + stackInvisible + " behindFullscreenActivity=" + behindFullscreenActivity); } else if (!isHomeStack() && r.frontOfTask && task.isOverHomeStack()) { behindFullscreenActivity = true; if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Showing home: at " + r - + " behindFullscreen=" + behindFullscreen + + " stackInvisible=" + stackInvisible + " behindFullscreenActivity=" + behindFullscreenActivity); } } else { if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Make invisible? " + r + " finishing=" + r.finishing - + " state=" + r.state + " behindFullscreen=" + behindFullscreen + + " state=" + r.state + " stackInvisible=" + stackInvisible + " behindFullscreenActivity=" + behindFullscreenActivity); // Now for any activities that aren't visible to the user, make // sure they no longer are keeping the screen frozen. @@ -1566,9 +1564,12 @@ final class ActivityStack { } } } - // Factoring if the previous task is fullscreen there by affecting the visibility of - // task behind it. - behindFullscreen |= task.mFullscreen; + if (mStackId == FREEFORM_WORKSPACE_STACK_ID) { + // The visibility of tasks and the activities they contain in freeform stack are + // determined individually unlike other stacks where the visibility or fullscreen + // status of an activity in a previous task affects other. + behindFullscreenActivity = stackInvisible; + } } if (mTranslucentActivityWaiting != null && diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 63d0ba131aee..3053904cf444 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -7061,5 +7061,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (mBurnInProtectionHelper != null) { mBurnInProtectionHelper.dump(prefix, pw); } + if (mKeyguardDelegate != null) { + mKeyguardDelegate.dump(prefix, pw); + } } } diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java index 6b45941d91ec..7ae3c79e0fe5 100644 --- a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java +++ b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java @@ -23,6 +23,8 @@ import com.android.internal.policy.IKeyguardDrawnCallback; import com.android.internal.policy.IKeyguardExitCallback; import com.android.internal.policy.IKeyguardService; +import java.io.PrintWriter; + /** * A local class that keeps a cache of keyguard state that can be restored in the event * keyguard crashes. It currently also allows runtime-selectable @@ -393,4 +395,26 @@ public class KeyguardServiceDelegate { mKeyguardService.onActivityDrawn(); } } + + public void dump(String prefix, PrintWriter pw) { + pw.println(prefix + TAG); + prefix += " "; + pw.println(prefix + "showing=" + mKeyguardState.showing); + pw.println(prefix + "showingAndNotOccluded=" + mKeyguardState.showingAndNotOccluded); + pw.println(prefix + "inputRestricted=" + mKeyguardState.inputRestricted); + pw.println(prefix + "occluded=" + mKeyguardState.occluded); + pw.println(prefix + "secure=" + mKeyguardState.secure); + pw.println(prefix + "dreaming=" + mKeyguardState.dreaming); + pw.println(prefix + "systemIsReady=" + mKeyguardState.systemIsReady); + pw.println(prefix + "deviceHasKeyguard=" + mKeyguardState.deviceHasKeyguard); + pw.println(prefix + "enabled=" + mKeyguardState.enabled); + pw.println(prefix + "offReason=" + mKeyguardState.offReason); + pw.println(prefix + "currentUser=" + mKeyguardState.currentUser); + pw.println(prefix + "bootCompleted=" + mKeyguardState.bootCompleted); + pw.println(prefix + "screenState=" + mKeyguardState.screenState); + pw.println(prefix + "interactiveState=" + mKeyguardState.interactiveState); + if (mKeyguardService != null) { + mKeyguardService.dump(prefix, pw); + } + } } diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java index cd88b664e2f8..429b18866a61 100644 --- a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java +++ b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java @@ -27,6 +27,8 @@ import com.android.internal.policy.IKeyguardExitCallback; import com.android.internal.policy.IKeyguardService; import com.android.internal.policy.IKeyguardStateCallback; +import java.io.PrintWriter; + /** * A wrapper class for KeyguardService. It implements IKeyguardService to ensure the interface * remains consistent. @@ -239,4 +241,8 @@ public class KeyguardServiceWrapper implements IKeyguardService { public boolean isInputRestricted() { return mKeyguardStateMonitor.isInputRestricted(); } + + public void dump(String prefix, PrintWriter pw) { + mKeyguardStateMonitor.dump(prefix, pw); + } }
\ No newline at end of file diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardStateMonitor.java b/services/core/java/com/android/server/policy/keyguard/KeyguardStateMonitor.java index f1f9c5087aa7..30cff039f11a 100644 --- a/services/core/java/com/android/server/policy/keyguard/KeyguardStateMonitor.java +++ b/services/core/java/com/android/server/policy/keyguard/KeyguardStateMonitor.java @@ -25,6 +25,8 @@ import com.android.internal.policy.IKeyguardService; import com.android.internal.policy.IKeyguardStateCallback; import com.android.internal.widget.LockPatternUtils; +import java.io.PrintWriter; + /** * Maintains a cached copy of Keyguard's state. * @hide @@ -90,4 +92,13 @@ public class KeyguardStateMonitor extends IKeyguardStateCallback.Stub { public void onInputRestrictedStateChanged(boolean inputRestricted) { mInputRestricted = inputRestricted; } + + public void dump(String prefix, PrintWriter pw) { + pw.println(prefix + TAG); + prefix += " "; + pw.println(prefix + "mIsShowing=" + mIsShowing); + pw.println(prefix + "mSimSecure=" + mSimSecure); + pw.println(prefix + "mInputRestricted=" + mInputRestricted); + pw.println(prefix + "mCurrentUserId=" + mCurrentUserId); + } }
\ No newline at end of file diff --git a/services/core/java/com/android/server/tv/TvInputManagerService.java b/services/core/java/com/android/server/tv/TvInputManagerService.java index ee2353f1a1e8..d814ebf0351f 100644 --- a/services/core/java/com/android/server/tv/TvInputManagerService.java +++ b/services/core/java/com/android/server/tv/TvInputManagerService.java @@ -445,14 +445,16 @@ public final class TvInputManagerService extends SystemService { // Unregister all callbacks and unbind all services. for (ServiceState serviceState : userState.serviceStateMap.values()) { - if (serviceState.callback != null) { - try { - serviceState.service.unregisterCallback(serviceState.callback); - } catch (RemoteException e) { - Slog.e(TAG, "error in unregisterCallback", e); + if (serviceState.service != null) { + if (serviceState.callback != null) { + try { + serviceState.service.unregisterCallback(serviceState.callback); + } catch (RemoteException e) { + Slog.e(TAG, "error in unregisterCallback", e); + } } + mContext.unbindService(serviceState.connection); } - mContext.unbindService(serviceState.connection); } userState.serviceStateMap.clear(); } @@ -1974,7 +1976,12 @@ public final class TvInputManagerService extends SystemService { Slog.d(TAG, "onServiceConnected(component=" + component + ")"); } synchronized (mLock) { - UserState userState = getOrCreateUserStateLocked(mUserId); + UserState userState = mUserStates.get(mUserId); + if (userState == null) { + // The user was removed while connecting. + mContext.unbindService(this); + return; + } ServiceState serviceState = userState.serviceStateMap.get(mComponent); serviceState.service = ITvInputService.Stub.asInterface(service); diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 666d902682a7..07a850bfe17c 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -40,6 +40,13 @@ class Task implements DimLayer.DimLayerUser { * when no window animation is driving it. */ private static final int DEFAULT_DIM_DURATION = 200; + // Return value from {@link setBounds} indicating no change was made to the Task bounds. + static final int BOUNDS_CHANGE_NONE = 0; + // Return value from {@link setBounds} indicating the position of the Task bounds changed. + static final int BOUNDS_CHANGE_POSITION = 1; + // Return value from {@link setBounds} indicating the size of the Task bounds changed. + static final int BOUNDS_CHANGE_SIZE = 1 << 1; + TaskStack mStack; final AppTokenList mAppTokens = new AppTokenList(); final int mTaskId; @@ -165,7 +172,7 @@ class Task implements DimLayer.DimLayerUser { } /** Set the task bounds. Passing in null sets the bounds to fullscreen. */ - boolean setBounds(Rect bounds, Configuration config) { + int setBounds(Rect bounds, Configuration config) { if (config == null) { config = Configuration.EMPTY; } @@ -190,7 +197,7 @@ class Task implements DimLayer.DimLayerUser { // ensure bounds are entirely within the display rect if (!bounds.intersect(mTmpRect)) { // Can't set bounds outside the containing display...Sorry! - return false; + return BOUNDS_CHANGE_NONE; } } mFullscreen = mTmpRect.equals(bounds); @@ -199,17 +206,25 @@ class Task implements DimLayer.DimLayerUser { if (bounds == null) { // Can't set to fullscreen if we don't have a display to get bounds from... - return false; + return BOUNDS_CHANGE_NONE; } if (mBounds.equals(bounds) && oldFullscreen == mFullscreen && mRotation == rotation) { - return false; + return BOUNDS_CHANGE_NONE; + } + + int boundsChange = BOUNDS_CHANGE_NONE; + if (mBounds.left != bounds.left || mBounds.right != bounds.right) { + boundsChange |= BOUNDS_CHANGE_POSITION; + } + if (mBounds.width() != bounds.width() || mBounds.height() != bounds.height()) { + boundsChange |= BOUNDS_CHANGE_SIZE; } mBounds.set(bounds); mRotation = rotation; updateDimLayer(); mOverrideConfig = mFullscreen ? Configuration.EMPTY : config; - return true; + return boundsChange; } void getBounds(Rect out) { diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index d345aca6892c..69440b883d00 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -4638,8 +4638,12 @@ public class WindowManagerService extends IWindowManager.Stub throw new IllegalArgumentException("resizeTask: taskId " + taskId + " not found."); } - if (task.setBounds(bounds, configuration)) { - task.resizeWindows(); + final int boundsChanged = task.setBounds(bounds, configuration); + if (boundsChanged != Task.BOUNDS_CHANGE_NONE) { + if ((boundsChanged & Task.BOUNDS_CHANGE_SIZE) == Task.BOUNDS_CHANGE_SIZE) { + task.resizeWindows(); + } + if (relayout) { task.getDisplayContent().layoutNeeded = true; mWindowPlacerLocked.performSurfacePlacement(); diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowSession.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowSession.java index 9824fa1b4702..299790765e39 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowSession.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowSession.java @@ -148,7 +148,7 @@ public final class BridgeWindowSession implements IWindowSession { } @Override - public boolean startMoving(IWindow window, float startX, float startY) + public boolean startMovingTask(IWindow window, float startX, float startY) throws RemoteException { // pass for now return false; |