diff options
author | John Reck <jreck@google.com> | 2011-07-07 15:38:43 -0700 |
---|---|---|
committer | John Reck <jreck@google.com> | 2011-07-11 17:13:11 -0700 |
commit | 0f602f3933dcd88702fdb514b6611e3066ca7a2b (patch) | |
tree | e60b25ca74f692980972a9c11227750579ee661d | |
parent | 017ffabc8af29b0cf14fecc6aad4a61acb8373a2 (diff) | |
download | packages_apps_browser-0f602f3933dcd88702fdb514b6611e3066ca7a2b.zip packages_apps_browser-0f602f3933dcd88702fdb514b6611e3066ca7a2b.tar.gz packages_apps_browser-0f602f3933dcd88702fdb514b6611e3066ca7a2b.tar.bz2 |
TitleBar refactor
Change-Id: I0a2df041529143c8e0ff17af341376a3f827be04
22 files changed, 1314 insertions, 1173 deletions
diff --git a/res/drawable-hdpi/ic_snapshot.png b/res/drawable-hdpi/ic_snapshot.png Binary files differdeleted file mode 100644 index a621cb4..0000000 --- a/res/drawable-hdpi/ic_snapshot.png +++ /dev/null diff --git a/res/drawable-mdpi/ic_snapshot.png b/res/drawable-mdpi/ic_snapshot.png Binary files differdeleted file mode 100644 index 6054acb..0000000 --- a/res/drawable-mdpi/ic_snapshot.png +++ /dev/null diff --git a/res/layout-sw600dp/title_bar_autologin.xml b/res/layout-sw600dp/title_bar_autologin.xml new file mode 100644 index 0000000..783b4c3 --- /dev/null +++ b/res/layout-sw600dp/title_bar_autologin.xml @@ -0,0 +1,67 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright 2011, 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. +--> +<com.android.browser.AutologinBar + xmlns:android="http://schemas.android.com/apk/res/android" + android:background="#FBF0A0" + android:gravity="center_vertical" + android:visibility="gone"> + <TextView + android:text="@string/autologin_bar_text" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textColor="@android:color/primary_text_light" + android:paddingLeft="15dip" + android:paddingRight="15dip" + android:textAppearance="?android:attr/textAppearanceMedium"/> + <Spinner + android:id="@+id/autologin_account" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + style="@android:style/Widget.Holo.Light.Spinner" /> + <Button + android:id="@+id/autologin_login" + android:text="@string/autologin_bar_login_text" + style="@android:style/Widget.Holo.Light.Button" + android:layout_marginRight="15dip" + android:layout_height="wrap_content" + android:layout_width="wrap_content" /> + <ProgressBar + android:id="@+id/autologin_progress" + android:indeterminateOnly="true" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:visibility="gone" /> + <TextView + android:id="@+id/autologin_error" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:textColor="#dd6826" + android:text="@string/autologin_bar_error" + android:textAppearance="?android:attr/textAppearanceMedium" + android:visibility="gone" /> + <View + android:layout_width="2dip" + android:layout_height="match_parent" + android:layout_weight="1"/> + <ImageButton + android:id="@+id/autologin_close" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:paddingRight="15dip" + android:background="@null" + android:src="@*android:drawable/btn_close"/> +</com.android.browser.AutologinBar> diff --git a/res/layout-sw600dp/title_bar_nav.xml b/res/layout-sw600dp/title_bar_nav.xml new file mode 100644 index 0000000..4ef94e8 --- /dev/null +++ b/res/layout-sw600dp/title_bar_nav.xml @@ -0,0 +1,122 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright 2011, 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. +--> +<com.android.browser.NavigationBarTablet + xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="horizontal" + android:background="@drawable/bg_urlbar"> + <ImageButton + android:id="@+id/back" + android:src="@drawable/ic_back_holo_dark" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:paddingLeft="16dip" + style="@style/HoloButton" /> + <ImageButton + android:id="@+id/forward" + android:src="@drawable/ic_forward_holo_dark" + android:layout_width="wrap_content" + android:layout_height="match_parent" + style="@style/HoloButton" /> + <ImageButton + android:id="@+id/stop" + android:layout_width="wrap_content" + android:layout_height="match_parent" + style="@style/HoloButton" + android:gravity="center_vertical" + android:src="@drawable/ic_stop_holo_dark" /> + <LinearLayout + android:id="@+id/urlbar_focused" + android:layout_width="0dip" + android:layout_height="match_parent" + android:layout_weight="1.0" + android:layout_marginLeft="8dip" + android:layout_marginRight="8dip" + android:orientation="horizontal" + android:background="@drawable/url_background"> + <ImageView + android:id="@+id/url_icon" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:src="@drawable/ic_web_holo_dark" + style="@style/HoloIcon" /> + <ImageView + android:id="@+id/lock" + android:layout_width="wrap_content" + android:layout_height="match_parent" + style="@style/HoloIcon" + android:visibility="gone" /> + <com.android.browser.UrlInputView + android:id="@+id/url" + android:layout_width="0dip" + android:layout_weight="1.0" + android:layout_height="match_parent" + android:layout_marginLeft="16dip" + android:paddingLeft="0dip" + android:paddingRight="0dip" + android:background="@null" + android:textAppearance="?android:attr/textAppearanceMedium" + android:hint="@string/search_hint" + android:singleLine="true" + android:ellipsize="end" + android:lines="1" + android:scrollHorizontally="true" + android:inputType="textUri" + android:imeOptions="actionGo" + style="@style/Suggestions" /> + <ImageButton + android:id="@+id/star" + android:src="@drawable/btn_imageview_star" + android:layout_width="wrap_content" + android:layout_height="match_parent" + style="@style/HoloButton" /> + <ImageButton + android:id="@+id/clear" + android:src="@drawable/ic_stop_holo_dark" + android:layout_width="wrap_content" + android:layout_height="match_parent" + style="@style/HoloButton" /> + </LinearLayout> + <ImageButton + android:id="@+id/go" + android:src="@drawable/ic_go_holo_dark" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:visibility="gone" + android:gravity="center_vertical" + style="@style/HoloButton" /> + <ImageButton + android:id="@+id/voicesearch" + android:src="@drawable/ic_voice_search_holo_dark" + android:layout_width="wrap_content" + android:layout_height="match_parent" + style="@style/HoloButton" /> + <ImageButton + android:id="@+id/search" + android:src="@drawable/ic_search_holo_dark" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:gravity="center_vertical" + style="@style/HoloButton" /> + <ImageButton + android:id="@+id/all_btn" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:scaleType="center" + android:paddingRight="16dip" + style="@style/HoloButton" + android:src="@drawable/ic_bookmarks_history_holo_dark" /> +</com.android.browser.NavigationBarTablet> diff --git a/res/layout/tab_title.xml b/res/layout/tab_title.xml index 7ac2ba0..589debc 100644 --- a/res/layout/tab_title.xml +++ b/res/layout/tab_title.xml @@ -28,7 +28,7 @@ android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="center_vertical" - android:src="@drawable/ic_snapshot" + android:src="@drawable/ic_search_category_history" android:visibility="gone" /> <ImageView android:id="@+id/favicon" diff --git a/res/layout/title_bar.xml b/res/layout/title_bar.xml index 7789bfc..21b5b2e 100644 --- a/res/layout/title_bar.xml +++ b/res/layout/title_bar.xml @@ -19,156 +19,25 @@ android:id="@+id/titlebar" android:layout_width="match_parent" android:layout_height="wrap_content"> - <LinearLayout + <include + layout="@layout/title_bar_nav" android:id="@+id/taburlbar" android:layout_width="match_parent" - android:layout_height="@dimen/toolbar_height" - android:orientation="horizontal" - android:background="@drawable/bg_urlbar"> - <LinearLayout - android:id="@+id/title_bg" - android:layout_width="0dip" - android:layout_weight="1.0" - android:layout_height="match_parent" - android:gravity="center_vertical" - android:orientation="horizontal"> - <FrameLayout - android:id="@+id/iconcombo" - android:layout_width="52dip" - android:layout_height="match_parent" - style="@style/HoloButton"> - <ImageView - android:id="@+id/favicon" - android:layout_width="36dip" - android:layout_height="36dip" - android:paddingLeft="8dip" - android:paddingRight="8dip" - android:layout_gravity="center_vertical" /> - <ImageView - android:id="@+id/lock" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="bottom|right" - android:visibility="gone" /> - </FrameLayout> - <ImageView - android:id="@+id/stop" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:src="@drawable/ic_stop_holo_dark" - style="@style/HoloButton" /> - <com.android.browser.UrlInputView - android:id="@+id/url" - android:focusable="true" - android:layout_width="0dip" - android:layout_weight="1.0" - android:layout_height="match_parent" - android:fadingEdge="horizontal" - android:fadingEdgeLength="24dip" - android:textAppearance="?android:attr/textAppearanceMedium" - android:hint="@string/search_hint" - android:singleLine="true" - android:ellipsize="end" - android:lines="1" - android:scrollHorizontally="true" - android:inputType="text" - android:imeOptions="actionGo" - style="@style/Suggestions" - android:background="@null" /> - <ImageView - android:id="@+id/voice" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:src="@drawable/ic_voice_search_holo_dark" - style="@style/HoloButton" - android:visibility="gone" /> - </LinearLayout> - <ImageButton - android:id="@+id/tab_switcher" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:src="@drawable/ic_windows_holo_dark" - style="@style/HoloButton" /> - <ImageButton - android:id="@+id/more" - android:layout_width="wrap_content" - android:layout_height="match_parent" - style="@style/HoloButton" - android:gravity="center_vertical" - android:src="@*android:drawable/ic_menu_moreoverflow_normal_holo_dark" /> - </LinearLayout> - <LinearLayout + android:layout_height="@dimen/toolbar_height" /> + <include + layout="@layout/title_bar_autologin" android:id="@+id/autologin" - android:background="#FBF0A0" - android:gravity="center_vertical" android:paddingTop="3dip" - android:visibility="gone" - android:layout_below="@+id/taburlbar" + android:layout_below="@id/taburlbar" android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical"> - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:paddingLeft="8dip" - android:paddingRight="8dip"> - <TextView - android:text="@string/autologin_bar_text" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:textColor="@android:color/primary_text_light" - android:textAppearance="?android:attr/textAppearanceMedium" /> - <Spinner - android:id="@+id/autologin_account" - android:layout_height="wrap_content" - android:layout_width="match_parent" - android:paddingLeft="8dp" - android:paddingRight="24dp" - style="@android:style/Widget.Holo.Light.Spinner" /> - </LinearLayout> - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:paddingLeft="8dip" - android:paddingRight="8dip"> - <Button - android:id="@+id/autologin_close" - android:layout_width="0dip" - android:layout_weight="1" - android:layout_height="wrap_content" - android:text="@string/autologin_bar_hide_text" - style="@android:style/Widget.Holo.Light.Button" /> - <ProgressBar - android:id="@+id/autologin_progress" - android:indeterminateOnly="true" - android:layout_height="wrap_content" - android:layout_width="wrap_content" - android:visibility="invisible" /> - <Button - android:id="@+id/autologin_login" - android:text="@string/autologin_bar_login_text" - style="@android:style/Widget.Holo.Light.Button" - android:layout_height="wrap_content" - android:layout_width="0dip" - android:layout_weight="1" /> - </LinearLayout> - <TextView - android:id="@+id/autologin_error" - android:layout_height="wrap_content" - android:layout_width="wrap_content" - android:textColor="#dd6826" - android:text="@string/autologin_bar_error" - android:textAppearance="?android:attr/textAppearanceMedium" - android:visibility="gone" /> - </LinearLayout> + android:layout_height="wrap_content" /> <com.android.browser.PageProgressView android:id="@+id/progress" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@null" - android:layout_below="@+id/taburlbar" + android:layout_below="@id/taburlbar" android:src="@drawable/progress" - android:layout_marginTop="-8dip" + android:layout_marginTop="@dimen/progress_bar_margin" android:visibility="gone" /> </RelativeLayout> diff --git a/res/layout/title_bar_autologin.xml b/res/layout/title_bar_autologin.xml new file mode 100644 index 0000000..839f875 --- /dev/null +++ b/res/layout/title_bar_autologin.xml @@ -0,0 +1,76 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright 2011, 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. +--> +<com.android.browser.AutologinBar + xmlns:android="http://schemas.android.com/apk/res/android" + android:background="#FBF0A0" + android:gravity="center_vertical" + android:visibility="gone" + android:orientation="vertical"> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:paddingLeft="8dip" + android:paddingRight="8dip"> + <TextView + android:text="@string/autologin_bar_text" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textColor="@android:color/primary_text_light" + android:textAppearance="?android:attr/textAppearanceMedium" /> + <Spinner + android:id="@+id/autologin_account" + android:layout_height="wrap_content" + android:layout_width="match_parent" + android:paddingLeft="8dp" + android:paddingRight="24dp" + style="@android:style/Widget.Holo.Light.Spinner" /> + </LinearLayout> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:paddingLeft="8dip" + android:paddingRight="8dip"> + <Button + android:id="@+id/autologin_close" + android:layout_width="0dip" + android:layout_weight="1" + android:layout_height="wrap_content" + android:text="@string/autologin_bar_hide_text" + style="@android:style/Widget.Holo.Light.Button" /> + <ProgressBar + android:id="@+id/autologin_progress" + android:indeterminateOnly="true" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:visibility="invisible" /> + <Button + android:id="@+id/autologin_login" + android:text="@string/autologin_bar_login_text" + style="@android:style/Widget.Holo.Light.Button" + android:layout_height="wrap_content" + android:layout_width="0dip" + android:layout_weight="1" /> + </LinearLayout> + <TextView + android:id="@+id/autologin_error" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:textColor="#dd6826" + android:text="@string/autologin_bar_error" + android:textAppearance="?android:attr/textAppearanceMedium" + android:visibility="gone" /> +</com.android.browser.AutologinBar> diff --git a/res/layout/title_bar_nav.xml b/res/layout/title_bar_nav.xml new file mode 100644 index 0000000..5a3c10e --- /dev/null +++ b/res/layout/title_bar_nav.xml @@ -0,0 +1,93 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright 2011, 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. +--> +<com.android.browser.NavigationBarPhone + xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="horizontal" + android:background="@drawable/bg_urlbar"> + <LinearLayout + android:id="@+id/title_bg" + android:layout_width="0dip" + android:layout_weight="1.0" + android:layout_height="match_parent" + android:gravity="center_vertical" + android:orientation="horizontal"> + <FrameLayout + android:id="@+id/iconcombo" + android:layout_width="52dip" + android:layout_height="match_parent" + style="@style/HoloButton"> + <ImageView + android:id="@+id/favicon" + android:layout_width="36dip" + android:layout_height="36dip" + android:paddingLeft="8dip" + android:paddingRight="8dip" + android:layout_gravity="center_vertical" /> + <ImageView + android:id="@+id/lock" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="bottom|right" + android:visibility="gone" /> + </FrameLayout> + <ImageView + android:id="@+id/stop" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" + android:src="@drawable/ic_stop_holo_dark" + style="@style/HoloButton" /> + <com.android.browser.UrlInputView + android:id="@+id/url" + android:focusable="true" + android:layout_width="0dip" + android:layout_weight="1.0" + android:layout_height="match_parent" + android:fadingEdge="horizontal" + android:fadingEdgeLength="24dip" + android:textAppearance="?android:attr/textAppearanceMedium" + android:hint="@string/search_hint" + android:singleLine="true" + android:ellipsize="end" + android:lines="1" + android:scrollHorizontally="true" + android:inputType="text" + android:imeOptions="actionGo" + style="@style/Suggestions" + android:background="@null" /> + <ImageView + android:id="@+id/voice" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:src="@drawable/ic_voice_search_holo_dark" + style="@style/HoloButton" + android:visibility="gone" /> + </LinearLayout> + <ImageButton + android:id="@+id/tab_switcher" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:src="@drawable/ic_windows_holo_dark" + style="@style/HoloButton" /> + <ImageButton + android:id="@+id/more" + android:layout_width="wrap_content" + android:layout_height="match_parent" + style="@style/HoloButton" + android:gravity="center_vertical" + android:src="@*android:drawable/ic_menu_moreoverflow_normal_holo_dark" /> +</com.android.browser.NavigationBarPhone> diff --git a/res/layout/url_bar.xml b/res/layout/url_bar.xml deleted file mode 100644 index 3864b7d..0000000 --- a/res/layout/url_bar.xml +++ /dev/null @@ -1,190 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - <!-- - Copyright 2010, 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. - --> -<RelativeLayout - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="wrap_content" - > - <LinearLayout - android:id="@+id/autologin" - android:background="#FBF0A0" - android:gravity="center_vertical" - android:paddingTop="3dip" - android:visibility="gone" - android:layout_below="@+id/taburlbar" - android:layout_width="match_parent" - android:layout_height="wrap_content"> - <TextView - android:text="@string/autologin_bar_text" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:textColor="@android:color/primary_text_light" - android:paddingLeft="15dip" - android:paddingRight="15dip" - android:textAppearance="?android:attr/textAppearanceMedium"/> - <Spinner - android:id="@+id/autologin_account" - android:layout_height="wrap_content" - android:layout_width="wrap_content" - style="@android:style/Widget.Holo.Light.Spinner" /> - <Button - android:id="@+id/autologin_login" - android:text="@string/autologin_bar_login_text" - style="@android:style/Widget.Holo.Light.Button" - android:layout_marginRight="15dip" - android:layout_height="wrap_content" - android:layout_width="wrap_content" /> - <ProgressBar - android:id="@+id/autologin_progress" - android:indeterminateOnly="true" - android:layout_height="wrap_content" - android:layout_width="wrap_content" - android:visibility="gone" /> - <TextView - android:id="@+id/autologin_error" - android:layout_height="wrap_content" - android:layout_width="wrap_content" - android:textColor="#dd6826" - android:text="@string/autologin_bar_error" - android:textAppearance="?android:attr/textAppearanceMedium" - android:visibility="gone" /> - <View - android:layout_width="2dip" - android:layout_height="match_parent" - android:layout_weight="1"/> - <ImageButton - android:id="@+id/autologin_close" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:paddingRight="15dip" - android:background="@null" - android:src="@*android:drawable/btn_close"/> - </LinearLayout> - <LinearLayout - android:id="@+id/taburlbar" - android:layout_width="match_parent" - android:layout_height="48dip" - android:orientation="horizontal" - android:background="@drawable/bg_urlbar"> - <ImageButton - android:id="@+id/back" - android:src="@drawable/ic_back_holo_dark" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:paddingLeft="16dip" - style="@style/HoloButton" /> - <ImageButton - android:id="@+id/forward" - android:src="@drawable/ic_forward_holo_dark" - android:layout_width="wrap_content" - android:layout_height="match_parent" - style="@style/HoloButton" /> - <ImageButton - android:id="@+id/stop" - android:layout_width="wrap_content" - android:layout_height="match_parent" - style="@style/HoloButton" - android:gravity="center_vertical" - android:src="@drawable/ic_stop_holo_dark" /> - <LinearLayout - android:id="@+id/urlbar_focused" - android:layout_width="0dip" - android:layout_height="match_parent" - android:layout_weight="1.0" - android:layout_marginLeft="8dip" - android:layout_marginRight="8dip" - android:orientation="horizontal" - android:background="@drawable/url_background"> - <ImageView - android:id="@+id/url_icon" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:src="@drawable/ic_web_holo_dark" - style="@style/HoloIcon" /> - <ImageView - android:id="@+id/lock" - android:layout_width="wrap_content" - android:layout_height="match_parent" - style="@style/HoloIcon" - android:visibility="gone" /> - <com.android.browser.UrlInputView - android:id="@+id/url" - android:layout_width="0dip" - android:layout_weight="1.0" - android:layout_height="match_parent" - android:layout_marginLeft="16dip" - android:paddingLeft="0dip" - android:paddingRight="0dip" - android:background="@null" - android:textAppearance="?android:attr/textAppearanceMedium" - android:hint="@string/search_hint" - android:singleLine="true" - android:ellipsize="end" - android:lines="1" - android:scrollHorizontally="true" - android:inputType="textUri" - android:imeOptions="actionGo" - style="@style/Suggestions" /> - <ImageButton - android:id="@+id/star" - android:src="@drawable/btn_imageview_star" - android:layout_width="wrap_content" - android:layout_height="match_parent" - style="@style/HoloButton" /> - <ImageButton - android:id="@+id/clear" - android:src="@drawable/ic_stop_holo_dark" - android:layout_width="wrap_content" - android:layout_height="match_parent" - style="@style/HoloButton" /> - </LinearLayout> - <ImageButton - android:id="@+id/go" - android:src="@drawable/ic_go_holo_dark" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:visibility="gone" - android:gravity="center_vertical" - style="@style/HoloButton" /> - <ImageButton - android:id="@+id/voicesearch" - android:src="@drawable/ic_voice_search_holo_dark" - android:layout_width="wrap_content" - android:layout_height="match_parent" - style="@style/HoloButton" /> - <ImageButton - android:id="@+id/search" - android:src="@drawable/ic_search_holo_dark" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:gravity="center_vertical" - style="@style/HoloButton" /> - <ImageButton - android:id="@+id/all_btn" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:scaleType="center" - android:paddingRight="16dip" - style="@style/HoloButton" - android:src="@drawable/ic_bookmarks_history_holo_dark" /> - </LinearLayout> - <com.android.browser.PageProgressView - android:id="@+id/progress" - android:layout_width="match_parent" - android:layout_height="22dip" - android:background="@null" - android:layout_below="@+id/taburlbar" - android:src="@drawable/progress" - android:layout_marginTop="-11dip" - android:visibility="gone" /> -</RelativeLayout> diff --git a/res/values-sw600dp/dimensions.xml b/res/values-sw600dp/dimensions.xml index e1ed19e..2c4aaae 100644 --- a/res/values-sw600dp/dimensions.xml +++ b/res/values-sw600dp/dimensions.xml @@ -35,4 +35,6 @@ <dimen name="qc_thumb_height">160dip</dimen> <dimen name="qc_item_size">48dip</dimen> <dimen name="suggest_item_padding">16dp</dimen> + <dimen name="toolbar_height">48dip</dimen> + <dimen name="progress_bar_margin">-11dip</dimen> </resources> diff --git a/res/values/dimensions.xml b/res/values/dimensions.xml index 62deb06..3b57f19 100644 --- a/res/values/dimensions.xml +++ b/res/values/dimensions.xml @@ -73,4 +73,5 @@ <dimen name="nav_tab_text_normal">18sp</dimen> <dimen name="nav_tab_text_small">14sp</dimen> <dimen name="suggest_item_padding">8dp</dimen> + <dimen name="progress_bar_margin">-8dip</dimen> </resources> diff --git a/src/com/android/browser/AutologinBar.java b/src/com/android/browser/AutologinBar.java new file mode 100644 index 0000000..e57d614 --- /dev/null +++ b/src/com/android/browser/AutologinBar.java @@ -0,0 +1,145 @@ +/* + * Copyright (C) 2011 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 com.android.browser; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.ContextThemeWrapper; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.Spinner; +import android.widget.TextView; + +import com.android.browser.DeviceAccountLogin.AutoLoginCallback; + +public class AutologinBar extends LinearLayout implements OnClickListener, + AutoLoginCallback { + + protected Spinner mAutoLoginAccount; + protected Button mAutoLoginLogin; + protected ProgressBar mAutoLoginProgress; + protected TextView mAutoLoginError; + protected View mAutoLoginCancel; + protected DeviceAccountLogin mAutoLoginHandler; + protected ArrayAdapter<String> mAccountsAdapter; + protected TitleBar mTitleBar; + + public AutologinBar(Context context) { + super(context); + } + + public AutologinBar(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public AutologinBar(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + mAutoLoginAccount = (Spinner) findViewById(R.id.autologin_account); + mAutoLoginLogin = (Button) findViewById(R.id.autologin_login); + mAutoLoginLogin.setOnClickListener(this); + mAutoLoginProgress = (ProgressBar) findViewById(R.id.autologin_progress); + mAutoLoginError = (TextView) findViewById(R.id.autologin_error); + mAutoLoginCancel = findViewById(R.id.autologin_close); + mAutoLoginCancel.setOnClickListener(this); + } + + public void setTitleBar(TitleBar titleBar) { + mTitleBar = titleBar; + } + + @Override + public void onClick(View v) { + if (mAutoLoginCancel == v) { + if (mAutoLoginHandler != null) { + mAutoLoginHandler.cancel(); + mAutoLoginHandler = null; + } + hideAutoLogin(true); + } else if (mAutoLoginLogin == v) { + if (mAutoLoginHandler != null) { + mAutoLoginAccount.setEnabled(false); + mAutoLoginLogin.setEnabled(false); + mAutoLoginProgress.setVisibility(View.VISIBLE); + mAutoLoginError.setVisibility(View.GONE); + mAutoLoginHandler.login( + mAutoLoginAccount.getSelectedItemPosition(), this); + } + } + } + + public void updateAutoLogin(Tab tab, boolean animate) { + DeviceAccountLogin login = tab.getDeviceAccountLogin(); + if (login != null) { + mAutoLoginHandler = login; + ContextThemeWrapper wrapper = new ContextThemeWrapper(mContext, + android.R.style.Theme_Holo_Light); + mAccountsAdapter = new ArrayAdapter<String>(wrapper, + android.R.layout.simple_spinner_item, login.getAccountNames()); + mAccountsAdapter.setDropDownViewResource( + android.R.layout.simple_spinner_dropdown_item); + mAutoLoginAccount.setAdapter(mAccountsAdapter); + mAutoLoginAccount.setSelection(0); + mAutoLoginAccount.setEnabled(true); + mAutoLoginLogin.setEnabled(true); + mAutoLoginProgress.setVisibility(View.INVISIBLE); + mAutoLoginError.setVisibility(View.GONE); + switch (login.getState()) { + case DeviceAccountLogin.PROCESSING: + mAutoLoginAccount.setEnabled(false); + mAutoLoginLogin.setEnabled(false); + mAutoLoginProgress.setVisibility(View.VISIBLE); + break; + case DeviceAccountLogin.FAILED: + mAutoLoginProgress.setVisibility(View.INVISIBLE); + mAutoLoginError.setVisibility(View.VISIBLE); + break; + case DeviceAccountLogin.INITIAL: + break; + default: + throw new IllegalStateException(); + } + showAutoLogin(animate); + } else { + hideAutoLogin(animate); + } + } + + void showAutoLogin(boolean animate) { + mTitleBar.showAutoLogin(animate); + } + + void hideAutoLogin(boolean animate) { + mTitleBar.hideAutoLogin(animate); + } + + @Override + public void loginFailed() { + mAutoLoginAccount.setEnabled(true); + mAutoLoginLogin.setEnabled(true); + mAutoLoginProgress.setVisibility(View.INVISIBLE); + mAutoLoginError.setVisibility(View.VISIBLE); + } + +} diff --git a/src/com/android/browser/BaseUi.java b/src/com/android/browser/BaseUi.java index 9de2c57..5551eca 100644 --- a/src/com/android/browser/BaseUi.java +++ b/src/com/android/browser/BaseUi.java @@ -17,7 +17,6 @@ package com.android.browser; import android.app.Activity; -import android.content.pm.PackageManager; import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Bitmap; @@ -110,6 +109,8 @@ public abstract class BaseUi implements UI, OnTouchListener { private boolean mActivityPaused; protected boolean mUseQuickControls; + protected TitleBar mTitleBar; + private NavigationBarBase mNavigationBar; public BaseUi(Activity browser, UiController controller) { mActivity = browser; @@ -140,6 +141,10 @@ public abstract class BaseUi implements UI, OnTouchListener { config.getScaledOverscrollDistance()); mTitlebarScrollTriggerSlop = Math.max(mTitlebarScrollTriggerSlop, config.getScaledTouchSlop()); + mTitleBar = new TitleBar(mActivity, mUiController, this, + mContentView); + mTitleBar.setProgress(100); + mNavigationBar = mTitleBar.getNavigationBar(); } private void cancelStopToast() { @@ -170,6 +175,10 @@ public abstract class BaseUi implements UI, OnTouchListener { public void onConfigurationChanged(Configuration config) { } + public Activity getActivity() { + return mActivity; + } + // key handling @Override @@ -205,7 +214,7 @@ public abstract class BaseUi implements UI, OnTouchListener { public void bookmarkedStatusHasChanged(Tab tab) { if (tab.inForeground()) { boolean isBookmark = tab.isBookmarkedSite(); - getTitleBar().setCurrentUrlIsBookmark(isBookmark); + mNavigationBar.setCurrentUrlIsBookmark(isBookmark); } } @@ -248,10 +257,10 @@ public abstract class BaseUi implements UI, OnTouchListener { onTabDataChanged(tab); onProgressChanged(tab); boolean incognito = mActiveTab.getWebView().isPrivateBrowsingEnabled(); - getTitleBar().setIncognitoMode(incognito); + mNavigationBar.setIncognitoMode(incognito); updateAutoLogin(tab, false); if (web != null && web.getVisibleTitleHeight() - != getTitleBar().getEmbeddedHeight() + != mTitleBar.getEmbeddedHeight() && !mUseQuickControls) { showTitleBarForDuration(); } @@ -422,7 +431,7 @@ public abstract class BaseUi implements UI, OnTouchListener { mUiController.endActionMode(); } showTitleBar(); - getTitleBar().startEditingUrl(clearInput); + mNavigationBar.startEditingUrl(clearInput); } boolean canShowTitleBar() { @@ -433,27 +442,29 @@ public abstract class BaseUi implements UI, OnTouchListener { && !mUiController.isInCustomActionMode(); } - void showTitleBar() { + protected void showTitleBar() { if (canShowTitleBar()) { - getTitleBar().show(); + mTitleBar.show(); } } protected void hideTitleBar() { - if (getTitleBar().isShowing()) { - getTitleBar().hide(); + if (mTitleBar.isShowing()) { + mTitleBar.hide(); } } protected boolean isTitleBarShowing() { - return getTitleBar().isShowing(); + return mTitleBar.isShowing(); } public boolean isEditingUrl() { - return getTitleBar().isEditingUrl(); + return mTitleBar.isEditingUrl(); } - protected abstract TitleBarBase getTitleBar(); + public TitleBar getTitleBar() { + return mTitleBar; + } protected void setTitleGravity(int gravity) { WebView web = getWebView(); @@ -464,20 +475,20 @@ public abstract class BaseUi implements UI, OnTouchListener { @Override public void showVoiceTitleBar(String title, List<String> results) { - getTitleBar().setInVoiceMode(true, results); - getTitleBar().setDisplayTitle(title); + mNavigationBar.setInVoiceMode(true, results); + mNavigationBar.setDisplayTitle(title); } @Override public void revertVoiceTitleBar(Tab tab) { - getTitleBar().setInVoiceMode(false, null); + mNavigationBar.setInVoiceMode(false, null); String url = tab.getUrl(); - getTitleBar().setDisplayTitle(url); + mNavigationBar.setDisplayTitle(url); } @Override public void registerDropdownChangeListener(DropdownChangeListener d) { - getTitleBar().registerDropdownChangeListener(d); + mNavigationBar.registerDropdownChangeListener(d); } @Override @@ -492,7 +503,7 @@ public abstract class BaseUi implements UI, OnTouchListener { FrameLayout wrapper = (FrameLayout) mContentView.findViewById(R.id.webview_wrapper); wrapper.setVisibility(View.GONE); - getTitleBar().stopEditingUrl(); + mNavigationBar.stopEditingUrl(); dismissIME(); hideTitleBar(); if (mActiveTab != null) { @@ -599,7 +610,7 @@ public abstract class BaseUi implements UI, OnTouchListener { } protected void updateAutoLogin(Tab tab, boolean animate) { - getTitleBar().updateAutoLogin(tab, animate); + mTitleBar.updateAutoLogin(tab, animate); } /** @@ -621,7 +632,7 @@ public abstract class BaseUi implements UI, OnTouchListener { } else if (lockIconType == LockIcon.LOCK_ICON_MIXED) { d = mMixLockIcon; } - getTitleBar().setLock(d); + mNavigationBar.setLock(d); } protected void setUrlTitle(Tab tab) { @@ -632,7 +643,7 @@ public abstract class BaseUi implements UI, OnTouchListener { } if (tab.isInVoiceSearchMode()) return; if (tab.inForeground()) { - getTitleBar().setDisplayTitle(url); + mNavigationBar.setDisplayTitle(url); } } @@ -640,7 +651,7 @@ public abstract class BaseUi implements UI, OnTouchListener { protected void setFavicon(Tab tab) { if (tab.inForeground()) { Bitmap icon = tab.getFavicon(); - getTitleBar().setFavicon(icon); + mNavigationBar.setFavicon(icon); } } @@ -793,7 +804,7 @@ public abstract class BaseUi implements UI, OnTouchListener { } } - protected Drawable getFaviconDrawable(Bitmap icon) { + public Drawable getFaviconDrawable(Bitmap icon) { Drawable[] array = new Drawable[3]; array[0] = new PaintDrawable(Color.BLACK); PaintDrawable p = new PaintDrawable(Color.WHITE); @@ -819,7 +830,7 @@ public abstract class BaseUi implements UI, OnTouchListener { * as if the user is editing the URL bar or if the page is loading */ public void suggestHideTitleBar() { - if (!isLoading() && !isEditingUrl()) { + if (!isLoading() && !isEditingUrl() && !mTitleBar.inAutoLogin()) { hideTitleBar(); } } diff --git a/src/com/android/browser/BrowserWebView.java b/src/com/android/browser/BrowserWebView.java index 80f4a53..cd29135 100644 --- a/src/com/android/browser/BrowserWebView.java +++ b/src/com/android/browser/BrowserWebView.java @@ -33,7 +33,7 @@ import java.util.Map; public class BrowserWebView extends WebView { private boolean mBackgroundRemoved = false; - private TitleBarBase mTitleBar; + private TitleBar mTitleBar; private int mCaptureSize; private Bitmap mCapture; private WebProxyView mProxyView; @@ -107,7 +107,7 @@ public class BrowserWebView extends WebView { @Override public void setEmbeddedTitleBar(final View title) { super.setEmbeddedTitleBar(title); - mTitleBar = (TitleBarBase) title; + mTitleBar = (TitleBar) title; } public boolean hasTitleBar() { diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java index f4563bd..116f0e0 100644 --- a/src/com/android/browser/Controller.java +++ b/src/com/android/browser/Controller.java @@ -1287,7 +1287,7 @@ public class Controller protected void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { - if (v instanceof TitleBarBase) { + if (v instanceof TitleBar) { return; } if (!(v instanceof WebView)) { diff --git a/src/com/android/browser/NavigationBarBase.java b/src/com/android/browser/NavigationBarBase.java new file mode 100644 index 0000000..a059352 --- /dev/null +++ b/src/com/android/browser/NavigationBarBase.java @@ -0,0 +1,333 @@ +/* + * Copyright (C) 2011 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 com.android.browser; + +import android.app.SearchManager; +import android.content.Context; +import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.speech.RecognizerResultsIntent; +import android.util.AttributeSet; +import android.view.KeyEvent; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.View.OnFocusChangeListener; +import android.webkit.WebView; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.PopupMenu; +import android.widget.PopupMenu.OnMenuItemClickListener; + +import com.android.browser.UI.DropdownChangeListener; +import com.android.browser.UrlInputView.UrlInputListener; +import com.android.browser.autocomplete.SuggestedTextController.TextChangeWatcher; + +import java.util.List; + +public class NavigationBarBase extends LinearLayout implements OnClickListener, + OnMenuItemClickListener, UrlInputListener, OnFocusChangeListener, + TextChangeWatcher { + + protected BaseUi mBaseUi; + protected TitleBar mTitleBar; + protected UiController mUiController; + protected UrlInputView mUrlInput; + protected boolean mInVoiceMode = false; + + private ImageView mFavicon; + private ImageView mLockIcon; + private View mUaSwitcher; + + public NavigationBarBase(Context context) { + super(context); + } + + public NavigationBarBase(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public NavigationBarBase(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + mLockIcon = (ImageView) findViewById(R.id.lock); + mFavicon = (ImageView) findViewById(R.id.favicon); + mUrlInput = (UrlInputView) findViewById(R.id.url); + mUrlInput.setUrlInputListener(this); + mUrlInput.setController(mUiController); + mUrlInput.setOnFocusChangeListener(this); + mUrlInput.setSelectAllOnFocus(true); + mUrlInput.addQueryTextWatcher(this); + } + + public void setTitleBar(TitleBar titleBar) { + mTitleBar = titleBar; + mBaseUi = mTitleBar.getUi(); + mUiController = mTitleBar.getUiController(); + } + + public void setLock(Drawable d) { + if (mLockIcon == null) return; + if (d == null) { + mLockIcon.setVisibility(View.GONE); + } else { + mLockIcon.setImageDrawable(d); + mLockIcon.setVisibility(View.VISIBLE); + } + } + + public void setFavicon(Bitmap icon) { + if (mFavicon == null) return; + mFavicon.setImageDrawable(mBaseUi.getFaviconDrawable(icon)); + } + + public void setUaSwitcher(View v) { + if (mUaSwitcher != null) { + mUaSwitcher.setOnClickListener(null); + } + mUaSwitcher = v; + mUaSwitcher.setOnClickListener(this); + } + + @Override + public void onClick(View v) { + if (mUaSwitcher == v) { + BrowserSettings settings = BrowserSettings.getInstance(); + WebView web = mTitleBar.getCurrentWebView(); + if (web == null) return; + boolean desktop = settings.hasDesktopUseragent(web); + PopupMenu popup = new PopupMenu(mContext, mUaSwitcher); + Menu menu = popup.getMenu(); + popup.getMenuInflater().inflate(R.menu.ua_switcher, menu); + menu.findItem(R.id.ua_mobile_menu_id).setChecked(!desktop); + menu.findItem(R.id.ua_desktop_menu_id).setChecked(desktop); + popup.setOnMenuItemClickListener(this); + popup.show(); + } + } + + @Override + public boolean onMenuItemClick(MenuItem item) { + BrowserSettings settings = BrowserSettings.getInstance(); + WebView web = mTitleBar.getCurrentWebView(); + if (web == null) return false; + boolean desktop = settings.hasDesktopUseragent(web); + switch (item.getItemId()) { + case R.id.ua_mobile_menu_id: + if (desktop) { + settings.toggleDesktopUseragent(web); + web.loadUrl(web.getOriginalUrl()); + } + return true; + case R.id.ua_desktop_menu_id: + if (!desktop) { + settings.toggleDesktopUseragent(web); + web.loadUrl(web.getOriginalUrl()); + } + return true; + } + return false; + } + + @Override + public void onFocusChange(View view, boolean hasFocus) { + // if losing focus and not in touch mode, leave as is + if (hasFocus || view.isInTouchMode() || mUrlInput.needsUpdate()) { + setFocusState(hasFocus); + } + if (hasFocus) { + mBaseUi.showTitleBar(); + mUrlInput.forceIme(); + if (mInVoiceMode) { + mUrlInput.forceFilter(); + } + } else if (!mUrlInput.needsUpdate()) { + mUrlInput.dismissDropDown(); + mUrlInput.hideIME(); + if (mUrlInput.getText().length() == 0) { + Tab currentTab = mUiController.getTabControl().getCurrentTab(); + if (currentTab != null) { + mUrlInput.setText(currentTab.getUrl(), false); + } + } + mBaseUi.suggestHideTitleBar(); + } + mUrlInput.clearNeedsUpdate(); + } + + protected void setFocusState(boolean focus) { + } + + protected void setSearchMode(boolean voiceSearchEnabled) {} + + public boolean isEditingUrl() { + return mUrlInput.hasFocus(); + } + + void stopEditingUrl() { + mUrlInput.clearFocus(); + } + + void setDisplayTitle(String title) { + if (!isEditingUrl()) { + mUrlInput.setText(title, false); + } + } + + // UrlInput text watcher + + @Override + public void onTextChanged(String newText) { + if (mUrlInput.hasFocus()) { + // clear voice mode when user types + setInVoiceMode(false, null); + } + } + + // voicesearch + + public void setInVoiceMode(boolean voicemode, List<String> voiceResults) { + mInVoiceMode = voicemode; + mUrlInput.setVoiceResults(voiceResults); + } + + void setIncognitoMode(boolean incognito) { + mUrlInput.setIncognitoMode(incognito); + } + + void clearCompletions() { + mUrlInput.setSuggestedText(null); + } + + // UrlInputListener implementation + + /** + * callback from suggestion dropdown + * user selected a suggestion + */ + @Override + public void onAction(String text, String extra, String source) { + mUiController.getCurrentTopWebView().requestFocus(); + if (UrlInputView.TYPED.equals(source)) { + String url = UrlUtils.smartUrlFilter(text, false); + Tab t = mBaseUi.getActiveTab(); + // Only shortcut javascript URIs for now, as there is special + // logic in UrlHandler for other schemas + if (url != null && t != null && url.startsWith("javascript:")) { + mUiController.loadUrl(t, url); + setDisplayTitle(text); + return; + } + } + Intent i = new Intent(); + String action = null; + if (UrlInputView.VOICE.equals(source)) { + action = RecognizerResultsIntent.ACTION_VOICE_SEARCH_RESULTS; + source = null; + } else { + action = Intent.ACTION_SEARCH; + } + i.setAction(action); + i.putExtra(SearchManager.QUERY, text); + if (extra != null) { + i.putExtra(SearchManager.EXTRA_DATA_KEY, extra); + } + if (source != null) { + Bundle appData = new Bundle(); + appData.putString(com.android.common.Search.SOURCE, source); + i.putExtra(SearchManager.APP_DATA, appData); + } + mUiController.handleNewIntent(i); + setDisplayTitle(text); + } + + @Override + public void onDismiss() { + final Tab currentTab = mBaseUi.getActiveTab(); + mBaseUi.hideTitleBar(); + post(new Runnable() { + public void run() { + clearFocus(); + if ((currentTab != null) && !mInVoiceMode) { + setDisplayTitle(currentTab.getUrl()); + } + } + }); + } + + /** + * callback from the suggestion dropdown + * copy text to input field and stay in edit mode + */ + @Override + public void onCopySuggestion(String text) { + mUrlInput.setText(text, true); + if (text != null) { + mUrlInput.setSelection(text.length()); + } + } + + public void setCurrentUrlIsBookmark(boolean isBookmark) { + } + + @Override + public boolean dispatchKeyEventPreIme(KeyEvent evt) { + if (evt.getKeyCode() == KeyEvent.KEYCODE_BACK) { + // catch back key in order to do slightly more cleanup than usual + mUrlInput.clearFocus(); + return true; + } + return super.dispatchKeyEventPreIme(evt); + } + + void registerDropdownChangeListener(DropdownChangeListener d) { + mUrlInput.registerDropdownChangeListener(d); + } + + /** + * called from the Ui when the user wants to edit + * @param clearInput clear the input field + */ + void startEditingUrl(boolean clearInput) { + // editing takes preference of progress + setVisibility(View.VISIBLE); + if (mTitleBar.useQuickControls()) { + mTitleBar.getProgressView().setVisibility(View.GONE); + } + if (!mUrlInput.hasFocus()) { + mUrlInput.requestFocus(); + } + if (clearInput) { + mUrlInput.setText(""); + } else if (mInVoiceMode) { + mUrlInput.showDropDown(); + } + } + + public void onProgressStarted() { + } + + public void onProgressStopped() { + } + +} diff --git a/src/com/android/browser/TitleBarPhone.java b/src/com/android/browser/NavigationBarPhone.java index 66b4648..c0ce428 100644 --- a/src/com/android/browser/TitleBarPhone.java +++ b/src/com/android/browser/NavigationBarPhone.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009 The Android Open Source Project + * Copyright (C) 2011 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. @@ -13,40 +13,29 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.android.browser; import android.app.Activity; import android.content.Context; import android.content.res.Resources; import android.graphics.drawable.Drawable; +import android.util.AttributeSet; import android.view.ContextMenu; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; -import android.view.View.OnClickListener; -import android.view.View.OnFocusChangeListener; import android.view.ViewConfiguration; import android.webkit.WebView; -import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.PopupMenu; import android.widget.PopupMenu.OnDismissListener; import com.android.browser.UrlInputView.StateListener; -import com.android.browser.autocomplete.SuggestedTextController.TextChangeWatcher; - -import java.util.List; -/** - * This class represents a title bar for a particular "tab" or "window" in the - * browser. - */ -public class TitleBarPhone extends TitleBarBase implements OnFocusChangeListener, - OnClickListener, TextChangeWatcher, StateListener, OnDismissListener { +public class NavigationBarPhone extends NavigationBarBase implements + StateListener, OnDismissListener { - private Activity mActivity; private ImageView mStopButton; private ImageView mVoiceButton; private Drawable mStopDrawable; @@ -59,19 +48,21 @@ public class TitleBarPhone extends TitleBarBase implements OnFocusChangeListener private boolean mMenuShowing; private boolean mNeedsMenu; - public TitleBarPhone(Activity activity, UiController controller, PhoneUi ui, - FrameLayout parent) { - super(activity, controller, ui, parent); - mNeedsMenu = !ViewConfiguration.get(activity).hasPermanentMenuKey(); - mActivity = activity; - initLayout(activity, R.layout.title_bar); + public NavigationBarPhone(Context context) { + super(context); + } + + public NavigationBarPhone(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public NavigationBarPhone(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); } @Override - protected void initLayout(Context context, int layoutId) { - super.initLayout(context, layoutId); - mLockIcon = (ImageView) findViewById(R.id.lock); - mFavicon = (ImageView) findViewById(R.id.favicon); + protected void onFinishInflate() { + super.onFinishInflate(); mStopButton = (ImageView) findViewById(R.id.stop); mStopButton.setOnClickListener(this); mVoiceButton = (ImageView) findViewById(R.id.voice); @@ -83,25 +74,22 @@ public class TitleBarPhone extends TitleBarBase implements OnFocusChangeListener mComboIcon = findViewById(R.id.iconcombo); mTitleContainer = findViewById(R.id.title_bg); setFocusState(false); - Resources res = context.getResources(); + Resources res = getContext().getResources(); mStopDrawable = res.getDrawable(R.drawable.ic_stop_holo_dark); mRefreshDrawable = res.getDrawable(R.drawable.ic_refresh_holo_dark); mTextfieldBgDrawable = res.getDrawable(R.drawable.textfield_active_holo_dark); setUaSwitcher(mComboIcon); mUrlInput.setContainer(this); mUrlInput.setStateListener(this); + mNeedsMenu = !ViewConfiguration.get(getContext()).hasPermanentMenuKey(); } @Override public void createContextMenu(ContextMenu menu) { - MenuInflater inflater = mActivity.getMenuInflater(); + Activity activity = mBaseUi.getActivity(); + MenuInflater inflater = activity.getMenuInflater(); inflater.inflate(R.menu.title_context, menu); - mActivity.onCreateContextMenu(menu, this, null); - } - - @Override - public void setInVoiceMode(boolean voicemode, List<String> voiceResults) { - super.setInVoiceMode(voicemode, voiceResults); + activity.onCreateContextMenu(menu, this, null); } @Override @@ -113,25 +101,27 @@ public class TitleBarPhone extends TitleBarBase implements OnFocusChangeListener } @Override - void setProgress(int progress) { - super.setProgress(progress); - if (progress == 100) { - mStopButton.setVisibility(View.GONE); - mStopButton.setImageDrawable(mRefreshDrawable); - if (!isEditingUrl()) { - mComboIcon.setVisibility(View.VISIBLE); - } - } else { - if (mStopButton.getDrawable() != mStopDrawable) { - mStopButton.setImageDrawable(mStopDrawable); - if (mStopButton.getVisibility() != View.VISIBLE) { - mComboIcon.setVisibility(View.GONE); - mStopButton.setVisibility(View.VISIBLE); - } + public void onProgressStarted() { + super.onProgressStarted(); + if (mStopButton.getDrawable() != mStopDrawable) { + mStopButton.setImageDrawable(mStopDrawable); + if (mStopButton.getVisibility() != View.VISIBLE) { + mComboIcon.setVisibility(View.GONE); + mStopButton.setVisibility(View.VISIBLE); } } } + @Override + public void onProgressStopped() { + super.onProgressStopped(); + mStopButton.setVisibility(View.GONE); + mStopButton.setImageDrawable(mRefreshDrawable); + if (!isEditingUrl()) { + mComboIcon.setVisibility(View.VISIBLE); + } + } + /** * Update the text displayed in the title bar. * @param title String to display. If null, the new tab string will be @@ -150,19 +140,9 @@ public class TitleBarPhone extends TitleBarBase implements OnFocusChangeListener } @Override - public void onFocusChange(View v, boolean hasFocus) { - if (v == mUrlInput) { - if (hasFocus) { - mActivity.closeOptionsMenu(); - } - } - super.onFocusChange(v, hasFocus); - } - - @Override public void onClick(View v) { if (v == mStopButton) { - if (mInLoad) { + if (mTitleBar.isInLoad()) { mUiController.stopLoading(); } else { WebView web = mBaseUi.getWebView(); @@ -246,5 +226,4 @@ public class TitleBarPhone extends TitleBarBase implements OnFocusChangeListener break; } } - } diff --git a/src/com/android/browser/TitleBarXLarge.java b/src/com/android/browser/NavigationBarTablet.java index 6aed86c..b7b3ed9 100644 --- a/src/com/android/browser/TitleBarXLarge.java +++ b/src/com/android/browser/NavigationBarTablet.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 The Android Open Source Project + * Copyright (C) 2011 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. @@ -13,38 +13,21 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.android.browser; -import com.android.browser.autocomplete.SuggestedTextController.TextChangeWatcher; - -import android.app.Activity; import android.content.Context; -import android.content.SharedPreferences; -import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.content.res.Resources; -import android.graphics.Bitmap; import android.graphics.drawable.Drawable; -import android.preference.PreferenceManager; import android.text.TextUtils; +import android.util.AttributeSet; import android.view.View; -import android.view.View.OnClickListener; -import android.view.View.OnFocusChangeListener; import android.webkit.WebView; -import android.widget.FrameLayout; import android.widget.ImageButton; import android.widget.ImageView; import java.util.List; -/** - * tabbed title bar for xlarge screen browser - */ -public class TitleBarXLarge extends TitleBarBase - implements OnClickListener, OnFocusChangeListener, TextChangeWatcher, - DeviceAccountLogin.AutoLoginCallback { - - private XLargeUi mUi; +public class NavigationBarTablet extends NavigationBarBase { private Drawable mStopDrawable; private Drawable mReloadDrawable; @@ -63,24 +46,34 @@ public class TitleBarXLarge extends TitleBarBase private Drawable mFocusDrawable; private Drawable mUnfocusDrawable; - public TitleBarXLarge(Activity activity, UiController controller, - XLargeUi ui, FrameLayout parent) { - super(activity, controller, ui, parent); - mUi = ui; - Resources resources = activity.getResources(); + public NavigationBarTablet(Context context) { + super(context); + init(context); + } + + public NavigationBarTablet(Context context, AttributeSet attrs) { + super(context, attrs); + init(context); + } + + public NavigationBarTablet(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + init(context); + } + + private void init(Context context) { + Resources resources = context.getResources(); mStopDrawable = resources.getDrawable(R.drawable.ic_stop_holo_dark); mReloadDrawable = resources.getDrawable(R.drawable.ic_refresh_holo_dark); mFocusDrawable = resources.getDrawable( R.drawable.textfield_active_holo_dark); mUnfocusDrawable = resources.getDrawable( R.drawable.textfield_default_holo_dark); - mInVoiceMode = false; - initLayout(activity, R.layout.url_bar); } @Override - protected void initLayout(Context context, int layoutId) { - super.initLayout(context, layoutId); + protected void onFinishInflate() { + super.onFinishInflate(); mAllButton = findViewById(R.id.all_btn); // TODO: Change enabled states based on whether you can go // back/forward. Probably should be done inside onPageStarted. @@ -90,7 +83,6 @@ public class TitleBarXLarge extends TitleBarBase mStar = (ImageView) findViewById(R.id.star); mStopButton = (ImageView) findViewById(R.id.stop); mSearchButton = (ImageView) findViewById(R.id.search); - mLockIcon = (ImageView) findViewById(R.id.lock); mGoButton = findViewById(R.id.go); mClearButton = findViewById(R.id.clear); mVoiceSearch = (ImageView) findViewById(R.id.voicesearch); @@ -106,6 +98,11 @@ public class TitleBarXLarge extends TitleBarBase mVoiceSearch.setOnClickListener(this); setUaSwitcher(mUrlIcon); mUrlInput.setContainer(mUrlContainer); + } + + @Override + public void setTitleBar(TitleBar titleBar) { + super.setTitleBar(titleBar); setFocusState(false); } @@ -127,7 +124,6 @@ public class TitleBarXLarge extends TitleBarBase mStar.setActivated(isBookmark); } - @Override public void onClick(View v) { if (mBackButton == v) { @@ -139,7 +135,7 @@ public class TitleBarXLarge extends TitleBarBase } else if (mAllButton == v) { mUiController.bookmarksOrHistoryPicker(false); } else if (mSearchButton == v) { - mUi.editUrl(true); + mBaseUi.editUrl(true); } else if (mStopButton == v) { stopOrRefresh(); } else if (mGoButton == v) { @@ -156,9 +152,6 @@ public class TitleBarXLarge extends TitleBarBase } } - @Override - void setFavicon(Bitmap icon) { } - private void clearOrClose() { if (TextUtils.isEmpty(mUrlInput.getUserText())) { // close @@ -189,7 +182,7 @@ public class TitleBarXLarge extends TitleBarBase mVoiceSearch.setVisibility(View.GONE); mStar.setVisibility(View.VISIBLE); mClearButton.setVisibility(View.GONE); - if (mUseQuickControls) { + if (mTitleBar.useQuickControls()) { mSearchButton.setVisibility(View.GONE); } else { mSearchButton.setVisibility(View.VISIBLE); @@ -201,7 +194,7 @@ public class TitleBarXLarge extends TitleBarBase } private void stopOrRefresh() { - if (mInLoad) { + if (mTitleBar.isInLoad()) { mUiController.stopLoading(); } else { mUiController.getCurrentTopWebView().reload(); @@ -209,12 +202,12 @@ public class TitleBarXLarge extends TitleBarBase } @Override - protected void onProgressStarted() { + public void onProgressStarted() { mStopButton.setImageDrawable(mStopDrawable); } @Override - protected void onProgressStopped() { + public void onProgressStopped() { mStopButton.setImageDrawable(mReloadDrawable); } @@ -240,12 +233,4 @@ public class TitleBarXLarge extends TitleBarBase } } - @Override - public View focusSearch(View focused, int dir) { - if (FOCUS_DOWN == dir && hasFocus()) { - return getCurrentWebView(); - } - return super.focusSearch(focused, dir); - } - } diff --git a/src/com/android/browser/PhoneUi.java b/src/com/android/browser/PhoneUi.java index d1db578..8b0c146 100644 --- a/src/com/android/browser/PhoneUi.java +++ b/src/com/android/browser/PhoneUi.java @@ -34,10 +34,10 @@ public class PhoneUi extends BaseUi { private static final String LOGTAG = "PhoneUi"; - private TitleBarPhone mTitleBar; private ActiveTabsPage mActiveTabsPage; private PieControlPhone mPieControl; private NavScreen mNavScreen; + private NavigationBarPhone mNavigationBar; boolean mExtendedMenuOpen; boolean mOptionsMenuOpen; @@ -49,13 +49,9 @@ public class PhoneUi extends BaseUi { */ public PhoneUi(Activity browser, UiController controller) { super(browser, controller); - mTitleBar = new TitleBarPhone(mActivity, mUiController, this, - mContentView); - // mTitleBar will be always be shown in the fully loaded mode on - // phone - mTitleBar.setProgress(100); mActivity.getActionBar().hide(); setUseQuickControls(BrowserSettings.getInstance().useQuickControls()); + mNavigationBar = (NavigationBarPhone) mTitleBar.getNavigationBar(); } @Override @@ -86,7 +82,7 @@ public class PhoneUi extends BaseUi { @Override public void editUrl(boolean clearInput) { if (mUseQuickControls) { - getTitleBar().setShowProgressOnly(false); + mTitleBar.setShowProgressOnly(false); } super.editUrl(clearInput); } @@ -178,11 +174,6 @@ public class PhoneUi extends BaseUi { tab.getTopWindow().requestFocus(); } - @Override - protected TitleBarBase getTitleBar() { - return mTitleBar; - } - /** * Suggest to the UI that the title bar can be hidden. The UI will then * decide whether or not to hide based off a number of factors, such @@ -190,8 +181,8 @@ public class PhoneUi extends BaseUi { */ @Override public void suggestHideTitleBar() { - if (!isLoading() && !isEditingUrl() && !mTitleBar.isMenuShowing()) { - hideTitleBar(); + if (!mNavigationBar.isMenuShowing()) { + super.suggestHideTitleBar(); } } @@ -266,9 +257,9 @@ public class PhoneUi extends BaseUi { protected void setTitleGravity(int gravity) { if (mUseQuickControls) { FrameLayout.LayoutParams lp = - (FrameLayout.LayoutParams) getTitleBar().getLayoutParams(); + (FrameLayout.LayoutParams) mTitleBar.getLayoutParams(); lp.gravity = gravity; - getTitleBar().setLayoutParams(lp); + mTitleBar.setLayoutParams(lp); } else { super.setTitleGravity(gravity); } @@ -277,7 +268,7 @@ public class PhoneUi extends BaseUi { @Override public void setUseQuickControls(boolean useQuickControls) { mUseQuickControls = useQuickControls; - getTitleBar().setUseQuickControls(mUseQuickControls); + mTitleBar.setUseQuickControls(mUseQuickControls); if (useQuickControls) { mPieControl = new PieControlPhone(mActivity, mUiController, this); mPieControl.attachToContainer(mContentView); diff --git a/src/com/android/browser/TitleBar.java b/src/com/android/browser/TitleBar.java new file mode 100644 index 0000000..4e93124 --- /dev/null +++ b/src/com/android/browser/TitleBar.java @@ -0,0 +1,341 @@ +/* + * Copyright (C) 2010 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 com.android.browser; + +import android.animation.Animator; +import android.animation.Animator.AnimatorListener; +import android.animation.ObjectAnimator; +import android.content.Context; +import android.content.res.Resources; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.Animation; +import android.view.animation.Animation.AnimationListener; +import android.view.animation.AnimationUtils; +import android.view.animation.DecelerateInterpolator; +import android.webkit.WebView; +import android.widget.AbsoluteLayout; +import android.widget.FrameLayout; +import android.widget.RelativeLayout; + + +/** + * Base class for a title bar used by the browser. + */ +public class TitleBar extends RelativeLayout { + + private static final int PROGRESS_MAX = 100; + private static final float ANIM_TITLEBAR_DECELERATE = 2.5f; + + private UiController mUiController; + private BaseUi mBaseUi; + private FrameLayout mParent; + private PageProgressView mProgress; + + private AutologinBar mAutoLogin; + private NavigationBarBase mNavBar; + private boolean mUseQuickControls; + + //state + private boolean mShowing; + private boolean mInLoad; + private boolean mSkipTitleBarAnimations; + private Animator mTitleBarAnimator; + + public TitleBar(Context context, UiController controller, BaseUi ui, + FrameLayout parent) { + super(context, null); + mUiController = controller; + mBaseUi = ui; + mParent = parent; + initLayout(context); + } + + private void initLayout(Context context) { + LayoutInflater factory = LayoutInflater.from(context); + factory.inflate(R.layout.title_bar, this); + mProgress = (PageProgressView) findViewById(R.id.progress); + mAutoLogin = (AutologinBar) findViewById(R.id.autologin); + mAutoLogin.setTitleBar(this); + mNavBar = (NavigationBarBase) findViewById(R.id.taburlbar); + mNavBar.setTitleBar(this); + } + + public BaseUi getUi() { + return mBaseUi; + } + + public UiController getUiController() { + return mUiController; + } + + public void setUseQuickControls(boolean use) { + mUseQuickControls = use; + setLayoutParams(makeLayoutParams()); + } + + void setShowProgressOnly(boolean progress) { + if (progress && !inAutoLogin()) { + mNavBar.setVisibility(View.GONE); + } else { + mNavBar.setVisibility(View.VISIBLE); + } + } + + void setSkipTitleBarAnimations(boolean skip) { + mSkipTitleBarAnimations = skip; + } + + void setupTitleBarAnimator(Animator animator) { + Resources res = mContext.getResources(); + int duration = res.getInteger(R.integer.titlebar_animation_duration); + animator.setInterpolator(new DecelerateInterpolator( + ANIM_TITLEBAR_DECELERATE)); + animator.setDuration(duration); + } + + void show() { + if (mUseQuickControls) { + mParent.addView(this); + } else { + if (!mSkipTitleBarAnimations) { + cancelTitleBarAnimation(false); + int visibleHeight = getVisibleTitleHeight(); + float startPos = (-getEmbeddedHeight() + visibleHeight); + if (getTranslationY() != 0) { + startPos = Math.max(startPos, getTranslationY()); + } + mTitleBarAnimator = ObjectAnimator.ofFloat(this, + "translationY", + startPos, 0); + setupTitleBarAnimator(mTitleBarAnimator); + mTitleBarAnimator.start(); + } + mBaseUi.setTitleGravity(Gravity.TOP); + } + mShowing = true; + } + + void hide() { + if (mUseQuickControls) { + mParent.removeView(this); + } else { + if (!mSkipTitleBarAnimations) { + cancelTitleBarAnimation(false); + int visibleHeight = getVisibleTitleHeight(); + mTitleBarAnimator = ObjectAnimator.ofFloat(this, + "translationY", getTranslationY(), + (-getEmbeddedHeight() + visibleHeight)); + mTitleBarAnimator.addListener(mHideTileBarAnimatorListener); + setupTitleBarAnimator(mTitleBarAnimator); + mTitleBarAnimator.start(); + } else { + mBaseUi.setTitleGravity(Gravity.NO_GRAVITY); + } + } + mShowing = false; + } + + boolean isShowing() { + return mShowing; + } + + void cancelTitleBarAnimation(boolean reset) { + if (mTitleBarAnimator != null) { + mTitleBarAnimator.cancel(); + mTitleBarAnimator = null; + } + if (reset) { + setTranslationY(0); + } + } + + private AnimatorListener mHideTileBarAnimatorListener = new AnimatorListener() { + + boolean mWasCanceled; + @Override + public void onAnimationStart(Animator animation) { + mWasCanceled = false; + } + + @Override + public void onAnimationRepeat(Animator animation) { + } + + @Override + public void onAnimationEnd(Animator animation) { + if (!mWasCanceled) { + setTranslationY(0); + } + mBaseUi.setTitleGravity(Gravity.NO_GRAVITY); + } + + @Override + public void onAnimationCancel(Animator animation) { + mWasCanceled = true; + } + }; + + private int getVisibleTitleHeight() { + Tab tab = mBaseUi.getActiveTab(); + WebView webview = tab != null ? tab.getWebView() : null; + return webview != null ? webview.getVisibleTitleHeight() : 0; + } + + /** + * Update the progress, from 0 to 100. + */ + public void setProgress(int newProgress) { + if (newProgress >= PROGRESS_MAX) { + mProgress.setProgress(PageProgressView.MAX_PROGRESS); + mProgress.setVisibility(View.GONE); + mInLoad = false; + mNavBar.onProgressStopped(); + // check if needs to be hidden + if (!isEditingUrl() && !inAutoLogin()) { + hide(); + if (mUseQuickControls) { + setShowProgressOnly(false); + } + } + } else { + if (!mInLoad) { + mProgress.setVisibility(View.VISIBLE); + mInLoad = true; + mNavBar.onProgressStarted(); + } + mProgress.setProgress(newProgress * PageProgressView.MAX_PROGRESS + / PROGRESS_MAX); + if (!mShowing) { + if (mUseQuickControls && !isEditingUrl()) { + setShowProgressOnly(true); + } + show(); + } + } + } + + public int getEmbeddedHeight() { + int height = mNavBar.getHeight(); + if (mAutoLogin.getVisibility() == View.VISIBLE) { + height += mAutoLogin.getHeight(); + } + return height; + } + + public void updateAutoLogin(Tab tab, boolean animate) { + mAutoLogin.updateAutoLogin(tab, animate); + } + + public void showAutoLogin(boolean animate) { + if (mUseQuickControls) { + mBaseUi.showTitleBar(); + } + mAutoLogin.setVisibility(View.VISIBLE); + if (animate) { + mAutoLogin.startAnimation(AnimationUtils.loadAnimation( + getContext(), R.anim.autologin_enter)); + } + } + + public void hideAutoLogin(boolean animate) { + if (mUseQuickControls) { + mBaseUi.hideTitleBar(); + mAutoLogin.setVisibility(View.GONE); + mBaseUi.refreshWebView(); + } else { + if (animate) { + Animation anim = AnimationUtils.loadAnimation(getContext(), + R.anim.autologin_exit); + anim.setAnimationListener(new AnimationListener() { + @Override + public void onAnimationEnd(Animation a) { + mAutoLogin.setVisibility(View.GONE); + mBaseUi.refreshWebView(); + } + + @Override + public void onAnimationStart(Animation a) { + } + + @Override + public void onAnimationRepeat(Animation a) { + } + }); + mAutoLogin.startAnimation(anim); + } else if (mAutoLogin.getAnimation() == null) { + mAutoLogin.setVisibility(View.GONE); + mBaseUi.refreshWebView(); + } + } + } + + public boolean inAutoLogin() { + return mAutoLogin.getVisibility() == View.VISIBLE; + } + + public boolean isEditingUrl() { + return mNavBar.isEditingUrl(); + } + + public WebView getCurrentWebView() { + Tab t = mBaseUi.getActiveTab(); + if (t != null) { + return t.getWebView(); + } else { + return null; + } + } + + public PageProgressView getProgressView() { + return mProgress; + } + + public NavigationBarBase getNavigationBar() { + return mNavBar; + } + + public boolean useQuickControls() { + return mUseQuickControls; + } + + public boolean isInLoad() { + return mInLoad; + } + + private ViewGroup.LayoutParams makeLayoutParams() { + if (mUseQuickControls) { + return new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, + LayoutParams.WRAP_CONTENT); + } else { + return new AbsoluteLayout.LayoutParams( + LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, + 0, 0); + } + } + + @Override + public View focusSearch(View focused, int dir) { + if (FOCUS_DOWN == dir && hasFocus()) { + return getCurrentWebView(); + } + return super.focusSearch(focused, dir); + } + +} diff --git a/src/com/android/browser/TitleBarBase.java b/src/com/android/browser/TitleBarBase.java deleted file mode 100644 index 17b9e19..0000000 --- a/src/com/android/browser/TitleBarBase.java +++ /dev/null @@ -1,664 +0,0 @@ -/* - * Copyright (C) 2010 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 com.android.browser; - -import android.animation.Animator; -import android.animation.Animator.AnimatorListener; -import android.animation.ObjectAnimator; -import android.app.SearchManager; -import android.content.Context; -import android.content.Intent; -import android.content.res.Resources; -import android.graphics.Bitmap; -import android.graphics.drawable.Drawable; -import android.os.Bundle; -import android.speech.RecognizerResultsIntent; -import android.text.TextUtils; -import android.view.ContextThemeWrapper; -import android.view.Gravity; -import android.view.KeyEvent; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.View.OnFocusChangeListener; -import android.view.ViewGroup; -import android.view.animation.Animation; -import android.view.animation.Animation.AnimationListener; -import android.view.animation.AnimationUtils; -import android.view.animation.DecelerateInterpolator; -import android.webkit.WebView; -import android.widget.AbsoluteLayout; -import android.widget.ArrayAdapter; -import android.widget.Button; -import android.widget.FrameLayout; -import android.widget.ImageView; -import android.widget.PopupMenu; -import android.widget.PopupMenu.OnMenuItemClickListener; -import android.widget.ProgressBar; -import android.widget.RelativeLayout; -import android.widget.Spinner; -import android.widget.TextView; - -import com.android.browser.UI.DropdownChangeListener; -import com.android.browser.UrlInputView.UrlInputListener; -import com.android.browser.autocomplete.SuggestedTextController.TextChangeWatcher; - -import java.util.List; - -/** - * Base class for a title bar used by the browser. - */ -public class TitleBarBase extends RelativeLayout - implements OnClickListener, OnFocusChangeListener, UrlInputListener, - TextChangeWatcher, DeviceAccountLogin.AutoLoginCallback, - OnMenuItemClickListener { - - protected static final int PROGRESS_MAX = 100; - private static final float ANIM_TITLEBAR_DECELERATE = 2.5f; - - // These need to be set by the subclass. - protected ImageView mFavicon; - protected ImageView mLockIcon; - - protected UiController mUiController; - protected BaseUi mBaseUi; - protected FrameLayout mParent; - protected PageProgressView mProgress; - protected UrlInputView mUrlInput; - protected boolean mInVoiceMode; - protected View mContainer; - private View mUaSwitcher; - - // Auto-login UI - protected View mAutoLogin; - protected Spinner mAutoLoginAccount; - protected Button mAutoLoginLogin; - protected ProgressBar mAutoLoginProgress; - protected TextView mAutoLoginError; - protected View mAutoLoginCancel; - protected DeviceAccountLogin mAutoLoginHandler; - protected ArrayAdapter<String> mAccountsAdapter; - protected boolean mUseQuickControls; - - //state - protected boolean mShowing; - protected boolean mInLoad; - protected boolean mSkipTitleBarAnimations; - private Animator mTitleBarAnimator; - - public TitleBarBase(Context context, UiController controller, BaseUi ui, - FrameLayout parent) { - super(context, null); - mUiController = controller; - mBaseUi = ui; - mParent = parent; - } - - protected void initLayout(Context context, int layoutId) { - LayoutInflater factory = LayoutInflater.from(context); - factory.inflate(layoutId, this); - mContainer = findViewById(R.id.taburlbar); - mProgress = (PageProgressView) findViewById(R.id.progress); - mUrlInput = (UrlInputView) findViewById(R.id.url); - mLockIcon = (ImageView) findViewById(R.id.lock); - mUrlInput.setUrlInputListener(this); - mUrlInput.setController(mUiController); - mUrlInput.setOnFocusChangeListener(this); - mUrlInput.setSelectAllOnFocus(true); - mUrlInput.addQueryTextWatcher(this); - mAutoLogin = findViewById(R.id.autologin); - mAutoLoginAccount = (Spinner) findViewById(R.id.autologin_account); - mAutoLoginLogin = (Button) findViewById(R.id.autologin_login); - mAutoLoginLogin.setOnClickListener(this); - mAutoLoginProgress = (ProgressBar) findViewById(R.id.autologin_progress); - mAutoLoginError = (TextView) findViewById(R.id.autologin_error); - mAutoLoginCancel = mAutoLogin.findViewById(R.id.autologin_close); - mAutoLoginCancel.setOnClickListener(this); - } - - protected void setupUrlInput() { - } - - protected void setUseQuickControls(boolean use) { - mUseQuickControls = use; - setLayoutParams(makeLayoutParams()); - } - - void setShowProgressOnly(boolean progress) { - if (progress && !inAutoLogin()) { - mContainer.setVisibility(View.GONE); - } else { - mContainer.setVisibility(View.VISIBLE); - } - } - - void setSkipTitleBarAnimations(boolean skip) { - mSkipTitleBarAnimations = skip; - } - - void setupTitleBarAnimator(Animator animator) { - Resources res = mContext.getResources(); - int duration = res.getInteger(R.integer.titlebar_animation_duration); - animator.setInterpolator(new DecelerateInterpolator( - ANIM_TITLEBAR_DECELERATE)); - animator.setDuration(duration); - } - - void show() { - if (mUseQuickControls) { - mParent.addView(this); - } else { - if (!mSkipTitleBarAnimations) { - cancelTitleBarAnimation(false); - int visibleHeight = getVisibleTitleHeight(); - float startPos = (-getEmbeddedHeight() + visibleHeight); - if (getTranslationY() != 0) { - startPos = Math.max(startPos, getTranslationY()); - } - mTitleBarAnimator = ObjectAnimator.ofFloat(this, - "translationY", - startPos, 0); - setupTitleBarAnimator(mTitleBarAnimator); - mTitleBarAnimator.start(); - } - mBaseUi.setTitleGravity(Gravity.TOP); - } - mShowing = true; - } - - void hide() { - if (mUseQuickControls) { - mParent.removeView(this); - } else { - if (!mSkipTitleBarAnimations) { - cancelTitleBarAnimation(false); - int visibleHeight = getVisibleTitleHeight(); - mTitleBarAnimator = ObjectAnimator.ofFloat(this, - "translationY", getTranslationY(), - (-getEmbeddedHeight() + visibleHeight)); - mTitleBarAnimator.addListener(mHideTileBarAnimatorListener); - setupTitleBarAnimator(mTitleBarAnimator); - mTitleBarAnimator.start(); - } else { - mBaseUi.setTitleGravity(Gravity.NO_GRAVITY); - } - } - mShowing = false; - } - - boolean isShowing() { - return mShowing; - } - - void cancelTitleBarAnimation(boolean reset) { - if (mTitleBarAnimator != null) { - mTitleBarAnimator.cancel(); - mTitleBarAnimator = null; - } - if (reset) { - setTranslationY(0); - } - } - - private AnimatorListener mHideTileBarAnimatorListener = new AnimatorListener() { - - boolean mWasCanceled; - @Override - public void onAnimationStart(Animator animation) { - mWasCanceled = false; - } - - @Override - public void onAnimationRepeat(Animator animation) { - } - - @Override - public void onAnimationEnd(Animator animation) { - if (!mWasCanceled) { - setTranslationY(0); - } - mBaseUi.setTitleGravity(Gravity.NO_GRAVITY); - } - - @Override - public void onAnimationCancel(Animator animation) { - mWasCanceled = true; - } - }; - - private int getVisibleTitleHeight() { - Tab tab = mBaseUi.getActiveTab(); - WebView webview = tab != null ? tab.getWebView() : null; - return webview != null ? webview.getVisibleTitleHeight() : 0; - } - - /** - * Update the progress, from 0 to 100. - */ - void setProgress(int newProgress) { - if (newProgress >= PROGRESS_MAX) { - mProgress.setProgress(PageProgressView.MAX_PROGRESS); - mProgress.setVisibility(View.GONE); - mInLoad = false; - onProgressStopped(); - // check if needs to be hidden - if (!isEditingUrl() && !inAutoLogin()) { - hide(); - if (mUseQuickControls) { - setShowProgressOnly(false); - } - } - } else { - if (!mInLoad) { - mProgress.setVisibility(View.VISIBLE); - mInLoad = true; - onProgressStarted(); - } - mProgress.setProgress(newProgress * PageProgressView.MAX_PROGRESS - / PROGRESS_MAX); - if (!mShowing) { - if (mUseQuickControls && !isEditingUrl()) { - setShowProgressOnly(true); - } - show(); - } - } - } - - protected void onProgressStarted() { - } - - protected void onProgressStopped() { - } - - /* package */ void setLock(Drawable d) { - assert mLockIcon != null; - if (null == d) { - mLockIcon.setVisibility(View.GONE); - } else { - mLockIcon.setImageDrawable(d); - mLockIcon.setVisibility(View.VISIBLE); - } - } - - /* package */ void setFavicon(Bitmap icon) { - mFavicon.setImageDrawable(mBaseUi.getFaviconDrawable(icon)); - } - - public int getEmbeddedHeight() { - int height = mContainer.getHeight(); - if (mAutoLogin.getVisibility() == View.VISIBLE) { - height += mAutoLogin.getHeight(); - } - return height; - } - - protected void updateAutoLogin(Tab tab, boolean animate) { - DeviceAccountLogin login = tab.getDeviceAccountLogin(); - if (login != null) { - mAutoLoginHandler = login; - ContextThemeWrapper wrapper = new ContextThemeWrapper(mContext, - android.R.style.Theme_Holo_Light); - mAccountsAdapter = new ArrayAdapter<String>(wrapper, - android.R.layout.simple_spinner_item, login.getAccountNames()); - mAccountsAdapter.setDropDownViewResource( - android.R.layout.simple_spinner_dropdown_item); - mAutoLoginAccount.setAdapter(mAccountsAdapter); - mAutoLoginAccount.setSelection(0); - mAutoLoginAccount.setEnabled(true); - mAutoLoginLogin.setEnabled(true); - mAutoLoginProgress.setVisibility(View.INVISIBLE); - mAutoLoginError.setVisibility(View.GONE); - switch (login.getState()) { - case DeviceAccountLogin.PROCESSING: - mAutoLoginAccount.setEnabled(false); - mAutoLoginLogin.setEnabled(false); - mAutoLoginProgress.setVisibility(View.VISIBLE); - break; - case DeviceAccountLogin.FAILED: - mAutoLoginProgress.setVisibility(View.INVISIBLE); - mAutoLoginError.setVisibility(View.VISIBLE); - break; - case DeviceAccountLogin.INITIAL: - break; - default: - throw new IllegalStateException(); - } - showAutoLogin(animate); - } else { - hideAutoLogin(animate); - } - } - - protected void showAutoLogin(boolean animate) { - if (mUseQuickControls) { - mBaseUi.showTitleBar(); - } - mAutoLogin.setVisibility(View.VISIBLE); - if (animate) { - mAutoLogin.startAnimation(AnimationUtils.loadAnimation( - getContext(), R.anim.autologin_enter)); - } - } - - protected void hideAutoLogin(boolean animate) { - mAutoLoginHandler = null; - if (mUseQuickControls) { - mBaseUi.hideTitleBar(); - mAutoLogin.setVisibility(View.GONE); - mBaseUi.refreshWebView(); - } else { - if (animate) { - Animation anim = AnimationUtils.loadAnimation(getContext(), - R.anim.autologin_exit); - anim.setAnimationListener(new AnimationListener() { - @Override - public void onAnimationEnd(Animation a) { - mAutoLogin.setVisibility(View.GONE); - mBaseUi.refreshWebView(); - } - - @Override - public void onAnimationStart(Animation a) { - } - - @Override - public void onAnimationRepeat(Animation a) { - } - }); - mAutoLogin.startAnimation(anim); - } else if (mAutoLogin.getAnimation() == null) { - mAutoLogin.setVisibility(View.GONE); - mBaseUi.refreshWebView(); - } - } - } - - @Override - public void loginFailed() { - mAutoLoginAccount.setEnabled(true); - mAutoLoginLogin.setEnabled(true); - mAutoLoginProgress.setVisibility(View.INVISIBLE); - mAutoLoginError.setVisibility(View.VISIBLE); - } - - - protected boolean inAutoLogin() { - return mAutoLoginHandler != null; - } - - public void setUaSwitcher(View v) { - if (mUaSwitcher != null) { - mUaSwitcher.setOnClickListener(null); - } - mUaSwitcher = v; - mUaSwitcher.setOnClickListener(this); - } - - @Override - public void onClick(View v) { - if (mAutoLoginCancel == v) { - if (mAutoLoginHandler != null) { - mAutoLoginHandler.cancel(); - mAutoLoginHandler = null; - } - hideAutoLogin(true); - } else if (mAutoLoginLogin == v) { - if (mAutoLoginHandler != null) { - mAutoLoginAccount.setEnabled(false); - mAutoLoginLogin.setEnabled(false); - mAutoLoginProgress.setVisibility(View.VISIBLE); - mAutoLoginError.setVisibility(View.GONE); - mAutoLoginHandler.login( - mAutoLoginAccount.getSelectedItemPosition(), this); - } - } else if (mUaSwitcher == v) { - BrowserSettings settings = BrowserSettings.getInstance(); - WebView web = getCurrentWebView(); - if (web == null) return; - boolean desktop = settings.hasDesktopUseragent(web); - PopupMenu popup = new PopupMenu(mContext, mUaSwitcher); - Menu menu = popup.getMenu(); - popup.getMenuInflater().inflate(R.menu.ua_switcher, menu); - menu.findItem(R.id.ua_mobile_menu_id).setChecked(!desktop); - menu.findItem(R.id.ua_desktop_menu_id).setChecked(desktop); - popup.setOnMenuItemClickListener(this); - popup.show(); - } - } - - @Override - public boolean onMenuItemClick(MenuItem item) { - BrowserSettings settings = BrowserSettings.getInstance(); - WebView web = getCurrentWebView(); - if (web == null) return false; - boolean desktop = settings.hasDesktopUseragent(web); - switch (item.getItemId()) { - case R.id.ua_mobile_menu_id: - if (desktop) { - settings.toggleDesktopUseragent(web); - web.loadUrl(web.getOriginalUrl()); - } - return true; - case R.id.ua_desktop_menu_id: - if (!desktop) { - settings.toggleDesktopUseragent(web); - web.loadUrl(web.getOriginalUrl()); - } - return true; - } - return false; - } - - @Override - public void onFocusChange(View view, boolean hasFocus) { - // if losing focus and not in touch mode, leave as is - if (hasFocus || view.isInTouchMode() || mUrlInput.needsUpdate()) { - setFocusState(hasFocus); - } - if (hasFocus) { - mBaseUi.showTitleBar(); - mUrlInput.forceIme(); - if (mInVoiceMode) { - mUrlInput.forceFilter(); - } - } else if (!mUrlInput.needsUpdate()) { - mUrlInput.dismissDropDown(); - mUrlInput.hideIME(); - if (mUrlInput.getText().length() == 0) { - Tab currentTab = mUiController.getTabControl().getCurrentTab(); - if (currentTab != null) { - mUrlInput.setText(currentTab.getUrl(), false); - } - } - mBaseUi.suggestHideTitleBar(); - } - mUrlInput.clearNeedsUpdate(); - } - - protected void setFocusState(boolean focus) { - } - - protected void setSearchMode(boolean voiceSearchEnabled) {} - - boolean isEditingUrl() { - return mUrlInput.hasFocus(); - } - - void stopEditingUrl() { - mUrlInput.clearFocus(); - } - - void setDisplayTitle(String title) { - if (!isEditingUrl()) { - mUrlInput.setText(title, false); - } - } - - // UrlInput text watcher - - @Override - public void onTextChanged(String newText) { - if (mUrlInput.hasFocus()) { - // clear voice mode when user types - setInVoiceMode(false, null); - } - } - - // voicesearch - - public void setInVoiceMode(boolean voicemode, List<String> voiceResults) { - mInVoiceMode = voicemode; - mUrlInput.setVoiceResults(voiceResults); - } - - void setIncognitoMode(boolean incognito) { - mUrlInput.setIncognitoMode(incognito); - } - - void clearCompletions() { - mUrlInput.setSuggestedText(null); - } - - // UrlInputListener implementation - - /** - * callback from suggestion dropdown - * user selected a suggestion - */ - @Override - public void onAction(String text, String extra, String source) { - mUiController.getCurrentTopWebView().requestFocus(); - if (UrlInputView.TYPED.equals(source)) { - String url = UrlUtils.smartUrlFilter(text, false); - Tab t = mBaseUi.getActiveTab(); - // Only shortcut javascript URIs for now, as there is special - // logic in UrlHandler for other schemas - if (url != null && t != null && url.startsWith("javascript:")) { - mUiController.loadUrl(t, url); - setDisplayTitle(text); - return; - } - } - Intent i = new Intent(); - String action = null; - if (UrlInputView.VOICE.equals(source)) { - action = RecognizerResultsIntent.ACTION_VOICE_SEARCH_RESULTS; - source = null; - } else { - action = Intent.ACTION_SEARCH; - } - i.setAction(action); - i.putExtra(SearchManager.QUERY, text); - if (extra != null) { - i.putExtra(SearchManager.EXTRA_DATA_KEY, extra); - } - if (source != null) { - Bundle appData = new Bundle(); - appData.putString(com.android.common.Search.SOURCE, source); - i.putExtra(SearchManager.APP_DATA, appData); - } - mUiController.handleNewIntent(i); - setDisplayTitle(text); - } - - @Override - public void onDismiss() { - final Tab currentTab = mBaseUi.getActiveTab(); - mBaseUi.hideTitleBar(); - post(new Runnable() { - public void run() { - clearFocus(); - if ((currentTab != null) && !mInVoiceMode) { - setDisplayTitle(currentTab.getUrl()); - } - } - }); - } - - /** - * callback from the suggestion dropdown - * copy text to input field and stay in edit mode - */ - @Override - public void onCopySuggestion(String text) { - mUrlInput.setText(text, true); - if (text != null) { - mUrlInput.setSelection(text.length()); - } - } - - public void setCurrentUrlIsBookmark(boolean isBookmark) { - } - - @Override - public boolean dispatchKeyEventPreIme(KeyEvent evt) { - if (evt.getKeyCode() == KeyEvent.KEYCODE_BACK) { - // catch back key in order to do slightly more cleanup than usual - mUrlInput.clearFocus(); - return true; - } - return super.dispatchKeyEventPreIme(evt); - } - - protected WebView getCurrentWebView() { - Tab t = mBaseUi.getActiveTab(); - if (t != null) { - return t.getWebView(); - } else { - return null; - } - } - - void registerDropdownChangeListener(DropdownChangeListener d) { - mUrlInput.registerDropdownChangeListener(d); - } - - /** - * called from the Ui when the user wants to edit - * @param clearInput clear the input field - */ - void startEditingUrl(boolean clearInput) { - // editing takes preference of progress - mContainer.setVisibility(View.VISIBLE); - if (mUseQuickControls) { - mProgress.setVisibility(View.GONE); - } - if (!mUrlInput.hasFocus()) { - mUrlInput.requestFocus(); - } - if (clearInput) { - mUrlInput.setText(""); - } else if (mInVoiceMode) { - mUrlInput.showDropDown(); - } - } - - private ViewGroup.LayoutParams makeLayoutParams() { - if (mUseQuickControls) { - return new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, - LayoutParams.WRAP_CONTENT); - } else { - return new AbsoluteLayout.LayoutParams( - LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, - 0, 0); - } - } - -} diff --git a/src/com/android/browser/XLargeUi.java b/src/com/android/browser/XLargeUi.java index 290bbf7..a868331 100644 --- a/src/com/android/browser/XLargeUi.java +++ b/src/com/android/browser/XLargeUi.java @@ -40,7 +40,7 @@ public class XLargeUi extends BaseUi { private ActionBar mActionBar; private TabBar mTabBar; - private TitleBarXLarge mTitleBar; + private NavigationBarTablet mNavBar; private PieControlXLarge mPieControl; private Handler mHandler; @@ -52,9 +52,7 @@ public class XLargeUi extends BaseUi { public XLargeUi(Activity browser, UiController controller) { super(browser, controller); mHandler = new Handler(); - mTitleBar = new TitleBarXLarge(mActivity, mUiController, this, - mContentView); - mTitleBar.setProgress(100); + mNavBar = (NavigationBarTablet) mTitleBar.getNavigationBar(); mTabBar = new TabBar(mActivity, mUiController, this); mActionBar = mActivity.getActionBar(); setupActionBar(); @@ -129,7 +127,7 @@ public class XLargeUi extends BaseUi { public void onResume() { super.onResume(); if (!BrowserSettings.getInstance().useInstantSearch()) { - mTitleBar.clearCompletions(); + mNavBar.clearCompletions(); } } @@ -187,7 +185,7 @@ public class XLargeUi extends BaseUi { mPieControl.forceToTop(mContentView); } else { // check if title bar is already attached by animation - if (mTitleBar.getParent() == null && !tab.isSnapshot()) { + if (mTitleBar.getParent() == null) { view.setEmbeddedTitleBar(mTitleBar); } } @@ -231,13 +229,13 @@ public class XLargeUi extends BaseUi { @Override public void editUrl(boolean clearInput) { if (mUseQuickControls) { - getTitleBar().setShowProgressOnly(false); + mTitleBar.setShowProgressOnly(false); } super.editUrl(clearInput); } void stopEditingUrl() { - mTitleBar.stopEditingUrl(); + mTitleBar.getNavigationBar().stopEditingUrl(); } @Override @@ -255,11 +253,6 @@ public class XLargeUi extends BaseUi { } @Override - protected TitleBarBase getTitleBar() { - return mTitleBar; - } - - @Override protected void setTitleGravity(int gravity) { if (!mUseQuickControls) { super.setTitleGravity(gravity); @@ -291,7 +284,7 @@ public class XLargeUi extends BaseUi { @Override protected void updateNavigationState(Tab tab) { - mTitleBar.updateNavigationState(tab); + mNavBar.updateNavigationState(tab); } @Override @@ -308,19 +301,6 @@ public class XLargeUi extends BaseUi { } @Override - public void showVoiceTitleBar(String title, List<String> vsresults) { - mTitleBar.setInVoiceMode(true, vsresults); - mTitleBar.setDisplayTitle(title); - } - - @Override - public void revertVoiceTitleBar(Tab tab) { - mTitleBar.setInVoiceMode(false, null); - String url = tab.getUrl(); - mTitleBar.setDisplayTitle(url); - } - - @Override public void showCustomView(View view, int requestedOrientation, CustomViewCallback callback) { super.showCustomView(view, requestedOrientation, callback); |