/* * Copyright (C) 2014 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.support.v17.leanback.widget; import android.content.Context; import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.KeyEvent; import android.view.accessibility.AccessibilityNodeInfo; import android.widget.EditText; import android.widget.TextView; /** * A custom EditText that satisfies the IME key monitoring requirements of GuidedStepFragment. */ public class GuidedActionEditText extends EditText implements ImeKeyMonitor { /** * Workaround for b/26990627 forcing recompute the padding for the View when we turn on/off * the default background of EditText */ static final class NoPaddingDrawable extends Drawable { @Override public boolean getPadding(Rect padding) { padding.set(0, 0, 0, 0); return true; } @Override public void draw(Canvas canvas) { } @Override public void setAlpha(int alpha) { } @Override public void setColorFilter(ColorFilter colorFilter) { } @Override public int getOpacity() { return PixelFormat.TRANSPARENT; } } private ImeKeyListener mKeyListener; private final Drawable mSavedBackground; private final Drawable mNoPaddingDrawable; public GuidedActionEditText(Context ctx) { this(ctx, null); } public GuidedActionEditText(Context ctx, AttributeSet attrs) { this(ctx, attrs, android.R.attr.editTextStyle); } public GuidedActionEditText(Context ctx, AttributeSet attrs, int defStyleAttr) { super(ctx, attrs, defStyleAttr); mSavedBackground = getBackground(); mNoPaddingDrawable = new NoPaddingDrawable(); setBackground(mNoPaddingDrawable); } @Override public void setImeKeyListener(ImeKeyListener listener) { mKeyListener = listener; } @Override public boolean onKeyPreIme(int keyCode, KeyEvent event) { boolean result = false; if (mKeyListener != null) { result = mKeyListener.onKeyPreIme(this, keyCode, event); } if (!result) { result = super.onKeyPreIme(keyCode, event); } return result; } @Override public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(info); info.setClassName(isFocused() ? EditText.class.getName() : TextView.class.getName()); } @Override protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { super.onFocusChanged(focused, direction, previouslyFocusedRect); if (focused) { setBackground(mSavedBackground); } else { setBackground(mNoPaddingDrawable); } // Make the TextView focusable during editing, avoid the TextView gets accessibility focus // before editing started. see also GuidedActionAdapterGroup where setFocusable(true). if (!focused) { setFocusable(false); } } }