Loading core/java/android/view/ImeInsetsSourceConsumer.java +16 −13 Original line number Diff line number Diff line Loading @@ -49,7 +49,7 @@ public final class ImeInsetsSourceConsumer extends InsetsSourceConsumer { * Tracks whether we have an outstanding request from the IME to show, but weren't able to * execute it because we didn't have control yet. */ private boolean mImeRequestedShow; private boolean mIsRequestedVisibleAwaitingControl; public ImeInsetsSourceConsumer( InsetsState state, Supplier<Transaction> transactionSupplier, Loading Loading @@ -88,15 +88,7 @@ public final class ImeInsetsSourceConsumer extends InsetsSourceConsumer { public void onWindowFocusLost() { super.onWindowFocusLost(); getImm().unregisterImeConsumer(this); mImeRequestedShow = false; } @Override public void show(boolean fromIme) { super.show(fromIme); if (fromIme) { mImeRequestedShow = true; } mIsRequestedVisibleAwaitingControl = false; } @Override Loading @@ -119,11 +111,14 @@ public final class ImeInsetsSourceConsumer extends InsetsSourceConsumer { // TODO: ResultReceiver for IME. // TODO: Set mShowOnNextImeRender to automatically show IME and guard it with a flag. if (getControl() == null) { // If control is null, schedule to show IME when control is available. mIsRequestedVisibleAwaitingControl = true; } // If we had a request before to show from IME (tracked with mImeRequestedShow), reaching // this code here means that we now got control, so we can start the animation immediately. // If client window is trying to control IME and IME is already visible, it is immediate. if (fromIme || mImeRequestedShow || mState.getSource(getType()).isVisible()) { mImeRequestedShow = false; if (fromIme || mState.getSource(getType()).isVisible()) { return ShowResult.SHOW_IMMEDIATELY; } Loading @@ -148,11 +143,19 @@ public final class ImeInsetsSourceConsumer extends InsetsSourceConsumer { public void setControl(@Nullable InsetsSourceControl control, int[] showTypes, int[] hideTypes) { super.setControl(control, showTypes, hideTypes); if (control == null) { if (control == getControl()) { return; } if (control == null && !mIsRequestedVisibleAwaitingControl) { hide(); } } @Override protected boolean isRequestedVisibleAwaitingControl() { return mIsRequestedVisibleAwaitingControl; } private boolean isDummyOrEmptyEditor(EditorInfo info) { // TODO(b/123044812): Handle dummy input gracefully in IME Insets API return info == null || (info.fieldId <= 0 && info.inputType <= 0); Loading core/java/android/view/InsetsSourceConsumer.java +13 −3 Original line number Diff line number Diff line Loading @@ -107,8 +107,8 @@ public class InsetsSourceConsumer { } else { // We are gaining control, and need to run an animation since previous state // didn't match if (mRequestedVisible != mState.getSource(mType).isVisible()) { if (mRequestedVisible) { if (isRequestedVisibleAwaitingControl() != mState.getSource(mType).isVisible()) { if (isRequestedVisibleAwaitingControl()) { showTypes[0] |= toPublicType(getType()); } else { hideTypes[0] |= toPublicType(getType()); Loading Loading @@ -138,6 +138,16 @@ public class InsetsSourceConsumer { return mSourceControl; } /** * Determines if the consumer will be shown after control is available. * Note: for system bars this method is same as {@link #isRequestedVisible()}. * * @return {@code true} if consumer has a pending show. */ protected boolean isRequestedVisibleAwaitingControl() { return isRequestedVisible(); } int getType() { return mType; } Loading Loading @@ -263,7 +273,7 @@ public class InsetsSourceConsumer { * Sets requested visibility from the client, regardless of whether we are able to control it at * the moment. */ private void setRequestedVisible(boolean requestedVisible) { protected void setRequestedVisible(boolean requestedVisible) { mRequestedVisible = requestedVisible; if (applyLocalVisibilityOverride()) { mController.notifyVisibilityChanged(); Loading Loading
core/java/android/view/ImeInsetsSourceConsumer.java +16 −13 Original line number Diff line number Diff line Loading @@ -49,7 +49,7 @@ public final class ImeInsetsSourceConsumer extends InsetsSourceConsumer { * Tracks whether we have an outstanding request from the IME to show, but weren't able to * execute it because we didn't have control yet. */ private boolean mImeRequestedShow; private boolean mIsRequestedVisibleAwaitingControl; public ImeInsetsSourceConsumer( InsetsState state, Supplier<Transaction> transactionSupplier, Loading Loading @@ -88,15 +88,7 @@ public final class ImeInsetsSourceConsumer extends InsetsSourceConsumer { public void onWindowFocusLost() { super.onWindowFocusLost(); getImm().unregisterImeConsumer(this); mImeRequestedShow = false; } @Override public void show(boolean fromIme) { super.show(fromIme); if (fromIme) { mImeRequestedShow = true; } mIsRequestedVisibleAwaitingControl = false; } @Override Loading @@ -119,11 +111,14 @@ public final class ImeInsetsSourceConsumer extends InsetsSourceConsumer { // TODO: ResultReceiver for IME. // TODO: Set mShowOnNextImeRender to automatically show IME and guard it with a flag. if (getControl() == null) { // If control is null, schedule to show IME when control is available. mIsRequestedVisibleAwaitingControl = true; } // If we had a request before to show from IME (tracked with mImeRequestedShow), reaching // this code here means that we now got control, so we can start the animation immediately. // If client window is trying to control IME and IME is already visible, it is immediate. if (fromIme || mImeRequestedShow || mState.getSource(getType()).isVisible()) { mImeRequestedShow = false; if (fromIme || mState.getSource(getType()).isVisible()) { return ShowResult.SHOW_IMMEDIATELY; } Loading @@ -148,11 +143,19 @@ public final class ImeInsetsSourceConsumer extends InsetsSourceConsumer { public void setControl(@Nullable InsetsSourceControl control, int[] showTypes, int[] hideTypes) { super.setControl(control, showTypes, hideTypes); if (control == null) { if (control == getControl()) { return; } if (control == null && !mIsRequestedVisibleAwaitingControl) { hide(); } } @Override protected boolean isRequestedVisibleAwaitingControl() { return mIsRequestedVisibleAwaitingControl; } private boolean isDummyOrEmptyEditor(EditorInfo info) { // TODO(b/123044812): Handle dummy input gracefully in IME Insets API return info == null || (info.fieldId <= 0 && info.inputType <= 0); Loading
core/java/android/view/InsetsSourceConsumer.java +13 −3 Original line number Diff line number Diff line Loading @@ -107,8 +107,8 @@ public class InsetsSourceConsumer { } else { // We are gaining control, and need to run an animation since previous state // didn't match if (mRequestedVisible != mState.getSource(mType).isVisible()) { if (mRequestedVisible) { if (isRequestedVisibleAwaitingControl() != mState.getSource(mType).isVisible()) { if (isRequestedVisibleAwaitingControl()) { showTypes[0] |= toPublicType(getType()); } else { hideTypes[0] |= toPublicType(getType()); Loading Loading @@ -138,6 +138,16 @@ public class InsetsSourceConsumer { return mSourceControl; } /** * Determines if the consumer will be shown after control is available. * Note: for system bars this method is same as {@link #isRequestedVisible()}. * * @return {@code true} if consumer has a pending show. */ protected boolean isRequestedVisibleAwaitingControl() { return isRequestedVisible(); } int getType() { return mType; } Loading Loading @@ -263,7 +273,7 @@ public class InsetsSourceConsumer { * Sets requested visibility from the client, regardless of whether we are able to control it at * the moment. */ private void setRequestedVisible(boolean requestedVisible) { protected void setRequestedVisible(boolean requestedVisible) { mRequestedVisible = requestedVisible; if (applyLocalVisibilityOverride()) { mController.notifyVisibilityChanged(); Loading