19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2012 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.webkit; 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.Editable; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.AbsoluteLayout; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.AdapterView; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.AdapterView.OnItemClickListener; 2780a60ba85b5c2ed40e8685a16ce6d3ed31ef0929Joe Onoratoimport android.widget.Filter; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.Filterable; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.ListAdapter; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.ListPopupWindow; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.PopupWindow.OnDismissListener; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass AutoCompletePopup implements OnItemClickListener, Filter.FilterListener, 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OnDismissListener{ 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static class AnchorView extends View { 36a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick AnchorView(Context context) { 3718e939623556928f73fcc7511c85a537929a4a7eDan Egnor super(context); 3818e939623556928f73fcc7511c85a537929a4a7eDan Egnor setFocusable(false); 3918e939623556928f73fcc7511c85a537929a4a7eDan Egnor setVisibility(INVISIBLE); 4018e939623556928f73fcc7511c85a537929a4a7eDan Egnor } 41a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick } 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int AUTOFILL_FORM = 100; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mIsAutoFillProfileSet; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Handler mHandler; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mQueryId; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ListPopupWindow mPopup; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Filter mFilter; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private CharSequence mText; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ListAdapter mAdapter; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private View mAnchor; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private WebViewClassic.WebViewInputConnection mInputConnection; 52c1e8aa4c448807fc3ee9d21e8b67bb886fa065aaMike Lockwood private WebViewClassic mWebView; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AutoCompletePopup(WebViewClassic webView, 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WebViewClassic.WebViewInputConnection inputConnection) { 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputConnection = inputConnection; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWebView = webView; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler = new Handler() { 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void handleMessage(Message msg) { 6175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov switch (msg.what) { 62dace230043314d6fab1c5ced4b031eaccd814c25Dianne Hackborn case AUTOFILL_FORM: 63603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana mWebView.autoFillForm(mQueryId); 64603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana break; 65603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana } 66603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana } 67b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn }; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean onKeyPreIme(int keyCode, KeyEvent event) { 71b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn if (mPopup == null) { 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (keyCode == KeyEvent.KEYCODE_BACK && mPopup.isShowing()) { 758d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert // special case for the back key, we do not even try to send it 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to the drop down list but instead, consume it immediately 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) { 78f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn KeyEvent.DispatcherState state = mAnchor.getKeyDispatcherState(); 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (state != null) { 8027b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel state.startTracking(event, this); 818cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn } 828cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn return true; 8387bba1ee14279bb14a28d42e27c4ef66d9967bf8Dianne Hackborn } else if (event.getAction() == KeyEvent.ACTION_UP) { 844528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate KeyEvent.DispatcherState state = mAnchor.getKeyDispatcherState(); 854a627c71ff53a4fca1f961f4b1dcc0461df18a06Christopher Tate if (state != null) { 864528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate state.handleUpEvent(event); 874528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate } 88bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly if (event.isTracking() && !event.isCanceled()) { 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.dismiss(); 9016fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly return true; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 923f41673265dcaaef058703311c5481e8a51fd8beJiafa Liu } 939f53119b72e6da865bcd53173d3dacd1eba01aeeDianne Hackborn } 94b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn if (mPopup.isShowing()) { 951ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu return mPopup.onKeyPreIme(keyCode, event); 961ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu } 979f53119b72e6da865bcd53173d3dacd1eba01aeeDianne Hackborn return false; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 100b06ea706530e6d19eb2a1a9a7ae6c5dd77d80af0Dianne Hackborn public void setText(CharSequence text) { 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mText = text; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFilter != null) { 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFilter.filter(text, this); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1058946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAutoFillQueryId(int queryId) { 108c4308f01c965571dc2354107c3574df113e397eeMike Lockwood mQueryId = queryId; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1104d02d001ef6e06583e858e63e48d1aebf54ba28dSan Mehat 111eb9cbb8fdddf4c887004b20b504083035d57a15fMike Lockwood public void clearAdapter() { 112d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey mAdapter = null; 113f36c6db108364dea89b1e3c27c0b15103e560d87Nick Pelly mFilter = null; 114f36c6db108364dea89b1e3c27c0b15103e560d87Nick Pelly if (mPopup != null) { 115f36c6db108364dea89b1e3c27c0b15103e560d87Nick Pelly mPopup.dismiss(); 116f36c6db108364dea89b1e3c27c0b15103e560d87Nick Pelly mPopup.setAdapter(null); 117367f41f8f61126c2ab34a34cc676756a9fc23ac2Nick Pelly } 118f36c6db108364dea89b1e3c27c0b15103e560d87Nick Pelly } 119f36c6db108364dea89b1e3c27c0b15103e560d87Nick Pelly 120f36c6db108364dea89b1e3c27c0b15103e560d87Nick Pelly public <T extends ListAdapter & Filterable> void setAdapter(T adapter) { 121eb9cbb8fdddf4c887004b20b504083035d57a15fMike Lockwood ensurePopup(); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.setAdapter(adapter); 123873f2145941cc28f6931dc18b5e9987bd22e2e19San Mehat mAdapter = adapter; 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (adapter != null) { 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFilter = adapter.getFilter(); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFilter.filter(mText, this); 1278ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } else { 1283a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood mFilter = null; 1294c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 1304c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn resetRect(); 1318cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn } 13275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov 13375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov public void resetRect() { 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ensurePopup(); 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int left = mWebView.contentToViewX(mWebView.mEditTextContentBounds.left); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int right = mWebView.contentToViewX(mWebView.mEditTextContentBounds.right); 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int width = right - left; 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.setWidth(width); 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 140361ec7711aa689aa70c5473348f4a1bc91bc1c06Alex Gruenstein int bottom = mWebView.contentToViewY(mWebView.mEditTextContentBounds.bottom); 141361ec7711aa689aa70c5473348f4a1bc91bc1c06Alex Gruenstein int top = mWebView.contentToViewY(mWebView.mEditTextContentBounds.top); 14250e657bb2d005568f5dd8bc1d904d07b0d94018fBjorn Bringert int height = bottom - top; 14350e657bb2d005568f5dd8bc1d904d07b0d94018fBjorn Bringert 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AbsoluteLayout.LayoutParams lp = 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (AbsoluteLayout.LayoutParams) mAnchor.getLayoutParams(); 146c028be4f3b8c7476b46859f66c3f33d528adf181Suchi Amalapurapu boolean needsUpdate = false; 147c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project if (null == lp) { 148c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project lp = new AbsoluteLayout.LayoutParams(width, height, left, top); 149487529a70cd1479ae8d6bbfb356be7e72542c185Christopher Tate } else { 150f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor if ((lp.x != left) || (lp.y != top) || (lp.width != width) 151c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project || (lp.height != height)) { 1520cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato needsUpdate = true; 1530cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato lp.x = left; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.y = top; 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.width = width; 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.height = height; 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (needsUpdate) { 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnchor.setLayoutParams(lp); 161499cb9f516062b654952d282f211bee44c31a3c2Winson Chung } 16281f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung if (mPopup.isShowing()) { 163b9a07c18e678da35b4c2a618b315fa174a21e818Brian Carlstrom mPopup.show(); // update its position 164a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 165a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 166a55c321329ae52a2db7a4f2bd36673a20b8f271dMike Lockwood 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // AdapterView.OnItemClickListener implementation 16815e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood @Override 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPopup == null) { 171c1e8aa4c448807fc3ee9d21e8b67bb886fa065aaMike Lockwood return; 17222d1f9fb23015471de6af1a70e40fb5c82ecb665Danke Xie } 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (id == 0 && position == 0 && mInputConnection.getIsAutoFillable()) { 174d5176cfe6eae954e9cef1e2ec17859a5089e1330Jean-Michel Trivi mText = ""; 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pushTextToInputConnection(); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Blank out the text box while we wait for WebCore to fill the form. 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIsAutoFillProfileSet) { 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Call a webview method to tell WebCore to autofill the form. 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWebView.autoFillForm(mQueryId); 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 18104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville // There is no autofill profile setup yet and the user has 18204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville // elected to try and set one up. Call through to the 1837640caaf912a7eefacc3e2108c5afd70f7b072a4noda // embedder to action that. 184e91bc680b731a5d97f066b2e6c9c99b3c7dd5c58John Wang WebChromeClient webChromeClient = mWebView.getWebChromeClient(); 1859207b1e7c8ad4bbef3530d2b047bf6587f2988c4Raphael if (webChromeClient != null) { 18655567efca99de7242b118cf7bf13cc773b01941cHung-ying Tyan webChromeClient.setupAutoFill( 1872d94231ef91c732f649ff7af9520ee9eac441b16Chung-yih Wang mHandler.obtainMessage(AUTOFILL_FORM)); 1882d94231ef91c732f649ff7af9520ee9eac441b16Chung-yih Wang } 1892d94231ef91c732f649ff7af9520ee9eac441b16Chung-yih Wang } 1902d94231ef91c732f649ff7af9520ee9eac441b16Chung-yih Wang } else { 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object selectedItem; 19245e6dbf90b24543c90f8c6b0426e9b70c934838dDoug Zongker if (position < 0) { 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project selectedItem = mPopup.getSelectedItem(); 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project selectedItem = mAdapter.getItem(position); 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19780a60ba85b5c2ed40e8685a16ce6d3ed31ef0929Joe Onorato if (selectedItem != null) { 19880a60ba85b5c2ed40e8685a16ce6d3ed31ef0929Joe Onorato setText(mFilter.convertResultToString(selectedItem)); 19980a60ba85b5c2ed40e8685a16ce6d3ed31ef0929Joe Onorato pushTextToInputConnection(); 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 202570bb5618a015c105e44eb1447dae5e0a34f3849Brian Carlstrom mPopup.dismiss(); 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setIsAutoFillProfileSet(boolean isAutoFillProfileSet) { 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIsAutoFillProfileSet = isAutoFillProfileSet; 207ac075190b9a6f10c2f24c3e3d1de035aa0329fa4Guang Zhu } 208ac075190b9a6f10c2f24c3e3d1de035aa0329fa4Guang Zhu 209ac075190b9a6f10c2f24c3e3d1de035aa0329fa4Guang Zhu private void pushTextToInputConnection() { 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Editable oldText = mInputConnection.getEditable(); 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputConnection.setSelection(0, oldText.length()); 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputConnection.replaceSelection(mText); 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputConnection.setSelection(mText.length(), mText.length()); 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onFilterComplete(int count) { 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ensurePopup(); 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean showDropDown = (count > 0) && 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (mInputConnection.getIsAutoFillable() || mText.length() > 0); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (showDropDown) { 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mPopup.isShowing()) { 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make sure the list does not obscure the IME when shown for the first time. 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.setInputMethodMode(ListPopupWindow.INPUT_METHOD_NEEDED); 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.show(); 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.getListView().setOverScrollMode(View.OVER_SCROLL_ALWAYS); 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.dismiss(); 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 234603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana public void onDismiss() { 235603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana mWebView.getWebView().removeView(mAnchor); 236603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana } 237603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void ensurePopup() { 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPopup == null) { 240459ba8639a8d1a9b0fb7ff4ada68bf1fe262eaaaNick Pelly mPopup = new ListPopupWindow(mWebView.getContext()); 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnchor = new AnchorView(mWebView.getContext()); 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWebView.getWebView().addView(mAnchor); 2431ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu mPopup.setOnItemClickListener(this); 244c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana mPopup.setAnchorView(mAnchor); 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.setPromptPosition(ListPopupWindow.POSITION_PROMPT_BELOW); 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (mWebView.getWebView().indexOfChild(mAnchor) < 0) { 247c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project mWebView.getWebView().addView(mAnchor); 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 249f36c6db108364dea89b1e3c27c0b15103e560d87Nick Pelly } 250f36c6db108364dea89b1e3c27c0b15103e560d87Nick Pelly} 251f36c6db108364dea89b1e3c27c0b15103e560d87Nick Pelly 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project