blob: 596aa8f7bc97764db4c1ec1fde993094dbe1cbcb [file] [log] [blame]
Winson Chungde34aa42015-05-07 18:21:28 -07001/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Winson97b0d082015-08-13 15:18:25 -070016package com.android.launcher3;
Winson Chungde34aa42015-05-07 18:21:28 -070017
18import android.content.Context;
19import android.util.AttributeSet;
Winson4e7a1012015-08-13 16:47:55 -070020import android.view.DragEvent;
Winson Chungde34aa42015-05-07 18:21:28 -070021import android.view.KeyEvent;
Hyunyoung Songc2fe1142016-09-09 15:02:20 -070022import android.view.inputmethod.InputMethodManager;
Winson Chungde34aa42015-05-07 18:21:28 -070023import android.widget.EditText;
24
25
26/**
Winson97b0d082015-08-13 15:18:25 -070027 * The edit text that reports back when the back key has been pressed.
Winson Chungde34aa42015-05-07 18:21:28 -070028 */
Winson97b0d082015-08-13 15:18:25 -070029public class ExtendedEditText extends EditText {
Winson Chungde34aa42015-05-07 18:21:28 -070030
Hyunyoung Songc2fe1142016-09-09 15:02:20 -070031 private boolean mShowImeAfterFirstLayout;
Jon Miranda54d4e642017-02-24 10:00:14 -080032 private boolean mForceDisableSuggestions = false;
Hyunyoung Songc2fe1142016-09-09 15:02:20 -070033
Winson Chungde34aa42015-05-07 18:21:28 -070034 /**
35 * Implemented by listeners of the back key.
36 */
37 public interface OnBackKeyListener {
Winson97b0d082015-08-13 15:18:25 -070038 public boolean onBackKey();
Winson Chungde34aa42015-05-07 18:21:28 -070039 }
40
41 private OnBackKeyListener mBackKeyListener;
42
Winson97b0d082015-08-13 15:18:25 -070043 public ExtendedEditText(Context context) {
Hyunyoung Song3f9d6472016-09-20 12:37:41 -070044 // ctor chaining breaks the touch handling
45 super(context);
Winson Chungde34aa42015-05-07 18:21:28 -070046 }
47
Winson97b0d082015-08-13 15:18:25 -070048 public ExtendedEditText(Context context, AttributeSet attrs) {
Hyunyoung Song3f9d6472016-09-20 12:37:41 -070049 // ctor chaining breaks the touch handling
50 super(context, attrs);
Winson Chungde34aa42015-05-07 18:21:28 -070051 }
52
Winson97b0d082015-08-13 15:18:25 -070053 public ExtendedEditText(Context context, AttributeSet attrs, int defStyleAttr) {
Winson Chungde34aa42015-05-07 18:21:28 -070054 super(context, attrs, defStyleAttr);
55 }
56
57 public void setOnBackKeyListener(OnBackKeyListener listener) {
58 mBackKeyListener = listener;
59 }
60
61 @Override
62 public boolean onKeyPreIme(int keyCode, KeyEvent event) {
63 // If this is a back key, propagate the key back to the listener
64 if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
65 if (mBackKeyListener != null) {
Winson97b0d082015-08-13 15:18:25 -070066 return mBackKeyListener.onBackKey();
Winson Chungde34aa42015-05-07 18:21:28 -070067 }
68 return false;
69 }
70 return super.onKeyPreIme(keyCode, event);
71 }
Winson4e7a1012015-08-13 16:47:55 -070072
73 @Override
74 public boolean onDragEvent(DragEvent event) {
75 // We don't want this view to interfere with Launcher own drag and drop.
76 return false;
77 }
Hyunyoung Songc2fe1142016-09-09 15:02:20 -070078
79 @Override
80 protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
81 super.onLayout(changed, left, top, right, bottom);
82 if (mShowImeAfterFirstLayout) {
83 // soft input only shows one frame after the layout of the EditText happens,
84 post(new Runnable() {
85 @Override
86 public void run() {
87 showSoftInput();
88 mShowImeAfterFirstLayout = false;
89 }
90 });
91 }
92 }
93
94 public void showKeyboard() {
95 mShowImeAfterFirstLayout = !showSoftInput();
96 }
97
98 private boolean showSoftInput() {
99 return requestFocus() &&
100 ((InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE))
Hyunyoung Song7e83ab92016-09-21 17:03:56 -0700101 .showSoftInput(this, InputMethodManager.SHOW_IMPLICIT);
Hyunyoung Songc2fe1142016-09-09 15:02:20 -0700102 }
Sunny Goyal740ac7f2016-09-28 16:47:32 -0700103
104 public void dispatchBackKey() {
105 ((InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE))
106 .hideSoftInputFromWindow(getWindowToken(), 0);
107 if (mBackKeyListener != null) {
108 mBackKeyListener.onBackKey();
109 }
110 }
Jon Miranda54d4e642017-02-24 10:00:14 -0800111
112 /**
113 * Set to true when you want isSuggestionsEnabled to return false.
114 * Use this to disable the red underlines that appear under typos when suggestions is enabled.
115 */
116 public void forceDisableSuggestions(boolean forceDisableSuggestions) {
117 mForceDisableSuggestions = forceDisableSuggestions;
118 }
119
120 @Override
121 public boolean isSuggestionsEnabled() {
122 return !mForceDisableSuggestions && super.isSuggestionsEnabled();
123 }
Winson Chungde34aa42015-05-07 18:21:28 -0700124}