NavigationBarTablet.java revision cfa3af5c59abb38c895416a80ef16da0ec1b5287
1571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins/*
2571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins * Copyright (C) 2010 The Android Open Source Project
3571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins *
4571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins * Licensed under the Apache License, Version 2.0 (the "License");
5571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins * you may not use this file except in compliance with the License.
6571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins * You may obtain a copy of the License at
7571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins *
8571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins *      http://www.apache.org/licenses/LICENSE-2.0
9571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins *
10571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins * Unless required by applicable law or agreed to in writing, software
11571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins * distributed under the License is distributed on an "AS IS" BASIS,
12571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins * See the License for the specific language governing permissions and
14571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins * limitations under the License.
15571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins */
16571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins
17571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scrogginspackage com.android.browser;
18571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins
19c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolbimport com.android.browser.UrlInputView.UrlInputListener;
20c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb
218233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.app.Activity;
22fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolbimport android.app.SearchManager;
23571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scrogginsimport android.content.Context;
24fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolbimport android.content.Intent;
25571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scrogginsimport android.content.res.Resources;
26fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolbimport android.graphics.Bitmap;
27571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scrogginsimport android.graphics.drawable.Drawable;
28257cc2c8fcdd7117317e89861d4509955a622be8Michael Kolbimport android.os.Bundle;
2931d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolbimport android.text.Editable;
301ce7813e6a0e42510fc1b3db5f5bb35999e1e87aMichael Kolbimport android.text.TextUtils;
3131d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolbimport android.text.TextWatcher;
32571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scrogginsimport android.view.LayoutInflater;
33571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scrogginsimport android.view.View;
34a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolbimport android.view.View.OnClickListener;
3531d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolbimport android.view.View.OnFocusChangeListener;
36b6bc32c9c6ed3ec90d602a729a7bfa7741896cf4Michael Kolbimport android.webkit.WebView;
37571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scrogginsimport android.widget.ImageView;
38571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins
39cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolbimport java.util.List;
40cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb
41571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins/**
42fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb * tabbed title bar for xlarge screen browser
43571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins */
44fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolbpublic class TitleBarXLarge extends TitleBarBase
4531d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb    implements UrlInputListener, OnClickListener, OnFocusChangeListener,
4631d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb    TextWatcher {
47fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb
48fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb    private static final int PROGRESS_MAX = 100;
49fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb
508233facddcc51865d612a919d450db6954aa48e3Michael Kolb    private UiController mUiController;
516670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb    private XLargeUi mUi;
528233facddcc51865d612a919d450db6954aa48e3Michael Kolb
53a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb    private Drawable mStopDrawable;
54a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb    private Drawable mReloadDrawable;
55c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb
563f65c3831ff82a20f6f0edb08df2d7edae540044Michael Kolb    private View mContainer;
57a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb    private View mBackButton;
58a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb    private View mForwardButton;
5931d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb    private ImageView mStar;
60a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb    private View mSearchButton;
6131d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb    private View mUrlContainer;
62513286f421ad4aadc4d016d455ea7c520a0f2f59Michael Kolb    private View mGoButton;
63a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb    private ImageView mStopButton;
64a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb    private View mAllButton;
65b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb    private View mClearButton;
6631d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb    private View mVoiceSearch;
67cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb    private View mVoiceSearchIndicator;
68c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb    private PageProgressView mProgressView;
6931d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb    private UrlInputView mUrlInput;
70cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb    private Drawable mFocusDrawable;
71cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb    private Drawable mUnfocusDrawable;
72cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb    private boolean mInVoiceMode;
7381b6f83b7032f22fdaaa514afda2448f801b73daMichael Kolb
74a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb    private boolean mInLoad;
75cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb    private boolean mEditable;
76a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb
7781b6f83b7032f22fdaaa514afda2448f801b73daMichael Kolb    public TitleBarXLarge(Activity activity, UiController controller,
786670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb            XLargeUi ui) {
798233facddcc51865d612a919d450db6954aa48e3Michael Kolb        super(activity);
808233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mUiController = controller;
8181b6f83b7032f22fdaaa514afda2448f801b73daMichael Kolb        mUi = ui;
828233facddcc51865d612a919d450db6954aa48e3Michael Kolb        Resources resources = activity.getResources();
83c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb        mStopDrawable = resources.getDrawable(R.drawable.ic_stop_normal);
84c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb        mReloadDrawable = resources.getDrawable(R.drawable.ic_refresh_normal);
85cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb        mFocusDrawable = resources.getDrawable(
86cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb                R.drawable.textfield_active_holo_dark);
87cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb        mUnfocusDrawable = resources.getDrawable(
88cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb                R.drawable.textfield_default_holo_dark);
898233facddcc51865d612a919d450db6954aa48e3Michael Kolb        rebuildLayout(activity, true);
90cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb        mInVoiceMode = false;
91fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb    }
92571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins
93fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb    private void rebuildLayout(Context context, boolean rebuildData) {
94fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb        LayoutInflater factory = LayoutInflater.from(context);
95a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb        factory.inflate(R.layout.url_bar, this);
96571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins
973f65c3831ff82a20f6f0edb08df2d7edae540044Michael Kolb        mContainer = findViewById(R.id.taburlbar);
9831d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb        mUrlInput = (UrlInputView) findViewById(R.id.url_focused);
99fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb        mAllButton = findViewById(R.id.all_btn);
100fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb        // TODO: Change enabled states based on whether you can go
101571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins        // back/forward.  Probably should be done inside onPageStarted.
102571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins        mBackButton = findViewById(R.id.back);
103571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins        mForwardButton = findViewById(R.id.forward);
10431d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb        mStar = (ImageView) findViewById(R.id.star);
105a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb        mStopButton = (ImageView) findViewById(R.id.stop);
106a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb        mSearchButton = findViewById(R.id.search);
107a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb        mLockIcon = (ImageView) findViewById(R.id.lock);
108513286f421ad4aadc4d016d455ea7c520a0f2f59Michael Kolb        mGoButton = findViewById(R.id.go);
109b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb        mClearButton = findViewById(R.id.clear);
11031d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb        mVoiceSearch = findViewById(R.id.voicesearch);
111c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb        mProgressView = (PageProgressView) findViewById(R.id.progress);
11231d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb        mUrlContainer = findViewById(R.id.urlbar_focused);
113cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb        mVoiceSearchIndicator = findViewById(R.id.voice_icon);
114a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb        mBackButton.setOnClickListener(this);
115a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb        mForwardButton.setOnClickListener(this);
116a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb        mStar.setOnClickListener(this);
117a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb        mAllButton.setOnClickListener(this);
118a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb        mStopButton.setOnClickListener(this);
119a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb        mSearchButton.setOnClickListener(this);
120513286f421ad4aadc4d016d455ea7c520a0f2f59Michael Kolb        mGoButton.setOnClickListener(this);
121b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb        mClearButton.setOnClickListener(this);
122cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb        mVoiceSearch.setOnClickListener(this);
12331d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb        mUrlContainer.setOnClickListener(this);
12431d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb        mUrlInput.setUrlInputListener(this);
12531d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb        mUrlInput.setContainer(mUrlContainer);
12631d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb        mUrlInput.setController(mUiController);
12731d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb        mUrlInput.setOnFocusChangeListener(this);
12831d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb        mUrlInput.setSelectAllOnFocus(true);
12931d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb        mUrlInput.addTextChangedListener(this);
13031d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb        setUrlMode(false);
13131d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb    }
13231d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb
133cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb    public void setEditable(boolean editable) {
134cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb        mEditable = editable;
135cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb        mUrlInput.setFocusable(mEditable);
136cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb        if (!mEditable) {
137cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb            mUrlInput.setOnClickListener(this);
138cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb        } else {
139cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb            mUrlContainer.setOnClickListener(null);
140cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb        }
141cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb    }
142cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb
14331d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb    @Override
14431d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb    public void onFocusChange(View view, boolean hasFocus) {
145cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb        if (!mEditable && hasFocus) {
146cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb            mUi.editUrl(false);
147cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb        } else {
148cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb            setUrlMode(hasFocus);
149cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb        }
150cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb        mUrlContainer.setBackgroundDrawable(hasFocus
151cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb                ? mFocusDrawable : mUnfocusDrawable);
152c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb    }
153b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb
1544cd97793901e8f5681cf642d0b2684697964a37aLeon Scroggins    public void setCurrentUrlIsBookmark(boolean isBookmark) {
15531d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb        mStar.setActivated(isBookmark);
1564cd97793901e8f5681cf642d0b2684697964a37aLeon Scroggins    }
1574cd97793901e8f5681cf642d0b2684697964a37aLeon Scroggins
15881b6f83b7032f22fdaaa514afda2448f801b73daMichael Kolb    /**
15981b6f83b7032f22fdaaa514afda2448f801b73daMichael Kolb     * called from the Ui when the user wants to edit
16081b6f83b7032f22fdaaa514afda2448f801b73daMichael Kolb     * Note: only the fake titlebar will get this callback
16181b6f83b7032f22fdaaa514afda2448f801b73daMichael Kolb     * independent of which input field started the edit mode
16281b6f83b7032f22fdaaa514afda2448f801b73daMichael Kolb     * @param clearInput clear the input field
16381b6f83b7032f22fdaaa514afda2448f801b73daMichael Kolb     */
16481b6f83b7032f22fdaaa514afda2448f801b73daMichael Kolb    void onEditUrl(boolean clearInput) {
165cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb        if (!mUrlInput.hasFocus()) {
166cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb            mUrlInput.requestFocus();
167cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb        }
16881b6f83b7032f22fdaaa514afda2448f801b73daMichael Kolb        if (clearInput) {
16981b6f83b7032f22fdaaa514afda2448f801b73daMichael Kolb            mUrlInput.setText("");
170cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb        } else if (mInVoiceMode) {
171cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb            mUrlInput.showDropDown();
17281b6f83b7032f22fdaaa514afda2448f801b73daMichael Kolb        }
17381b6f83b7032f22fdaaa514afda2448f801b73daMichael Kolb    }
17481b6f83b7032f22fdaaa514afda2448f801b73daMichael Kolb
17581b6f83b7032f22fdaaa514afda2448f801b73daMichael Kolb    boolean isEditingUrl() {
17681b6f83b7032f22fdaaa514afda2448f801b73daMichael Kolb        return mUrlInput.hasFocus();
17781b6f83b7032f22fdaaa514afda2448f801b73daMichael Kolb    }
17881b6f83b7032f22fdaaa514afda2448f801b73daMichael Kolb
179a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb    @Override
180a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb    public void onClick(View v) {
18181b6f83b7032f22fdaaa514afda2448f801b73daMichael Kolb        if (mUrlInput == v) {
182cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb            mUi.editUrl(false);
183cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb        } else if (mUrlContainer == v) {
18481b6f83b7032f22fdaaa514afda2448f801b73daMichael Kolb            if (!mUrlInput.hasFocus()) {
18581b6f83b7032f22fdaaa514afda2448f801b73daMichael Kolb                mUi.editUrl(false);
18681b6f83b7032f22fdaaa514afda2448f801b73daMichael Kolb            }
18781b6f83b7032f22fdaaa514afda2448f801b73daMichael Kolb        } else if (mBackButton == v) {
1888233facddcc51865d612a919d450db6954aa48e3Michael Kolb            mUiController.getCurrentTopWebView().goBack();
189a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb        } else if (mForwardButton == v) {
1908233facddcc51865d612a919d450db6954aa48e3Michael Kolb            mUiController.getCurrentTopWebView().goForward();
191a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb        } else if (mStar == v) {
1928233facddcc51865d612a919d450db6954aa48e3Michael Kolb            mUiController.bookmarkCurrentPage(
19388d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                    AddBookmarkPage.DEFAULT_FOLDER_ID);
194a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb        } else if (mAllButton == v) {
1958233facddcc51865d612a919d450db6954aa48e3Michael Kolb            mUiController.bookmarksOrHistoryPicker(false);
196a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb        } else if (mSearchButton == v) {
19781b6f83b7032f22fdaaa514afda2448f801b73daMichael Kolb            mUi.editUrl(true);
198a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb        } else if (mStopButton == v) {
199a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb            stopOrRefresh();
200513286f421ad4aadc4d016d455ea7c520a0f2f59Michael Kolb        } else if (mGoButton == v) {
20131d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb            if (!TextUtils.isEmpty(mUrlInput.getText())) {
20231d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb                onAction(mUrlInput.getText().toString(), null,
203257cc2c8fcdd7117317e89861d4509955a622be8Michael Kolb                        UrlInputView.TYPED);
2041ce7813e6a0e42510fc1b3db5f5bb35999e1e87aMichael Kolb            }
205b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb        } else if (mClearButton == v) {
20631d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb            clearOrClose();
207cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb        } else if (mVoiceSearch == v) {
208cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb            mUiController.startVoiceSearch();
209fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb        }
210fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb    }
211fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb
2123f65c3831ff82a20f6f0edb08df2d7edae540044Michael Kolb    int getHeightWithoutProgress() {
2133f65c3831ff82a20f6f0edb08df2d7edae540044Michael Kolb        return mContainer.getHeight();
2143f65c3831ff82a20f6f0edb08df2d7edae540044Michael Kolb    }
2153f65c3831ff82a20f6f0edb08df2d7edae540044Michael Kolb
216a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb    @Override
217a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb    void setFavicon(Bitmap icon) { }
218fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb
21931d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb    private void clearOrClose() {
22031d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb        if (TextUtils.isEmpty(mUrlInput.getText())) {
22131d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb            // close
22231d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb            setUrlMode(false);
22331d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb        } else {
22431d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb            // clear
22531d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb            mUrlInput.setText("");
22631d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb        }
22731d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb    }
22831d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb
229fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb    // UrlInputListener implementation
230fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb
23181b6f83b7032f22fdaaa514afda2448f801b73daMichael Kolb    /**
23281b6f83b7032f22fdaaa514afda2448f801b73daMichael Kolb     * callback from suggestion dropdown
23381b6f83b7032f22fdaaa514afda2448f801b73daMichael Kolb     * user selected a suggestion
23481b6f83b7032f22fdaaa514afda2448f801b73daMichael Kolb     */
235fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb    @Override
236257cc2c8fcdd7117317e89861d4509955a622be8Michael Kolb    public void onAction(String text, String extra, String source) {
2378233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mUiController.getCurrentTopWebView().requestFocus();
2386670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        mUi.hideFakeTitleBar();
239fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb        Intent i = new Intent();
240fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb        i.setAction(Intent.ACTION_SEARCH);
241fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb        i.putExtra(SearchManager.QUERY, text);
24240f720ecfd4ef7ebb657f0fc1906a9982b3bafbdJohn Reck        if (extra != null) {
24340f720ecfd4ef7ebb657f0fc1906a9982b3bafbdJohn Reck            i.putExtra(SearchManager.EXTRA_DATA_KEY, extra);
24440f720ecfd4ef7ebb657f0fc1906a9982b3bafbdJohn Reck        }
245257cc2c8fcdd7117317e89861d4509955a622be8Michael Kolb        if (source != null) {
246257cc2c8fcdd7117317e89861d4509955a622be8Michael Kolb            Bundle appData = new Bundle();
247257cc2c8fcdd7117317e89861d4509955a622be8Michael Kolb            appData.putString(com.android.common.Search.SOURCE, source);
248257cc2c8fcdd7117317e89861d4509955a622be8Michael Kolb            i.putExtra(SearchManager.APP_DATA, appData);
249257cc2c8fcdd7117317e89861d4509955a622be8Michael Kolb        }
2508233facddcc51865d612a919d450db6954aa48e3Michael Kolb        mUiController.handleNewIntent(i);
251b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb        setUrlMode(false);
252513286f421ad4aadc4d016d455ea7c520a0f2f59Michael Kolb        setDisplayTitle(text);
253fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb    }
254fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb
255fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb    @Override
256fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb    public void onDismiss() {
257b6bc32c9c6ed3ec90d602a729a7bfa7741896cf4Michael Kolb        WebView top = mUiController.getCurrentTopWebView();
258b6bc32c9c6ed3ec90d602a729a7bfa7741896cf4Michael Kolb        if (top != null) {
259b6bc32c9c6ed3ec90d602a729a7bfa7741896cf4Michael Kolb            mUiController.getCurrentTopWebView().requestFocus();
260b6bc32c9c6ed3ec90d602a729a7bfa7741896cf4Michael Kolb        }
2616670653d355fea0ae20dc51f6c693f994c4cbb54Michael Kolb        mUi.hideFakeTitleBar();
262b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb        setUrlMode(false);
263b6bc32c9c6ed3ec90d602a729a7bfa7741896cf4Michael Kolb        // if top != null current must be set
264cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb        if ((top != null) && !mInVoiceMode) {
265b6bc32c9c6ed3ec90d602a729a7bfa7741896cf4Michael Kolb            setDisplayTitle(mUiController.getCurrentWebView().getUrl());
266b6bc32c9c6ed3ec90d602a729a7bfa7741896cf4Michael Kolb        }
267513286f421ad4aadc4d016d455ea7c520a0f2f59Michael Kolb    }
268513286f421ad4aadc4d016d455ea7c520a0f2f59Michael Kolb
26981b6f83b7032f22fdaaa514afda2448f801b73daMichael Kolb    /**
27081b6f83b7032f22fdaaa514afda2448f801b73daMichael Kolb     * callback from the suggestion dropdown
27181b6f83b7032f22fdaaa514afda2448f801b73daMichael Kolb     * copy text to input field and stay in edit mode
27281b6f83b7032f22fdaaa514afda2448f801b73daMichael Kolb     */
273513286f421ad4aadc4d016d455ea7c520a0f2f59Michael Kolb    @Override
274513286f421ad4aadc4d016d455ea7c520a0f2f59Michael Kolb    public void onEdit(String text) {
2757b20ddd4f03d59cca8fdd4aee790784421570aabMichael Kolb        setDisplayTitle(text, true);
276513286f421ad4aadc4d016d455ea7c520a0f2f59Michael Kolb        if (text != null) {
27731d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb            mUrlInput.setSelection(text.length());
278513286f421ad4aadc4d016d455ea7c520a0f2f59Michael Kolb        }
279513286f421ad4aadc4d016d455ea7c520a0f2f59Michael Kolb    }
280513286f421ad4aadc4d016d455ea7c520a0f2f59Michael Kolb
28181b6f83b7032f22fdaaa514afda2448f801b73daMichael Kolb    void setUrlMode(boolean focused) {
282b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb        if (focused) {
28331d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb            mUrlInput.setDropDownWidth(mUrlContainer.getWidth());
28431d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb            mUrlInput.setDropDownHorizontalOffset(-mUrlInput.getLeft());
285b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb            mSearchButton.setVisibility(View.GONE);
28631d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb            mStar.setVisibility(View.GONE);
28731d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb            mClearButton.setVisibility(View.VISIBLE);
288cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb            if (mInVoiceMode) {
289cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb                mVoiceSearchIndicator.setVisibility(View.VISIBLE);
290cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb            }
29131d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb            updateSearchMode();
292b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb        } else {
29331d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb            mUrlInput.clearFocus();
294b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb            mSearchButton.setVisibility(View.VISIBLE);
295b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb            mGoButton.setVisibility(View.GONE);
29631d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb            mVoiceSearch.setVisibility(View.GONE);
29731d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb            mStar.setVisibility(View.VISIBLE);
29831d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb            mClearButton.setVisibility(View.GONE);
299cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb            mVoiceSearchIndicator.setVisibility(View.GONE);
300b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb        }
301b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb    }
302b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb
303a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb    private void stopOrRefresh() {
304a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb        if (mInLoad) {
3058233facddcc51865d612a919d450db6954aa48e3Michael Kolb            mUiController.stopLoading();
306571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins        } else {
3078233facddcc51865d612a919d450db6954aa48e3Michael Kolb            mUiController.getCurrentTopWebView().reload();
308571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins        }
309571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins    }
310571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins
311571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins    /**
312a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb     * Update the progress, from 0 to 100.
313fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb     */
314fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb    @Override
315a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb    void setProgress(int newProgress) {
316a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb        if (newProgress >= PROGRESS_MAX) {
317b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb            mProgressView.setProgress(PageProgressView.MAX_PROGRESS);
318a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb            mProgressView.setVisibility(View.GONE);
319a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb            mInLoad = false;
320a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb            mStopButton.setImageDrawable(mReloadDrawable);
321a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb        } else {
322a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb            if (!mInLoad) {
323a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb                mProgressView.setVisibility(View.VISIBLE);
324a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb                mInLoad = true;
325a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb                mStopButton.setImageDrawable(mStopDrawable);
326fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb            }
327b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb            mProgressView.setProgress(newProgress * PageProgressView.MAX_PROGRESS
328b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb                    / PROGRESS_MAX);
329fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb        }
330fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb    }
331fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb
33231d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb    private void updateSearchMode() {
33331d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb        setSearchMode(TextUtils.isEmpty(mUrlInput.getText()));
33431d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb    }
33531d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb
33631d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb    private void setSearchMode(boolean voiceSearchEnabled) {
33731d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb        mVoiceSearch.setVisibility(voiceSearchEnabled ? View.VISIBLE :
33831d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb                View.GONE);
33931d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb        mGoButton.setVisibility(voiceSearchEnabled ? View.GONE :
34031d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb                View.VISIBLE);
34131d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb    }
34231d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb
343fe25199a6f975c67d28afcc1de56b0f987b66cd8Michael Kolb    @Override
344a2b2ba8da913f26c820e49d3e43158e2fe6ebebaMichael Kolb    /* package */ void setDisplayTitle(String title) {
34531d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb        mUrlInput.setText(title, false);
346571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins    }
347571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins
3487b20ddd4f03d59cca8fdd4aee790784421570aabMichael Kolb    void setDisplayTitle(String title, boolean filter) {
34931d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb        mUrlInput.setText(title, filter);
3507b20ddd4f03d59cca8fdd4aee790784421570aabMichael Kolb    }
3517b20ddd4f03d59cca8fdd4aee790784421570aabMichael Kolb
35231d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb    // UrlInput text watcher
3534cd97793901e8f5681cf642d0b2684697964a37aLeon Scroggins
35431d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb    @Override
35531d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb    public void afterTextChanged(Editable s) {
35631d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb        if (mUrlInput.hasFocus()) {
35781b6f83b7032f22fdaaa514afda2448f801b73daMichael Kolb            // check if input field is empty and adjust voice search state
35831d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb            updateSearchMode();
359cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb            // clear voice mode when user types
360cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb            setInVoiceMode(false, null);
3614cd97793901e8f5681cf642d0b2684697964a37aLeon Scroggins        }
36231d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb    }
3634cd97793901e8f5681cf642d0b2684697964a37aLeon Scroggins
36431d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb    @Override
36531d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
36631d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb    }
3674cd97793901e8f5681cf642d0b2684697964a37aLeon Scroggins
36831d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb    @Override
36931d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb    public void onTextChanged(CharSequence s, int start, int before, int count) {
3704cd97793901e8f5681cf642d0b2684697964a37aLeon Scroggins    }
37131d469bca6f6d5a8b444b7dac8038a1b75cd7e43Michael Kolb
372cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb    // voicesearch
373cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb
374cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb    @Override
375cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb    public void setInVoiceMode(boolean voicemode) {
376cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb        setInVoiceMode(voicemode, null);
377cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb    }
378cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb
379cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb    public void setInVoiceMode(boolean voicemode, List<String> voiceResults) {
380cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb        mInVoiceMode = voicemode;
381cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb        mUrlInput.setVoiceResults(voiceResults);
382cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb        mVoiceSearchIndicator.setVisibility(mInVoiceMode
383cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb                ? View.VISIBLE : View.GONE);
384cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb    }
385cfa3af5c59abb38c895416a80ef16da0ec1b5287Michael Kolb
386571b3762a5eb9e492283e0a1e437edd209fdc0deLeon Scroggins}
387