Merge "Remove IME surface when occured in multi-window mode" into rvc-dev am: b55bc82d13 am: 13212d164e

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/11612967

Change-Id: I70040662b89e37015da805318d35c4e6aeb9352e
This commit is contained in:
Yunfan Chen
2020-06-12 03:47:39 +00:00
committed by Automerger Merge Worker
4 changed files with 45 additions and 3 deletions

View File

@@ -71,4 +71,6 @@ interface IInputMethodManager {
void reportActivityView(in IInputMethodClient parentClient, int childDisplayId, void reportActivityView(in IInputMethodClient parentClient, int childDisplayId,
in float[] matrixValues); in float[] matrixValues);
void removeImeSurface();
} }

View File

@@ -19,11 +19,13 @@ package com.android.systemui.wm;
import android.animation.Animator; import android.animation.Animator;
import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator; import android.animation.ValueAnimator;
import android.content.Context;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.graphics.Point; import android.graphics.Point;
import android.graphics.Rect; import android.graphics.Rect;
import android.os.Handler; import android.os.Handler;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.ServiceManager;
import android.util.Slog; import android.util.Slog;
import android.util.SparseArray; import android.util.SparseArray;
import android.view.IDisplayWindowInsetsController; import android.view.IDisplayWindowInsetsController;
@@ -36,6 +38,7 @@ import android.view.WindowInsets;
import android.view.animation.Interpolator; import android.view.animation.Interpolator;
import android.view.animation.PathInterpolator; import android.view.animation.PathInterpolator;
import com.android.internal.view.IInputMethodManager;
import com.android.systemui.TransactionPool; import com.android.systemui.TransactionPool;
import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dagger.qualifiers.Main;
@@ -352,6 +355,16 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged
dispatchEndPositioning(mDisplayId, mCancelled, t); dispatchEndPositioning(mDisplayId, mCancelled, t);
if (mAnimationDirection == DIRECTION_HIDE && !mCancelled) { if (mAnimationDirection == DIRECTION_HIDE && !mCancelled) {
t.hide(mImeSourceControl.getLeash()); t.hide(mImeSourceControl.getLeash());
final IInputMethodManager imms = getImms();
if (imms != null) {
try {
// Remove the IME surface to make the insets invisible for
// non-client controlled insets.
imms.removeImeSurface();
} catch (RemoteException e) {
Slog.e(TAG, "Failed to remove IME surface.", e);
}
}
} }
t.apply(); t.apply();
mTransactionPool.release(t); mTransactionPool.release(t);
@@ -382,9 +395,9 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged
* Called when the IME position is starting to animate. * Called when the IME position is starting to animate.
* *
* @param hiddenTop The y position of the top of the IME surface when it is hidden. * @param hiddenTop The y position of the top of the IME surface when it is hidden.
* @param shownTop The y position of the top of the IME surface when it is shown. * @param shownTop The y position of the top of the IME surface when it is shown.
* @param showing {@code true} when we are animating from hidden to shown, {@code false} * @param showing {@code true} when we are animating from hidden to shown, {@code false}
* when animating from shown to hidden. * when animating from shown to hidden.
*/ */
default void onImeStartPositioning(int displayId, int hiddenTop, int shownTop, default void onImeStartPositioning(int displayId, int hiddenTop, int shownTop,
boolean showing, SurfaceControl.Transaction t) {} boolean showing, SurfaceControl.Transaction t) {}
@@ -406,4 +419,9 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged
default void onImeEndPositioning(int displayId, boolean cancel, default void onImeEndPositioning(int displayId, boolean cancel,
SurfaceControl.Transaction t) {} SurfaceControl.Transaction t) {}
} }
public IInputMethodManager getImms() {
return IInputMethodManager.Stub.asInterface(
ServiceManager.getService(Context.INPUT_METHOD_SERVICE));
}
} }

View File

@@ -207,6 +207,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
static final int MSG_HIDE_CURRENT_INPUT_METHOD = 1035; static final int MSG_HIDE_CURRENT_INPUT_METHOD = 1035;
static final int MSG_INITIALIZE_IME = 1040; static final int MSG_INITIALIZE_IME = 1040;
static final int MSG_CREATE_SESSION = 1050; static final int MSG_CREATE_SESSION = 1050;
static final int MSG_REMOVE_IME_SURFACE = 1060;
static final int MSG_START_INPUT = 2000; static final int MSG_START_INPUT = 2000;
@@ -3946,6 +3947,12 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
} }
} }
@Override
public void removeImeSurface() {
mContext.enforceCallingPermission(Manifest.permission.INTERNAL_SYSTEM_WINDOW, null);
mHandler.sendMessage(mHandler.obtainMessage(MSG_REMOVE_IME_SURFACE));
}
@BinderThread @BinderThread
private void notifyUserAction(@NonNull IBinder token) { private void notifyUserAction(@NonNull IBinder token) {
if (DEBUG) { if (DEBUG) {
@@ -4216,6 +4223,15 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
args.recycle(); args.recycle();
return true; return true;
} }
case MSG_REMOVE_IME_SURFACE: {
try {
if (mEnabledSession != null && mEnabledSession.session != null) {
mEnabledSession.session.removeImeSurface();
}
} catch (RemoteException e) {
}
return true;
}
// --------------------------------------------------------- // ---------------------------------------------------------
case MSG_START_INPUT: { case MSG_START_INPUT: {

View File

@@ -1460,6 +1460,12 @@ public final class MultiClientInputMethodManagerService {
return null; return null;
} }
@BinderThread
@Override
public void removeImeSurface() {
reportNotSupported();
}
@BinderThread @BinderThread
@Override @Override
public boolean showSoftInput( public boolean showSoftInput(