Merge "Hide the IME using InputMethodManagerInternal, because doing it that way actually works." into rvc-dev
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -466,7 +466,6 @@ public class BubbleExpandedView extends LinearLayout {
|
||||
@Override
|
||||
protected void onDetachedFromWindow() {
|
||||
super.onDetachedFromWindow();
|
||||
hideImeIfVisible();
|
||||
mKeyboardVisible = false;
|
||||
mNeedsNewHeight = false;
|
||||
if (mActivityView != null) {
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user