Merge "Allow autofill to request show soft IME through InputMethodManager" into rvc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
a8d6a321d3
@@ -41,7 +41,9 @@ import android.graphics.Rect;
|
|||||||
import android.metrics.LogMaker;
|
import android.metrics.LogMaker;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.os.Handler;
|
||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
|
import android.os.Looper;
|
||||||
import android.os.Parcelable;
|
import android.os.Parcelable;
|
||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
@@ -63,6 +65,7 @@ import android.view.accessibility.AccessibilityManager;
|
|||||||
import android.view.accessibility.AccessibilityNodeInfo;
|
import android.view.accessibility.AccessibilityNodeInfo;
|
||||||
import android.view.accessibility.AccessibilityNodeProvider;
|
import android.view.accessibility.AccessibilityNodeProvider;
|
||||||
import android.view.accessibility.AccessibilityWindowInfo;
|
import android.view.accessibility.AccessibilityWindowInfo;
|
||||||
|
import android.view.inputmethod.InputMethodManager;
|
||||||
import android.widget.EditText;
|
import android.widget.EditText;
|
||||||
import android.widget.TextView;
|
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 */
|
/** @hide */
|
||||||
public void requestHideFillUi() {
|
public void requestHideFillUi() {
|
||||||
requestHideFillUi(mIdShownFillUi, true);
|
requestHideFillUi(mIdShownFillUi, true);
|
||||||
@@ -3368,6 +3409,14 @@ public final class AutofillManager {
|
|||||||
afm.post(() -> afm.getAugmentedAutofillClient(result));
|
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
|
private static final class AugmentedAutofillManagerClient
|
||||||
|
|||||||
@@ -117,4 +117,9 @@ oneway interface IAutoFillManagerClient {
|
|||||||
* Notifies disables autofill for the app or activity.
|
* Notifies disables autofill for the app or activity.
|
||||||
*/
|
*/
|
||||||
void notifyDisableAutofill(long disableDuration, in ComponentName componentName);
|
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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user