Merge changes from topic "revert-9783082-1574797358199-802c4081-VGXGMNZIXS" into qt-qpr1-dev

* changes:
  DO NOT MERGE: Revert Move startInput for WINDOW_FOCUS_GAIN to background thread
  DO NOT MERGE: Revert: Freeup lock when IME is set inactive and unbound
This commit is contained in:
TreeHugger Robot
2020-02-29 21:24:47 +00:00
committed by Android (Google) Code Review

View File

@@ -92,10 +92,7 @@ import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.CancellationException;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CountDownLatch; import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
/** /**
@@ -424,13 +421,6 @@ public final class InputMethodManager {
int mCursorCandStart; int mCursorCandStart;
int mCursorCandEnd; int mCursorCandEnd;
/**
* Initial startInput with {@link StartInputReason.WINDOW_FOCUS_GAIN} is executed
* in a background thread. Later, if there is an actual startInput it will wait on
* main thread till the background thread completes.
*/
private CompletableFuture<Void> mWindowFocusGainFuture;
/** /**
* The instance that has previously been sent to the input method. * The instance that has previously been sent to the input method.
*/ */
@@ -655,7 +645,6 @@ public final class InputMethodManager {
} catch (RemoteException e) { } catch (RemoteException e) {
} }
} }
}
// Check focus again in case that "onWindowFocus" is called before // Check focus again in case that "onWindowFocus" is called before
// handling this message. // handling this message.
if (mServedView != null && canStartInput(mServedView)) { if (mServedView != null && canStartInput(mServedView)) {
@@ -665,6 +654,7 @@ public final class InputMethodManager {
startInputInner(reason, null, 0, 0, 0); startInputInner(reason, null, 0, 0, 0);
} }
} }
}
return; return;
} }
case MSG_SEND_INPUT_EVENT: { case MSG_SEND_INPUT_EVENT: {
@@ -1225,10 +1215,6 @@ public final class InputMethodManager {
*/ */
void clearBindingLocked() { void clearBindingLocked() {
if (DEBUG) Log.v(TAG, "Clearing binding!"); if (DEBUG) Log.v(TAG, "Clearing binding!");
if (mWindowFocusGainFuture != null) {
mWindowFocusGainFuture.cancel(false /* mayInterruptIfRunning */);
mWindowFocusGainFuture = null;
}
clearConnectionLocked(); clearConnectionLocked();
setInputChannelLocked(null); setInputChannelLocked(null);
mBindSequence = -1; mBindSequence = -1;
@@ -1612,18 +1598,6 @@ public final class InputMethodManager {
boolean startInputInner(@StartInputReason int startInputReason, boolean startInputInner(@StartInputReason int startInputReason,
@Nullable IBinder windowGainingFocus, @StartInputFlags int startInputFlags, @Nullable IBinder windowGainingFocus, @StartInputFlags int startInputFlags,
@SoftInputModeFlags int softInputMode, int windowFlags) { @SoftInputModeFlags int softInputMode, int windowFlags) {
if (startInputReason != StartInputReason.WINDOW_FOCUS_GAIN
&& mWindowFocusGainFuture != null) {
try {
mWindowFocusGainFuture.get();
} catch (ExecutionException | InterruptedException e) {
// do nothing
} catch (CancellationException e) {
// window no longer has focus.
return true;
}
}
final View view; final View view;
synchronized (mH) { synchronized (mH) {
view = mServedView; view = mServedView;
@@ -1977,19 +1951,13 @@ public final class InputMethodManager {
startInputFlags |= StartInputFlags.FIRST_WINDOW_FOCUS_GAIN; startInputFlags |= StartInputFlags.FIRST_WINDOW_FOCUS_GAIN;
} }
final boolean forceNewFocus1 = forceNewFocus; if (checkFocusNoStartInput(forceNewFocus)) {
final int startInputFlags1 = startInputFlags;
if (mWindowFocusGainFuture != null) {
mWindowFocusGainFuture.cancel(false/* mayInterruptIfRunning */);
}
mWindowFocusGainFuture = CompletableFuture.runAsync(() -> {
if (checkFocusNoStartInput(forceNewFocus1)) {
// We need to restart input on the current focus view. This // We need to restart input on the current focus view. This
// should be done in conjunction with telling the system service // should be done in conjunction with telling the system service
// about the window gaining focus, to help make the transition // about the window gaining focus, to help make the transition
// smooth. // smooth.
if (startInputInner(StartInputReason.WINDOW_FOCUS_GAIN, rootView.getWindowToken(), if (startInputInner(StartInputReason.WINDOW_FOCUS_GAIN, rootView.getWindowToken(),
startInputFlags1, softInputMode, windowFlags)) { startInputFlags, softInputMode, windowFlags)) {
return; return;
} }
} }
@@ -2001,14 +1969,13 @@ public final class InputMethodManager {
if (DEBUG) Log.v(TAG, "Reporting focus gain, without startInput"); if (DEBUG) Log.v(TAG, "Reporting focus gain, without startInput");
mService.startInputOrWindowGainedFocus( mService.startInputOrWindowGainedFocus(
StartInputReason.WINDOW_FOCUS_GAIN_REPORT_ONLY, mClient, StartInputReason.WINDOW_FOCUS_GAIN_REPORT_ONLY, mClient,
rootView.getWindowToken(), startInputFlags1, softInputMode, windowFlags, rootView.getWindowToken(), startInputFlags, softInputMode, windowFlags,
null, null, 0 /* missingMethodFlags */, null, null, 0 /* missingMethodFlags */,
rootView.getContext().getApplicationInfo().targetSdkVersion); rootView.getContext().getApplicationInfo().targetSdkVersion);
} catch (RemoteException e) { } catch (RemoteException e) {
throw e.rethrowFromSystemServer(); throw e.rethrowFromSystemServer();
} }
} }
});
} }
/** @hide */ /** @hide */
@@ -2023,10 +1990,6 @@ public final class InputMethodManager {
// If the mCurRootView is losing window focus, release the strong reference to it // If the mCurRootView is losing window focus, release the strong reference to it
// so as not to prevent it from being garbage-collected. // so as not to prevent it from being garbage-collected.
mCurRootView = null; mCurRootView = null;
if (mWindowFocusGainFuture != null) {
mWindowFocusGainFuture.cancel(false /* mayInterruptIfRunning */);
mWindowFocusGainFuture = null;
}
} else { } else {
if (DEBUG) { if (DEBUG) {
Log.v(TAG, "Ignoring onPreWindowFocus()." Log.v(TAG, "Ignoring onPreWindowFocus()."