Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d3b000ca authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Move ImeAwareTextEdit from Settings to android.widget" into rvc-dev

parents 05e4028d 412bd819
Loading
Loading
Loading
Loading
+96 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.widget;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
import android.view.inputmethod.InputMethodManager;

/**
 * EditText that keeps track of the IME state, specifically its input connection. This is useful
 * for clients who request the IME before the system has established a connection.
 * @hide
 */
public class ImeAwareEditText extends EditText {
    private boolean mHasPendingShowSoftInputRequest;
    final Runnable mRunShowSoftInputIfNecessary = () -> showSoftInputIfNecessary();

    public ImeAwareEditText(Context context) {
        super(context, null);
    }

    public ImeAwareEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ImeAwareEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public ImeAwareEditText(Context context, AttributeSet attrs, int defStyleAttr,
            int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    /**
     * This method is called back by the system when the system is about to establish a connection
     * to the current input method.
     *
     * <p>This is a good and reliable signal to schedule a pending task to call
     * {@link InputMethodManager#showSoftInput(View, int)}.</p>
     *
     * @param editorInfo context about the text input field.
     * @return {@link InputConnection} to be passed to the input method.
     */
    @Override
    public InputConnection onCreateInputConnection(EditorInfo editorInfo) {
        final InputConnection ic = super.onCreateInputConnection(editorInfo);
        if (mHasPendingShowSoftInputRequest) {
            removeCallbacks(mRunShowSoftInputIfNecessary);
            post(mRunShowSoftInputIfNecessary);
        }
        return ic;
    }

    private void showSoftInputIfNecessary() {
        if (mHasPendingShowSoftInputRequest) {
            final InputMethodManager imm =
                    getContext().getSystemService(InputMethodManager.class);
            imm.showSoftInput(this, 0);
            mHasPendingShowSoftInputRequest = false;
        }
    }

    public void scheduleShowSoftInput() {
        final InputMethodManager imm = getContext().getSystemService(InputMethodManager.class);
        if (imm.isActive(this)) {
            // This means that ImeAwareEditText is already connected to the IME.
            // InputMethodManager#showSoftInput() is guaranteed to pass client-side focus check.
            mHasPendingShowSoftInputRequest = false;
            removeCallbacks(mRunShowSoftInputIfNecessary);
            imm.showSoftInput(this, 0);
            return;
        }

        // Otherwise, InputMethodManager#showSoftInput() should be deferred after
        // onCreateInputConnection().
        mHasPendingShowSoftInputRequest = true;
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -55,7 +55,7 @@
        android:layout_height="0dp"
        android:layout_weight="1"/>

    <EditText
    <ImeAwareEditText
        android:id="@+id/lockPassword"
        android:layout_width="208dp"
        android:layout_height="wrap_content"
+4 −7
Original line number Diff line number Diff line
@@ -23,7 +23,7 @@ import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.ImeAwareEditText;
import android.widget.TextView;

import com.android.internal.widget.LockPatternChecker;
@@ -39,7 +39,7 @@ public class AuthCredentialPasswordView extends AuthCredentialView
    private static final String TAG = "BiometricPrompt/AuthCredentialPasswordView";

    private final InputMethodManager mImm;
    private EditText mPasswordField;
    private ImeAwareEditText mPasswordField;

    public AuthCredentialPasswordView(Context context,
            AttributeSet attrs) {
@@ -75,11 +75,8 @@ public class AuthCredentialPasswordView extends AuthCredentialView
                    InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD);
        }

        // Wait a bit to focus the field so the focusable flag on the window is already set then.
        postDelayed(() -> {
        mPasswordField.requestFocus();
            mImm.showSoftInput(mPasswordField, InputMethodManager.SHOW_IMPLICIT);
        }, 100);
        mPasswordField.scheduleShowSoftInput();
    }

    @Override