summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/java/android/view/WindowManagerPolicy.java7
-rwxr-xr-xpolicy/src/com/android/internal/policy/impl/PhoneWindowManager.java47
-rwxr-xr-xservices/java/com/android/server/wm/WindowManagerService.java4
3 files changed, 45 insertions, 13 deletions
diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java
index 5025a29..e725e75 100644
--- a/core/java/android/view/WindowManagerPolicy.java
+++ b/core/java/android/view/WindowManagerPolicy.java
@@ -1100,6 +1100,13 @@ public interface WindowManagerPolicy {
public void stopScreenSaver();
/**
+ * Set the last used input method window state. This state is used to make IME transition
+ * smooth.
+ * @hide
+ */
+ public void setLastInputMethodWindowLw(WindowState ime, WindowState target);
+
+ /**
* Print the WindowManagerPolicy's state into the given stream.
*
* @param prefix Text to print at the front of each line.
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index 40acc61..b3ca171 100755
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -324,6 +324,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
volatile boolean mPowerKeyHandled; // accessed from input reader and handler thread
boolean mPendingPowerKeyUpCanceled;
Handler mHandler;
+ WindowState mLastInputMethodWindow = null;
+ WindowState mLastInputMethodTargetWindow = null;
static final int RECENT_APPS_BEHAVIOR_SHOW_OR_DISMISS = 0;
static final int RECENT_APPS_BEHAVIOR_EXIT_TOUCH_MODE_AND_SHOW = 1;
@@ -2395,6 +2397,14 @@ public class PhoneWindowManager implements WindowManagerPolicy {
if (win == mStatusBar || win == mNavigationBar) {
return;
}
+ final boolean needsToOffsetInputMethodTarget =
+ (win == mLastInputMethodTargetWindow && mLastInputMethodWindow != null);
+ if (needsToOffsetInputMethodTarget) {
+ if (DEBUG_LAYOUT) {
+ Slog.i(TAG, "Offset ime target window by the last ime window state");
+ }
+ offsetInputMethodWindowLw(mLastInputMethodWindow);
+ }
final int fl = attrs.flags;
final int sim = attrs.softInputMode;
@@ -2672,22 +2682,27 @@ public class PhoneWindowManager implements WindowManagerPolicy {
// Dock windows carve out the bottom of the screen, so normal windows
// can't appear underneath them.
if (attrs.type == TYPE_INPUT_METHOD && !win.getGivenInsetsPendingLw()) {
- int top = win.getContentFrameLw().top;
- top += win.getGivenContentInsetsLw().top;
- if (mContentBottom > top) {
- mContentBottom = top;
- }
- top = win.getVisibleFrameLw().top;
- top += win.getGivenVisibleInsetsLw().top;
- if (mCurBottom > top) {
- mCurBottom = top;
- }
- if (DEBUG_LAYOUT) Log.v(TAG, "Input method: mDockBottom="
- + mDockBottom + " mContentBottom="
- + mContentBottom + " mCurBottom=" + mCurBottom);
+ setLastInputMethodWindowLw(null, null);
+ offsetInputMethodWindowLw(win);
}
}
+ private void offsetInputMethodWindowLw(WindowState win) {
+ int top = win.getContentFrameLw().top;
+ top += win.getGivenContentInsetsLw().top;
+ if (mContentBottom > top) {
+ mContentBottom = top;
+ }
+ top = win.getVisibleFrameLw().top;
+ top += win.getGivenVisibleInsetsLw().top;
+ if (mCurBottom > top) {
+ mCurBottom = top;
+ }
+ if (DEBUG_LAYOUT) Log.v(TAG, "Input method: mDockBottom="
+ + mDockBottom + " mContentBottom="
+ + mContentBottom + " mCurBottom=" + mCurBottom);
+ }
+
/** {@inheritDoc} */
@Override
public void finishLayoutLw() {
@@ -4184,6 +4199,12 @@ public class PhoneWindowManager implements WindowManagerPolicy {
return mHasNavigationBar;
}
+ @Override
+ public void setLastInputMethodWindowLw(WindowState ime, WindowState target) {
+ mLastInputMethodWindow = ime;
+ mLastInputMethodTargetWindow = target;
+ }
+
public void dump(String prefix, FileDescriptor fd, PrintWriter pw, String[] args) {
pw.print(prefix); pw.print("mSafeMode="); pw.print(mSafeMode);
pw.print(" mSystemReady="); pw.print(mSystemReady);
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java
index 70da61a..9eb2577 100755
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -2262,6 +2262,7 @@ public class WindowManagerService extends IWindowManager.Stub
boolean imMayMove = true;
if (attrs.type == TYPE_INPUT_METHOD) {
+ win.mGivenInsetsPending = true;
mInputMethodWindow = win;
addInputMethodWindowToListLocked(win);
imMayMove = false;
@@ -3422,6 +3423,9 @@ public class WindowManagerService extends IWindowManager.Stub
synchronized(mWindowMap) {
WindowToken wtoken = mTokenMap.remove(token);
if (wtoken != null) {
+ if (wtoken.windowType == TYPE_INPUT_METHOD && mInputMethodWindow != null) {
+ mPolicy.setLastInputMethodWindowLw(mInputMethodWindow, mInputMethodTarget);
+ }
boolean delayed = false;
if (!wtoken.hidden) {
wtoken.hidden = true;