summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Riddle Hsu <riddlehsu@google.com> 2023-05-19 22:49:09 +0800
committer Riddle Hsu <riddlehsu@google.com> 2023-05-19 14:53:07 +0000
commit3756211c110b83ff4561e4a8adbfe6521638fde2 (patch)
tree43535315ea3d13f3356d35d0ce121f14987b8540
parentb7a23d62a9bf7f7fc05ad2fb02b3e73ebb44d466 (diff)
Propagate last-ime-shown in the same task explicitly
For example: Task [ top: Activity B with a focused EditText and IME is shown Activity A with a focused EditText ] The test expects that after B calls finish, the IME will show for A automatically. Previously, the ime-restore relied on a task snapshot when the activity is finishing. But the snapshot is unnecessary because there is no task switch. The logic worked accidentally by the heavy snapshot operation. Since shell transition should be able to centralize the timing to take snapshot to reduce duplicated snapshot in a cleaner way, it is more reasonable to propagate last-ime-shown directly. Bug: 283413681 Test: atest com.android.inputmethod.stresstest.AutoShowTest \ #autoShow_backwardWithKeyboardOn Change-Id: Ic58d1afd6e0e2f7db2136ac60818e3b46f338bc8
-rw-r--r--services/core/java/com/android/server/wm/ActivityRecord.java8
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java8
2 files changed, 12 insertions, 4 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index d84c01309286..3db031510317 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -3570,6 +3570,14 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
// Tell window manager to prepare for this one to be removed.
setVisibility(false);
+ // Propagate the last IME visibility in the same task, so the IME can show
+ // automatically if the next activity has a focused editable view.
+ if (mLastImeShown && mTransitionController.isShellTransitionsEnabled()) {
+ final ActivityRecord nextRunning = task.topRunningActivity();
+ if (nextRunning != null) {
+ nextRunning.mLastImeShown = true;
+ }
+ }
if (getTaskFragment().getPausingActivity() == null) {
ProtoLog.v(WM_DEBUG_STATES, "Finish needs to pause: %s", this);
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 322c11a7cc4b..e33c6f03c720 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -9254,7 +9254,6 @@ public class WindowManagerService extends IWindowManager.Stub
boolean shouldRestoreImeVisibility(IBinder imeTargetWindowToken) {
final Task imeTargetWindowTask;
- boolean hadRequestedShowIme = false;
synchronized (mGlobalLock) {
final WindowState imeTargetWindow = mWindowMap.get(imeTargetWindowToken);
if (imeTargetWindow == null) {
@@ -9264,14 +9263,15 @@ public class WindowManagerService extends IWindowManager.Stub
if (imeTargetWindowTask == null) {
return false;
}
- if (imeTargetWindow.mActivityRecord != null) {
- hadRequestedShowIme = imeTargetWindow.mActivityRecord.mLastImeShown;
+ if (imeTargetWindow.mActivityRecord != null
+ && imeTargetWindow.mActivityRecord.mLastImeShown) {
+ return true;
}
}
final TaskSnapshot snapshot = getTaskSnapshot(imeTargetWindowTask.mTaskId,
imeTargetWindowTask.mUserId, false /* isLowResolution */,
false /* restoreFromDisk */);
- return snapshot != null && snapshot.hasImeSurface() || hadRequestedShowIme;
+ return snapshot != null && snapshot.hasImeSurface();
}
@Override