Merge "Merge "Allow autofill to request show soft IME through InputMethodManager" into rvc-dev am: a8d6a321d3 am: d6f3258272" into rvc-d1-dev-plus-aosp am: 5b12f3932f

Change-Id: I7b4406087d16a09a2d4f2866588df25bbd1a4ee3
This commit is contained in:
Automerger Merge Worker
2020-03-28 04:22:31 +00:00
2 changed files with 54 additions and 0 deletions

View File

@@ -41,7 +41,9 @@ import android.graphics.Rect;
import android.metrics.LogMaker;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.Parcelable;
import android.os.RemoteException;
import android.os.SystemClock;
@@ -63,6 +65,7 @@ import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.accessibility.AccessibilityNodeProvider;
import android.view.accessibility.AccessibilityWindowInfo;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.TextView;
@@ -2444,6 +2447,44 @@ public final class AutofillManager {
}
}
private void requestShowSoftInput(@NonNull AutofillId id) {
if (sVerbose) Log.v(TAG, "requestShowSoftInput(" + id + ")");
final AutofillClient client = getClient();
if (client == null) {
return;
}
final View view = client.autofillClientFindViewByAutofillIdTraversal(id);
if (view == null) {
if (sVerbose) Log.v(TAG, "View is not found");
return;
}
final Handler handler = view.getHandler();
if (handler == null) {
if (sVerbose) Log.v(TAG, "Ignoring requestShowSoftInput due to no handler in view");
return;
}
if (handler.getLooper() != Looper.myLooper()) {
// The view is running on a different thread than our own, so we need to reschedule
// our work for over there.
if (sVerbose) Log.v(TAG, "Scheduling showSoftInput() on the view UI thread");
handler.post(() -> requestShowSoftInputInViewThread(view));
} else {
requestShowSoftInputInViewThread(view);
}
}
// This method must be called from within the View thread.
private static void requestShowSoftInputInViewThread(@NonNull View view) {
if (!view.isFocused()) {
Log.w(TAG, "Ignoring requestShowSoftInput() due to non-focused view");
return;
}
final InputMethodManager inputMethodManager = view.getContext().getSystemService(
InputMethodManager.class);
boolean ret = inputMethodManager.showSoftInput(view, /*flags=*/ 0);
if (sVerbose) Log.v(TAG, " InputMethodManager.showSoftInput returns " + ret);
}
/** @hide */
public void requestHideFillUi() {
requestHideFillUi(mIdShownFillUi, true);
@@ -3368,6 +3409,14 @@ public final class AutofillManager {
afm.post(() -> afm.getAugmentedAutofillClient(result));
}
}
@Override
public void requestShowSoftInput(@NonNull AutofillId id) {
final AutofillManager afm = mAfm.get();
if (afm != null) {
afm.post(() -> afm.requestShowSoftInput(id));
}
}
}
private static final class AugmentedAutofillManagerClient

View File

@@ -117,4 +117,9 @@ oneway interface IAutoFillManagerClient {
* Notifies disables autofill for the app or activity.
*/
void notifyDisableAutofill(long disableDuration, in ComponentName componentName);
/**
* Requests to show the soft input method if the focus is on the given id.
*/
void requestShowSoftInput(in AutofillId id);
}