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