Merge "Hide the IME using InputMethodManagerInternal, because doing it that way actually works." into rvc-dev

This commit is contained in:
Josh Tsuji
2020-06-24 02:31:47 +00:00
committed by Android (Google) Code Review
6 changed files with 54 additions and 27 deletions

View File

@@ -46,7 +46,8 @@ import java.lang.annotation.Retention;
SoftInputShowHideReason.HIDE_SETTINGS_ON_CHANGE,
SoftInputShowHideReason.HIDE_POWER_BUTTON_GO_HOME,
SoftInputShowHideReason.HIDE_DOCKED_STACK_ATTACHED,
SoftInputShowHideReason.HIDE_RECENTS_ANIMATION})
SoftInputShowHideReason.HIDE_RECENTS_ANIMATION,
SoftInputShowHideReason.HIDE_BUBBLES})
public @interface SoftInputShowHideReason {
/** Show soft input by {@link android.view.inputmethod.InputMethodManager#showSoftInput}. */
int SHOW_SOFT_INPUT = 0;
@@ -140,4 +141,10 @@ public @interface SoftInputShowHideReason {
* intercept touch from app window.
*/
int HIDE_RECENTS_ANIMATION = 18;
/**
* Hide soft input when {@link com.android.systemui.bubbles.BubbleController} is expanding,
* switching, or collapsing Bubbles.
*/
int HIDE_BUBBLES = 19;
}

View File

@@ -79,6 +79,7 @@ interface IStatusBarService
void onNotificationSettingsViewed(String key);
void onNotificationBubbleChanged(String key, boolean isBubble, int flags);
void onBubbleNotificationSuppressionChanged(String key, boolean isSuppressed);
void hideCurrentInputMethodForBubbles();
void grantInlineReplyUriPermission(String key, in Uri uri, in UserHandle user, String packageName);
void clearInlineReplyUriPermissions(String key);

View File

@@ -483,12 +483,13 @@ public class BubbleController implements ConfigurationController.ConfigurationLi
}
/**
* Dispatches a back press into the expanded Bubble's ActivityView if its IME is visible,
* causing it to hide.
* Hides the current input method, wherever it may be focused, via InputMethodManagerInternal.
*/
public void hideImeFromExpandedBubble() {
if (mStackView != null) {
mStackView.hideImeFromExpandedBubble();
public void hideCurrentInputMethod() {
try {
mBarService.hideCurrentInputMethodForBubbles();
} catch (RemoteException e) {
e.printStackTrace();
}
}
@@ -693,8 +694,8 @@ public class BubbleController implements ConfigurationController.ConfigurationLi
if (mStackView == null) {
mStackView = new BubbleStackView(
mContext, mBubbleData, mSurfaceSynchronizer, mFloatingContentCoordinator,
mSysUiState, this::onAllBubblesAnimatedOut,
this::onImeVisibilityChanged);
mSysUiState, this::onAllBubblesAnimatedOut, this::onImeVisibilityChanged,
this::hideCurrentInputMethod);
mStackView.addView(mBubbleScrim);
if (mExpandListener != null) {
mStackView.setExpandListener(mExpandListener);
@@ -1589,7 +1590,11 @@ public class BubbleController implements ConfigurationController.ConfigurationLi
@Override
public void onBackPressedOnTaskRoot(RunningTaskInfo taskInfo) {
if (mStackView != null && taskInfo.displayId == getExpandedDisplayId(mContext)) {
mBubbleData.setExpanded(false);
if (mImeVisible) {
hideCurrentInputMethod();
} else {
mBubbleData.setExpanded(false);
}
}
}

View File

@@ -466,7 +466,6 @@ public class BubbleExpandedView extends LinearLayout {
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
hideImeIfVisible();
mKeyboardVisible = false;
mNeedsNewHeight = false;
if (mActivityView != null) {

View File

@@ -383,6 +383,11 @@ public class BubbleStackView extends FrameLayout
*/
public final Consumer<Boolean> mOnImeVisibilityChanged;
/**
* Callback to run to ask BubbleController to hide the current IME.
*/
private final Runnable mHideCurrentInputMethodCallback;
/**
* The currently magnetized object, which is being dragged and will be attracted to the magnetic
* dismiss target.
@@ -560,7 +565,7 @@ public class BubbleStackView extends FrameLayout
mMagneticTarget,
mIndividualBubbleMagnetListener);
hideImeFromExpandedBubble();
hideCurrentInputMethod();
// Save the magnetized individual bubble so we can dispatch touch events to it.
mMagnetizedObject = mExpandedAnimationController.getMagnetizedBubbleDraggingOut();
@@ -732,7 +737,8 @@ public class BubbleStackView extends FrameLayout
FloatingContentCoordinator floatingContentCoordinator,
SysUiState sysUiState,
Runnable allBubblesAnimatedOutAction,
Consumer<Boolean> onImeVisibilityChanged) {
Consumer<Boolean> onImeVisibilityChanged,
Runnable hideCurrentInputMethodCallback) {
super(context);
mBubbleData = data;
@@ -868,6 +874,7 @@ public class BubbleStackView extends FrameLayout
setUpOverflow();
mOnImeVisibilityChanged = onImeVisibilityChanged;
mHideCurrentInputMethodCallback = hideCurrentInputMethodCallback;
setOnApplyWindowInsetsListener((View view, WindowInsets insets) -> {
onImeVisibilityChanged.accept(insets.getInsets(WindowInsets.Type.ime()).bottom > 0);
@@ -1593,6 +1600,8 @@ public class BubbleStackView extends FrameLayout
updatePointerPosition();
if (mIsExpanded) {
hideCurrentInputMethod();
// Make the container of the expanded view transparent before removing the expanded view
// from it. Otherwise a punch hole created by {@link android.view.SurfaceView} in the
// expanded view becomes visible on the screen. See b/126856255
@@ -1601,11 +1610,6 @@ public class BubbleStackView extends FrameLayout
if (previouslySelected != null) {
previouslySelected.setContentVisibility(false);
}
if (previouslySelected != null && previouslySelected.getExpandedView() != null) {
// Hide the currently expanded bubble's IME if it's visible before switching
// to a new bubble.
previouslySelected.getExpandedView().hideImeIfVisible();
}
updateExpandedBubble();
requestUpdate();
@@ -1633,6 +1637,8 @@ public class BubbleStackView extends FrameLayout
return;
}
hideCurrentInputMethod();
mSysUiState
.setFlag(QuickStepContract.SYSUI_STATE_BUBBLES_EXPANDED, shouldExpand)
.commitUpdate(mContext.getDisplayId());
@@ -1816,12 +1822,12 @@ public class BubbleStackView extends FrameLayout
}
}
void hideImeFromExpandedBubble() {
if (mExpandedBubble != null && mExpandedBubble.getExpandedView() != null) {
// Hide the currently expanded bubble's IME if it's visible before switching to a new
// bubble.
mExpandedBubble.getExpandedView().hideImeIfVisible();
}
/**
* Asks the BubbleController to hide the IME from anywhere, whether it's focused on Bubbles or
* not.
*/
void hideCurrentInputMethod() {
mHideCurrentInputMethodCallback.run();
}
private void beforeExpandedViewAnimation() {
@@ -1938,10 +1944,6 @@ public class BubbleStackView extends FrameLayout
mAnimatingOutSurfaceContainer.setScaleX(0f);
mAnimatingOutSurfaceContainer.setScaleY(0f);
if (mExpandedBubble != null && mExpandedBubble.getExpandedView() != null) {
mExpandedBubble.getExpandedView().hideImeIfVisible();
}
// Let the expanded animation controller know that it shouldn't animate child adds/reorders
// since we're about to animate collapsed.
mExpandedAnimationController.notifyPreparingToCollapse();

View File

@@ -52,6 +52,7 @@ import android.view.WindowInsetsController.Appearance;
import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.inputmethod.SoftInputShowHideReason;
import com.android.internal.statusbar.IStatusBar;
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.statusbar.NotificationVisibility;
@@ -61,6 +62,7 @@ import com.android.internal.util.DumpUtils;
import com.android.internal.view.AppearanceRegion;
import com.android.server.LocalServices;
import com.android.server.UiThread;
import com.android.server.inputmethod.InputMethodManagerInternal;
import com.android.server.notification.NotificationDelegate;
import com.android.server.policy.GlobalActionsProvider;
import com.android.server.power.ShutdownThread;
@@ -1401,6 +1403,17 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
}
}
@Override
public void hideCurrentInputMethodForBubbles() {
final long token = Binder.clearCallingIdentity();
try {
InputMethodManagerInternal.get().hideCurrentInputMethod(
SoftInputShowHideReason.HIDE_BUBBLES);
} finally {
Binder.restoreCallingIdentity(token);
}
}
@Override
public void grantInlineReplyUriPermission(String key, Uri uri, UserHandle user,
String packageName) {