Both View focus (which is triggered by View.requestFocus()) and IME focus (which is internally handled inside InputMethodManager), are implemented as delayed tasks on the UI thread. The goal here is to make sure that InputMethodManager.showSoftInput() always gets called only after the target EditText gained IME focus. This requires some tricks, but is basically a solved problem with ImeAwareEditText introduced by I182b05d3ff59fb3b4732d60d0d5a464f0e0e0235. Here we can just reuse it. Note that ConfirmLockPassword & ChooseLockPassword are the only ones using ScrollToParentEditText. Latter doesn't call IMM.showSoftInput(). Fixes: 62542157 Test: Verified keyboard still shows-up on the ConfirmLock screen. Change-Id: I892d639f3cc5d43db553b682d5278b8ce2fe72da
54 lines
1.9 KiB
Java
54 lines
1.9 KiB
Java
/*
|
|
* Copyright (C) 2017 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 com.android.settings.widget;
|
|
|
|
import android.content.Context;
|
|
import android.graphics.Rect;
|
|
import android.util.AttributeSet;
|
|
import android.view.View;
|
|
import android.view.ViewParent;
|
|
import android.widget.EditText;
|
|
|
|
import com.android.settings.widget.ImeAwareEditText;
|
|
|
|
/**
|
|
* An EditText that, instead of scrolling to itself when focused, will request scrolling to its
|
|
* parent. This is used in ChooseLockPassword to do make a best effort for not hiding the error
|
|
* messages for why the password is invalid under the keyboard.
|
|
*/
|
|
public class ScrollToParentEditText extends ImeAwareEditText {
|
|
|
|
private Rect mRect = new Rect();
|
|
|
|
public ScrollToParentEditText(Context context, AttributeSet attrs) {
|
|
super(context, attrs);
|
|
}
|
|
|
|
@Override
|
|
public boolean requestRectangleOnScreen(Rect rectangle, boolean immediate) {
|
|
ViewParent parent = getParent();
|
|
if (parent instanceof View) {
|
|
// Request the entire parent view to be shown, which in ChooseLockPassword's case,
|
|
// will include messages for why the password is invalid (if any).
|
|
((View) parent).getDrawingRect(mRect);
|
|
return ((View) parent).requestRectangleOnScreen(mRect, immediate);
|
|
} else {
|
|
return super.requestRectangleOnScreen(rectangle, immediate);
|
|
}
|
|
}
|
|
}
|