Merge "Report WINDOW_FOCUS_GAIN_REPORT_ONLY when the served connection remains" into rvc-dev am: b121512580
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/11686078 Change-Id: I63b9925dec9f752b08ee06e863ac8bd8f918700c
This commit is contained in:
@@ -125,6 +125,13 @@ public final class ImeFocusController {
|
|||||||
final View viewForWindowFocus = focusedView != null ? focusedView : mViewRootImpl.mView;
|
final View viewForWindowFocus = focusedView != null ? focusedView : mViewRootImpl.mView;
|
||||||
onViewFocusChanged(viewForWindowFocus, true);
|
onViewFocusChanged(viewForWindowFocus, true);
|
||||||
|
|
||||||
|
// Skip starting input when the next focused view is same as served view and the served
|
||||||
|
// input connection still exists.
|
||||||
|
final boolean nextFocusIsServedView = mServedView != null && mServedView == focusedView;
|
||||||
|
if (nextFocusIsServedView && immDelegate.isAcceptingText()) {
|
||||||
|
forceFocus = false;
|
||||||
|
}
|
||||||
|
|
||||||
immDelegate.startInputAsyncOnWindowFocusGain(viewForWindowFocus,
|
immDelegate.startInputAsyncOnWindowFocusGain(viewForWindowFocus,
|
||||||
windowAttribute.softInputMode, windowAttribute.flags, forceFocus);
|
windowAttribute.softInputMode, windowAttribute.flags, forceFocus);
|
||||||
}
|
}
|
||||||
@@ -247,6 +254,7 @@ public final class ImeFocusController {
|
|||||||
void setCurrentRootView(ViewRootImpl rootView);
|
void setCurrentRootView(ViewRootImpl rootView);
|
||||||
boolean isCurrentRootView(ViewRootImpl rootView);
|
boolean isCurrentRootView(ViewRootImpl rootView);
|
||||||
boolean isRestartOnNextWindowFocus(boolean reset);
|
boolean isRestartOnNextWindowFocus(boolean reset);
|
||||||
|
boolean isAcceptingText();
|
||||||
}
|
}
|
||||||
|
|
||||||
public View getServedView() {
|
public View getServedView() {
|
||||||
|
|||||||
@@ -616,12 +616,19 @@ public final class InputMethodManager {
|
|||||||
// For some reason we didn't do a startInput + windowFocusGain, so
|
// For some reason we didn't do a startInput + windowFocusGain, so
|
||||||
// we'll just do a window focus gain and call it a day.
|
// we'll just do a window focus gain and call it a day.
|
||||||
try {
|
try {
|
||||||
if (DEBUG) Log.v(TAG, "Reporting focus gain, without startInput");
|
View servedView = controller.getServedView();
|
||||||
|
boolean nextFocusIsServedView = servedView != null && servedView == focusedView;
|
||||||
|
if (DEBUG) {
|
||||||
|
Log.v(TAG, "Reporting focus gain, without startInput"
|
||||||
|
+ ", nextFocusIsServedView=" + nextFocusIsServedView);
|
||||||
|
}
|
||||||
mService.startInputOrWindowGainedFocus(
|
mService.startInputOrWindowGainedFocus(
|
||||||
StartInputReason.WINDOW_FOCUS_GAIN_REPORT_ONLY, mClient,
|
StartInputReason.WINDOW_FOCUS_GAIN_REPORT_ONLY, mClient,
|
||||||
focusedView.getWindowToken(), startInputFlags, softInputMode,
|
focusedView.getWindowToken(), startInputFlags, softInputMode,
|
||||||
windowFlags,
|
windowFlags,
|
||||||
null, null, 0 /* missingMethodFlags */,
|
nextFocusIsServedView ? mCurrentTextBoxAttribute : null,
|
||||||
|
nextFocusIsServedView ? mServedInputConnectionWrapper : null,
|
||||||
|
0 /* missingMethodFlags */,
|
||||||
mCurRootView.mContext.getApplicationInfo().targetSdkVersion);
|
mCurRootView.mContext.getApplicationInfo().targetSdkVersion);
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
throw e.rethrowFromSystemServer();
|
throw e.rethrowFromSystemServer();
|
||||||
@@ -646,8 +653,7 @@ public final class InputMethodManager {
|
|||||||
public void setCurrentRootView(ViewRootImpl rootView) {
|
public void setCurrentRootView(ViewRootImpl rootView) {
|
||||||
synchronized (mH) {
|
synchronized (mH) {
|
||||||
if (mCurRootView != null) {
|
if (mCurRootView != null) {
|
||||||
// Reset the last served view and restart window focus state of the root view.
|
// Restart the input when the next window focus state of the root view changed.
|
||||||
mCurRootView.getImeFocusController().setServedView(null);
|
|
||||||
mRestartOnNextWindowFocus = true;
|
mRestartOnNextWindowFocus = true;
|
||||||
}
|
}
|
||||||
mCurRootView = rootView;
|
mCurRootView = rootView;
|
||||||
@@ -677,6 +683,18 @@ public final class InputMethodManager {
|
|||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For {@link ImeFocusController} to check if the currently served view is accepting full
|
||||||
|
* text edits.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean isAcceptingText() {
|
||||||
|
synchronized (mH) {
|
||||||
|
return mServedInputConnectionWrapper != null
|
||||||
|
&& mServedInputConnectionWrapper.getInputConnection() != null;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @hide */
|
/** @hide */
|
||||||
|
|||||||
@@ -50,8 +50,9 @@ public @interface StartInputReason {
|
|||||||
int WINDOW_FOCUS_GAIN = 1;
|
int WINDOW_FOCUS_GAIN = 1;
|
||||||
/**
|
/**
|
||||||
* {@link android.view.Window} gained focus but there is no {@link android.view.View} that is
|
* {@link android.view.Window} gained focus but there is no {@link android.view.View} that is
|
||||||
* eligible to have IME focus. {@link android.view.inputmethod.InputMethodManager} just reports
|
* eligible to have IME focus, or the focused view is same as current served view and its
|
||||||
* this window focus change event.
|
* input connection remains. {@link android.view.inputmethod.InputMethodManager} just reports
|
||||||
|
* this window focus change event to sync IME input target for system.
|
||||||
*/
|
*/
|
||||||
int WINDOW_FOCUS_GAIN_REPORT_ONLY = 2;
|
int WINDOW_FOCUS_GAIN_REPORT_ONLY = 2;
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user