am 19f9ca13: am db2c56a0: am 673b9a69: Merge "fix incorrect unicode usage when using Spanish"
* commit '19f9ca13908a5e1670ac1b38774242d1fc5f0a78':
fix incorrect unicode usage when using Spanish
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 9ddc7b5..440a141 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -59,7 +59,7 @@
android:label="@string/application_name"
android:launchMode="singleTask"
android:alwaysRetainTaskState="true"
- android:configChanges="orientation|keyboardHidden|keyboard"
+ android:configChanges="orientation|keyboardHidden|keyboard|screenSize"
android:theme="@style/BrowserTheme"
android:hardwareAccelerated="false"
android:windowSoftInputMode="adjustResize" >
@@ -167,7 +167,7 @@
<activity android:name="AddBookmarkPage" android:label="Save bookmark"
android:theme="@style/DialogWhenLarge"
- android:configChanges="orientation|keyboardHidden"
+ android:configChanges="orientation|keyboardHidden|screenSize"
android:windowSoftInputMode="stateHidden|adjustPan">
<intent-filter>
<action android:name="android.intent.action.INSERT" />
diff --git a/res/drawable-hdpi/bg_bookmark_widget_holo.9.png b/res/drawable-hdpi/bg_bookmark_widget_holo.9.png
deleted file mode 100644
index adb57a4..0000000
--- a/res/drawable-hdpi/bg_bookmark_widget_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/bg_bookmarks_widget_holo.9.png b/res/drawable-hdpi/bg_bookmarks_widget_holo.9.png
new file mode 100644
index 0000000..4fd263f
--- /dev/null
+++ b/res/drawable-hdpi/bg_bookmarks_widget_holo.9.png
Binary files differ
diff --git a/res/drawable-hdpi/browser_widget_preview.png b/res/drawable-hdpi/browser_widget_preview.png
new file mode 100644
index 0000000..4ee806b
--- /dev/null
+++ b/res/drawable-hdpi/browser_widget_preview.png
Binary files differ
diff --git a/res/drawable-hdpi/browsertab_add_focused.png b/res/drawable-hdpi/browsertab_add_focused.png
new file mode 100644
index 0000000..1490a61
--- /dev/null
+++ b/res/drawable-hdpi/browsertab_add_focused.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_ic_back_bookmark_widget_holo_dark.png b/res/drawable-hdpi/btn_ic_back_bookmark_widget_holo_dark.png
deleted file mode 100644
index 5f975e5..0000000
--- a/res/drawable-hdpi/btn_ic_back_bookmark_widget_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/btn_ic_bookmark_bookmark_widget_holo_dark.png b/res/drawable-hdpi/btn_ic_bookmark_bookmark_widget_holo_dark.png
deleted file mode 100644
index 722f3b8..0000000
--- a/res/drawable-hdpi/btn_ic_bookmark_bookmark_widget_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_browser_bookmark_widget_holo.png b/res/drawable-hdpi/ic_browser_bookmark_widget_holo.png
deleted file mode 100644
index e583acd..0000000
--- a/res/drawable-hdpi/ic_browser_bookmark_widget_holo.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_btn_copy.png b/res/drawable-hdpi/ic_btn_copy.png
deleted file mode 100644
index 847cf7e..0000000
--- a/res/drawable-hdpi/ic_btn_copy.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_btn_find.png b/res/drawable-hdpi/ic_btn_find.png
deleted file mode 100644
index 0da38a1..0000000
--- a/res/drawable-hdpi/ic_btn_find.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_btn_select_all.png b/res/drawable-hdpi/ic_btn_select_all.png
deleted file mode 100644
index 9545a53..0000000
--- a/res/drawable-hdpi/ic_btn_select_all.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_btn_stop_v2.png b/res/drawable-hdpi/ic_btn_stop_v2.png
deleted file mode 100644
index 2c97223..0000000
--- a/res/drawable-hdpi/ic_btn_stop_v2.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_clear_search.png b/res/drawable-hdpi/ic_clear_search.png
deleted file mode 100644
index e8e67b4..0000000
--- a/res/drawable-hdpi/ic_clear_search.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_history_holo_dark.png b/res/drawable-hdpi/ic_history_holo_dark.png
deleted file mode 100644
index 7972a81..0000000
--- a/res/drawable-hdpi/ic_history_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_most_visited_holo_dark.png b/res/drawable-hdpi/ic_most_visited_holo_dark.png
deleted file mode 100644
index bbb0bf6..0000000
--- a/res/drawable-hdpi/ic_most_visited_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_new_incognito_holo_dark.png b/res/drawable-hdpi/ic_new_incognito_holo_dark.png
new file mode 100644
index 0000000..dbd2c3c
--- /dev/null
+++ b/res/drawable-hdpi/ic_new_incognito_holo_dark.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_pie_back.png b/res/drawable-hdpi/ic_pie_back.png
deleted file mode 100644
index 32b3ea7..0000000
--- a/res/drawable-hdpi/ic_pie_back.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_pie_bookmarks.png b/res/drawable-hdpi/ic_pie_bookmarks.png
deleted file mode 100644
index 2536856..0000000
--- a/res/drawable-hdpi/ic_pie_bookmarks.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_pie_close_tab.png b/res/drawable-hdpi/ic_pie_close_tab.png
deleted file mode 100644
index 108f8da..0000000
--- a/res/drawable-hdpi/ic_pie_close_tab.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_pie_forward.png b/res/drawable-hdpi/ic_pie_forward.png
deleted file mode 100644
index 4e5f08e..0000000
--- a/res/drawable-hdpi/ic_pie_forward.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_pie_more.png b/res/drawable-hdpi/ic_pie_more.png
deleted file mode 100644
index 0833ee2..0000000
--- a/res/drawable-hdpi/ic_pie_more.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_pie_new_tab.png b/res/drawable-hdpi/ic_pie_new_tab.png
deleted file mode 100644
index 18f49ef..0000000
--- a/res/drawable-hdpi/ic_pie_new_tab.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_pie_refresh.png b/res/drawable-hdpi/ic_pie_refresh.png
deleted file mode 100644
index f0a5d7a..0000000
--- a/res/drawable-hdpi/ic_pie_refresh.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_pie_search.png b/res/drawable-hdpi/ic_pie_search.png
deleted file mode 100644
index f1c8825..0000000
--- a/res/drawable-hdpi/ic_pie_search.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_pie_tabs.png b/res/drawable-hdpi/ic_pie_tabs.png
deleted file mode 100644
index b941285..0000000
--- a/res/drawable-hdpi/ic_pie_tabs.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_thumbnail_view_holo_dark.png b/res/drawable-hdpi/ic_thumbnail_view_holo_dark.png
new file mode 100644
index 0000000..514b7dc
--- /dev/null
+++ b/res/drawable-hdpi/ic_thumbnail_view_holo_dark.png
Binary files differ
diff --git a/res/drawable-hdpi/list_divider_vert.9.png b/res/drawable-hdpi/list_divider_vert.9.png
deleted file mode 100644
index d99730a..0000000
--- a/res/drawable-hdpi/list_divider_vert.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/nav_tab_bg.9.png b/res/drawable-hdpi/nav_tab_bg.9.png
new file mode 100644
index 0000000..2578e4a
--- /dev/null
+++ b/res/drawable-hdpi/nav_tab_bg.9.png
Binary files differ
diff --git a/res/drawable-hdpi/page_indicator.png b/res/drawable-hdpi/page_indicator.png
deleted file mode 100644
index d00b900..0000000
--- a/res/drawable-hdpi/page_indicator.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/page_indicator_unselected2.png b/res/drawable-hdpi/page_indicator_unselected2.png
deleted file mode 100644
index a34fd2e..0000000
--- a/res/drawable-hdpi/page_indicator_unselected2.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/progress.9.png b/res/drawable-hdpi/progress.9.png
index 398bee4..2bfc699 100644
--- a/res/drawable-hdpi/progress.9.png
+++ b/res/drawable-hdpi/progress.9.png
Binary files differ
diff --git a/res/drawable-hdpi/qc_background_normal.png b/res/drawable-hdpi/qc_background_normal.png
new file mode 100644
index 0000000..fec04f2
--- /dev/null
+++ b/res/drawable-hdpi/qc_background_normal.png
Binary files differ
diff --git a/res/drawable-hdpi/search_plate_browser.9.png b/res/drawable-hdpi/search_plate_browser.9.png
deleted file mode 100644
index cf0567b..0000000
--- a/res/drawable-hdpi/search_plate_browser.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/tab_nr.png b/res/drawable-hdpi/tab_nr.png
new file mode 100644
index 0000000..d9e74d5
--- /dev/null
+++ b/res/drawable-hdpi/tab_nr.png
Binary files differ
diff --git a/res/drawable-hdpi/text_field_results.9.png b/res/drawable-hdpi/text_field_results.9.png
deleted file mode 100644
index bd4bcc5..0000000
--- a/res/drawable-hdpi/text_field_results.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/thumbnail_bookmarks_widget_no_bookmark_holo.png b/res/drawable-hdpi/thumbnail_bookmarks_widget_no_bookmark_holo.png
new file mode 100644
index 0000000..9d55e98
--- /dev/null
+++ b/res/drawable-hdpi/thumbnail_bookmarks_widget_no_bookmark_holo.png
Binary files differ
diff --git a/res/drawable-hdpi/url_bg_active.9.png b/res/drawable-hdpi/url_bg_active.9.png
new file mode 100644
index 0000000..479acb1
--- /dev/null
+++ b/res/drawable-hdpi/url_bg_active.9.png
Binary files differ
diff --git a/res/drawable-hdpi/url_bg_default.9.png b/res/drawable-hdpi/url_bg_default.9.png
new file mode 100644
index 0000000..7db9db4
--- /dev/null
+++ b/res/drawable-hdpi/url_bg_default.9.png
Binary files differ
diff --git a/res/drawable-hdpi/urlbar_bg.9.png b/res/drawable-hdpi/urlbar_bg.9.png
deleted file mode 100644
index c35383e..0000000
--- a/res/drawable-hdpi/urlbar_bg.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/bg_bookmark_widget_holo.9.png b/res/drawable-mdpi/bg_bookmark_widget_holo.9.png
deleted file mode 100644
index d95f8d3..0000000
--- a/res/drawable-mdpi/bg_bookmark_widget_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/browser_widget_preview.png b/res/drawable-mdpi/browser_widget_preview.png
similarity index 100%
rename from res/drawable/browser_widget_preview.png
rename to res/drawable-mdpi/browser_widget_preview.png
Binary files differ
diff --git a/res/drawable-mdpi/btn_ic_back_bookmark_widget_holo_dark.png b/res/drawable-mdpi/btn_ic_back_bookmark_widget_holo_dark.png
deleted file mode 100644
index d8697b8..0000000
--- a/res/drawable-mdpi/btn_ic_back_bookmark_widget_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/btn_ic_bookmark_bookmark_widget_holo_dark.png b/res/drawable-mdpi/btn_ic_bookmark_bookmark_widget_holo_dark.png
deleted file mode 100644
index 21a2cc3..0000000
--- a/res/drawable-mdpi/btn_ic_bookmark_bookmark_widget_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_browser_bookmark_widget_holo.png b/res/drawable-mdpi/ic_browser_bookmark_widget_holo.png
deleted file mode 100644
index 0d9e49d..0000000
--- a/res/drawable-mdpi/ic_browser_bookmark_widget_holo.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_btn_copy.png b/res/drawable-mdpi/ic_btn_copy.png
deleted file mode 100644
index 2174368..0000000
--- a/res/drawable-mdpi/ic_btn_copy.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_btn_find.png b/res/drawable-mdpi/ic_btn_find.png
deleted file mode 100644
index 71bc61a..0000000
--- a/res/drawable-mdpi/ic_btn_find.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_btn_select_all.png b/res/drawable-mdpi/ic_btn_select_all.png
deleted file mode 100644
index 8ce8c8f..0000000
--- a/res/drawable-mdpi/ic_btn_select_all.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_btn_stop_v2.png b/res/drawable-mdpi/ic_btn_stop_v2.png
deleted file mode 100644
index 89f01e7..0000000
--- a/res/drawable-mdpi/ic_btn_stop_v2.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_clear_search.png b/res/drawable-mdpi/ic_clear_search.png
deleted file mode 100644
index e8e67b4..0000000
--- a/res/drawable-mdpi/ic_clear_search.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_history_holo_dark.png b/res/drawable-mdpi/ic_history_holo_dark.png
deleted file mode 100644
index 44f2245..0000000
--- a/res/drawable-mdpi/ic_history_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_most_visited_holo_dark.png b/res/drawable-mdpi/ic_most_visited_holo_dark.png
deleted file mode 100644
index 52082bd..0000000
--- a/res/drawable-mdpi/ic_most_visited_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_pie_back.png b/res/drawable-mdpi/ic_pie_back.png
deleted file mode 100644
index daddaea..0000000
--- a/res/drawable-mdpi/ic_pie_back.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_pie_bookmarks.png b/res/drawable-mdpi/ic_pie_bookmarks.png
deleted file mode 100644
index ffa430d..0000000
--- a/res/drawable-mdpi/ic_pie_bookmarks.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_pie_close_tab.png b/res/drawable-mdpi/ic_pie_close_tab.png
deleted file mode 100644
index 62396f4..0000000
--- a/res/drawable-mdpi/ic_pie_close_tab.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_pie_forward.png b/res/drawable-mdpi/ic_pie_forward.png
deleted file mode 100644
index bd8dcac..0000000
--- a/res/drawable-mdpi/ic_pie_forward.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_pie_more.png b/res/drawable-mdpi/ic_pie_more.png
deleted file mode 100644
index c96c6a4..0000000
--- a/res/drawable-mdpi/ic_pie_more.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_pie_new_tab.png b/res/drawable-mdpi/ic_pie_new_tab.png
deleted file mode 100644
index 206675a..0000000
--- a/res/drawable-mdpi/ic_pie_new_tab.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_pie_refresh.png b/res/drawable-mdpi/ic_pie_refresh.png
deleted file mode 100644
index 5980f8b..0000000
--- a/res/drawable-mdpi/ic_pie_refresh.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_pie_search.png b/res/drawable-mdpi/ic_pie_search.png
deleted file mode 100644
index 6981697..0000000
--- a/res/drawable-mdpi/ic_pie_search.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_pie_tabs.png b/res/drawable-mdpi/ic_pie_tabs.png
deleted file mode 100644
index fda262a..0000000
--- a/res/drawable-mdpi/ic_pie_tabs.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_pie_web.png b/res/drawable-mdpi/ic_pie_web.png
deleted file mode 100644
index 86e41ff..0000000
--- a/res/drawable-mdpi/ic_pie_web.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_thumbnail_view_holo_dark.png b/res/drawable-mdpi/ic_thumbnail_view_holo_dark.png
new file mode 100644
index 0000000..95c674d
--- /dev/null
+++ b/res/drawable-mdpi/ic_thumbnail_view_holo_dark.png
Binary files differ
diff --git a/res/drawable-mdpi/list_divider_vert.9.png b/res/drawable-mdpi/list_divider_vert.9.png
deleted file mode 100644
index d99730a..0000000
--- a/res/drawable-mdpi/list_divider_vert.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/page_indicator.png b/res/drawable-mdpi/page_indicator.png
deleted file mode 100644
index 73c030a..0000000
--- a/res/drawable-mdpi/page_indicator.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/page_indicator_unselected2.png b/res/drawable-mdpi/page_indicator_unselected2.png
deleted file mode 100644
index 70818ee..0000000
--- a/res/drawable-mdpi/page_indicator_unselected2.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/search_plate_browser.9.png b/res/drawable-mdpi/search_plate_browser.9.png
deleted file mode 100644
index 2370d9c..0000000
--- a/res/drawable-mdpi/search_plate_browser.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/text_field_results.9.png b/res/drawable-mdpi/text_field_results.9.png
deleted file mode 100644
index 167c42d..0000000
--- a/res/drawable-mdpi/text_field_results.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/urlbar_bg.9.png b/res/drawable-mdpi/urlbar_bg.9.png
deleted file mode 100644
index 18b49e7..0000000
--- a/res/drawable-mdpi/urlbar_bg.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/url_selector.xml b/res/drawable/url_selector.xml
new file mode 100644
index 0000000..d4febe6
--- /dev/null
+++ b/res/drawable/url_selector.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<selector
+ xmlns:android="http://schemas.android.com/apk/res/android">
+ <item
+ android:state_focused="true"
+ android:drawable="@drawable/url_bg_active" />
+ <item
+ android:state_focused="false"
+ android:drawable="@drawable/url_bg_default" />
+</selector>
\ No newline at end of file
diff --git a/res/layout-xlarge/bookmarks_history.xml b/res/layout-xlarge/bookmarks_history.xml
new file mode 100644
index 0000000..ae5e19b
--- /dev/null
+++ b/res/layout-xlarge/bookmarks_history.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+<FrameLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/fragment"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@drawable/bg_browser" />
diff --git a/res/layout-xlarge/history.xml b/res/layout-xlarge/history.xml
new file mode 100644
index 0000000..2d949e1
--- /dev/null
+++ b/res/layout-xlarge/history.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+>
+
+ <ViewStub
+ android:id="@+id/pref_stub"
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:inflatedId="@+id/history" />
+
+ <TextView android:id="@android:id/empty"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:text="@string/empty_history"
+ android:visibility="gone"
+ />
+
+</FrameLayout>
diff --git a/res/layout/active_tabs.xml b/res/layout/active_tabs.xml
index 8b5fe9e..f9bd6b0 100644
--- a/res/layout/active_tabs.xml
+++ b/res/layout/active_tabs.xml
@@ -14,31 +14,41 @@
limitations under the License.
-->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_height="match_parent"
- android:layout_width="match_parent"
- android:orientation="vertical"
- android:background="@color/black"
- >
- <RelativeLayout
- style="?android:attr/windowTitleBackgroundStyle"
+<merge xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content">
+
+ <Button
+ android:id="@+id/new_tab"
+ android:text="@string/new_tab"
+ android:layout_width="0dip"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:singleLine="true"
+ android:textAppearance="?android:attr/textAppearanceSmall" />
+
+ <Button
+ android:id="@+id/new_incognito_tab"
+ android:text="@string/new_incognito_tab"
+ android:layout_width="0dip"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:singleLine="true"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:paddingLeft="0dip"
+ android:paddingRight="0dip" />
+
+ </LinearLayout>
+
+ <ListView
+ android:id="@android:id/list"
android:layout_width="match_parent"
- android:layout_height="?android:attr/windowTitleSize"
- >
- <TextView android:id="@android:id/title"
- style="?android:attr/windowTitleStyle"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="@null"
- android:fadingEdge="horizontal"
- android:gravity="center_vertical"
- android:text="@string/active_tabs"
- />
- </RelativeLayout>
- <ListView android:id="@+id/list"
- android:layout_width="match_parent"
- android:layout_height="0dip"
- android:layout_weight="1"
- android:cacheColorHint="@color/black"
- />
-</LinearLayout>
+ android:layout_height="match_parent"
+ android:listSelector="@drawable/bookmark_thumb_selector"
+ android:drawSelectorOnTop="true"
+ android:focusable="true"
+ android:focusableInTouchMode="true" />
+
+</merge>
diff --git a/res/layout/bookmarks_history.xml b/res/layout/bookmarks_history.xml
index 5622917..826fe49 100644
--- a/res/layout/bookmarks_history.xml
+++ b/res/layout/bookmarks_history.xml
@@ -4,9 +4,9 @@
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.
@@ -18,4 +18,5 @@
android:id="@+id/fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:background="@drawable/bg_browser" />
+ android:background="@drawable/bg_browser"
+ android:paddingTop="?android:attr/actionBarSize" />
diff --git a/res/layout/history.xml b/res/layout/history.xml
index f7d2c7c..f3adb51 100644
--- a/res/layout/history.xml
+++ b/res/layout/history.xml
@@ -19,11 +19,10 @@
android:layout_height="match_parent"
>
- <ViewStub
- android:id="@+id/pref_stub"
+ <ExpandableListView
+ android:id="@+id/history"
android:layout_height="match_parent"
- android:layout_width="match_parent"
- android:inflatedId="@+id/history" />
+ android:layout_width="match_parent" />
<TextView android:id="@android:id/empty"
android:layout_width="wrap_content"
diff --git a/res/layout/history_item.xml b/res/layout/history_item.xml
index 3b3dd7a..f6076a0 100644
--- a/res/layout/history_item.xml
+++ b/res/layout/history_item.xml
@@ -42,7 +42,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
- android:ellipsize="end"
+ android:ellipsize="marquee"
+ android:marqueeRepeatLimit="marquee_forever"
/>
<TextView android:id="@+id/url"
android:textAppearance="?android:attr/textAppearanceSmall"
@@ -50,7 +51,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
- android:ellipsize="end"
+ android:ellipsize="marquee"
+ android:marqueeRepeatLimit="marquee_forever"
/>
</LinearLayout>
<CheckBox android:id="@+id/star"
diff --git a/res/layout/tab_view_add_tab.xml b/res/layout/min_font_size.xml
similarity index 62%
rename from res/layout/tab_view_add_tab.xml
rename to res/layout/min_font_size.xml
index f4e0f02..d4d1314 100644
--- a/res/layout/tab_view_add_tab.xml
+++ b/res/layout/min_font_size.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
@@ -15,25 +15,24 @@
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_height="wrap_content"
- android:minHeight="?android:attr/listPreferredItemHeight"
android:layout_width="match_parent"
- android:orientation="horizontal"
- android:gravity="center_vertical"
- >
- <ImageView
- android:layout_width="40dip"
- android:layout_height="40dip"
- android:layout_marginLeft="8dip"
- android:layout_marginRight="8dip"
- android:src="@drawable/ic_new_window_holo_dark"/>
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:paddingRight="6dip"
+ android:paddingTop="6dip"
+ android:paddingBottom="6dip"
+ android:paddingLeft="8dip">
+
<TextView
- android:layout_width="match_parent"
+ android:text="@string/pref_min_font_size"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:maxLines="1"
- android:singleLine="true"
- android:ellipsize="end"
- android:text="@string/new_tab"
- />
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+
+ <SeekBar
+ android:id="@+id/seekbar"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
+
</LinearLayout>
+
diff --git a/res/layout/nav_screen.xml b/res/layout/nav_screen.xml
new file mode 100644
index 0000000..2170154
--- /dev/null
+++ b/res/layout/nav_screen.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/nav_screen"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+ <LinearLayout
+ android:id="@+id/navtop"
+ android:layout_width="match_parent"
+ android:layout_height="44dip"
+ android:background="#80404040">
+ <ImageButton
+ android:id="@+id/newtab"
+ android:layout_width="0dip"
+ android:layout_weight="0.25"
+ android:layout_height="match_parent"
+ style="@style/HoloButton"
+ android:gravity="center_vertical"
+ android:src="@drawable/ic_new_window_holo_dark" />
+ <ImageButton
+ android:id="@+id/newincognito"
+ android:layout_width="0dip"
+ android:layout_weight="0.25"
+ android:layout_height="match_parent"
+ style="@style/HoloButton"
+ android:gravity="center_vertical"
+ android:src="@drawable/ic_new_incognito_holo_dark" />
+ <ImageButton
+ android:id="@+id/tabs"
+ android:layout_width="0dip"
+ android:layout_weight="0.25"
+ android:layout_height="match_parent"
+ style="@style/HoloButton"
+ android:gravity="center_vertical"
+ android:src="@drawable/ic_windows_holo_dark" />
+ <ImageButton
+ android:id="@+id/more"
+ android:layout_width="0dip"
+ android:layout_weight="0.25"
+ android:layout_height="match_parent"
+ style="@style/HoloButton"
+ android:gravity="center_vertical"
+ android:src="@*android:drawable/ic_menu_moreoverflow_normal_holo_dark" />
+ </LinearLayout>
+ <FrameLayout
+ android:id="@+id/galleryholder"
+ android:layout_width="match_parent"
+ android:layout_height="0dip"
+ android:layout_weight="1"
+ android:paddingTop="5dp"
+ android:paddingBottom="5dp" />
+ <LinearLayout
+ android:id="@+id/navbar"
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="44dip"
+ android:background="#80404040">
+ <ImageButton
+ android:id="@+id/back"
+ android:layout_width="0dip"
+ android:layout_weight="0.25"
+ android:layout_height="match_parent"
+ android:src="@drawable/ic_back_holo_dark"
+ style="@style/HoloButton" />
+ <ImageButton
+ android:id="@+id/refresh"
+ android:layout_width="0dip"
+ android:layout_weight="0.25"
+ android:layout_height="match_parent"
+ android:src="@drawable/ic_refresh_holo_dark"
+ style="@style/HoloButton" />
+ <ImageButton
+ android:id="@+id/forward"
+ android:layout_width="0dip"
+ android:layout_weight="0.25"
+ android:layout_height="match_parent"
+ android:src="@drawable/ic_forward_holo_dark"
+ style="@style/HoloButton" />
+ <ImageButton
+ android:id="@+id/bookmarks"
+ android:layout_width="0dip"
+ android:layout_weight="0.25"
+ android:layout_height="match_parent"
+ android:src="@drawable/ic_bookmarks_history_holo_dark"
+ style="@style/HoloButton" />
+ </LinearLayout>
+</LinearLayout>
diff --git a/res/layout/nav_tab_view.xml b/res/layout/nav_tab_view.xml
new file mode 100644
index 0000000..439eb89
--- /dev/null
+++ b/res/layout/nav_tab_view.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<com.android.browser.view.TabHolderView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/tab_view"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:padding="4dip"
+ android:focusable="false"
+ android:background="@drawable/nav_tab_bg">
+ <LinearLayout
+ android:id="@+id/titlebar"
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/toolbar_height" >
+ <ImageView
+ android:id="@+id/favicon"
+ android:layout_width="20dip"
+ android:layout_height="20dip"
+ android:layout_marginLeft="4dip"
+ android:layout_marginRight="4dip"
+ android:layout_gravity="center_vertical" />
+ <TextView
+ android:id="@+id/title"
+ android:layout_width="0dip"
+ android:layout_height="wrap_content"
+ android:layout_weight="1.0"
+ android:textSize="14dip"
+ android:textColor="@color/white"
+ android:singleLine="true"
+ android:ellipsize="end"
+ android:lines="1"
+ android:scrollHorizontally="true"
+ android:hint="@string/search_hint"
+ android:layout_gravity="center_vertical" />
+ <ImageButton
+ android:id="@+id/closetab"
+ android:src="@drawable/ic_stop_holo_dark"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_gravity="center_vertical"
+ android:paddingLeft="4dip"
+ android:background="@drawable/bookmark_thumb_selector"
+ />
+ </LinearLayout>
+ <ImageView
+ android:id="@+id/content"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:adjustViewBounds="true"
+ android:scaleType="fitXY" />
+</com.android.browser.view.TabHolderView>
diff --git a/res/layout/preference_list_content.xml b/res/layout/preference_list_content.xml
new file mode 100644
index 0000000..ad3d64e
--- /dev/null
+++ b/res/layout/preference_list_content.xml
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_height="match_parent"
+ android:layout_width="match_parent">
+
+ <LinearLayout
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="0px"
+ android:layout_weight="1">
+
+ <LinearLayout
+ android:id="@+id/headers"
+ android:orientation="vertical"
+ android:layout_width="0px"
+ android:layout_height="match_parent"
+ android:layout_marginRight="@dimen/preference_screen_side_margin_negative"
+ android:layout_marginLeft="@dimen/preference_screen_side_margin"
+ android:layout_marginTop="32dp"
+ android:layout_marginBottom="32dp"
+ android:layout_weight="10">
+
+ <ListView android:id="@android:id/list"
+ android:layout_width="match_parent"
+ android:layout_height="0px"
+ android:layout_weight="1"
+ android:drawSelectorOnTop="false"
+ android:cacheColorHint="@android:color/transparent"
+ android:listPreferredItemHeight="48dp"
+ android:scrollbarAlwaysDrawVerticalTrack="true" />
+
+ <FrameLayout android:id="@+id/list_footer"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="0" />
+
+ </LinearLayout>
+
+ <LinearLayout
+ android:id="@+id/prefs_frame"
+ android:layout_width="0px"
+ android:layout_height="match_parent"
+ android:layout_weight="20"
+ android:layout_marginLeft="@dimen/preference_screen_side_margin"
+ android:layout_marginRight="@dimen/preference_screen_side_margin"
+ android:layout_marginTop="16dp"
+ android:layout_marginBottom="16dp"
+ android:background="?android:attr/detailsElementBackground"
+ android:orientation="vertical"
+ android:visibility="gone" >
+
+ <!-- Breadcrumb inserted here -->
+ <android.app.FragmentBreadCrumbs
+ android:id="@android:id/title"
+ android:layout_height="72dip"
+ android:layout_width="match_parent"
+ android:paddingTop="16dip"
+ android:paddingBottom="8dip"
+ android:gravity="center_vertical|left"
+ android:layout_marginLeft="48dip"
+ android:layout_marginRight="48dip"
+ />
+
+ <ImageView
+ android:layout_width="match_parent"
+ android:layout_height="1dip"
+ android:paddingLeft="32dip"
+ android:paddingRight="32dip"
+ android:src="#404040"
+ />
+ <android.preference.PreferenceFrameLayout android:id="@+id/prefs"
+ android:layout_width="match_parent"
+ android:layout_height="0dip"
+ android:layout_weight="1"
+ android:layout_marginTop="-1dip"
+ />
+ </LinearLayout>
+ </LinearLayout>
+</LinearLayout>
diff --git a/res/layout/tab_view.xml b/res/layout/tab_view.xml
index 885f4cf..8ffb73d 100644
--- a/res/layout/tab_view.xml
+++ b/res/layout/tab_view.xml
@@ -20,42 +20,54 @@
android:layout_width="match_parent"
android:orientation="horizontal"
android:gravity="center_vertical"
+ android:paddingLeft="8dip"
+ android:paddingTop="4dip"
+ android:paddingBottom="4dip"
>
- <!-- This ImageView has the same width as the ImageView in
- tab_view_add_tab.xml. -->
- <ImageView android:id="@+id/favicon"
- android:layout_width="20dip"
- android:layout_height="20dip"
- android:layout_marginLeft="18dip"
- android:layout_marginRight="18dip"
- android:background="@drawable/fav_icn_background"
- android:padding="2dip"/>
- <LinearLayout
+ <RelativeLayout
+ android:id="@+id/list_item"
android:layout_width="0dip"
- android:layout_height="wrap_content"
android:layout_weight="1"
- android:orientation="vertical"
- >
- <TextView android:id="@+id/title"
+ android:layout_height="wrap_content"
+ android:background="@drawable/bookmark_list_favicon_bg">
+ <ImageView
+ android:id="@+id/thumb"
+ android:src="@drawable/thumbnail_bookmarks_widget_no_bookmark_holo"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/tab_view_thumbnail_height"
+ android:scaleType="fitXY"
+ android:cropToPadding="true" />
+ <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:maxLines="1"
- android:singleLine="true"
- android:ellipsize="end"
- />
- <TextView android:id="@+id/url"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:maxLines="1"
- android:singleLine="true"
- android:ellipsize="end"
- />
- </LinearLayout>
+ android:layout_alignBottom="@id/thumb"
+ android:background="@color/tabViewTitleBackground">
+ <ImageView
+ android:id="@+id/favicon"
+ android:src="@drawable/app_web_browser_sm"
+ android:layout_width="@dimen/favicon_size"
+ android:layout_height="@dimen/favicon_size"
+ android:layout_gravity="center_vertical"
+ android:layout_marginLeft="4dip"
+ android:layout_marginRight="8dip"
+ android:layout_marginTop="4dip"
+ android:layout_marginBottom="4dip"
+ android:scaleType="fitXY" />
+ <TextView
+ android:id="@+id/label"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:singleLine="true"
+ android:ellipsize="end"
+ android:textSize="12sp"
+ android:typeface="sans"
+ android:textColor="@android:color/white" />
+ </LinearLayout>
+ </RelativeLayout>
<View android:id="@+id/divider"
- android:background="#ff313431"
- android:layout_width="1dip"
+ android:background="?android:attr/dividerVertical"
+ android:layout_width="1dp"
android:layout_height="match_parent"
android:layout_marginLeft="8dip"
android:layout_marginTop="5dip"
@@ -64,10 +76,10 @@
<view class="com.android.browser.ActiveTabsPage$CloseHolder" android:id="@+id/close"
android:layout_width="wrap_content"
android:layout_height="match_parent"
- android:paddingLeft="18dip"
- android:paddingRight="18dip"
- android:background="@drawable/close_background"
- android:src="@drawable/btn_close_window"
+ android:paddingLeft="12dip"
+ android:paddingRight="12dip"
+ android:background="@drawable/bookmark_thumb_selector"
+ android:src="@drawable/ic_close_window_holo_dark"
android:scaleType="center"
/>
</LinearLayout>
diff --git a/res/layout/tab_view_add_incognito_tab.xml b/res/layout/tab_view_add_incognito_tab.xml
deleted file mode 100644
index 43fcb43..0000000
--- a/res/layout/tab_view_add_incognito_tab.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2009 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.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_height="wrap_content"
- android:minHeight="?android:attr/listPreferredItemHeight"
- android:layout_width="match_parent"
- android:orientation="horizontal"
- android:gravity="center_vertical"
- >
- <ImageView
- android:layout_width="40dip"
- android:layout_height="40dip"
- android:layout_marginLeft="8dip"
- android:layout_marginRight="8dip"
- android:src="@drawable/ic_new_window_holo_dark"/>
- <TextView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:maxLines="1"
- android:singleLine="true"
- android:ellipsize="end"
- android:text="@string/new_incognito_tab"
- />
-</LinearLayout>
diff --git a/res/layout/title_bar.xml b/res/layout/title_bar.xml
index 99ac04d..d00a56c 100644
--- a/res/layout/title_bar.xml
+++ b/res/layout/title_bar.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- Copyright 2009, The Android Open Source Project
+ 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.
@@ -14,85 +14,143 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<RelativeLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/titlebar"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical" >
-
+ android:layout_height="wrap_content">
<LinearLayout
+ android:id="@+id/taburlbar"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
+ android:layout_height="@dimen/toolbar_height"
android:orientation="horizontal"
android:background="@drawable/bg_urlbar"
android:paddingLeft="4dip"
android:paddingRight="4dip"
android:paddingTop="2dip"
- android:paddingBottom="1dip"
- >
-
- <LinearLayout android:id="@+id/title_bg"
+ android:paddingBottom="2dip">
+ <LinearLayout
+ android:id="@+id/title_bg"
android:layout_width="0dip"
android:layout_weight="1.0"
- android:layout_height="48dip"
- android:layout_marginBottom="4dip"
+ android:layout_height="match_parent"
android:gravity="center_vertical"
- android:orientation="horizontal"
- android:background="@drawable/url_background"
- >
- <ImageView android:id="@+id/favicon"
- android:layout_width="20dip"
- android:layout_height="20dip"
- />
- <ImageView android:id="@+id/lock"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginLeft="3dip"
- android:visibility="gone"
- />
- <com.android.browser.UrlInputView
- android:id="@+id/url_input"
- android:focusable="true"
- android:layout_width="0dip"
- android:layout_weight="1.0"
- android:layout_height="match_parent"
- android:layout_marginLeft="3dip"
- 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" />
+ android:orientation="horizontal">
+ <ImageView
+ android:id="@+id/favicon"
+ android:layout_width="20dip"
+ android:layout_height="20dip" />
+ <ImageView
+ android:id="@+id/lock"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="2dip"
+ android:visibility="gone" />
+ <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:layout_marginLeft="2dip"
+ android:paddingLeft="4dip"
+ android:paddingRight="4dip"
+ android:background="@*android:drawable/edit_text_holo_dark"
+ 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" />
</LinearLayout>
- <ImageButton
+ <ImageView
+ android:id="@+id/voice"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:src="@drawable/ic_voice_search_holo_dark"
+ android:visibility="gone" />
+ <ImageView
android:id="@+id/stop"
android:layout_width="wrap_content"
- android:layout_height="match_parent"
- style="@style/HoloButton"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
android:src="@drawable/ic_stop_holo_dark"
- android:visibility="gone"
- />
- <ImageButton
- android:id="@+id/bookmark"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- style="@style/HoloButton"
- android:src="@drawable/btn_imageview_star"
- />
+ android:visibility="gone" />
</LinearLayout>
-
- <com.android.browser.PageProgressView
- android:id="@+id/progress_horizontal"
+ <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="22dip"
+ 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>
+ <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:src="@drawable/progress"
- android:layout_marginTop="-11dip"
+ android:layout_marginTop="-8dip"
android:visibility="gone" />
-</LinearLayout>
+</RelativeLayout>
diff --git a/res/layout/url_bar.xml b/res/layout/url_bar.xml
index 8743906..3864b7d 100644
--- a/res/layout/url_bar.xml
+++ b/res/layout/url_bar.xml
@@ -118,7 +118,7 @@
style="@style/HoloIcon"
android:visibility="gone" />
<com.android.browser.UrlInputView
- android:id="@+id/url_focused"
+ android:id="@+id/url"
android:layout_width="0dip"
android:layout_weight="1.0"
android:layout_height="match_parent"
diff --git a/res/layout/tab_view_add_tab.xml b/res/layout/webview_preview.xml
similarity index 62%
copy from res/layout/tab_view_add_tab.xml
copy to res/layout/webview_preview.xml
index f4e0f02..6edbcce 100644
--- a/res/layout/tab_view_add_tab.xml
+++ b/res/layout/webview_preview.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
@@ -15,25 +15,24 @@
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_height="wrap_content"
- android:minHeight="?android:attr/listPreferredItemHeight"
android:layout_width="match_parent"
- android:orientation="horizontal"
- android:gravity="center_vertical"
- >
- <ImageView
- android:layout_width="40dip"
- android:layout_height="40dip"
- android:layout_marginLeft="8dip"
- android:layout_marginRight="8dip"
- android:src="@drawable/ic_new_window_holo_dark"/>
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:paddingRight="6dip"
+ android:paddingTop="6dip"
+ android:paddingBottom="6dip"
+ android:paddingLeft="8dip">
+
<TextView
- android:layout_width="match_parent"
+ android:text="@string/preview"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:maxLines="1"
- android:singleLine="true"
- android:ellipsize="end"
- android:text="@string/new_tab"
- />
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+
+ <WebView
+ android:id="@+id/webview"
+ android:layout_width="match_parent"
+ android:layout_height="180dp" />
+
</LinearLayout>
+
diff --git a/res/menu/bookmark.xml b/res/menu/bookmark.xml
index b761779..5517ab9 100644
--- a/res/menu/bookmark.xml
+++ b/res/menu/bookmark.xml
@@ -26,12 +26,15 @@
android:showAsAction="always" />
<item
android:id="@+id/thumbnail_view"
- android:title="@string/bookmark_thumbnail_view"/>
+ android:title="@string/bookmark_thumbnail_view"
+ android:icon="@drawable/ic_thumbnail_view_holo_dark" />
<item
android:id="@+id/list_view"
- android:title="@string/bookmark_list_view"/>
+ android:title="@string/bookmark_list_view"
+ android:icon="@drawable/ic_list_view_holo_dark" />
<item
android:id="@+id/preferences_menu_id"
android:title="@string/menu_preferences"
+ android:icon="@drawable/ic_settings_holo_dark"
android:alphabeticShortcut="p" />
</menu>
diff --git a/res/menu/browser.xml b/res/menu/browser.xml
index abe3716..d9e884b 100644
--- a/res/menu/browser.xml
+++ b/res/menu/browser.xml
@@ -15,55 +15,73 @@
-->
<menu xmlns:android="http://schemas.android.com/apk/res/android">
- <group android:id="@+id/MAIN_MENU">
- <item android:id="@+id/new_tab_menu_id"
- android:title="@string/new_tab"
- android:icon="@drawable/ic_menu_new_window"
- android:alphabeticShortcut="n" />
- <item android:id="@+id/bookmarks_menu_id"
- android:title="@string/bookmarks"
- android:alphabeticShortcut="b"
- android:icon="@drawable/ic_bookmarks_holo_dark" />
- <item android:id="@+id/active_tabs_menu_id"
- android:title="@string/active_tabs"
- android:icon="@drawable/ic_windows_holo_dark"
- android:alphabeticShortcut="t" />
- <item android:id="@+id/stop_reload_menu_id"
- android:alphabeticShortcut="r" />
- <item android:id="@+id/forward_menu_id"
- android:title="@string/forward"
- android:icon="@*android:drawable/ic_menu_forward" />
- <item android:id="@+id/add_bookmark_menu_id"
+ <group
+ android:id="@+id/MAIN_MENU">
+ <group
+ android:id="@+id/NAV_MENU">
+ <item
+ android:id="@+id/new_tab_menu_id"
+ android:title="@string/new_tab"
+ android:icon="@drawable/ic_menu_new_window"
+ android:alphabeticShortcut="n" />
+ <item
+ android:id="@+id/bookmarks_menu_id"
+ android:title="@string/bookmarks"
+ android:alphabeticShortcut="b"
+ android:icon="@drawable/ic_bookmarks_holo_dark" />
+ <item
+ android:id="@+id/active_tabs_menu_id"
+ android:title="@string/active_tabs"
+ android:icon="@drawable/ic_windows_holo_dark"
+ android:alphabeticShortcut="t" />
+ <item
+ android:id="@+id/stop_reload_menu_id"
+ android:alphabeticShortcut="r" />
+ <item
+ android:id="@+id/forward_menu_id"
+ android:title="@string/forward"
+ android:icon="@*android:drawable/ic_menu_forward" />
+ </group>
+ <item
+ android:id="@+id/add_bookmark_menu_id"
android:title="@string/save_to_bookmarks"
android:icon="@drawable/ic_bookmark_on_holo_dark"
android:alphabeticShortcut="d" />
- <item android:id="@+id/find_menu_id"
+ <item
+ android:id="@+id/find_menu_id"
android:title="@*android:string/find_on_page"
android:icon="@*android:drawable/ic_menu_find"
android:alphabeticShortcut="f" />
- <item android:id="@+id/share_page_menu_id"
+ <item
+ android:id="@+id/share_page_menu_id"
android:title="@string/share_page"
android:icon="@drawable/ic_share_holo_dark"
android:alphabeticShortcut="s" />
- <item android:id="@+id/save_webarchive_menu_id"
+ <item
+ android:id="@+id/save_webarchive_menu_id"
android:title="@string/menu_save_webarchive" />
- <item android:id="@+id/page_info_menu_id"
+ <item
+ android:id="@+id/page_info_menu_id"
android:title="@string/page_info"
android:icon="@drawable/ic_pageinfo_holo_dark"
android:alphabeticShortcut="g" />
- <item android:id="@+id/view_downloads_menu_id"
+ <item
+ android:id="@+id/view_downloads_menu_id"
android:title="@string/menu_view_download"
android:icon="@drawable/ic_downloads_holo_dark"
android:alphabeticShortcut="j" />
- <item android:id="@+id/preferences_menu_id"
+ <item
+ android:id="@+id/preferences_menu_id"
android:title="@string/menu_preferences"
android:icon="@drawable/ic_settings_holo_dark"
android:alphabeticShortcut="p" />
<!-- followings are debug only -->
- <item android:id="@+id/dump_nav_menu_id"
+ <item
+ android:id="@+id/dump_nav_menu_id"
android:title="@string/dump_nav"
android:visible="false" />
- <item android:id="@+id/dump_counters_menu_id"
+ <item
+ android:id="@+id/dump_counters_menu_id"
android:title="@string/dump_counters"
android:visible="false" />
</group>
diff --git a/res/raw/most_visited.ktpl b/res/raw/most_visited.ktpl
index 04b9eee..9a6e1b8 100644
--- a/res/raw/most_visited.ktpl
+++ b/res/raw/most_visited.ktpl
@@ -3,7 +3,7 @@
<html>
<head>
<title><%@ string/new_tab %></title>
-<meta name="viewport" content="width=device-width; initial-scale=1.0;" />
+<meta name="viewport" content="width=device-width; initial-scale=1.0; user-scalable=0" />
<style type="text/css">
@@ -14,20 +14,19 @@
body {
text-align: center;
- margin: 16px auto;
+ margin: 0px auto;
padding: 0 8px 0 8px;
max-width: <%@ dimen/mv_max_width %>px;
}
-#most_visited h3 {
+h3 {
text-align: center;
- padding: 0;
- margin: 5px 0 5px 0px;
+ margin: 5px 0 5px 0;
}
.thumbwrap li {
display: inline-block;
- margin: 0 7px 15px 7px;
+ margin: 0 7px 12px 7px;
padding: 0;
}
diff --git a/res/values-ar-xlarge/strings.xml b/res/values-ar-xlarge/strings.xml
index db12504..e9c0109 100644
--- a/res/values-ar-xlarge/strings.xml
+++ b/res/values-ar-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"فتح في علامة تبويب جديدة في الخلفية"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"فتح الكل في علامات تبويب جديدة"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"فتح علامات تبويب جديدة وراء علامة التبويب الحالية"</string>
+ <string name="recover_title" msgid="7754049918641251703">"استعادة علامات التبويب؟"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"يبدو أن المتصفح قد تعطل. هل تريد استعادة علامات التبويب من المرة السابقة؟"</string>
</resources>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 98d59bd..7009d85 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"ضخم"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"حجم النص"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"التكبير/التصغير الافتراضي"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"بعيد"</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"الكورية (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"تشفير النص"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"الميزات الاختبارية"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"عناصر التحكم السريعة"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"مرر الإبهام من الحافة اليسرى أو اليمنى للدخول إلى عناصر التحكم السريعة وإخفاء أشرطة عناوين URL والتطبيق"</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"مشاركة"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"لا يتوفر المزيد من علامات التبويب"</string>
<string name="instant_search_label" msgid="8769284297650716935">"Google مع البحث الفوري (ميزات اختبارية)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"استعادة النوافذ؟"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"يبدو أن المتصفح قد تعطل. هل تريد استعادة النوافذ من المرة السابقة؟"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"نعم"</string>
+ <string name="recover_no" msgid="3121030267940592611">"لا"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-bg-xlarge/strings.xml b/res/values-bg-xlarge/strings.xml
index 91bd88b..ea2a21c 100644
--- a/res/values-bg-xlarge/strings.xml
+++ b/res/values-bg-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"Отваряне в нов раздел на заден план"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"Отваряне на всички в нови раздели"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"Отваряне на нови раздели зад текущия"</string>
+ <string name="recover_title" msgid="7754049918641251703">"Да се възстановят ли разделите?"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"Изглежда се получи срив в браузъра. Искате ли да възстановите разделите си от последния път?"</string>
</resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index d4f727b..21f6b40 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"Огромен"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Размер на текста"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"Стандартна промяна на мащаба"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"Далече"</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"Корейски (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Текстово кодиране"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"Лаборатория"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"Бързи контроли"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"Прокарайте палец от левия/десния край за достъп до бързите контроли и скр. на лентите за прил. и URL адр."</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"Споделяне"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"Не се предлагат повече раздели"</string>
<string name="instant_search_label" msgid="8769284297650716935">"Google с Динамично търсене (Лаборатория)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"Да се възстановят ли прозорците?"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"Изглежда се получи срив в браузъра. Искате ли да възстановите прозорците си от последния път?"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"Да"</string>
+ <string name="recover_no" msgid="3121030267940592611">"Не"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-ca-xlarge/strings.xml b/res/values-ca-xlarge/strings.xml
index 783e2f4..6d41d51 100644
--- a/res/values-ca-xlarge/strings.xml
+++ b/res/values-ca-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"Obre en una pestanya de fons nova"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"Obre-ho tot en pestanyes noves"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"Obre les pestanyes noves darrere l\'actual"</string>
+ <string name="recover_title" msgid="7754049918641251703">"Vols restaurar les pestanyes?"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"Sembla que s\'ha bloquejat el navegador. Vols restaurar les pestanyes que tenies obertes la darrera vegada?"</string>
</resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 4071fed..02cc365 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"Enorme"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Mida del text"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"Zoom predeterminat"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"Lluny"</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"Coreà (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Codificació del text"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"Labs"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"Controls ràpids"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"Fes lliscar el polze des de la vora esquerra o dreta per accedir als controls ràpids i ocultar les barres d\'aplicació i URL"</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"Comparteix"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"No hi ha cap més pestanya disponible"</string>
<string name="instant_search_label" msgid="8769284297650716935">"Google amb Instant (Labs)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"Vols restaurar les finestres?"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"Sembla que s\'ha bloquejat el navegador. Vols restaurar les finestres que tenies obertes la darrera vegada?"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"Sí"</string>
+ <string name="recover_no" msgid="3121030267940592611">"No"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-cs-xlarge/strings.xml b/res/values-cs-xlarge/strings.xml
index 9f47093..25bdce9 100644
--- a/res/values-cs-xlarge/strings.xml
+++ b/res/values-cs-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"Otevřít na nové kartě na pozadí"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"Otevřít vše na nových kartách"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"Otevírat nové karty za aktuální kartou"</string>
+ <string name="recover_title" msgid="7754049918641251703">"Obnovit karty?"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"Zřejmě došlo k selhání prohlížeče. Chcete obnovit naposledy otevřené karty?"</string>
</resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 34def37..4bd5b4b 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"Velmi velký"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Velikost textu"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"Výchozí přiblížení"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"Daleko"</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"Korejština (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Kódování textu"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"Laboratoř Google"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"Rychlé ovládací prvky"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"Posunutím prstu od levého nebo pravého okraje zobrazíte rychlé ovládací prvky a skryjete panely aplikací a URL."</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"Sdílet"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"Žádné další karty nejsou k dispozici"</string>
<string name="instant_search_label" msgid="8769284297650716935">"Google s dynamickým vyhledáváním (experimentální funkce)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"Obnovit okna?"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"Zřejmě došlo k selhání prohlížeče. Chcete obnovit naposledy otevřená okna?"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"Ano"</string>
+ <string name="recover_no" msgid="3121030267940592611">"Ne"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-da-xlarge/strings.xml b/res/values-da-xlarge/strings.xml
index ab581c7..43867bb 100644
--- a/res/values-da-xlarge/strings.xml
+++ b/res/values-da-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"Åbn på ny fane i baggrunden"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"Åbn alle i nye faner"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"Åbn nye faner bag den aktive"</string>
+ <string name="recover_title" msgid="7754049918641251703">"Vil du gendanne fanerne?"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"Det lader til, at browseren er gået ned. Vil du gendanne dine faner fra sidste gang?"</string>
</resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index c0647c7..eaf3437 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"Kæmpestor"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Tekststørrelse"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"Standardzoom"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"Langt væk"</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"Koreansk (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Tekstkodning"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"Labs"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"Hurtig betjening"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"Glid fra venstre til højre for hurtig betjening og for at skjule applikation og adresselinje"</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"Del"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"Der er ikke flere tilgængelige faner"</string>
<string name="instant_search_label" msgid="8769284297650716935">"Google med Direkte (Labs)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"Vil du gendanne vinduer?"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"Det lader til, at browseren er gået ned. Vil du gendanne dine vinduer fra sidste gang?"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"Ja"</string>
+ <string name="recover_no" msgid="3121030267940592611">"Nej"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-de-xlarge/strings.xml b/res/values-de-xlarge/strings.xml
index 71c5fa3..9135940 100644
--- a/res/values-de-xlarge/strings.xml
+++ b/res/values-de-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"In neuem Hintergrundtab öffnen"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"Alle in jeweils neuem Tab öffnen"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"Neue Tabs hinter dem aktuellen Tab öffnen"</string>
+ <string name="recover_title" msgid="7754049918641251703">"Tabs wiederherstellen?"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"Offenbar ist der Browser abgestürzt. Sollen Ihre Tabs wiederhergestellt werden?"</string>
</resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 7ffc171..d816543 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"Sehr groß"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Textgröße"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"Standard-Zoom"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"Entfernt"</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"Koreanisch (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Textcodierung"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"Labs"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"Schnellsteuerung"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"Für Schnellsteuerung/Ausblenden der App- und URL-Leisten Daumen von links nach rechts ziehen"</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"Weitergeben"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"Es sind keine weiteren Tabs verfügbar."</string>
<string name="instant_search_label" msgid="8769284297650716935">"Google mit dynamischer Suche (Labs)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"Fenster wiederherstellen?"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"Offenbar ist der Browser abgestürzt. Sollen Ihre Fenster wiederhergestellt werden?"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"Ja"</string>
+ <string name="recover_no" msgid="3121030267940592611">"Nein"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-el-xlarge/strings.xml b/res/values-el-xlarge/strings.xml
index 17411be..de581b8 100644
--- a/res/values-el-xlarge/strings.xml
+++ b/res/values-el-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"Άνοιγμα σε νέα καρτέλα στο παρασκήνιο"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"Άνοιγμα όλων σε νέες καρτέλες"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"Άνοιγμα νέων καρτελών πίσω από την τρέχουσα"</string>
+ <string name="recover_title" msgid="7754049918641251703">"Επαναφορά καρτελών;"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"Η λειτουργία του προγράμματος περιήγησης διακόπηκε ξαφνικά. Θα θέλατε να κάνετε ανάκτηση των καρτελών από την τελευταία συνεδρία σας;"</string>
</resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 297eb46..b2c12fd 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"Πολύ μεγάλο"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Μέγεθος κειμένου"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"Προεπιλεγμένο ζουμ"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"Μακριά"</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"Κορεατικά (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Κωδικοποίηση κειμένου"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"Εργαστήρια"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"Στοιχεία γρήγορου ελέγχου"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"Σύρετε τον αντίχειρα από αρ. ή δεξ. για τα στοιχ. γρήγ. ελέγχου και κρύψτε τις γραμμές Εφαρμογές και URL"</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"Κοινή χρήση"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"Δεν υπάρχουν άλλες διαθέσιμες καρτέλες"</string>
<string name="instant_search_label" msgid="8769284297650716935">"Google με Instant (Labs)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"Επαναφορά παραθύρων;"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"Η λειτουργία του προγράμματος περιήγησης διακόπηκε ξαφνικά. Θα θέλατε να κάνετε ανάκτηση των παραθύρων από την τελευταία συνεδρία σας;"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"Ναι"</string>
+ <string name="recover_no" msgid="3121030267940592611">"Όχι"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-en-rGB-xlarge/strings.xml b/res/values-en-rGB-xlarge/strings.xml
index ee70575..1db7634 100644
--- a/res/values-en-rGB-xlarge/strings.xml
+++ b/res/values-en-rGB-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"Open in new background tab"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"Open all in new tabs"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"Open new tabs behind the current one"</string>
+ <string name="recover_title" msgid="7754049918641251703">"Restore tabs?"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"Browser appears to have crashed. Would you like to restore your tabs from last time?"</string>
</resources>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index e8c0538..b307e76 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"Huge"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Text size"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"Default zoom"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"Far"</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"Korean (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Text encoding"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"Labs"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"Quick controls"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"Swipe thumb from left or right edge to access quick controls and hide Application and URL bars"</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"Share"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"No more tabs available"</string>
<string name="instant_search_label" msgid="8769284297650716935">"Google with Instant (Labs)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"Restore windows?"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"Browser appears to have crashed. Would you like to restore your windows from last time?"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"Yes"</string>
+ <string name="recover_no" msgid="3121030267940592611">"No"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-es-rUS-xlarge/strings.xml b/res/values-es-rUS-xlarge/strings.xml
index 096451d..f9d14cd 100644
--- a/res/values-es-rUS-xlarge/strings.xml
+++ b/res/values-es-rUS-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"Abrir en una nueva pestaña de fondo"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"Abrir todos en pestañas nuevas"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"Abrir nuevas pestañas detrás de la actual"</string>
+ <string name="recover_title" msgid="7754049918641251703">"¿Quieres restaurar las pestañas?"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"Parece que se ha producido un fallo en el navegador. ¿Quieres restaurar las pestañas de la última sesión?"</string>
</resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 6b5c40a..e355d1c 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"Enorme"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Tamaño del texto"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"Zoom predeterminado"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"Lejos"</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"Coreano (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Codificación de texto"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"Labs"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"Controles rápidos"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"Desliza pulgar de borde izq. o der. para acceder a contr. ráp. y ocultar barras Aplicación y URL"</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"Compartir"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"No hay más pestañas disponibles."</string>
<string name="instant_search_label" msgid="8769284297650716935">"Google con Instant (Labs)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"¿Quieres restaurar las ventanas?"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"Parece que se ha producido un fallo en el navegador. ¿Quieres restaurar las ventanas de la última sesión?"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"Sí"</string>
+ <string name="recover_no" msgid="3121030267940592611">"No"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-es-xlarge/strings.xml b/res/values-es-xlarge/strings.xml
index c4bdd3e..690043d 100644
--- a/res/values-es-xlarge/strings.xml
+++ b/res/values-es-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"Abrir en una nueva pestaña en segundo plano"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"Abrir todo en pestañas nuevas"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"Abrir nuevas pestañas detrás de la actual"</string>
+ <string name="recover_title" msgid="7754049918641251703">"¿Quieres restaurar las pestañas?"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"Parece que se ha producido un error en el navegador. ¿Quieres restaurar las pestañas de la última sesión?"</string>
</resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index d270534..3949c61 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"Enorme"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Tamaño de texto"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"Zoom predeterminado"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"Lejos"</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"Coreano (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Codificación de texto"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"Labs"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"Controles rápidos"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"Desliza el pulgar para acceder a los controles rápidos y ocultar las barras."</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"Compartir"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"No hay más pestañas disponibles."</string>
<string name="instant_search_label" msgid="8769284297650716935">"Google con Instant (experimental)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"¿Quieres restaurar las ventanas?"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"Parece que se ha producido un error en el navegador. ¿Quieres restaurar las ventanas de la última sesión?"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"Sí"</string>
+ <string name="recover_no" msgid="3121030267940592611">"No"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-fa-xlarge/strings.xml b/res/values-fa-xlarge/strings.xml
index cd670ff..25a7039 100644
--- a/res/values-fa-xlarge/strings.xml
+++ b/res/values-fa-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"باز کردن در برگه جدید در پس زمینه"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"باز کردن همه در برگه های جدید"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"باز کردن برگه های جدید پشت برگه فعلی"</string>
+ <string name="recover_title" msgid="7754049918641251703">"برگه ها بازیابی شوند؟"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"به نظر می رسد مرورگر خراب شده است. آیا می خواهید برگه های آخرین بازدید خود را بازیابی کنید؟"</string>
</resources>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 4a0204a..3d9f474 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"بسیار بزرگ"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"اندازه متن"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"بزرگنمایی پیش فرض"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"دور"</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"کره ای (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"رمزگذاری متن"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"Labs"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"کنترل های سریع"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"انگشت شست را از لبه چپ یا راست حرکت دهید تا به کنترل های سریع دسترسی داشته و نوارهای URL و برنامه را پنهان کنید"</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"اشتراک گذاری"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"برگه بیشتری در دسترس نیست"</string>
<string name="instant_search_label" msgid="8769284297650716935">"Google با Instant (ویژگی های آزمایشی)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"پنجره ها بازیابی شوند؟"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"به نظر می رسد مرورگر خراب شده است. آیا می خواهید پنجره های آخرین بازدید خود را بازیابی کنید؟"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"بله"</string>
+ <string name="recover_no" msgid="3121030267940592611">"خیر"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-fi-xlarge/strings.xml b/res/values-fi-xlarge/strings.xml
index a1246d4..850cab4 100644
--- a/res/values-fi-xlarge/strings.xml
+++ b/res/values-fi-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"Avaa uudessa välilehdessä taustalla"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"Avaa kaikki uusiin välilehtiin"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"Avaa uudet välilehdet nykyisen taakse"</string>
+ <string name="recover_title" msgid="7754049918641251703">"Palautetaanko välilehdet?"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"Selain vaikuttaa kaatuneen. Haluatko palauttaa viime kerralla auki olleet välilehdet?"</string>
</resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index f14f718..442a3ce 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"Hyvin suuri"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Tekstin koko"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"Oletuszoomaus"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"Kauas"</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"korea (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Tekstin koodaus"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"Labs"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"Pikasäätimet"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"Saat pikasäätimet käyttöösi ja voit piilottaa Sovellus- ja URL-palkit liu\'uttamalla vasemmalta tai oikealta reunalta"</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"Jaa"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"Välilehtiä ei ole enempää saatavilla"</string>
<string name="instant_search_label" msgid="8769284297650716935">"Google ja Instant (Labs)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"Palautetaanko ikkunat?"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"Selain vaikuttaa kaatuneen. Haluatko palauttaa viime kerralla auki olleet ikkunat?"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"Kyllä"</string>
+ <string name="recover_no" msgid="3121030267940592611">"En"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-fr-xlarge/strings.xml b/res/values-fr-xlarge/strings.xml
index 2975ed5..e65274f 100644
--- a/res/values-fr-xlarge/strings.xml
+++ b/res/values-fr-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"Ouvrir dans un nouvel onglet d\'arrière-plan"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"Toujours ouvrir dans un nouvel onglet"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"Ouvrir nouveaux onglets derrière onglet actuel"</string>
+ <string name="recover_title" msgid="7754049918641251703">"Restaurer les onglets ?"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"Le navigateur semble bloqué. Souhaitez-vous restaurer les onglets ouverts lors de votre dernière connexion ?"</string>
</resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 42219fa..c0d1fa5 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"Très grande"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Taille de la police"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"Zoom par défaut"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"Éloigné"</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"Coréen (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Codage du texte"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"Labs"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"Commandes rapides"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"Accès commandes rapides/masquer barres applications et URL : faire glisser vers droite/gauche"</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"Partager"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"Plus aucun onglet n\'est disponible."</string>
<string name="instant_search_label" msgid="8769284297650716935">"Google avec Recherche instantanée (Google Labs)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"Restaurer les fenêtres ?"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"Le navigateur semble bloqué. Souhaitez-vous restaurer les fenêtres ouvertes lors de votre dernière connexion ?"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"Oui"</string>
+ <string name="recover_no" msgid="3121030267940592611">"Non"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-hr-xlarge/strings.xml b/res/values-hr-xlarge/strings.xml
index e61c130..0b35273 100644
--- a/res/values-hr-xlarge/strings.xml
+++ b/res/values-hr-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"Otvori u novoj pozadinskoj kartici"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"Otvori sve na novim karticama"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"Otvori nove kartice iza trenutne"</string>
+ <string name="recover_title" msgid="7754049918641251703">"Vratiti kartice?"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"Izgleda da je preglednik pao. Želite li vratiti kartice od prethodnog puta?"</string>
</resources>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index e2636da..07ecdaa 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"Ogroman"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Veličina teksta"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"Zadano povećanje/smanjenje"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"Daleko"</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"korejski (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Kodiranje teksta"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"Labs"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"Brze kontrole"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"Za pristup brzim kontrolama i skrivanje Aplikacija i URL-ova prijeđite palcem"</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"Dijeli"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"Nema više rasp. kartica"</string>
<string name="instant_search_label" msgid="8769284297650716935">"Google sa značajkom Instant (Labs)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"Vratiti prozore?"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"Izgleda da je preglednik pao. Želite li vratiti prozore od prethodnog puta?"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"Da"</string>
+ <string name="recover_no" msgid="3121030267940592611">"Ne"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-hu-xlarge/strings.xml b/res/values-hu-xlarge/strings.xml
index 76d05c5..0460fbe 100644
--- a/res/values-hu-xlarge/strings.xml
+++ b/res/values-hu-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"Megnyitás új lapon a háttérben"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"Összes megnyitása új lapon"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"Új lapok megnyitása a jelenlegi mögött"</string>
+ <string name="recover_title" msgid="7754049918641251703">"Visszaállítja a lapokat?"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"Úgy tűnik, hogy böngészője összeomlott. Szeretné visszaállítani a korábbi lapokat?"</string>
</resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 5a5a97e..84a609e 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"Óriási"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Szöveg mérete"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"Alapértelmezett nagyítás"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"Távoli"</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"Koreai (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Szöveg kódolása"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"Labs"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"Gyorsbeállítások"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"Seperjen az ujjával: gyorsvezérlők elérése, az Alkalmazás és URL-sáv elrejtése."</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"Megosztás"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"Nem nyitható meg több lap"</string>
<string name="instant_search_label" msgid="8769284297650716935">"Google Instanttal (Labs)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"Visszaállítja az ablakokat?"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"Úgy tűnik, hogy böngészője összeomlott. Szeretné visszaállítani a korábbi ablakokat?"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"Igen"</string>
+ <string name="recover_no" msgid="3121030267940592611">"Nem"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-in-xlarge/strings.xml b/res/values-in-xlarge/strings.xml
index 785a17b..0753ef4 100644
--- a/res/values-in-xlarge/strings.xml
+++ b/res/values-in-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"Buka di tab latar belakang baru"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"Buka semua di tab baru"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"Buka tab baru di belakang tab ini"</string>
+ <string name="recover_title" msgid="7754049918641251703">"Pulihkan tab?"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"Peramban tampaknya telah mogok. Inginkah Anda memulihkan tab-tab yang terakhir kali terbuka?"</string>
</resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 9e0bd1e..368ebbc 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"Sangat besar"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Ukuran teks"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"Zoom bawaan"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"Jauh"</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"Korea (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Penyandiaksaraan teks"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"Labs"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"Kontrol cepat"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"Gesek ibu jari dari tepi kiri atau kanan untuk mengakses kontrol cepat dan menyembunyikan bilah aplikasi dan URL"</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"Bagikan"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"Tidak ada lagi tab yang tersedia"</string>
<string name="instant_search_label" msgid="8769284297650716935">"Google dengan Sekejap (Labs)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"Pulihkan jendela?"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"Peramban tampaknya telah mogok. Inginkah Anda memulihkan jendela-jendela yang terakhir kali terbuka?"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"Ya"</string>
+ <string name="recover_no" msgid="3121030267940592611">"Tidak"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-it-xlarge/strings.xml b/res/values-it-xlarge/strings.xml
index d2dc0e6..e580d2a 100644
--- a/res/values-it-xlarge/strings.xml
+++ b/res/values-it-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"Apri in una nuova scheda in secondo piano"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"Apri tutto in nuove schede"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"Apri le nuove schede dietro la scheda corrente"</string>
+ <string name="recover_title" msgid="7754049918641251703">"Ripristinare le schede?"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"Sembra che si sia verificato un arresto anomalo del browser. Ripristinare le schede che erano aperte durante l\'ultima sessione?"</string>
</resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 8ac3436..dfd5cf9 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"Molto grande"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Dimensioni testo"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"Zoom predefinito"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"Lontano"</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"Coreano (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Codifica testo"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"Labs"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"Controlli rapidi"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"Fai scorrere il pollice dal lato sinistro/destro per accedere ai controlli e nascondere le barre delle applicazioni e dell\'URL"</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"Condividi"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"Nessun\'altra scheda disponibile"</string>
<string name="instant_search_label" msgid="8769284297650716935">"Google con Instant (Labs)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"Ripristinare le finestre?"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"Sembra che si sia verificato un arresto anomalo del browser. Ripristinare le finestre he erano aperte durante l\'ultima sessione?"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"Sì"</string>
+ <string name="recover_no" msgid="3121030267940592611">"No"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-iw-xlarge/strings.xml b/res/values-iw-xlarge/strings.xml
index 1ea3357..9660c57 100644
--- a/res/values-iw-xlarge/strings.xml
+++ b/res/values-iw-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"פתח בכרטיסיית רקע חדשה"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"פתח את הכל בכרטיסיות חדשות"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"פתח כרטיסיות חדשות מאחורי הכרטיסייה הנוכחית"</string>
+ <string name="recover_title" msgid="7754049918641251703">"לשחזר כרטיסיות?"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"נראה שהדפדפן קרס. האם ברצונך לשחזר את הכרטיסיות שלך מההפעלה הקודמת?"</string>
</resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 0230fc1..26b3b37 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"ענק"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"גודל טקסט"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"ברירת מחדל של מרחק מתצוגה"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"רחוק"</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"קוריאנית (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"קידוד טקסט"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"Labs"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"פקדים מהירים"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"העבר את האגודל מאחד הצדדים כדי לגשת לפקדים המהירים ולהסתיר את סרגלי היישום וה-URL"</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"שתף"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"אין עוד כרטיסיות זמינות"</string>
<string name="instant_search_label" msgid="8769284297650716935">"Google עם Instant (Google Labs)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"לשחזר חלונות?"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"נראה שהדפדפן קרס. האם ברצונך לשחזר את החלונות שלך מההפעלה הקודמת?"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"כן"</string>
+ <string name="recover_no" msgid="3121030267940592611">"לא"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-ja-xlarge/strings.xml b/res/values-ja-xlarge/strings.xml
index 7e75d86..3ae0184 100644
--- a/res/values-ja-xlarge/strings.xml
+++ b/res/values-ja-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"新しいバックグラウンドタブで開く"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"常に新しいタブで開く"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"現在のタブの後ろに新しいタブを開く"</string>
+ <string name="recover_title" msgid="7754049918641251703">"タブを元に戻しますか?"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"ブラウザはクラッシュしたようです。前回のタブに戻しますか?"</string>
</resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 7266a9f..8d092fc 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"最大"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"文字サイズ"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"デフォルトの倍率"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"低"</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"韓国語(EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"テキストエンコード"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"Labs"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"クイックコントロール"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"クイックコントロールへのアクセス(アプリ/URLバー非表示)には左/右端からスワイプ"</string>
@@ -286,7 +290,7 @@
<string name="empty_history" msgid="8738772352308207274">"ブラウザ履歴はありません。"</string>
<string name="add_new_bookmark" msgid="8086367791400349049">"現在のページをブックマーク"</string>
<string name="add_bookmark_short" msgid="3783984330998103735">"追加"</string>
- <string name="search_hint" msgid="4647356319916631820">"URLを検索または入力"</string>
+ <string name="search_hint" msgid="4647356319916631820">"検索またはURLを入力"</string>
<string name="search_button_text" msgid="5235226933877634410">"移動"</string>
<string name="search_settings_description" msgid="1422401062529014107">"ブックマークとウェブ履歴"</string>
<string name="attention" msgid="3473639060042811244">"注意"</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"共有"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"タブ数が上限に達しました"</string>
<string name="instant_search_label" msgid="8769284297650716935">"Googleインスタント検索(Labs)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"ウィンドウを元に戻しますか?"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"ブラウザはクラッシュしたようです。前回のウィンドウに戻しますか?"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"はい"</string>
+ <string name="recover_no" msgid="3121030267940592611">"いいえ"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-ko-xlarge/strings.xml b/res/values-ko-xlarge/strings.xml
index 63bd6a1..c2e21ce 100644
--- a/res/values-ko-xlarge/strings.xml
+++ b/res/values-ko-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"새 배경 탭에서 열기"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"새 탭에서 모두 열기"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"현재 탭 뒤에 새 탭 열기"</string>
+ <string name="recover_title" msgid="7754049918641251703">"탭을 복원하시겠습니까?"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"브라우저가 멈추었습니다. 마지막에 열려있던 탭을 복원하시겠습니까?"</string>
</resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index d247e52..baa18fa 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -76,7 +76,7 @@
<string name="name" msgid="5462672162695365387">"라벨"</string>
<string name="http" msgid="2163722670597250102">"http://"</string>
<string name="save_to_bookmarks" msgid="6101482434920313244">"북마크에 추가"</string>
- <string name="bookmark_this_page" msgid="7530739804320811054">"페이지 북마크"</string>
+ <string name="bookmark_this_page" msgid="7530739804320811054">"북마크하기"</string>
<string name="remove" msgid="7820112494467011374">"삭제"</string>
<string name="edit_bookmark" msgid="5024089053490231905">"북마크 수정"</string>
<string name="create_shortcut_bookmark" msgid="1995095662095484289">"홈에 바로가기 추가"</string>
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"아주 크게"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"텍스트 크기"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"기본 확대/축소"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"축소"</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"한국어(EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"텍스트 인코딩"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"실험실"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"빠른 컨트롤"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"좌/우 끝에서 엄지로 스와이프하여 빠른 컨트롤에 액세스하고 앱 및 URL 표시줄 숨김"</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"공유"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"탭이 더 이상 없습니다."</string>
<string name="instant_search_label" msgid="8769284297650716935">"Google 순간 검색(실험실)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"창을 복원하시겠습니까?"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"브라우저가 멈추었습니다. 마지막에 열려있던 창을 복원하시겠습니까?"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"예"</string>
+ <string name="recover_no" msgid="3121030267940592611">"아니요"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-land/dimensions.xml b/res/values-land/dimensions.xml
new file mode 100644
index 0000000..f3b1235
--- /dev/null
+++ b/res/values-land/dimensions.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ 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.
+-->
+
+<resources>
+ <dimen name="preference_screen_side_margin">96dp</dimen>
+ <dimen name="preference_screen_side_margin_negative">-100dp</dimen>
+ <dimen name="preference_widget_width">72dp</dimen>
+</resources>
diff --git a/res/values-lt-xlarge/strings.xml b/res/values-lt-xlarge/strings.xml
index 7fedc78..832e6ff 100644
--- a/res/values-lt-xlarge/strings.xml
+++ b/res/values-lt-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"Atidaryti naujame fono skirtuko lape"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"Atidaryti visas naujuose skirtukų lapuose"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"Atidaroma naujų skirtukų lapų už dabartinio"</string>
+ <string name="recover_title" msgid="7754049918641251703">"Atkurti skirtukus?"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"Atrodo, naršyklė užstrigo. Ar norėtumėte atkurti paskutinį kartą naudotus skirtukus?"</string>
</resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index f449b26..4d1af90 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"Didžiulis"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Teksto dydis"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"Numatytasis mastelio keitimas"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"Toli"</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"Korėjiečių (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Teksto koduotė"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"Laboratorijos"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"Spartieji valdikliai"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"Sl. nykščiu iš kair. ar deš. kr., kad pasiekt. sparč. vald. ir pasl. pr. ir URL juost."</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"Bendrinti"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"Daugiau galimų skirtukų nėra"</string>
<string name="instant_search_label" msgid="8769284297650716935">"„Google“ su Intuityviąja paieška (Laboratorijos)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"Atkurti langus?"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"Atrodo, naršyklė užstrigo. Ar norėtumėte atkurti paskutinį kartą naudotus langus?"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"Taip"</string>
+ <string name="recover_no" msgid="3121030267940592611">"Ne"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-lv-xlarge/strings.xml b/res/values-lv-xlarge/strings.xml
index 75c6059..0279ba9 100644
--- a/res/values-lv-xlarge/strings.xml
+++ b/res/values-lv-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"Atvērt jaunā fona cilnē"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"Atvērt visas jaunās cilnēs"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"Atvērt jaunas cilnes aiz pašreizējās"</string>
+ <string name="recover_title" msgid="7754049918641251703">"Vai atjaunot cilnes?"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"Notika pārlūkprogrammas avārija. Vai vēlaties atjaunot pēdējās atvērtās cilnes?"</string>
</resources>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 7322e2e..cc993fe 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"Milzīgs"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Teksta lielums"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"Noklusējuma tālummaiņa"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"Tālu"</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"Korejiešu (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Teksta kodējums"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"Laboratorijas"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"Ātrās piekļuves vadīklas"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"Lai piekļ. ātr. piekļ. vadīklām un slēptu lietojumpr. un URL joslas, ekr. lab. vai kr. malā pavelciet ar īkšķi."</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"Kopīgot"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"Vairs nav pieejamu ciļņu"</string>
<string name="instant_search_label" msgid="8769284297650716935">"Pakalpojums Google ar dinamisko meklēšanu (Laboratorijas)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"Vai atjaunot logus?"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"Notika pārlūkprogrammas avārija. Vai vēlaties atjaunot pēdējos atvērtos logus?"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"Jā"</string>
+ <string name="recover_no" msgid="3121030267940592611">"Nē"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-nb-xlarge/strings.xml b/res/values-nb-xlarge/strings.xml
index 67ab1b6..03c56ae 100644
--- a/res/values-nb-xlarge/strings.xml
+++ b/res/values-nb-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"Åpne i ny bakgrunnsfane"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"Åpne alle i nye faner"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"Åpne nye faner bak den gjeldende"</string>
+ <string name="recover_title" msgid="7754049918641251703">"Vil du gjenopprette fanene?"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"Nettleseren ser ut til å ha fått et programstopp. Ønsker du å gjenopprette fanene fra forrige økt?"</string>
</resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 18007c7..1b7aee8 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"Kjempestor"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Tekststørrelse"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"Standardzoom"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"Langt unna"</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"Koreansk (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Tekstkoding"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"Prøvefunksjoner"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"Hurtigkontroller"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"Sveip fra venstre mot høyre kant for å bruke hurtigkontr. og skjule app- og nettadresserader"</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"Del"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"Ingen flere faner tilgjengelig"</string>
<string name="instant_search_label" msgid="8769284297650716935">"Google med Instant (Labs)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"Vil du gjenopprette vinduene?"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"Nettleseren ser ut til å ha fått et programstopp. Ønsker du å gjenopprette vinduene fra forrige økt?"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"Ja"</string>
+ <string name="recover_no" msgid="3121030267940592611">"Nei"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-nl-xlarge/strings.xml b/res/values-nl-xlarge/strings.xml
index ea78890..16d5032 100644
--- a/res/values-nl-xlarge/strings.xml
+++ b/res/values-nl-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"Openen op een nieuw tabblad op de achtergrond"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"Alle bladwijzers openen op nieuwe tabbladen"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"Nieuwe tabbladen openen achter het huidige tabblad"</string>
+ <string name="recover_title" msgid="7754049918641251703">"Tabbladen herstellen?"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"De browser lijkt te zijn gecrasht. Wilt u de tabbladen uit uw vorige sessie herstellen?"</string>
</resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 8c25469..5d58c49 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"Enorm"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Tekengrootte"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"Standaardzoom"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"Veraf"</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"Koreaans (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Tekstcodering"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"Labs"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"Snelle bedieningselementen"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"Schuif vanaf links of rechts voor Quick Controls en om app- en URL-balken te verbergen"</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"Delen"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"Er zijn niet meer tabbladen beschikbaar"</string>
<string name="instant_search_label" msgid="8769284297650716935">"Google met Instant (Labs)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"Vensters herstellen?"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"De browser lijkt te zijn gecrasht. Wilt u de vensters uit uw vorige sessie herstellen?"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"Ja"</string>
+ <string name="recover_no" msgid="3121030267940592611">"Nee"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-pl-xlarge/strings.xml b/res/values-pl-xlarge/strings.xml
index d5fe8e5..33c1eb9 100644
--- a/res/values-pl-xlarge/strings.xml
+++ b/res/values-pl-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"Otwórz w nowej karcie tła"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"Otwórz wszystkie w nowych kartach"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"Otwieraj nowe karty za bieżącą"</string>
+ <string name="recover_title" msgid="7754049918641251703">"Przywrócić karty?"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"Przeglądarka uległa awarii. Czy chcesz przywrócić karty z poprzedniej sesji?"</string>
</resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index e686328..1ccd76b 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"Bardzo duży"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Rozmiar tekstu"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"Powiększenie domyślne"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"Małe"</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"koreański (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Kodowanie tekstu"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"Laboratorium"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"Szybkie sterowanie"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"Przesuń kciukiem od lewej lub prawej, aby użyć szybkiego sterowania oraz ukryć paski aplikacji i URL"</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"Udostępnij"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"Brak dostępnych kart"</string>
<string name="instant_search_label" msgid="8769284297650716935">"Google z wyszukiwaniem dynamicznym (Laboratorium)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"Przywrócić okna?"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"Przeglądarka uległa awarii. Czy chcesz przywrócić okna z poprzedniej sesji?"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"Tak"</string>
+ <string name="recover_no" msgid="3121030267940592611">"Nie"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-pt-rPT-xlarge/strings.xml b/res/values-pt-rPT-xlarge/strings.xml
index 5c45d17..fac7ed3 100644
--- a/res/values-pt-rPT-xlarge/strings.xml
+++ b/res/values-pt-rPT-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"Abrir em novo separador em segundo plano"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"Abrir tudo em separadores novos"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"Abrir novos separadores atrás do actual"</string>
+ <string name="recover_title" msgid="7754049918641251703">"Restaurar separadores?"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"O navegador bloqueou. Pretende restaurar os separadores utilizados na última sessão?"</string>
</resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index a9017fb..9ff1725 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"Muito grande"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Tamanho do texto"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"Zoom predefinido"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"Afastado"</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"Coreano (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Codificação do texto"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"Labs"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"Controlos rápidos"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"Deslize polegar margem esq. ou dir. p/ aceder contr. rápidos e ocultar barras Aplicação e URL"</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"Partilhar"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"Atingiu o limite de separadores"</string>
<string name="instant_search_label" msgid="8769284297650716935">"Google com Instantâneo (Labs)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"Restaurar as janelas?"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"O navegador bloqueou. Pretende restaurar as janelas utilizadas na última sessão?"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"Sim"</string>
+ <string name="recover_no" msgid="3121030267940592611">"Não"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-pt-xlarge/strings.xml b/res/values-pt-xlarge/strings.xml
index 73dfece..a729b61 100644
--- a/res/values-pt-xlarge/strings.xml
+++ b/res/values-pt-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"Abrir em uma nova guia em segundo plano"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"Abrir todos em novas abas"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"Abrir novas guias atrás da guia atual"</string>
+ <string name="recover_title" msgid="7754049918641251703">"Restaurar guias?"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"O navegador parece ter travado. Gostaria de restaurar as guias da última vez?"</string>
</resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index baa56ab..16cda89 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"Enorme"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Tamanho do texto"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"Zoom padrão"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"Longe"</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"Coreano (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Codificação de texto"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"Google Labs"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"Controles rápidos"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"Deslize o polegar da esqu. ou dir. para acessar controles rápidos e ocultar barras de apps e URL"</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"Compartilhar"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"Não há mais guias disponíveis"</string>
<string name="instant_search_label" msgid="8769284297650716935">"Google com Instant (Labs)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"Restaurar janelas?"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"O navegador parece ter travado. Gostaria de restaurar as janelas da última vez?"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"Sim"</string>
+ <string name="recover_no" msgid="3121030267940592611">"Não"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-rm/strings.xml b/res/values-rm/strings.xml
index 5cabaa0..677d5eb 100644
--- a/res/values-rm/strings.xml
+++ b/res/values-rm/strings.xml
@@ -305,6 +305,8 @@
<item msgid="7201512237890458902">"Fitg grond"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Grondezza dal text"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"Zoom predefinì"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"Lontan"</item>
@@ -336,6 +338,8 @@
<item msgid="2193955365569270096">"Corean (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Codaziun dal text"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<!-- no translation found for pref_lab_title (5571091610359629423) -->
<skip />
<!-- no translation found for pref_lab_quick_controls (3267606522082281367) -->
@@ -478,4 +482,14 @@
<skip />
<!-- no translation found for instant_search_label (8769284297650716935) -->
<skip />
+ <!-- no translation found for recover_title (8095611702406163360) -->
+ <skip />
+ <!-- no translation found for recover_prompt (5526783279696786755) -->
+ <skip />
+ <!-- no translation found for recover_yes (5837971910598069183) -->
+ <skip />
+ <!-- no translation found for recover_no (3121030267940592611) -->
+ <skip />
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-ro-xlarge/strings.xml b/res/values-ro-xlarge/strings.xml
index a7d3698..a5e2a8e 100644
--- a/res/values-ro-xlarge/strings.xml
+++ b/res/values-ro-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"Deschideţi într-o filă nouă în fundal"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"Deschideţi-le pe toate în file noi"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"Deschideţi file noi în spatele celei curente"</string>
+ <string name="recover_title" msgid="7754049918641251703">"Restabiliţi filele?"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"Browserul pare să se fi blocat. Doriţi să restabiliţi filele din ultima sesiune?"</string>
</resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 53c3e97..ba4ff8b 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"Foarte mare"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Dimensiune text"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"Zoom prestabilit"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"Departe"</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"Coreeană (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Codificare text"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"Laborator"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"Comenzi rapide"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"Glis. deg. mare din marg. st. sau dr. şi acc. com. rapide/asc. bar. Apl. şi URL"</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"Distribuiţi"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"Nu mai există file disponibile"</string>
<string name="instant_search_label" msgid="8769284297650716935">"Google cu Instant (Google Labs)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"Restabiliţi ferestrele?"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"Browserul pare să se fi blocat. Doriţi să restabiliţi ferestrele din ultima sesiune?"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"Da"</string>
+ <string name="recover_no" msgid="3121030267940592611">"Nu"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-ru-xlarge/strings.xml b/res/values-ru-xlarge/strings.xml
index 517957e..9fad6d2 100644
--- a/res/values-ru-xlarge/strings.xml
+++ b/res/values-ru-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"Открыть в фоновой вкладке"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"Открыть все в новых вкладках"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"Открывать новые вкладки под текущей вкладкой"</string>
+ <string name="recover_title" msgid="7754049918641251703">"Восстановить вкладки?"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"Произошел сбой в работе браузера. Восстановить вкладки последнего сеанса?"</string>
</resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 5c3ae46..f44c675 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"Огромный"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Размер текста"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"Масштаб по умолчанию"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"Мелкий"</item>
@@ -248,7 +250,7 @@
<string name="pref_content_load_page" msgid="2219810141690955452">"Обзор страниц"</string>
<string name="pref_content_load_page_summary" msgid="8792093504054149369">"Открывать страницы в мелком маштабе для ознакомления"</string>
<string name="pref_extras_title" msgid="7075456173747370647">"Дополнительные функции"</string>
- <string name="pref_extras_website_settings" msgid="67866640052455549">"Настройки веб-сайта"</string>
+ <string name="pref_extras_website_settings" msgid="67866640052455549">"Настройки веб-сайтов"</string>
<string name="pref_extras_website_settings_summary" msgid="1656771443223494406">"Дополнительные настройки для отдельных сайтов"</string>
<string name="pref_extras_reset_default_title" msgid="3579760449455761762">"Сброс настроек"</string>
<string name="pref_extras_reset_default" msgid="8904000515846202110">"Сброс настроек"</string>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"Корейская (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Кодировка текста"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"Лаборатория Google"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"Панель инструментов"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"Чтобы открыть панель инструментов, скрыв адресную строку и панель приложений, проведите пальцем в правом или левом углу экрана"</string>
@@ -344,11 +348,11 @@
<string name="webstorage_origin_summary_mb_stored" msgid="1985885826292236210">"Объем занятой памяти телефона (МБ)"</string>
<string name="loading_video" msgid="4887871585216091096">"Загрузка видео"</string>
<string name="geolocation_permissions_prompt_message" msgid="356796102004052471">"<xliff:g id="WEBSITE_ORIGIN">%s</xliff:g> запрашивает данные о вашем местоположении"</string>
- <string name="geolocation_permissions_prompt_share" msgid="9084486342048347976">"Сообщить местоположение"</string>
+ <string name="geolocation_permissions_prompt_share" msgid="9084486342048347976">"Разрешить"</string>
<string name="geolocation_permissions_prompt_dont_share" msgid="6303025160237860300">"Отклонить"</string>
<string name="geolocation_permissions_prompt_remember" msgid="3118526300707348308">"Запомнить настройки"</string>
- <string name="geolocation_permissions_prompt_toast_allowed" msgid="987286072035125498">"У этого сайта есть доступ к данным о вашем местоположении. Для изменения параметров доступа выберите Настройки -> Настройки веб-сайта"</string>
- <string name="geolocation_permissions_prompt_toast_disallowed" msgid="7695100950212692515">"У этого сайта нет доступа к данным о вашем местоположении. Для изменения параметров доступа выберите Настройки -> Настройки веб-сайта"</string>
+ <string name="geolocation_permissions_prompt_toast_allowed" msgid="987286072035125498">"У этого сайта есть доступ к данным о вашем местоположении. Для изменения параметров доступа выберите Настройки -> Настройки веб-сайтов"</string>
+ <string name="geolocation_permissions_prompt_toast_disallowed" msgid="7695100950212692515">"У этого сайта нет доступа к данным о вашем местоположении. Для изменения параметров доступа выберите Настройки -> Настройки веб-сайтов"</string>
<string name="geolocation_settings_page_title" msgid="1745477985097536528">"Закрыть геоданные"</string>
<string name="geolocation_settings_page_summary_allowed" msgid="9180251524290811398">"Этот сайт сейчас имеет доступ к вашему местоположению"</string>
<string name="geolocation_settings_page_summary_not_allowed" msgid="4589649082203102544">"Этот сайт в настоящее время не имеет доступа к вашему местоположению"</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"Отправить"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"Достигнут предел количества вкладок"</string>
<string name="instant_search_label" msgid="8769284297650716935">"Google с Живым поиском (Лаборатория Google)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"Восстановить окна?"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"Произошел сбой в работе браузера. Восстановить окна последнего сеанса?"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"Да"</string>
+ <string name="recover_no" msgid="3121030267940592611">"Нет"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-sk-xlarge/strings.xml b/res/values-sk-xlarge/strings.xml
index d1be7da..f9f9048 100644
--- a/res/values-sk-xlarge/strings.xml
+++ b/res/values-sk-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"Otvoriť na novej karte na pozadí"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"Otvoriť všetky na nových kartách"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"Otvárať nové karty za aktuálnou kartou"</string>
+ <string name="recover_title" msgid="7754049918641251703">"Obnoviť karty?"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"Zrejme došlo k zlyhaniu prehliadača. Chcete obnoviť naposledy otvorené karty?"</string>
</resources>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 12a0aed..71c6ac7 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"Veľmi veľký"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Veľkosť textu"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"Predvolené priblíženie"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"Ďaleko"</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"Kórejčina (EUC–KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Kódovanie textu"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"Labs"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"Rýchle ovládacie prvky"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"Posuňte prstom v smere od ľavého alebo pravého okraja, čím rýchlo pristúpite k ovládacím prvkom a skryjete panely aplikácií a adresy URL"</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"Zdieľať"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"K dispozícii nie sú žiadne ďalšie záložky"</string>
<string name="instant_search_label" msgid="8769284297650716935">"Google s Dynamickým vyhľadávaním (Labs)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"Obnoviť okná?"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"Zrejme došlo k zlyhaniu prehliadača. Chcete obnoviť naposledy otvorené okná?"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"Áno"</string>
+ <string name="recover_no" msgid="3121030267940592611">"Nie"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-sl-xlarge/strings.xml b/res/values-sl-xlarge/strings.xml
index 55a76e4..bce1349 100644
--- a/res/values-sl-xlarge/strings.xml
+++ b/res/values-sl-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"Odpri v novem zavihku v ozadju"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"Odpri vse v novih zavihkih"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"Odpri nove zavihke za trenutnim"</string>
+ <string name="recover_title" msgid="7754049918641251703">"Želite obnoviti zavihke?"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"Videti je, da se je brskalnik zrušil. Želite obnoviti prejšnje zavihke?"</string>
</resources>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index b153da3..ed0311a 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"Velikanska"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Velikost besedila"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"Privzeta povečava/pomanjšava"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"Oddaljeno"</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"Korejščina (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Kodiranje besedila"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"Laboratoriji"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"Hitri kontrolniki"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"Povlecite palec z l./d. roba za hitre kontr. in skrivanje vrstic Program in URL"</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"Skupna raba"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"Ni več razpoložljivih zavihkov"</string>
<string name="instant_search_label" msgid="8769284297650716935">"Google z Dinamičnim iskanjem (Labs)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"Želite obnoviti okna?"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"Videti je, da se je brskalnik zrušil. Želite obnoviti prejšnja okna?"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"Da"</string>
+ <string name="recover_no" msgid="3121030267940592611">"Ne"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-sr-xlarge/strings.xml b/res/values-sr-xlarge/strings.xml
index 993e372..b4c6b08 100644
--- a/res/values-sr-xlarge/strings.xml
+++ b/res/values-sr-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"Отвори у новој позадинској картици"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"Отвори све у новим картицама"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"Отварање нових картица иза тренутне картице"</string>
+ <string name="recover_title" msgid="7754049918641251703">"Желите ли да вратите картице?"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"Изгледа да је прегледач отказао. Желите ли да вратите картице које сте последње користили?"</string>
</resources>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 77a0145..91cb466 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"Огромно"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Величина текста"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"Подразумевано зумирај"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"Издалека"</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"корејски (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Кодирање текста"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"Labs"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"Брзе контроле"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"Листањем са леве или десне ивице приступа се брзим контролама и сакривају траке Апликације и URL адресе"</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"Дели"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"Нема више доступних картица"</string>
<string name="instant_search_label" msgid="8769284297650716935">"Google са Инстантом (Labs)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"Желите ли да вратите прозоре?"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"Изгледа да је прегледач отказао. Желите ли да вратите прозоре које сте последње користили?"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"Да"</string>
+ <string name="recover_no" msgid="3121030267940592611">"Не"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-sv-xlarge/strings.xml b/res/values-sv-xlarge/strings.xml
index 0e3cd5b..07b3c5e 100644
--- a/res/values-sv-xlarge/strings.xml
+++ b/res/values-sv-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"Öppna i ny flik i bakgrunden"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"Öppna alla på en ny flik"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"Öppna nya flikar bakom den aktiva"</string>
+ <string name="recover_title" msgid="7754049918641251703">"Vill du återställa flikar?"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"Webbläsaren verkar ha kraschat. Vill du återställa dina flikar från förra gången?"</string>
</resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 35715ff..e53e8e2 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"Mycket stor"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Textstorlek"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"Standardinställning för zoom"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"Lång"</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"koreanska (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Textkodning"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"Labs"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"Snabbkontroller"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"Svep från vänster eller höger så visas snabbkontrollerna och program- och adressfälten döljs"</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"Dela"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"Det finnns inga fler flikar"</string>
<string name="instant_search_label" msgid="8769284297650716935">"Google med Instant (Labs)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"Vill du återställa fönster?"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"Webbläsaren verkar ha kraschat. Vill du återställa dina fönster från förra gången?"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"Ja"</string>
+ <string name="recover_no" msgid="3121030267940592611">"Nej"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-th-xlarge/strings.xml b/res/values-th-xlarge/strings.xml
index 7eb654b..9047f27 100644
--- a/res/values-th-xlarge/strings.xml
+++ b/res/values-th-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"เปิดในแท็บพื้นหลังใหม่"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"เปิดทั้งหมดในแท็บใหม่"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"เปิดแท็บใหม่หลังแท็บปัจจุบัน"</string>
+ <string name="recover_title" msgid="7754049918641251703">"กู้แท็บคืนหรือไม่"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"ดูเหมือนว่าจะเกิดข้อขัดข้องกับเบราว์เซอร์ คุณต้องการคืนค่าแท็บจากครั้งที่แล้วหรือไม่"</string>
</resources>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 97e9d23..286cc99 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"ใหญ่มาก"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"ขนาดข้อความ"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"การซูมเริ่มต้น"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"ไกล"</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"เกาหลี (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"การเข้ารหัสข้อความ"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"Labs"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"การควบคุมอย่างรวดเร็ว"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"กวาดหัวแม่มือจากซ้ายหรือขวาเพื่อการควบคุมที่รวดเร็วและซ่อนแอปพลิเคชันและแถบ URL"</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"แบ่งปัน"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"ไม่สามารถใช้แท็บเพิ่มได้"</string>
<string name="instant_search_label" msgid="8769284297650716935">"Google พร้อมการค้นหาทันใจ (Labs)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"กู้หน้าต่างคืนหรือไม่"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"ดูเหมือนว่าจะเกิดข้อขัดข้องกับเบราว์เซอร์ คุณต้องการคืนค่าหน้าต่างจากครั้งที่แล้วหรือไม่"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"ใช่"</string>
+ <string name="recover_no" msgid="3121030267940592611">"ไม่"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-tl-xlarge/strings.xml b/res/values-tl-xlarge/strings.xml
index 069d6eb..fbbfb73 100644
--- a/res/values-tl-xlarge/strings.xml
+++ b/res/values-tl-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"Buksan sa bagong tab na background"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"Buksan sa lahat ng mga bagong tab"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"Buksan ang mga bagong tab sa likod ng kasalukuyan"</string>
+ <string name="recover_title" msgid="7754049918641251703">"Ibalik ang mga tab?"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"Mukhang nag-crash ang browser. Gusto mo bang ibalik ang iyong mga tab mula sa nakaraan?"</string>
</resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index cf791c4..55a60df 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"Malaki"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Laki ng teksto"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"Default zoom"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"Malayo"</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"Korean (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Pag-encode ng teksto"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"Mga Lab"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"Mga mabilis na pagkontrol"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"I-swipe thumb sa kaliwa o kanan gilid para access bilis kontrol at itago Application at URL bar"</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"Ibahagi"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"Wala nang available na mga tab"</string>
<string name="instant_search_label" msgid="8769284297650716935">"Google na mayroong Instant (Labs)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"Ibalik ang windows?"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"Mukhang nag-crash ang browser. Gusto mo bang ibalik ang iyong windows mula sa nakaraan?"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"Oo"</string>
+ <string name="recover_no" msgid="3121030267940592611">"Hindi"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-tr-xlarge/strings.xml b/res/values-tr-xlarge/strings.xml
index ad88d26..9836e2a 100644
--- a/res/values-tr-xlarge/strings.xml
+++ b/res/values-tr-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"Yeni arka plan sekmesinde aç"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"Tümünü yeni sekmelerde aç"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"Yeni sekmeleri geçerli sekmenin arkasında aç"</string>
+ <string name="recover_title" msgid="7754049918641251703">"Sekmeler geri yüklensin mi?"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"Tarayıcı kilitlenmiş görünüyor. Son kullandığınız sekmelerin geri yüklenmesini ister misiniz?"</string>
</resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 9896e0c..445b4f1 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"Çok büyük"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Metin boyutu"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"Varsayılan zum"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"Uzak"</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"Korece (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Metin kodlama"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"Labs"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"Hızlı denetimler"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"Hızlı dentmlr erşmk, Uyg ve URL çubklr gizlmk için başprmğnzı sol veya sağ kenrdn hızlc kaydrn"</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"Paylaş"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"Kullanılabilir başka sekme yok"</string>
<string name="instant_search_label" msgid="8769284297650716935">"Anında Arama ile Google (Labs)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"Pencereler geri yüklensin mi?"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"Tarayıcı kilitlenmiş görünüyor. Son kullandığınız pencerelerin geri yüklenmesini ister misiniz?"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"Evet"</string>
+ <string name="recover_no" msgid="3121030267940592611">"Hayır"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-uk-xlarge/strings.xml b/res/values-uk-xlarge/strings.xml
index 036aeaf..114653e 100644
--- a/res/values-uk-xlarge/strings.xml
+++ b/res/values-uk-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"Відкрити в новій фоновій вкладці"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"Відкрити все в нових вкладках"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"Відкривати нові вкладки за поточною"</string>
+ <string name="recover_title" msgid="7754049918641251703">"Відновити вкладки?"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"Відбулося аварійне завершення роботи веб-переглядача. Відновити останні відкриті вкладки?"</string>
</resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index eec1e19..b668193 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"Дуже вел."</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Розмір тексту"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"Масштаб за умовч."</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"Віддал."</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"Корейська (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Кодування тексту"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"Лабораторії"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"Швидкі елементи керування"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"Гортайте зліва чи справа, щоб відкрити швидкі елем. керування та сховати панелі програми й URL"</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"Надіслати"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"Більше немає вкладок"</string>
<string name="instant_search_label" msgid="8769284297650716935">"Google із Миттєвим пошуком (Лабораторії)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"Відновити вікна?"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"Відбулося аварійне завершення роботи веб-переглядача. Відновити останні відкриті вікна?"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"Так"</string>
+ <string name="recover_no" msgid="3121030267940592611">"Ні"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-vi-xlarge/strings.xml b/res/values-vi-xlarge/strings.xml
index 5e74c13..4a12067 100644
--- a/res/values-vi-xlarge/strings.xml
+++ b/res/values-vi-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"Mở trong tab nền mới"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"Mở tất cả trong tab mới"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"Mở tab mới phía sau tab hiện tại"</string>
+ <string name="recover_title" msgid="7754049918641251703">"Khôi phục các tab?"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"Trình duyệt có vẻ như đã gặp sự cố. Bạn có muốn khôi phục lại các tab từ lần trước không?"</string>
</resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index d5010a4..de6f05f 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"Rất lớn"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Kích cỡ chữ"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"Thu phóng mặc định"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"Xa"</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"Tiếng Hàn (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Mã hoá văn bản"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"Lab"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"Các điều khiển nhanh"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"Trượt ngón tay từ cạnh trái hoặc phải để truy cập điều khiển nhanh và ẩn các thanh Ứng dụng và URL"</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"Chia sẻ"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"Không có thêm tab nào"</string>
<string name="instant_search_label" msgid="8769284297650716935">"Google với tính năng Instant (Labs)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"Khôi phục các cửa sổ?"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"Trình duyệt có vẻ như đã gặp sự cố. Bạn có muốn khôi phục lại các cửa sổ từ lần trước không?"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"Có"</string>
+ <string name="recover_no" msgid="3121030267940592611">"Không"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-xlarge/dimensions.xml b/res/values-xlarge/dimensions.xml
index 2549818..eae9b0e 100644
--- a/res/values-xlarge/dimensions.xml
+++ b/res/values-xlarge/dimensions.xml
@@ -27,4 +27,12 @@
<dimen name="combo_paddingTop">50dip</dimen>
<dimen name="combo_paddingLeftRight">134dip</dimen>
<dimen name="combo_horizontalSpacing">20dip</dimen>
+ <dimen name="qc_radius_start">50dip</dimen>
+ <dimen name="qc_radius_increment">70dip</dimen>
+ <dimen name="qc_slop">15dip</dimen>
+ <dimen name="qc_touch_offset">15dip</dimen>
+ <dimen name="qc_tab_title_height">30dip</dimen>
+ <dimen name="qc_thumb_width">240dip</dimen>
+ <dimen name="qc_thumb_height">160dip</dimen>
+ <dimen name="qc_item_size">48dip</dimen>
</resources>
diff --git a/res/values-xlarge/strings.xml b/res/values-xlarge/strings.xml
index 92646a4..d715c1b 100644
--- a/res/values-xlarge/strings.xml
+++ b/res/values-xlarge/strings.xml
@@ -32,4 +32,8 @@
<string name="open_all_in_new_window">Open all in new tabs</string>
<!-- Settings summary CHAR LIMIT=50]-->
<string name="pref_content_open_in_background_summary">Open new tabs behind the current one</string>
+ <!-- Recover tabs after a crash dialog title [CHAR LIMIT=32] -->
+ <string name="recover_title">Restore tabs?</string>
+ <!-- Recover tabs after a crash dialog prompt [CHAR LIMIT=none] -->
+ <string name="recover_prompt">Browser appears to have crashed. Would you like to restore your tabs from last time?</string>
</resources>
diff --git a/res/values-xlarge/styles.xml b/res/values-xlarge/styles.xml
new file mode 100644
index 0000000..4951b2e
--- /dev/null
+++ b/res/values-xlarge/styles.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+<resources>
+ <style name="BrowserTheme" parent="@android:Theme.Holo">
+ <item name="android:windowBackground">@color/white</item>
+ <item name="android:colorBackground">#FFFFFFFF</item>
+ <item name="android:windowActionBar">true</item>
+ <item name="android:windowNoTitle">false</item>
+ <item name="android:actionBarStyle">@style/ActionBarStyle</item>
+ <item name="android:actionButtonStyle">@style/ActionButton</item>
+ </style>
+</resources>
diff --git a/res/values-zh-rCN-xlarge/strings.xml b/res/values-zh-rCN-xlarge/strings.xml
index b64a476..5ae13e5 100644
--- a/res/values-zh-rCN-xlarge/strings.xml
+++ b/res/values-zh-rCN-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"在新的后台标签页中打开"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"在新标签页中打开全部书签"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"在当前标签页后方打开新标签页"</string>
+ <string name="recover_title" msgid="7754049918641251703">"恢复标签页?"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"浏览器似乎已崩溃。要恢复最后一次打开的标签页吗?"</string>
</resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index ed5f8e1..2b1faad 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"超大"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"文字大小"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"默认缩放设置"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"远"</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"韩语 (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"文字编码"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"实验室"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"快速控制"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"从左边缘或右边缘滑动拇指即可访问快速控制并隐藏应用程序和网址栏"</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"分享"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"没有更多标签可用"</string>
<string name="instant_search_label" msgid="8769284297650716935">"具有即搜即得功能的 Google(实验室)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"恢复窗口?"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"浏览器似乎已崩溃。要恢复最后一次打开的窗口吗?"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"是"</string>
+ <string name="recover_no" msgid="3121030267940592611">"否"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values-zh-rTW-xlarge/strings.xml b/res/values-zh-rTW-xlarge/strings.xml
index 32c2158..9edd749 100644
--- a/res/values-zh-rTW-xlarge/strings.xml
+++ b/res/values-zh-rTW-xlarge/strings.xml
@@ -23,4 +23,6 @@
<string name="contextmenu_openlink_newwindow_background" msgid="5625314148071601758">"在新背景分頁中開啟連結"</string>
<string name="open_all_in_new_window" msgid="8498279523071618315">"於新分頁開啟所有書籤"</string>
<string name="pref_content_open_in_background_summary" msgid="7653600574808720292">"在目前分頁的後面開啟新分頁"</string>
+ <string name="recover_title" msgid="7754049918641251703">"還原標籤?"</string>
+ <string name="recover_prompt" msgid="3030249435588073132">"瀏覽器已當機。您想要還原最後一次的標籤?"</string>
</resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index a3dc094..be90d4a 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -129,7 +129,7 @@
<string name="contextmenu_add_contact" msgid="3183511922223645716">"新增聯絡人"</string>
<string name="contextmenu_send_mail" msgid="1014513374828775660">"傳送電子郵件"</string>
<string name="contextmenu_map" msgid="7471390435434034912">"地圖"</string>
- <string name="choosertitle_sharevia" msgid="4600490613341909086">"透過下列應用程式分享:"</string>
+ <string name="choosertitle_sharevia" msgid="4600490613341909086">"分享方式:"</string>
<string name="clear" msgid="7070043081700011461">"清除"</string>
<string name="replace" msgid="4843033491070384047">"取代"</string>
<string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"書籤"</string>
@@ -188,7 +188,7 @@
<string name="autofill_profile_editor_zip_code" msgid="283668573295656671">"郵遞區號:"</string>
<string name="autofill_profile_editor_country" msgid="7234470301239156656">"國家/地區:"</string>
<string name="autofill_profile_editor_phone_number" msgid="4938852821413729276">"電話:"</string>
- <string name="autofill_profile_editor_phone_number_invalid" msgid="7166394872369167580">"無效的電話號碼"</string>
+ <string name="autofill_profile_editor_phone_number_invalid" msgid="7166394872369167580">"電話號碼錯誤"</string>
<string name="autofill_profile_editor_save_profile" msgid="8349915287435262888">"儲存設定檔"</string>
<string name="autofill_profile_successful_save" msgid="6834102203944938409">"設定檔已儲存"</string>
<string name="autofill_profile_successful_delete" msgid="2421442112954362732">"個人資料已刪除"</string>
@@ -238,6 +238,8 @@
<item msgid="7201512237890458902">"最大"</item>
</string-array>
<string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"文字大小"</string>
+ <!-- no translation found for pref_min_font_size (8811125835817449131) -->
+ <skip />
<string name="pref_default_zoom" msgid="8076142259097187395">"預設縮放"</string>
<string-array name="pref_default_zoom_choices">
<item msgid="549583171195154919">"遠"</item>
@@ -268,6 +270,8 @@
<item msgid="2193955365569270096">"韓文 (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"文字編碼"</string>
+ <!-- no translation found for pref_accessibility_title (5127836981587423215) -->
+ <skip />
<string name="pref_lab_title" msgid="5571091610359629423">"研究室"</string>
<string name="pref_lab_quick_controls" msgid="3267606522082281367">"快速控制介面"</string>
<string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"於左右邊緣滑動拇指即可使用快速控制介面,以及隱藏應用程式列和網址列"</string>
@@ -382,4 +386,10 @@
<string name="menu_share_url" msgid="5851814357333739700">"分享"</string>
<string name="max_tabs_warning" msgid="4122034303809457570">"已無分頁可供使用"</string>
<string name="instant_search_label" msgid="8769284297650716935">"使用 Google 互動智慧搜尋 (研究室)"</string>
+ <string name="recover_title" msgid="8095611702406163360">"還原視窗?"</string>
+ <string name="recover_prompt" msgid="5526783279696786755">"瀏覽器已當機。您想要還原最後一次的視窗?"</string>
+ <string name="recover_yes" msgid="5837971910598069183">"好"</string>
+ <string name="recover_no" msgid="3121030267940592611">"不用了"</string>
+ <!-- no translation found for preview (1470306351083271066) -->
+ <skip />
</resources>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 6a7c578..15a5c87 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -36,4 +36,5 @@
<color name="qcMenuBackground">#C0000000</color>
<color name="qc_normal">#C02447B2</color>
<color name="qc_selected">#D0102052</color>
+ <color name="tabViewTitleBackground">#D0000000</color>
</resources>
diff --git a/res/values/dimensions.xml b/res/values/dimensions.xml
index 99eb43e..5b962d8 100644
--- a/res/values/dimensions.xml
+++ b/res/values/dimensions.xml
@@ -30,21 +30,21 @@
<dimen name="widgetItemMinHeight">48dip</dimen>
<dimen name="favicon_size">16dip</dimen>
<dimen name="favicon_padded_size">20dip</dimen>
- <dimen name="qc_radius_start">50dip</dimen>
- <dimen name="qc_radius_increment">70dip</dimen>
- <dimen name="qc_slop">15dip</dimen>
+ <dimen name="qc_radius_start">30dip</dimen>
+ <dimen name="qc_radius_increment">60dip</dimen>
+ <dimen name="qc_slop">10dip</dimen>
<dimen name="qc_touch_offset">15dip</dimen>
<dimen name="qc_tab_title_height">30dip</dimen>
- <dimen name="qc_thumb_width">240dip</dimen>
- <dimen name="qc_thumb_height">160dip</dimen>
- <dimen name="qc_item_size">48dip</dimen>
+ <dimen name="qc_thumb_width">160dip</dimen>
+ <dimen name="qc_thumb_height">120dip</dimen>
+ <dimen name="qc_item_size">40dip</dimen>
<dimen name="bookmark_widget_thumb_size">32dip</dimen>
<dimen name="bookmark_widget_favicon_size">26dip</dimen>
- <!-- For the most visited page -->
- <dimen name="mv_max_width">830dp</dimen>
- <dimen name="mv_item_width">96dp</dimen>
- <dimen name="mv_item_width_portrait">96dp</dimen>
- <dimen name="mv_border_width">3dp</dimen>
+ <!-- For the most visited page (we use px as these are adjusted by the browser) -->
+ <dimen name="mv_max_width">450px</dimen>
+ <dimen name="mv_item_width">80px</dimen>
+ <dimen name="mv_item_width_portrait">80px</dimen>
+ <dimen name="mv_border_width">2px</dimen>
<dimen name="tab_padding_top">12dp</dimen>
<dimen name="tab_first_padding_left">12dp</dimen>
<dimen name="list_favicon_padding">5dip</dimen>
@@ -55,6 +55,16 @@
<dimen name="widgetVerticalSpacing">12dip</dimen>
<!-- For the combined Bookmarks History view -->
<dimen name="combo_paddingTop">10dip</dimen>
- <dimen name="combo_paddingLeftRight">16dip</dimen>
- <dimen name="combo_horizontalSpacing">8dip</dimen>
+ <dimen name="combo_paddingLeftRight">8dip</dimen>
+ <dimen name="combo_horizontalSpacing">6dip</dimen>
+ <dimen name="tab_view_thumbnail_height">76dip</dimen>
+ <!-- Preference activity side margins -->
+ <dimen name="preference_screen_side_margin">0dp</dimen>
+ <!-- Preference activity side margins negative-->
+ <dimen name="preference_screen_side_margin_negative">0dp</dimen>
+ <!-- Preference widget area width (to the left of the text) -->
+ <dimen name="preference_widget_width">56dp</dimen>
+ <dimen name="nav_tab_spacing">8dp</dimen>
+ <dimen name="menu_width">240dip</dimen>
+ <dimen name="toolbar_height">52dip</dimen>
</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index e754ea9..f3631d2 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -384,9 +384,11 @@
<!-- Message shown during auto login [CHAR-LIMIT=none] -->
<string name="pref_autologin_progress">Signing into Google sites using <xliff:g>%s</xliff:g></string>
<!-- Auto-login bar description [CHAR-LIMIT=40] -->
- <string name="autologin_bar_text">Automatic sign-in is available.</string>
+ <string name="autologin_bar_text">Sign in as</string>
<!-- Login button [CHAR-LIMIT=10] -->
<string name="autologin_bar_login_text">Login</string>
+ <!-- Hide button [CHAR-LIMIT=10] -->
+ <string name="autologin_bar_hide_text">Hide</string>
<!-- Login failure text [CHAR-LIMIT=25] -->
<string name="autologin_bar_error">Login failed.</string>
@@ -523,6 +525,12 @@
<item><xliff:g>LARGER</xliff:g></item>
<item><xliff:g>LARGEST</xliff:g></item>
</string-array>
+ <!-- Label for minimum font size [CHAR LIMIT=30] -->
+ <string name="pref_min_font_size">Minimum font size</string>
+ <!-- Label for whether or not to force-enable user scalablity (aka, zoom) [CHAR LIMIT=30] -->
+ <string name="pref_force_userscalable">Force enable zoom</string>
+ <!-- Summary for whether or not to force-enable user scalablity (aka, zoom) [CHAR LIMIT=30] -->
+ <string name="pref_force_userscalable_summary">Whether or not to override a website\'s request to control zoom behavior</string>
<!-- Settings label -->
<string name="pref_default_zoom">Default zoom</string>
<!-- Settings default zoom options; appear in default zoom dialog box -->
@@ -586,6 +594,7 @@
<item>iPhone</item>
<item>iPad</item>
<item>Froyo-N1</item>
+ <item>Honeycomb-Xoom</item>
</string-array>
<!-- Do not tranlsate. Development option -->
<string-array name="pref_development_ua_values" translatable="false">
@@ -594,6 +603,7 @@
<item>2</item>
<item>3</item>
<item>4</item>
+ <item>5</item>
</string-array>
<string name="pref_development_error_console" translatable="false">Show JavaScript Console</string>
<!-- Settings screen, setting option name -->
@@ -625,6 +635,8 @@
<item>EUC-KR</item>
</string-array>
<string name="pref_default_text_encoding_default" translatable="false">Latin-1</string>
+ <!-- Title for accessibility settings [CHAR LIMIT=25] -->
+ <string name="pref_accessibility_title">Accessibility</string>
<!-- Title for lab settings [CHAR LIMIT=25] -->
<string name="pref_lab_title">Labs</string>
<!-- Title for lab quick controls feature [CHAR LIMIT=40] -->
@@ -643,6 +655,11 @@
<string name="pref_use_instant_search_summary">
Use Google Instant when you use Google Search, to show results as you
type (this can increase data use).</string>
+ <string name="pref_lab_fullscreen">Fullscreen</string>
+ <!-- Summary for the fullscreen lab feature [CHAR LIMIT=120] -->
+ <string name="pref_lab_fullscreen_summary">
+ Use fullscreen mode to hide the status bar.</string>
+
<!-- Title for a dialog displayed when the browser has a data connectivity
problem -->
<string name="browserFrameNetworkErrorLabel">Data connectivity problem</string>
@@ -975,4 +992,14 @@
the search engines list (Preferences->Advanced->Set search engine
[CHAR LIMIT=80] -->
<string name="instant_search_label">Google with Instant (Labs)</string>
+ <!-- Recover tabs after a crash dialog title [CHAR LIMIT=32] -->
+ <string name="recover_title">Restore windows?</string>
+ <!-- Recover tabs after a crash dialog prompt [CHAR LIMIT=none] -->
+ <string name="recover_prompt">Browser appears to have crashed. Would you like to restore your windows from last time?</string>
+ <!-- Yes, recover windows from last time [CHAR LIMIT=10] -->
+ <string name="recover_yes">Yes</string>
+ <!-- No, don't recover windows from last time [CHAR LIMIT=10] -->
+ <string name="recover_no">No</string>
+ <!-- Font size preview label [CHAR LIMIT=30] -->
+ <string name="preview">Preview:</string>
</resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 8d222f4..1b77509 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -23,6 +23,7 @@
<item name="android:colorBackground">#FFFFFFFF</item>
<item name="android:windowActionBar">true</item>
<item name="android:windowNoTitle">false</item>
+ <item name="android:windowActionBarOverlay">true</item>
<item name="android:actionBarStyle">@style/ActionBarStyle</item>
<item name="android:actionButtonStyle">@style/ActionButton</item>
</style>
@@ -68,7 +69,7 @@
<item name="android:windowEnterAnimation">@anim/title_bar_enter</item>
<item name="android:windowExitAnimation">@anim/title_bar_exit</item>
</style>
- <style name="HoloIcon">
+ <style name="HoloIcon">
<item name="android:layout_marginLeft">16dip</item>
</style>
<style name="HoloButton">
diff --git a/res/xml-xlarge/lab_preferences.xml b/res/xml-xlarge/lab_preferences.xml
new file mode 100644
index 0000000..87383b0
--- /dev/null
+++ b/res/xml-xlarge/lab_preferences.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<PreferenceScreen
+ xmlns:android="http://schemas.android.com/apk/res/android" >
+
+ <CheckBoxPreference
+ android:key="enable_quick_controls"
+ android:defaultValue="false"
+ android:title="@string/pref_lab_quick_controls"
+ android:summary="@string/pref_lab_quick_controls_summary" />
+
+ <CheckBoxPreference
+ android:key="use_most_visited_homepage"
+ android:defaultValue="false"
+ android:title="@string/pref_lab_most_visited_homepage"
+ android:summary="@string/pref_lab_most_visited_homepage_summary" />
+
+ <CheckBoxPreference
+ android:key="use_instant_search"
+ android:defaultValue="false"
+ android:title="@string/pref_use_instant_search"
+ android:summary="@string/pref_use_instant_search_summary" />
+</PreferenceScreen>
diff --git a/res/xml/accessibility_preferences.xml b/res/xml/accessibility_preferences.xml
new file mode 100644
index 0000000..799d0e2
--- /dev/null
+++ b/res/xml/accessibility_preferences.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<PreferenceScreen
+ xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <com.android.browser.preferences.WebViewPreview />
+
+ <ListPreference
+ android:key="text_size"
+ android:title="@string/pref_text_size"
+ android:defaultValue="NORMAL"
+ android:entries="@array/pref_text_size_choices"
+ android:entryValues="@array/pref_text_size_values"
+ android:dialogTitle="@string/pref_text_size_dialogtitle" />
+
+ <com.android.browser.preferences.MinFontSizePreference
+ android:key="min_font_size"
+ android:title="@string/pref_min_font_size"
+ android:defaultValue="1" />
+
+ <CheckBoxPreference android:key="force_userscalable"
+ android:title="@string/pref_force_userscalable"
+ android:summary="@string/pref_force_userscalable_summary"
+ android:defaultValue="false" />
+
+</PreferenceScreen>
diff --git a/res/xml/advanced_preferences.xml b/res/xml/advanced_preferences.xml
index 3264d22..4a2823e 100644
--- a/res/xml/advanced_preferences.xml
+++ b/res/xml/advanced_preferences.xml
@@ -50,13 +50,6 @@
android:summary="@string/pref_extras_website_settings_summary" />
<PreferenceCategory android:title="@string/pref_content_title">
- <ListPreference
- android:key="text_size"
- android:title="@string/pref_text_size"
- android:defaultValue="NORMAL"
- android:entries="@array/pref_text_size_choices"
- android:entryValues="@array/pref_text_size_values"
- android:dialogTitle="@string/pref_text_size_dialogtitle" />
<ListPreference
android:key="default_zoom"
diff --git a/res/xml/debug_preferences.xml b/res/xml/debug_preferences.xml
index 50d4c14..5126b0d 100644
--- a/res/xml/debug_preferences.xml
+++ b/res/xml/debug_preferences.xml
@@ -29,4 +29,51 @@
android:entryValues="@array/pref_development_ua_values"
android:defaultValue="0"/>
+ <!-- The javascript console is enabled by default when the user has
+ also enabled debug mode by navigating to about:debug. -->
+ <CheckBoxPreference
+ android:key="enable_visual_indicator"
+ android:defaultValue="false"
+ android:title="@string/pref_development_visual_indicator" />
+
+ <CheckBoxPreference
+ android:key="javascript_console"
+ android:defaultValue="true"
+ android:title="@string/pref_development_error_console" />
+
+ <CheckBoxPreference
+ android:key="small_screen"
+ android:defaultValue="false"
+ android:title="@string/pref_development_single_column_rendering" />
+
+ <CheckBoxPreference
+ android:key="wide_viewport"
+ android:defaultValue="true"
+ android:title="@string/pref_development_viewport" />
+
+ <CheckBoxPreference
+ android:key="normal_layout"
+ android:defaultValue="false"
+ android:title="@string/pref_development_normal_rendering" />
+
+ <CheckBoxPreference
+ android:key="enable_tracing"
+ android:defaultValue="false"
+ android:title="@string/pref_development_trace" />
+
+ <CheckBoxPreference
+ android:key="enable_light_touch"
+ android:defaultValue="false"
+ android:title="Enable light touch" />
+
+ <CheckBoxPreference
+ android:key="enable_nav_dump"
+ android:defaultValue="false"
+ android:title="@string/pref_development_nav_dump" />
+
+ <EditTextPreference
+ android:key="js_engine_flags"
+ android:title="@string/js_engine_flags"
+ android:singleLine="true" />
+
</PreferenceScreen>
diff --git a/res/xml/hidden_debug_preferences.xml b/res/xml/hidden_debug_preferences.xml
deleted file mode 100644
index 661d9de..0000000
--- a/res/xml/hidden_debug_preferences.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 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.
--->
-
-<PreferenceScreen
- xmlns:android="http://schemas.android.com/apk/res/android" >
-
- <!-- The javascript console is enabled by default when the user has
- also enabled debug mode by navigating to about:debug. -->
- <CheckBoxPreference
- android:key="enable_visual_indicator"
- android:defaultValue="false"
- android:title="@string/pref_development_visual_indicator" />
-
- <CheckBoxPreference
- android:key="javascript_console"
- android:defaultValue="true"
- android:title="@string/pref_development_error_console" />
-
- <CheckBoxPreference
- android:key="small_screen"
- android:defaultValue="false"
- android:title="@string/pref_development_single_column_rendering" />
-
- <CheckBoxPreference
- android:key="wide_viewport"
- android:defaultValue="true"
- android:title="@string/pref_development_viewport" />
-
- <CheckBoxPreference
- android:key="normal_layout"
- android:defaultValue="false"
- android:title="@string/pref_development_normal_rendering" />
-
- <CheckBoxPreference
- android:key="enable_tracing"
- android:defaultValue="false"
- android:title="@string/pref_development_trace" />
-
- <CheckBoxPreference
- android:key="enable_light_touch"
- android:defaultValue="false"
- android:title="Enable light touch" />
-
- <CheckBoxPreference
- android:key="enable_nav_dump"
- android:defaultValue="false"
- android:title="@string/pref_development_nav_dump" />
-
- <EditTextPreference
- android:key="js_engine_flags"
- android:title="@string/js_engine_flags"
- android:singleLine="true" />
-
-</PreferenceScreen>
diff --git a/res/xml/lab_preferences.xml b/res/xml/lab_preferences.xml
index 87383b0..ee00463 100644
--- a/res/xml/lab_preferences.xml
+++ b/res/xml/lab_preferences.xml
@@ -16,22 +16,19 @@
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android" >
-
<CheckBoxPreference
android:key="enable_quick_controls"
android:defaultValue="false"
android:title="@string/pref_lab_quick_controls"
android:summary="@string/pref_lab_quick_controls_summary" />
-
<CheckBoxPreference
android:key="use_most_visited_homepage"
android:defaultValue="false"
android:title="@string/pref_lab_most_visited_homepage"
android:summary="@string/pref_lab_most_visited_homepage_summary" />
-
<CheckBoxPreference
- android:key="use_instant_search"
+ android:key="fullscreen"
android:defaultValue="false"
- android:title="@string/pref_use_instant_search"
- android:summary="@string/pref_use_instant_search_summary" />
+ android:title="@string/pref_lab_fullscreen"
+ android:summary="@string/pref_lab_fullscreen_summary" />
</PreferenceScreen>
diff --git a/res/xml/preference_headers.xml b/res/xml/preference_headers.xml
index cdf259c..e58b90a 100644
--- a/res/xml/preference_headers.xml
+++ b/res/xml/preference_headers.xml
@@ -24,6 +24,10 @@
android:title="@string/pref_privacy_security_title"
/>
+ <header android:fragment="com.android.browser.preferences.AccessibilityPreferencesFragment"
+ android:title="@string/pref_accessibility_title"
+ />
+
<header android:fragment="com.android.browser.preferences.AdvancedPreferencesFragment"
android:title="@string/pref_extras_title"
/>
diff --git a/src/com/android/browser/ActiveTabsPage.java b/src/com/android/browser/ActiveTabsPage.java
index 664fd68..52d943f 100644
--- a/src/com/android/browser/ActiveTabsPage.java
+++ b/src/com/android/browser/ActiveTabsPage.java
@@ -18,62 +18,87 @@
import android.content.Context;
import android.graphics.Bitmap;
-import android.os.Handler;
+import android.text.TextUtils;
import android.util.AttributeSet;
-import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
+import android.view.View.OnClickListener;
import android.view.ViewGroup;
+import android.widget.AbsListView;
import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
+import android.widget.ImageView.ScaleType;
import android.widget.LinearLayout;
-import android.widget.ListView;
import android.widget.TextView;
-public class ActiveTabsPage extends LinearLayout {
+interface OnCloseTab {
+ void onCloseTab(int position);
+}
- private static final String LOGTAG = "TabPicker";
+public class ActiveTabsPage extends LinearLayout implements OnClickListener,
+ OnItemClickListener, OnCloseTab {
- private final LayoutInflater mFactory;
- private final UiController mUiController;
- private final TabControl mControl;
- private final TabsListAdapter mAdapter;
- private final ListView mListView;
+ private Context mContext;
+ private UiController mController;
+ private TabControl mTabControl;
+ private View mNewTab, mNewIncognitoTab;
+ private TabAdapter mAdapter;
+ private AbsListView mTabsList;
- public ActiveTabsPage(Context context, UiController control) {
+ public ActiveTabsPage(Context context, UiController controller) {
super(context);
- mUiController = control;
- mControl = control.getTabControl();
- mFactory = LayoutInflater.from(context);
- mFactory.inflate(R.layout.active_tabs, this);
- mListView = (ListView) findViewById(R.id.list);
- mAdapter = new TabsListAdapter();
- mListView.setAdapter(mAdapter);
- mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
- public void onItemClick(AdapterView<?> parent, View view,
- int position, long id) {
- if (mControl.canCreateNewTab()) {
- position -= 2;
- }
- boolean needToAttach = false;
- if (position == -2) {
- // Create a new tab
- mUiController.openTabToHomePage();
- } else if (position == -1) {
- // Create a new incognito tab
- mUiController.openIncognitoTab();
- } else {
- // Open the corresponding tab
- // If the tab is the current one, switchToTab will
- // do nothing and return, so we need to make sure
- // it gets attached back to its mContentView in
- // removeActiveTabPage
- needToAttach = !mUiController.switchToTab(position);
- }
- mUiController.removeActiveTabsPage(needToAttach);
- }
- });
+ mContext = context;
+ mController = controller;
+ mTabControl = mController.getTabControl();
+ setOrientation(VERTICAL);
+ setBackgroundResource(R.drawable.bg_browser);
+ LayoutInflater inflate = LayoutInflater.from(mContext);
+ inflate.inflate(R.layout.active_tabs, this, true);
+ mNewTab = findViewById(R.id.new_tab);
+ mNewIncognitoTab = findViewById(R.id.new_incognito_tab);
+ mNewTab.setOnClickListener(this);
+ mNewIncognitoTab.setOnClickListener(this);
+ int visibility = mTabControl.canCreateNewTab() ? View.VISIBLE : View.GONE;
+ mNewTab.setVisibility(visibility);
+ mNewIncognitoTab.setVisibility(visibility);
+ mTabsList = (AbsListView) findViewById(android.R.id.list);
+ mAdapter = new TabAdapter(mContext, mTabControl);
+ mAdapter.setOnCloseListener(this);
+ mTabsList.setAdapter(mAdapter);
+ mTabsList.setOnItemClickListener(this);
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (v == mNewTab) {
+ mController.openTabToHomePage();
+ } else if (v == mNewIncognitoTab) {
+ mController.openIncognitoTab();
+ }
+ mController.removeActiveTabsPage(false);
+ }
+
+ @Override
+ public void onItemClick(
+ AdapterView<?> parent, View view, int position, long id) {
+ boolean needToAttach = !mController.switchToTab(position);
+ mController.removeActiveTabsPage(needToAttach);
+ }
+
+ @Override
+ public void onCloseTab(int position) {
+ Tab tab = mTabControl.getTab(position);
+ if (tab != null) {
+ mController.closeTab(tab);
+ if (mTabControl.getTabCount() == 0) {
+ mController.openTabToHomePage();
+ mController.removeActiveTabsPage(false);
+ } else {
+ mAdapter.notifyDataSetChanged();
+ }
+ }
}
/**
@@ -81,7 +106,7 @@
* the parent to be pressed without being pressed itself. This way the line
* of a tab can be pressed, but the close button itself is not.
*/
- private static class CloseHolder extends ImageView {
+ public static class CloseHolder extends ImageView {
public CloseHolder(Context context, AttributeSet attrs) {
super(context, attrs);
}
@@ -96,118 +121,79 @@
}
}
- private class TabsListAdapter extends BaseAdapter {
- private boolean mNotified = true;
- private int mReturnedCount;
- private Handler mHandler = new Handler();
+ static class TabAdapter extends BaseAdapter implements OnClickListener {
+ LayoutInflater mInflater;
+ OnCloseTab mCloseListener;
+ TabControl mTabControl;
+
+ TabAdapter(Context context, TabControl tabs) {
+ mInflater = LayoutInflater.from(context);
+ mTabControl = tabs;
+ }
+
+ void setOnCloseListener(OnCloseTab listener) {
+ mCloseListener = listener;
+ }
+
+ @Override
+ public View getView(int position, View view, ViewGroup parent) {
+ if (view == null) {
+ view = mInflater.inflate(R.layout.tab_view, parent, false);
+ }
+ ImageView favicon = (ImageView) view.findViewById(R.id.favicon);
+ ImageView thumbnail = (ImageView) view.findViewById(R.id.thumb);
+ TextView title = (TextView) view.findViewById(R.id.label);
+ Tab tab = getItem(position);
+
+ String label = tab.getTitle();
+ if (TextUtils.isEmpty(label)) {
+ label = tab.getUrl();
+ }
+ title.setText(label);
+ Bitmap thumbnailBitmap = tab.getScreenshot();
+ if (thumbnailBitmap == null) {
+ thumbnail.setImageResource(R.drawable.browser_thumbnail);
+ } else {
+ thumbnail.setImageBitmap(thumbnailBitmap);
+ }
+ Bitmap faviconBitmap = tab.getFavicon();
+ if (tab.isPrivateBrowsingEnabled()) {
+ favicon.setImageResource(R.drawable.ic_incognito_holo_dark);
+ } else {
+ if (faviconBitmap == null) {
+ favicon.setImageResource(R.drawable.app_web_browser_sm);
+ } else {
+ favicon.setImageBitmap(faviconBitmap);
+ }
+ }
+ View close = view.findViewById(R.id.close);
+ close.setTag(position);
+ close.setOnClickListener(this);
+ return view;
+ }
+
+ @Override
+ public void onClick(View v) {
+ int position = (Integer) v.getTag();
+ if (mCloseListener != null) {
+ mCloseListener.onCloseTab(position);
+ }
+ }
+
+ @Override
public int getCount() {
- int count = mControl.getTabCount();
- if (mControl.canCreateNewTab()) {
- count += 2;
- }
- // XXX: This is a workaround to be more like a real adapter. Most
- // adapters call notifyDataSetChanged() whenever the internal data
- // has changed. Since TabControl is our internal data, we don't
- // know when that changes.
- //
- // Keep track of the last count we returned and whether we called
- // notifyDataSetChanged(). If we did not initiate a data set
- // change, and the count is different, send the notify and return
- // the old count.
- if (!mNotified && count != mReturnedCount) {
- notifyChange();
- return mReturnedCount;
- }
- mReturnedCount = count;
- mNotified = false;
- return count;
+ return mTabControl.getTabCount();
}
- public Object getItem(int position) {
- return null;
+
+ @Override
+ public Tab getItem(int position) {
+ return mTabControl.getTab(position);
}
+
+ @Override
public long getItemId(int position) {
return position;
}
- public int getViewTypeCount() {
- return 2;
- }
- public int getItemViewType(int position) {
- if (mControl.canCreateNewTab()) {
- position -= 2;
- }
- // Do not recycle the "add new tab" item.
- return position < 0 ? IGNORE_ITEM_VIEW_TYPE : 1;
- }
- public View getView(int position, View convertView, ViewGroup parent) {
- final int tabCount = mControl.getTabCount();
- if (mControl.canCreateNewTab()) {
- position -= 2;
- }
-
- if (convertView == null) {
- if (position == -2) {
- convertView = mFactory.inflate(R.layout.tab_view_add_tab, null);
- } else if (position == -1) {
- convertView = mFactory.inflate(R.layout.tab_view_add_incognito_tab, null);
- } else {
- convertView = mFactory.inflate(R.layout.tab_view, null);
- }
- }
-
- if (position >= 0) {
- TextView title =
- (TextView) convertView.findViewById(R.id.title);
- TextView url = (TextView) convertView.findViewById(R.id.url);
- ImageView favicon =
- (ImageView) convertView.findViewById(R.id.favicon);
- View close = convertView.findViewById(R.id.close);
- Tab tab = mControl.getTab(position);
- if (tab.getWebView() == null) {
- // This means that populatePickerData will have to use the
- // saved state.
- Log.w(LOGTAG, "Tab " + position + " has a null WebView and "
- + (tab.getSavedState() == null ? "null" : "non-null")
- + " saved state ");
- }
- if (tab.getTitle() == null || tab.getTitle().length() == 0) {
- Log.w(LOGTAG, "Tab " + position + " has no title. "
- + "Check above in the Logs to see whether it has a "
- + "null WebView or null WebHistoryItem");
- }
- title.setText(tab.getTitle());
- url.setText(tab.getUrl());
- Bitmap icon = tab.getFavicon();
- if (icon != null) {
- favicon.setImageBitmap(icon);
- } else {
- favicon.setImageResource(R.drawable.app_web_browser_sm);
- }
- final int closePosition = position;
- close.setOnClickListener(new View.OnClickListener() {
- public void onClick(View v) {
- mUiController.closeTab(
- mControl.getTab(closePosition));
- if (tabCount == 1) {
- mUiController.openTabToHomePage();
- mUiController.removeActiveTabsPage(false);
- } else {
- mNotified = true;
- notifyDataSetChanged();
- }
- }
- });
- }
- return convertView;
- }
-
- void notifyChange() {
- mHandler.post(new Runnable() {
- public void run() {
- mNotified = true;
- notifyDataSetChanged();
- }
- });
- }
}
}
diff --git a/src/com/android/browser/AutoFillSettingsFragment.java b/src/com/android/browser/AutoFillSettingsFragment.java
index 3a7ae12..e87645e 100644
--- a/src/com/android/browser/AutoFillSettingsFragment.java
+++ b/src/com/android/browser/AutoFillSettingsFragment.java
@@ -53,6 +53,7 @@
// Used to display toast after DB interactions complete.
private Handler mHandler;
+ private BrowserSettings mSettings;
private final static int PROFILE_SAVED_MSG = 100;
private final static int PROFILE_DELETED_MSG = 101;
@@ -130,6 +131,7 @@
@Override
public void onCreate(Bundle savedState) {
super.onCreate(savedState);
+ mSettings = BrowserSettings.getInstance();
}
@Override
@@ -177,7 +179,7 @@
mCountryEdit.getText().toString(),
mPhoneEdit.getText().toString());
- BrowserSettings.getInstance().setAutoFillProfile(getActivity(), newProfile,
+ mSettings.setAutoFillProfile(newProfile,
mHandler.obtainMessage(PROFILE_SAVED_MSG));
closeEditor();
}
@@ -200,7 +202,7 @@
// Update browser settings and native with a null profile. This will
// trigger the current profile to get deleted from the DB.
- BrowserSettings.getInstance().setAutoFillProfile(getActivity(), null,
+ mSettings.setAutoFillProfile(null,
mHandler.obtainMessage(PROFILE_DELETED_MSG));
updateButtonState();
@@ -215,7 +217,7 @@
});
// Populate the text boxes with any pre existing AutoFill data.
- AutoFillProfile activeProfile = BrowserSettings.getInstance().getAutoFillProfile();
+ AutoFillProfile activeProfile = mSettings.getAutoFillProfile();
if (activeProfile != null) {
mFullNameEdit.setText(activeProfile.getFullName());
mEmailEdit.setText(activeProfile.getEmailAddress());
diff --git a/src/com/android/browser/AutofillHandler.java b/src/com/android/browser/AutofillHandler.java
new file mode 100644
index 0000000..d91c7ff
--- /dev/null
+++ b/src/com/android/browser/AutofillHandler.java
@@ -0,0 +1,198 @@
+
+/*
+ * 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.content.SharedPreferences;
+import android.content.SharedPreferences.Editor;
+import android.database.Cursor;
+import android.os.AsyncTask;
+import android.os.Message;
+import android.preference.PreferenceManager;
+import android.webkit.WebSettings.AutoFillProfile;
+
+import java.util.concurrent.CountDownLatch;
+
+public class AutofillHandler {
+
+ private AutoFillProfile mAutoFillProfile;
+ // Default to zero. In the case no profile is set up, the initial
+ // value will come from the AutoFillSettingsFragment when the user
+ // creates a profile. Otherwise, we'll read the ID of the last used
+ // profile from the prefs db.
+ private int mAutoFillActiveProfileId;
+ private static final int NO_AUTOFILL_PROFILE_SET = 0;
+
+ private CountDownLatch mLoaded = new CountDownLatch(1);
+ private Context mContext;
+
+ public AutofillHandler(Context context) {
+ mContext = context;
+ }
+
+ /**
+ * Load settings from the browser app's database. It is performed in
+ * an AsyncTask as it involves plenty of slow disk IO.
+ * NOTE: Strings used for the preferences must match those specified
+ * in the various preference XML files.
+ */
+ public void asyncLoadFromDb() {
+ // Run the initial settings load in an AsyncTask as it hits the
+ // disk multiple times through SharedPreferences and SQLite. We
+ // need to be certain though that this has completed before we start
+ // to load pages though, so in the worst case we will block waiting
+ // for it to finish in BrowserActivity.onCreate().
+ new LoadFromDb().start();
+ }
+
+ public void waitForLoad() {
+ try {
+ mLoaded.await();
+ } catch (InterruptedException e) {}
+ }
+
+ private class LoadFromDb extends Thread {
+
+ @Override
+ public void run() {
+ SharedPreferences p =
+ PreferenceManager.getDefaultSharedPreferences(mContext);
+
+ // Read the last active AutoFill profile id.
+ mAutoFillActiveProfileId = p.getInt(
+ PreferenceKeys.PREF_AUTOFILL_ACTIVE_PROFILE_ID,
+ mAutoFillActiveProfileId);
+
+ // Load the autofill profile data from the database. We use a database separate
+ // to the browser preference DB to make it easier to support multiple profiles
+ // and switching between them.
+ AutoFillProfileDatabase autoFillDb = AutoFillProfileDatabase.getInstance(mContext);
+ Cursor c = autoFillDb.getProfile(mAutoFillActiveProfileId);
+
+ if (c.getCount() > 0) {
+ c.moveToFirst();
+
+ String fullName = c.getString(c.getColumnIndex(
+ AutoFillProfileDatabase.Profiles.FULL_NAME));
+ String email = c.getString(c.getColumnIndex(
+ AutoFillProfileDatabase.Profiles.EMAIL_ADDRESS));
+ String company = c.getString(c.getColumnIndex(
+ AutoFillProfileDatabase.Profiles.COMPANY_NAME));
+ String addressLine1 = c.getString(c.getColumnIndex(
+ AutoFillProfileDatabase.Profiles.ADDRESS_LINE_1));
+ String addressLine2 = c.getString(c.getColumnIndex(
+ AutoFillProfileDatabase.Profiles.ADDRESS_LINE_2));
+ String city = c.getString(c.getColumnIndex(
+ AutoFillProfileDatabase.Profiles.CITY));
+ String state = c.getString(c.getColumnIndex(
+ AutoFillProfileDatabase.Profiles.STATE));
+ String zip = c.getString(c.getColumnIndex(
+ AutoFillProfileDatabase.Profiles.ZIP_CODE));
+ String country = c.getString(c.getColumnIndex(
+ AutoFillProfileDatabase.Profiles.COUNTRY));
+ String phone = c.getString(c.getColumnIndex(
+ AutoFillProfileDatabase.Profiles.PHONE_NUMBER));
+ mAutoFillProfile = new AutoFillProfile(mAutoFillActiveProfileId,
+ fullName, email, company, addressLine1, addressLine2, city,
+ state, zip, country, phone);
+ }
+ c.close();
+ autoFillDb.close();
+
+ mLoaded.countDown();
+ }
+ }
+
+ public void setAutoFillProfile(AutoFillProfile profile, Message msg) {
+ if (profile != null) {
+ setActiveAutoFillProfileId(profile.getUniqueId());
+ // Update the AutoFill DB with the new profile.
+ new SaveProfileToDbTask(msg).execute(profile);
+ } else {
+ // Delete the current profile.
+ if (mAutoFillProfile != null) {
+ new DeleteProfileFromDbTask(msg).execute(mAutoFillProfile.getUniqueId());
+ setActiveAutoFillProfileId(NO_AUTOFILL_PROFILE_SET);
+ }
+ }
+ mAutoFillProfile = profile;
+ }
+
+ public AutoFillProfile getAutoFillProfile() {
+ return mAutoFillProfile;
+ }
+
+ private void setActiveAutoFillProfileId(int activeProfileId) {
+ mAutoFillActiveProfileId = activeProfileId;
+ Editor ed = PreferenceManager.
+ getDefaultSharedPreferences(mContext).edit();
+ ed.putInt(PreferenceKeys.PREF_AUTOFILL_ACTIVE_PROFILE_ID, activeProfileId);
+ ed.apply();
+ }
+
+ private abstract class AutoFillProfileDbTask<T> extends AsyncTask<T, Void, Void> {
+ AutoFillProfileDatabase mAutoFillProfileDb;
+ Message mCompleteMessage;
+
+ public AutoFillProfileDbTask(Message msg) {
+ mCompleteMessage = msg;
+ }
+
+ @Override
+ protected void onPostExecute(Void result) {
+ if (mCompleteMessage != null) {
+ mCompleteMessage.sendToTarget();
+ }
+ mAutoFillProfileDb.close();
+ }
+
+ @Override
+ abstract protected Void doInBackground(T... values);
+ }
+
+
+ private class SaveProfileToDbTask extends AutoFillProfileDbTask<AutoFillProfile> {
+ public SaveProfileToDbTask(Message msg) {
+ super(msg);
+ }
+
+ @Override
+ protected Void doInBackground(AutoFillProfile... values) {
+ mAutoFillProfileDb = AutoFillProfileDatabase.getInstance(mContext);
+ assert mAutoFillActiveProfileId != NO_AUTOFILL_PROFILE_SET;
+ AutoFillProfile newProfile = values[0];
+ mAutoFillProfileDb.addOrUpdateProfile(mAutoFillActiveProfileId, newProfile);
+ return null;
+ }
+ }
+
+ private class DeleteProfileFromDbTask extends AutoFillProfileDbTask<Integer> {
+ public DeleteProfileFromDbTask(Message msg) {
+ super(msg);
+ }
+
+ @Override
+ protected Void doInBackground(Integer... values) {
+ mAutoFillProfileDb = AutoFillProfileDatabase.getInstance(mContext);
+ int id = values[0];
+ assert id > 0;
+ mAutoFillProfileDb.dropProfile(id);
+ return null;
+ }
+ }
+}
diff --git a/src/com/android/browser/BaseUi.java b/src/com/android/browser/BaseUi.java
index 71346ae..7530732 100644
--- a/src/com/android/browser/BaseUi.java
+++ b/src/com/android/browser/BaseUi.java
@@ -17,17 +17,20 @@
package com.android.browser;
import com.android.browser.Tab.LockIcon;
-import com.android.browser.UI.DropdownChangeListener;
+import com.android.internal.view.menu.MenuBuilder;
-import android.animation.Animator;
-import android.animation.Animator.AnimatorListener;
import android.animation.ObjectAnimator;
import android.app.Activity;
+import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
+import android.graphics.Color;
+import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
+import android.graphics.drawable.LayerDrawable;
+import android.graphics.drawable.PaintDrawable;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
@@ -75,10 +78,11 @@
private Drawable mSecLockIcon;
private Drawable mMixLockIcon;
+ protected Drawable mGenericFavicon;
private FrameLayout mBrowserFrameLayout;
protected FrameLayout mContentView;
- private FrameLayout mCustomViewContainer;
+ protected FrameLayout mCustomViewContainer;
private View mCustomView;
private WebChromeClient.CustomViewCallback mCustomViewCallback;
@@ -89,7 +93,6 @@
private Toast mStopToast;
- private boolean mTitleShowing;
// the default <video> poster
private Bitmap mDefaultVideoPoster;
@@ -119,7 +122,23 @@
mCustomViewContainer = (FrameLayout) mBrowserFrameLayout
.findViewById(R.id.fullscreen_custom_content);
frameLayout.addView(mBrowserFrameLayout, COVER_SCREEN_PARAMS);
- mTitleShowing = false;
+ setFullscreen(BrowserSettings.getInstance().useFullscreen());
+ mGenericFavicon = res.getDrawable(
+ R.drawable.app_web_browser_sm);
+ }
+
+ @Override
+ public WebView createWebView(boolean privateBrowsing) {
+ // Create a new WebView
+ BrowserWebView w = new BrowserWebView(mActivity, null,
+ android.R.attr.webViewStyle, privateBrowsing);
+ initWebViewSettings(w);
+ return w;
+ }
+
+ @Override
+ public WebView createSubWebView(boolean privateBrowsing) {
+ return createWebView(privateBrowsing);
}
/**
@@ -132,11 +151,15 @@
w.setMapTrackballToArrowKeys(false); // use trackball directly
// Enable the built-in zoom
w.getSettings().setBuiltInZoomControls(true);
+ boolean supportsMultiTouch = mActivity.getPackageManager()
+ .hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH);
+ w.getSettings().setDisplayZoomControls(!supportsMultiTouch);
+ w.setExpandedTileBounds(true); // smoother scrolling
// Add this WebView to the settings observer list and update the
// settings
final BrowserSettings s = BrowserSettings.getInstance();
- s.addObserver(w.getSettings()).update(s, null);
+ s.startManagingSettings(w.getSettings());
}
private void cancelStopToast() {
@@ -167,8 +190,6 @@
public void onConfigurationChanged(Configuration config) {
}
- public abstract void editUrl(boolean clearInput);
-
// key handling
@Override
@@ -215,7 +236,7 @@
@Override
public boolean needsRestoreAllTabs() {
- return false;
+ return true;
}
@Override
@@ -303,8 +324,6 @@
Log.w(LOGTAG, "mContainer is already attached to content in"
+ " attachTabToContentView!");
}
- mainView.setNextFocusUpId(R.id.url_focused);
- mainView.setNextFocusDownId(R.id.url_focused);
mUiController.attachSubWindow(tab);
}
@@ -398,50 +417,73 @@
mContentView.addView(container, COVER_SCREEN_PARAMS);
}
+ protected void refreshWebView() {
+ WebView web = getWebView();
+ if (web != null) {
+ web.invalidate();
+ }
+ }
+
+ public void editUrl(boolean clearInput) {
+ if (mUiController.isInCustomActionMode()) {
+ mUiController.endActionMode();
+ }
+ showTitleBar();
+ getTitleBar().startEditingUrl(clearInput);
+ }
+
boolean canShowTitleBar() {
return !isTitleBarShowing()
&& !isActivityPaused()
&& (getActiveTab() != null)
- && (getActiveTab().getWebView() != null)
+ && (getWebView() != null)
&& !mUiController.isInCustomActionMode();
}
void showTitleBar() {
- mTitleShowing = true;
+ if (canShowTitleBar()) {
+ getTitleBar().show();
+ }
}
protected void hideTitleBar() {
- mTitleShowing = false;
+ if (getTitleBar().isShowing()) {
+ getTitleBar().hide();
+ }
}
protected boolean isTitleBarShowing() {
- return mTitleShowing;
+ return getTitleBar().isShowing();
}
protected abstract TitleBarBase getTitleBar();
protected void setTitleGravity(int gravity) {
- getTitleBar().setTitleGravity(gravity);
- Tab tab = getActiveTab();
- if ((tab != null) && (tab.getWebView() != null)) {
- tab.getWebView().setTitleBarGravity(gravity);
+ WebView web = getWebView();
+ if (web != null) {
+ web.setTitleBarGravity(gravity);
}
}
@Override
- public void showVoiceTitleBar(String title) {
- getTitleBar().setInVoiceMode(true);
+ public void showVoiceTitleBar(String title, List<String> results) {
+ getTitleBar().setInVoiceMode(true, results);
getTitleBar().setDisplayTitle(title);
}
@Override
public void revertVoiceTitleBar(Tab tab) {
- getTitleBar().setInVoiceMode(false);
+ getTitleBar().setInVoiceMode(false, null);
String url = tab.getUrl();
getTitleBar().setDisplayTitle(url);
}
@Override
+ public void registerDropdownChangeListener(DropdownChangeListener d) {
+ getTitleBar().registerDropdownChangeListener(d);
+ }
+
+ @Override
public void showComboView(boolean startWithHistory, Bundle extras) {
if (mComboView != null) {
return;
@@ -455,8 +497,9 @@
FrameLayout wrapper =
(FrameLayout) mContentView.findViewById(R.id.webview_wrapper);
wrapper.setVisibility(View.GONE);
- hideTitleBar();
+ getTitleBar().stopEditingUrl();
dismissIME();
+ hideTitleBar();
if (mActiveTab != null) {
WebView web = mActiveTab.getWebView();
mActiveTab.putInBackground();
@@ -562,7 +605,9 @@
protected void updateNavigationState(Tab tab) {
}
- protected void updateAutoLogin(Tab tab, boolean animate) {}
+ protected void updateAutoLogin(Tab tab, boolean animate) {
+ getTitleBar().updateAutoLogin(tab, animate);
+ }
/**
* Update the lock icon to correspond to our latest state.
@@ -608,11 +653,6 @@
@Override
public void onActionModeFinished(boolean inLoad) {
- if (inLoad) {
- // the titlebar was removed when the CAB was shown
- // if the page is loading, show it again
- showTitleBar();
- }
}
// active tabs page
@@ -721,7 +761,59 @@
warning.show();
}
- @Override
- public void registerDropdownChangeListener(DropdownChangeListener d) {
+ protected void captureTab(final Tab tab) {
+ captureTab(tab,
+ (int) mActivity.getResources()
+ .getDimension(R.dimen.qc_thumb_width),
+ (int) mActivity.getResources()
+ .getDimension(R.dimen.qc_thumb_height));
}
+
+ protected void captureTab(final Tab tab, int width, int height) {
+ if ((tab == null) || (tab.getWebView() == null)) return;
+ Bitmap sshot = Controller.createScreenshot(tab, width, height);
+ tab.setScreenshot(sshot);
+ }
+
+ protected WebView getWebView() {
+ if (mActiveTab != null) {
+ return mActiveTab.getWebView();
+ } else {
+ return null;
+ }
+ }
+
+ protected Menu getMenu() {
+ MenuBuilder menu = new MenuBuilder(mActivity);
+ mActivity.getMenuInflater().inflate(R.menu.browser, menu);
+ return menu;
+ }
+
+ public void setFullscreen(boolean enabled) {
+ if (enabled) {
+ mActivity.getWindow().setFlags(
+ WindowManager.LayoutParams.FLAG_FULLSCREEN,
+ WindowManager.LayoutParams.FLAG_FULLSCREEN);
+ } else {
+ mActivity.getWindow().clearFlags(
+ WindowManager.LayoutParams.FLAG_FULLSCREEN);
+ }
+ }
+
+ protected Drawable getFaviconDrawable(Bitmap icon) {
+ Drawable[] array = new Drawable[3];
+ array[0] = new PaintDrawable(Color.BLACK);
+ PaintDrawable p = new PaintDrawable(Color.WHITE);
+ array[1] = p;
+ if (icon == null) {
+ array[2] = mGenericFavicon;
+ } else {
+ array[2] = new BitmapDrawable(icon);
+ }
+ LayerDrawable d = new LayerDrawable(array);
+ d.setLayerInset(1, 1, 1, 1, 1);
+ d.setLayerInset(2, 2, 2, 2, 2);
+ return d;
+ }
+
}
diff --git a/src/com/android/browser/BookmarkItem.java b/src/com/android/browser/BookmarkItem.java
index 4e60073..e7f37a5 100644
--- a/src/com/android/browser/BookmarkItem.java
+++ b/src/com/android/browser/BookmarkItem.java
@@ -30,6 +30,8 @@
*/
class BookmarkItem extends LinearLayout {
+ final static int MAX_TEXTVIEW_LEN = 80;
+
protected TextView mTextView;
protected TextView mUrlText;
protected ImageView mImageView;
@@ -63,6 +65,16 @@
item.mImageView.setImageDrawable(mImageView.getDrawable());
}
+ public void startMarquee() {
+ mTextView.setSelected(true);
+ mUrlText.setSelected(true);
+ }
+
+ public void stopMarquee() {
+ mTextView.setSelected(false);
+ mUrlText.setSelected(false);
+ }
+
/**
* Return the name assigned to this bookmark item.
*/
@@ -111,8 +123,8 @@
mTitle = name;
- if (name.length() > BrowserSettings.MAX_TEXTVIEW_LEN) {
- name = name.substring(0, BrowserSettings.MAX_TEXTVIEW_LEN);
+ if (name.length() > MAX_TEXTVIEW_LEN) {
+ name = name.substring(0, MAX_TEXTVIEW_LEN);
}
mTextView.setText(name);
@@ -129,8 +141,8 @@
mUrl = url;
- if (url.length() > BrowserSettings.MAX_TEXTVIEW_LEN) {
- url = url.substring(0, BrowserSettings.MAX_TEXTVIEW_LEN);
+ if (url.length() > MAX_TEXTVIEW_LEN) {
+ url = url.substring(0, MAX_TEXTVIEW_LEN);
}
mUrlText.setText(url);
diff --git a/src/com/android/browser/Browser.java b/src/com/android/browser/Browser.java
index f49da5d..65eb0ce 100644
--- a/src/com/android/browser/Browser.java
+++ b/src/com/android/browser/Browser.java
@@ -16,12 +16,9 @@
package com.android.browser;
-import android.os.FileUtils;
-import android.util.Log;
-
import android.app.Application;
import android.content.Intent;
-import android.webkit.CookieManager;
+import android.util.Log;
import android.webkit.CookieSyncManager;
import dalvik.system.VMRuntime;
@@ -52,9 +49,6 @@
public void onCreate() {
super.onCreate();
- // Set the umask so that native code creates files with the correct
- // permissions (0660)
- FileUtils.setUMask(FileUtils.S_IRWXO);
if (LOGV_ENABLED)
Log.v(LOGTAG, "Browser.onCreate: this=" + this);
@@ -63,7 +57,7 @@
TARGET_HEAP_UTILIZATION);
// create CookieSyncManager with current Context
CookieSyncManager.createInstance(this);
- BrowserSettings.getInstance().asyncLoadFromDb(this);
+ BrowserSettings.initialize(getApplicationContext());
}
static Intent createBrowserViewIntent() {
diff --git a/src/com/android/browser/BrowserActivity.java b/src/com/android/browser/BrowserActivity.java
index 3c025d2..c26d850 100644
--- a/src/com/android/browser/BrowserActivity.java
+++ b/src/com/android/browser/BrowserActivity.java
@@ -62,11 +62,6 @@
BrowserSettings settings = BrowserSettings.getInstance();
- // We load the first set of BrowserSettings from the db asynchronously
- // but if it has not completed at this point, we have no choice but
- // to block waiting for them to finish loading. :(
- settings.waitForLoadFromDbToComplete();
-
// render the browser in OpenGL
if (settings.isHardwareAccelerated()) {
// Set the flag in the activity's window
@@ -77,12 +72,6 @@
this.getWindow().setFlags(0, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
}
- // enable this to test the browser in 32bit
- if (false) {
- getWindow().setFormat(PixelFormat.RGBX_8888);
- BitmapFactory.setDefaultConfig(Bitmap.Config.ARGB_8888);
- }
-
// If this was a web search request, pass it on to the default web
// search provider and finish this activity.
if (IntentHandler.handleWebSearchIntent(this, null, getIntent())) {
diff --git a/src/com/android/browser/BrowserBookmarksAdapter.java b/src/com/android/browser/BrowserBookmarksAdapter.java
index 9e71077..201079c 100644
--- a/src/com/android/browser/BrowserBookmarksAdapter.java
+++ b/src/com/android/browser/BrowserBookmarksAdapter.java
@@ -20,7 +20,6 @@
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
-import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -31,7 +30,6 @@
class BrowserBookmarksAdapter extends CursorAdapter {
LayoutInflater mInflater;
int mCurrentView;
- Drawable mFaviconBackground;
/**
* Create a new BrowserBookmarksAdapter.
@@ -42,8 +40,6 @@
super(context, null, 0);
mInflater = LayoutInflater.from(context);
selectView(defaultView);
- float density = context.getResources().getDisplayMetrics().density;
- mFaviconBackground = BookmarkUtils.createListFaviconBackground(context);
}
@Override
@@ -101,9 +97,7 @@
} else {
favicon.setImageBitmap(faviconBitmap);
}
- //favicon.setBackgroundResource(R.drawable.bookmark_list_favicon_bg);
- // TODO: Switch to above instead of below once b/3353813 is fixed
- favicon.setBackgroundDrawable(mFaviconBackground);
+ favicon.setBackgroundResource(R.drawable.bookmark_list_favicon_bg);
}
}
diff --git a/src/com/android/browser/BrowserBookmarksPage.java b/src/com/android/browser/BrowserBookmarksPage.java
index de28d0d..1dc2612 100644
--- a/src/com/android/browser/BrowserBookmarksPage.java
+++ b/src/com/android/browser/BrowserBookmarksPage.java
@@ -223,7 +223,7 @@
copy(getUrl(i.position));
break;
case R.id.homepage_context_menu_id: {
- BrowserSettings.getInstance().setHomePage(activity, getUrl(i.position));
+ BrowserSettings.getInstance().setHomePage(getUrl(i.position));
Toast.makeText(activity, R.string.homepage_set, Toast.LENGTH_LONG).show();
break;
}
@@ -331,10 +331,15 @@
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
- setHasOptionsMenu(true);
+ SharedPreferences prefs = PreferenceManager
+ .getDefaultSharedPreferences(getActivity());
+ prefs.registerOnSharedPreferenceChangeListener(this);
+ mCurrentView = prefs.getInt(PREF_SELECTED_VIEW, getDefaultView());
Bundle args = getArguments();
mDisableNewWindow = args == null ? false : args.getBoolean(EXTRA_DISABLE_WINDOW, false);
+
+ setHasOptionsMenu(true);
}
@Override
@@ -372,11 +377,6 @@
}
// Start the loaders
LoaderManager lm = getLoaderManager();
- SharedPreferences prefs = PreferenceManager
- .getDefaultSharedPreferences(getActivity());
- prefs.registerOnSharedPreferenceChangeListener(this);
- mCurrentView =
- prefs.getInt(PREF_SELECTED_VIEW, getDefaultView());
mAdapter = new BrowserBookmarksAdapter(getActivity(), mCurrentView);
lm.restartLoader(LOADER_BOOKMARKS, null, this);
diff --git a/src/com/android/browser/BrowserHistoryPage.java b/src/com/android/browser/BrowserHistoryPage.java
index 44f358d..e728254 100644
--- a/src/com/android/browser/BrowserHistoryPage.java
+++ b/src/com/android/browser/BrowserHistoryPage.java
@@ -59,6 +59,9 @@
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
+import android.widget.ExpandableListView;
+import android.widget.ExpandableListView.ExpandableListContextMenuInfo;
+import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
@@ -68,7 +71,7 @@
* days of viewing.
*/
public class BrowserHistoryPage extends Fragment
- implements LoaderCallbacks<Cursor> {
+ implements LoaderCallbacks<Cursor>, OnChildClickListener {
static final int LOADER_HISTORY = 1;
static final int LOADER_MOST_VISITED = 2;
@@ -82,6 +85,7 @@
ListView mGroupList, mChildList;
private ViewGroup mPrefsContainer;
private FragmentBreadCrumbs mFragmentBreadCrumbs;
+ private ExpandableListView mHistoryList;
// Implementation of WebIconDatabase.IconListener
class IconReceiver implements IconListener {
@@ -187,7 +191,7 @@
switch (loader.getId()) {
case LOADER_HISTORY: {
mAdapter.changeCursor(data);
- if (!mAdapter.isEmpty()
+ if (!mAdapter.isEmpty() && mGroupList != null
&& mGroupList.getCheckedItemPosition() == ListView.INVALID_POSITION) {
selectGroup(0);
}
@@ -229,26 +233,13 @@
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mRoot = inflater.inflate(R.layout.history, container, false);
- ViewStub stub = (ViewStub) mRoot.findViewById(R.id.pref_stub);
- stub.setLayoutResource(com.android.internal.R.layout.preference_list_content);
- stub.inflate();
- mGroupList = (ListView) mRoot.findViewById(android.R.id.list);
- mPrefsContainer = (ViewGroup) mRoot.findViewById(com.android.internal.R.id.prefs_frame);
- mFragmentBreadCrumbs = (FragmentBreadCrumbs) mRoot.findViewById(android.R.id.title);
- mFragmentBreadCrumbs.setMaxVisible(1);
- mFragmentBreadCrumbs.setActivity(getActivity());
- mPrefsContainer.setVisibility(View.VISIBLE);
mAdapter = new HistoryAdapter(getActivity());
- mGroupList.setAdapter(new HistoryGroupWrapper(mAdapter));
- mGroupList.setOnItemClickListener(mGroupItemClickListener);
- mGroupList.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);
- mChildWrapper = new HistoryChildWrapper(mAdapter);
- mChildList = new ListView(getActivity());
- mChildList.setAdapter(mChildWrapper);
- mChildList.setOnItemClickListener(mChildItemClickListener);
- registerForContextMenu(mChildList);
- ViewGroup prefs = (ViewGroup) mRoot.findViewById(com.android.internal.R.id.prefs);
- prefs.addView(mChildList);
+ ViewStub stub = (ViewStub) mRoot.findViewById(R.id.pref_stub);
+ if (stub != null) {
+ inflateTwoPane(stub);
+ } else {
+ inflateSinglePane();
+ }
// Start the loaders
getLoaderManager().restartLoader(LOADER_HISTORY, null, this);
@@ -259,6 +250,34 @@
return mRoot;
}
+ private void inflateSinglePane() {
+ mHistoryList = (ExpandableListView) mRoot.findViewById(R.id.history);
+ mHistoryList.setAdapter(mAdapter);
+ mHistoryList.setOnChildClickListener(this);
+ registerForContextMenu(mHistoryList);
+ }
+
+ private void inflateTwoPane(ViewStub stub) {
+ stub.setLayoutResource(R.layout.preference_list_content);
+ stub.inflate();
+ mGroupList = (ListView) mRoot.findViewById(android.R.id.list);
+ mPrefsContainer = (ViewGroup) mRoot.findViewById(R.id.prefs_frame);
+ mFragmentBreadCrumbs = (FragmentBreadCrumbs) mRoot.findViewById(android.R.id.title);
+ mFragmentBreadCrumbs.setMaxVisible(1);
+ mFragmentBreadCrumbs.setActivity(getActivity());
+ mPrefsContainer.setVisibility(View.VISIBLE);
+ mGroupList.setAdapter(new HistoryGroupWrapper(mAdapter));
+ mGroupList.setOnItemClickListener(mGroupItemClickListener);
+ mGroupList.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);
+ mChildWrapper = new HistoryChildWrapper(mAdapter);
+ mChildList = new ListView(getActivity());
+ mChildList.setAdapter(mChildWrapper);
+ mChildList.setOnItemClickListener(mChildItemClickListener);
+ registerForContextMenu(mChildList);
+ ViewGroup prefs = (ViewGroup) mRoot.findViewById(R.id.prefs);
+ prefs.addView(mChildList);
+ }
+
private OnItemClickListener mGroupItemClickListener = new OnItemClickListener() {
@Override
public void onItemClick(
@@ -279,6 +298,13 @@
};
@Override
+ public boolean onChildClick(ExpandableListView parent, View view,
+ int groupPosition, int childPosition, long id) {
+ mCallbacks.onUrlSelected(((HistoryItem) view).getUrl(), false);
+ return true;
+ }
+
+ @Override
public void onDestroy() {
super.onDestroy();
CombinedBookmarkHistoryView.getIconListenerSet().removeListener(mIconReceiver);
@@ -341,17 +367,30 @@
}
}
+ View getTargetView(ContextMenuInfo menuInfo) {
+ if (menuInfo instanceof AdapterContextMenuInfo) {
+ return ((AdapterContextMenuInfo) menuInfo).targetView;
+ }
+ if (menuInfo instanceof ExpandableListContextMenuInfo) {
+ return ((ExpandableListContextMenuInfo) menuInfo).targetView;
+ }
+ return null;
+ }
+
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
- AdapterContextMenuInfo i = (AdapterContextMenuInfo) menuInfo;
+
+ View targetView = getTargetView(menuInfo);
+ if (!(targetView instanceof HistoryItem)) {
+ return;
+ }
+ HistoryItem historyItem = (HistoryItem) targetView;
// Inflate the menu
Activity parent = getActivity();
MenuInflater inflater = parent.getMenuInflater();
inflater.inflate(R.menu.historycontext, menu);
- HistoryItem historyItem = (HistoryItem) i.targetView;
-
// Setup the header
if (mContextHeader == null) {
mContextHeader = new HistoryItem(parent, false);
@@ -382,12 +421,11 @@
@Override
public boolean onContextItemSelected(MenuItem item) {
- AdapterContextMenuInfo i =
- (AdapterContextMenuInfo) item.getMenuInfo();
- if (i == null) {
+ ContextMenuInfo menuInfo = item.getMenuInfo();
+ if (menuInfo == null) {
return false;
}
- HistoryItem historyItem = (HistoryItem) i.targetView;
+ HistoryItem historyItem = (HistoryItem) getTargetView(menuInfo);
String url = historyItem.getUrl();
String title = historyItem.getName();
Activity activity = getActivity();
@@ -417,7 +455,7 @@
Browser.deleteFromHistory(activity.getContentResolver(), url);
return true;
case R.id.homepage_context_menu_id:
- BrowserSettings.getInstance().setHomePage(activity, url);
+ BrowserSettings.getInstance().setHomePage(url);
Toast.makeText(activity, R.string.homepage_set, Toast.LENGTH_LONG).show();
return true;
default:
@@ -636,6 +674,7 @@
item.getPaddingRight(),
item.getPaddingBottom());
item.setFaviconBackground(mFaviconBackground);
+ item.startMarquee();
} else {
item = (HistoryItem) convertView;
}
diff --git a/src/com/android/browser/BrowserPreferencesPage.java b/src/com/android/browser/BrowserPreferencesPage.java
index dae838f..8302011 100644
--- a/src/com/android/browser/BrowserPreferencesPage.java
+++ b/src/com/android/browser/BrowserPreferencesPage.java
@@ -21,7 +21,6 @@
import android.app.ActionBar;
import android.os.Bundle;
import android.preference.PreferenceActivity;
-import android.preference.PreferenceManager;
import android.view.MenuItem;
import java.util.List;
@@ -48,7 +47,7 @@
public void onBuildHeaders(List<Header> target) {
loadHeadersFromResource(R.xml.preference_headers, target);
- if (BrowserSettings.DEV_BUILD || BrowserSettings.getInstance().showDebugSettings()) {
+ if (BrowserSettings.getInstance().isDebugEnabled()) {
Header debug = new Header();
debug.title = getText(R.string.pref_development_title);
debug.fragment = DebugPreferencesFragment.class.getName();
@@ -57,16 +56,6 @@
}
@Override
- protected void onPause() {
- super.onPause();
-
- // sync the shared preferences back to BrowserSettings
- BrowserSettings.getInstance().syncSharedPreferences(
- getApplicationContext(),
- PreferenceManager.getDefaultSharedPreferences(this));
- }
-
- @Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
diff --git a/src/com/android/browser/BrowserProvider.java b/src/com/android/browser/BrowserProvider.java
index f69665c..6ebc2c2 100644
--- a/src/com/android/browser/BrowserProvider.java
+++ b/src/com/android/browser/BrowserProvider.java
@@ -40,7 +40,6 @@
import android.preference.PreferenceManager;
import android.provider.Browser;
import android.provider.Browser.BookmarkColumns;
-import android.provider.Settings;
import android.speech.RecognizerResultsIntent;
import android.text.TextUtils;
import android.util.Log;
diff --git a/src/com/android/browser/BrowserSettings.java b/src/com/android/browser/BrowserSettings.java
index 357d1e9..7d64cfc 100644
--- a/src/com/android/browser/BrowserSettings.java
+++ b/src/com/android/browser/BrowserSettings.java
@@ -1,6 +1,5 @@
-
/*
- * Copyright (C) 2007 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.
@@ -25,396 +24,271 @@
import android.content.ContentResolver;
import android.content.Context;
import android.content.SharedPreferences;
-import android.content.SharedPreferences.Editor;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.AsyncTask;
+import android.os.Build;
import android.os.Message;
import android.preference.PreferenceManager;
import android.provider.Browser;
-import android.util.Log;
import android.webkit.CookieManager;
import android.webkit.GeolocationPermissions;
import android.webkit.WebIconDatabase;
import android.webkit.WebSettings;
import android.webkit.WebSettings.AutoFillProfile;
+import android.webkit.WebSettings.LayoutAlgorithm;
+import android.webkit.WebSettings.PluginState;
+import android.webkit.WebSettings.TextSize;
+import android.webkit.WebSettings.ZoomDensity;
import android.webkit.WebStorage;
import android.webkit.WebView;
import android.webkit.WebViewDatabase;
-import java.util.HashMap;
-import java.util.Observable;
+import java.lang.ref.WeakReference;
+import java.util.Iterator;
+import java.util.LinkedList;
-/*
- * Package level class for storing various WebView and Browser settings. To use
- * this class:
- * BrowserSettings s = BrowserSettings.getInstance();
- * s.addObserver(webView.getSettings());
- * s.loadFromDb(context); // Only needed on app startup
- * s.javaScriptEnabled = true;
- * ... // set any other settings
- * s.update(); // this will update all the observers
- *
- * To remove an observer:
- * s.deleteObserver(webView.getSettings());
+/**
+ * Class for managing settings
*/
-public class BrowserSettings extends Observable implements OnSharedPreferenceChangeListener {
- // Private variables for settings
- // NOTE: these defaults need to be kept in sync with the XML
- // until the performance of PreferenceManager.setDefaultValues()
- // is improved.
- // Note: boolean variables are set inside reset function.
- private boolean loadsImagesAutomatically;
- private boolean javaScriptEnabled;
- private WebSettings.PluginState pluginState;
- private boolean javaScriptCanOpenWindowsAutomatically;
- private boolean showSecurityWarnings;
- private boolean rememberPasswords;
- private boolean saveFormData;
- private boolean autoFillEnabled;
- private boolean openInBackground;
- private String defaultTextEncodingName;
- private String homeUrl = "";
- private SearchEngine searchEngine;
- private boolean autoFitPage;
- private boolean loadsPageInOverviewMode;
- private boolean showDebugSettings;
- // HTML5 API flags
- private boolean appCacheEnabled;
- private boolean databaseEnabled;
- private boolean domStorageEnabled;
- private boolean geolocationEnabled;
- private boolean workersEnabled; // only affects V8. JSC does not have a similar setting
- // HTML5 API configuration params
- private long appCacheMaxSize = Long.MAX_VALUE;
- private String appCachePath; // default value set in loadFromDb().
- private String databasePath; // default value set in loadFromDb()
- private String geolocationDatabasePath; // default value set in loadFromDb()
- private WebStorageSizeManager webStorageSizeManager;
+public class BrowserSettings implements OnSharedPreferenceChangeListener,
+ PreferenceKeys {
- private String jsFlags = "";
-
- private final static String TAG = "BrowserSettings";
-
- // Development settings
- public WebSettings.LayoutAlgorithm layoutAlgorithm =
- WebSettings.LayoutAlgorithm.NARROW_COLUMNS;
- private boolean useWideViewPort = true;
- private int userAgent = 0;
- private boolean tracing = false;
- private boolean lightTouch = false;
- private boolean navDump = false;
- private boolean hardwareAccelerated = true;
- private boolean showVisualIndicator = false;
- // Lab settings
- private boolean quickControls = false;
- private boolean useMostVisitedHomepage = false;
- private boolean useInstant = false;
-
- // By default the error console is shown once the user navigates to about:debug.
- // The setting can be then toggled from the settings menu.
- private boolean showConsole = true;
-
- // Private preconfigured values
- private static int minimumFontSize = 1;
- private static int minimumLogicalFontSize = 1;
- private static int defaultFontSize = 16;
- private static int defaultFixedFontSize = 13;
- private static WebSettings.TextSize textSize =
- WebSettings.TextSize.NORMAL;
- private static WebSettings.ZoomDensity zoomDensity =
- WebSettings.ZoomDensity.MEDIUM;
- private static int pageCacheCapacity;
-
-
- private AutoFillProfile autoFillProfile;
- // Default to zero. In the case no profile is set up, the initial
- // value will come from the AutoFillSettingsFragment when the user
- // creates a profile. Otherwise, we'll read the ID of the last used
- // profile from the prefs db.
- private int autoFillActiveProfileId;
- private static final int NO_AUTOFILL_PROFILE_SET = 0;
-
- // Preference keys that are used outside this class
- public final static String PREF_CLEAR_CACHE = "privacy_clear_cache";
- public final static String PREF_CLEAR_COOKIES = "privacy_clear_cookies";
- public final static String PREF_CLEAR_HISTORY = "privacy_clear_history";
- public final static String PREF_HOMEPAGE = "homepage";
- public final static String PREF_SEARCH_ENGINE = "search_engine";
- public final static String PREF_CLEAR_FORM_DATA =
- "privacy_clear_form_data";
- public final static String PREF_CLEAR_PASSWORDS =
- "privacy_clear_passwords";
- public final static String PREF_EXTRAS_RESET_DEFAULTS =
- "reset_default_preferences";
- public final static String PREF_DEBUG_SETTINGS = "debug_menu";
- public final static String PREF_WEBSITE_SETTINGS = "website_settings";
- public final static String PREF_TEXT_SIZE = "text_size";
- public final static String PREF_DEFAULT_ZOOM = "default_zoom";
- public final static String PREF_DEFAULT_TEXT_ENCODING =
- "default_text_encoding";
- public final static String PREF_CLEAR_GEOLOCATION_ACCESS =
- "privacy_clear_geolocation_access";
- public final static String PREF_AUTOFILL_ENABLED = "autofill_enabled";
- public final static String PREF_AUTOFILL_PROFILE = "autofill_profile";
- public final static String PREF_AUTOFILL_ACTIVE_PROFILE_ID = "autofill_active_profile_id";
- public final static String PREF_HARDWARE_ACCEL = "enable_hardware_accel";
- public final static String PREF_VISUAL_INDICATOR = "enable_visual_indicator";
- public final static String PREF_USER_AGENT = "user_agent";
-
- public final static String PREF_QUICK_CONTROLS = "enable_quick_controls";
- public final static String PREF_MOST_VISITED_HOMEPAGE = "use_most_visited_homepage";
- public final static String PREF_PLUGIN_STATE = "plugin_state";
- public final static String PREF_USE_INSTANT = "use_instant_search";
-
- private static final String DESKTOP_USERAGENT = "Mozilla/5.0 (Macintosh; " +
- "U; Intel Mac OS X 10_6_3; en-us) AppleWebKit/533.16 (KHTML, " +
- "like Gecko) Version/5.0 Safari/533.16";
+ // TODO: Do something with this UserAgent stuff
+ private static final String DESKTOP_USERAGENT = "Mozilla/5.0 (X11; " +
+ "Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) " +
+ "Chrome/11.0.696.34 Safari/534.24";
private static final String IPHONE_USERAGENT = "Mozilla/5.0 (iPhone; U; " +
- "CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 " +
- "(KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7";
+ "CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 " +
+ "(KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7";
private static final String IPAD_USERAGENT = "Mozilla/5.0 (iPad; U; " +
- "CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 " +
- "(KHTML, like Gecko) Version/4.0.4 Mobile/7B367 Safari/531.21.10";
+ "CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 " +
+ "(KHTML, like Gecko) Version/4.0.4 Mobile/7B367 Safari/531.21.10";
private static final String FROYO_USERAGENT = "Mozilla/5.0 (Linux; U; " +
- "Android 2.2; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 " +
- "(KHTML, like Gecko) Version/4.0 Mobile Safari/533.1";
+ "Android 2.2; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 " +
+ "(KHTML, like Gecko) Version/4.0 Mobile Safari/533.1";
- // Value to truncate strings when adding them to a TextView within
- // a ListView
- public final static int MAX_TEXTVIEW_LEN = 80;
+ private static final String HONEYCOMB_USERAGENT = "Mozilla/5.0 (Linux; U; " +
+ "Android 3.1; en-us; Xoom Build/HMJ25) AppleWebKit/534.13 " +
+ "(KHTML, like Gecko) Version/4.0 Safari/534.13";
- public static final String RLZ_PROVIDER = "com.google.android.partnersetup.rlzappprovider";
+ private static final String USER_AGENTS[] = { null,
+ DESKTOP_USERAGENT,
+ IPHONE_USERAGENT,
+ IPAD_USERAGENT,
+ FROYO_USERAGENT,
+ HONEYCOMB_USERAGENT,
+ };
- public static final Uri RLZ_PROVIDER_URI = Uri.parse("content://" + RLZ_PROVIDER + "/");
+ private static BrowserSettings sInstance;
- // Set to true to enable some of the about:debug options
- public static final boolean DEV_BUILD = false;
-
+ private Context mContext;
+ private SharedPreferences mPrefs;
+ private LinkedList<WeakReference<WebSettings>> mManagedSettings;
private Controller mController;
+ private WebStorageSizeManager mWebStorageSizeManager;
+ private AutofillHandler mAutofillHandler;
- // Single instance of the BrowserSettings for use in the Browser app.
- private static BrowserSettings sSingleton;
+ // Cached settings
+ private SearchEngine mSearchEngine;
- // Private map of WebSettings to Observer objects used when deleting an
- // observer.
- private HashMap<WebSettings,Observer> mWebSettingsToObservers =
- new HashMap<WebSettings,Observer>();
+ public static void initialize(final Context context) {
+ sInstance = new BrowserSettings(context);
+ }
- private boolean mLoadFromDbComplete;
+ public static BrowserSettings getInstance() {
+ return sInstance;
+ }
- public void waitForLoadFromDbToComplete() {
- synchronized (sSingleton) {
- while (!mLoadFromDbComplete) {
- try {
- sSingleton.wait();
- } catch (InterruptedException e) { }
- }
+ private BrowserSettings(Context context) {
+ mContext = context;
+ mPrefs = PreferenceManager.getDefaultSharedPreferences(mContext);
+ if (Build.VERSION.CODENAME.equals("REL")) {
+ // This is a release build, always startup with debug disabled
+ setDebugEnabled(false);
+ }
+ mAutofillHandler = new AutofillHandler(mContext);
+ mManagedSettings = new LinkedList<WeakReference<WebSettings>>();
+ mWebStorageSizeManager = new WebStorageSizeManager(mContext,
+ new WebStorageSizeManager.StatFsDiskInfo(getAppCachePath()),
+ new WebStorageSizeManager.WebKitAppCacheInfo(getAppCachePath()));
+ mPrefs.registerOnSharedPreferenceChangeListener(this);
+ mAutofillHandler.asyncLoadFromDb();
+ }
+
+ public void setController(Controller controller) {
+ mController = controller;
+ syncSharedSettings();
+
+ if (mController != null && (mSearchEngine instanceof InstantSearchEngine)) {
+ ((InstantSearchEngine) mSearchEngine).setController(mController);
}
}
- /*
- * An observer wrapper for updating a WebSettings object with the new
- * settings after a call to BrowserSettings.update().
- */
- static class Observer implements java.util.Observer {
- // Private WebSettings object that will be updated.
- private WebSettings mSettings;
-
- Observer(WebSettings w) {
- mSettings = w;
- }
-
- public void update(Observable o, Object arg) {
- BrowserSettings b = (BrowserSettings)o;
- WebSettings s = mSettings;
-
- s.setLayoutAlgorithm(b.layoutAlgorithm);
- if (b.userAgent == 0) {
- // use the default ua string
- s.setUserAgentString(null);
- } else if (b.userAgent == 1) {
- s.setUserAgentString(DESKTOP_USERAGENT);
- } else if (b.userAgent == 2) {
- s.setUserAgentString(IPHONE_USERAGENT);
- } else if (b.userAgent == 3) {
- s.setUserAgentString(IPAD_USERAGENT);
- } else if (b.userAgent == 4) {
- s.setUserAgentString(FROYO_USERAGENT);
- }
- s.setUseWideViewPort(b.useWideViewPort);
- s.setLoadsImagesAutomatically(b.loadsImagesAutomatically);
- s.setJavaScriptEnabled(b.javaScriptEnabled);
- s.setShowVisualIndicator(b.showVisualIndicator);
- s.setPluginState(b.pluginState);
- s.setJavaScriptCanOpenWindowsAutomatically(
- b.javaScriptCanOpenWindowsAutomatically);
- s.setDefaultTextEncodingName(b.defaultTextEncodingName);
- s.setMinimumFontSize(b.minimumFontSize);
- s.setMinimumLogicalFontSize(b.minimumLogicalFontSize);
- s.setDefaultFontSize(b.defaultFontSize);
- s.setDefaultFixedFontSize(b.defaultFixedFontSize);
- s.setNavDump(b.navDump);
- s.setTextSize(b.textSize);
- s.setDefaultZoom(b.zoomDensity);
- s.setLightTouchEnabled(b.lightTouch);
- s.setSaveFormData(b.saveFormData);
- s.setAutoFillEnabled(b.autoFillEnabled);
- s.setSavePassword(b.rememberPasswords);
- s.setLoadWithOverviewMode(b.loadsPageInOverviewMode);
- s.setPageCacheCapacity(pageCacheCapacity);
-
- // WebView inside Browser doesn't want initial focus to be set.
- s.setNeedInitialFocus(false);
- // Browser supports multiple windows
- s.setSupportMultipleWindows(true);
- // enable smooth transition for better performance during panning or
- // zooming
- s.setEnableSmoothTransition(true);
- // disable content url access
- s.setAllowContentAccess(false);
-
- // HTML5 API flags
- s.setAppCacheEnabled(b.appCacheEnabled);
- s.setDatabaseEnabled(b.databaseEnabled);
- s.setDomStorageEnabled(b.domStorageEnabled);
- s.setWorkersEnabled(b.workersEnabled); // This only affects V8.
- s.setGeolocationEnabled(b.geolocationEnabled);
-
- // HTML5 configuration parameters.
- s.setAppCacheMaxSize(b.appCacheMaxSize);
- s.setAppCachePath(b.appCachePath);
- s.setDatabasePath(b.databasePath);
- s.setGeolocationDatabasePath(b.geolocationDatabasePath);
-
- // Active AutoFill profile data.
- s.setAutoFillProfile(b.autoFillProfile);
-
- b.updateTabControlSettings();
+ public void startManagingSettings(WebSettings settings) {
+ synchronized (mManagedSettings) {
+ syncStaticSettings(settings);
+ syncSetting(settings);
+ mManagedSettings.add(new WeakReference<WebSettings>(settings));
}
}
/**
- * Load settings from the browser app's database. It is performed in
- * an AsyncTask as it involves plenty of slow disk IO.
- * NOTE: Strings used for the preferences must match those specified
- * in the various preference XML files.
- * @param ctx A Context object used to query the browser's settings
- * database. If the database exists, the saved settings will be
- * stored in this BrowserSettings object. This will update all
- * observers of this object.
+ * Syncs all the settings that have a Preference UI
*/
- public void asyncLoadFromDb(final Context ctx) {
- mLoadFromDbComplete = false;
- // Run the initial settings load in an AsyncTask as it hits the
- // disk multiple times through SharedPreferences and SQLite. We
- // need to be certain though that this has completed before we start
- // to load pages though, so in the worst case we will block waiting
- // for it to finish in BrowserActivity.onCreate().
- new LoadFromDbTask(ctx).execute();
+ private void syncSetting(WebSettings settings) {
+ settings.setGeolocationEnabled(enableGeolocation());
+ settings.setJavaScriptEnabled(enableJavascript());
+ settings.setLightTouchEnabled(enableLightTouch());
+ settings.setNavDump(enableNavDump());
+ settings.setShowVisualIndicator(enableVisualIndicator());
+ settings.setDefaultTextEncodingName(getDefaultTextEncoding());
+ settings.setDefaultZoom(getDefaultZoom());
+ settings.setMinimumFontSize(getMinimumFontSize());
+ settings.setMinimumLogicalFontSize(getMinimumFontSize());
+ settings.setForceUserScalable(forceEnableUserScalable());
+ settings.setPluginState(getPluginState());
+ settings.setTextSize(getTextSize());
+ settings.setUserAgentString(USER_AGENTS[getUserAgent()]);
+ settings.setAutoFillEnabled(isAutofillEnabled());
+ settings.setLayoutAlgorithm(getLayoutAlgorithm());
+ settings.setJavaScriptCanOpenWindowsAutomatically(blockPopupWindows());
+ settings.setLoadsImagesAutomatically(loadImages());
+ settings.setLoadWithOverviewMode(loadPageInOverviewMode());
+ settings.setSavePassword(rememberPasswords());
+ settings.setSaveFormData(saveFormdata());
+ settings.setUseWideViewPort(isWideViewport());
+ settings.setAutoFillProfile(getAutoFillProfile());
}
- private class LoadFromDbTask extends AsyncTask<Void, Void, Void> {
- private Context mContext;
+ /**
+ * Syncs all the settings that have no UI
+ * These cannot change, so we only need to set them once per WebSettings
+ */
+ private void syncStaticSettings(WebSettings settings) {
+ settings.setDefaultFontSize(16);
+ settings.setDefaultFixedFontSize(13);
+ settings.setPageCacheCapacity(getPageCacheCapacity());
- public LoadFromDbTask(Context context) {
- mContext = context;
+ // WebView inside Browser doesn't want initial focus to be set.
+ settings.setNeedInitialFocus(false);
+ // Browser supports multiple windows
+ settings.setSupportMultipleWindows(true);
+ // enable smooth transition for better performance during panning or
+ // zooming
+ settings.setEnableSmoothTransition(true);
+ // disable content url access
+ settings.setAllowContentAccess(false);
+
+ // HTML5 API flags
+ settings.setAppCacheEnabled(true);
+ settings.setDatabaseEnabled(true);
+ settings.setDomStorageEnabled(true);
+ settings.setWorkersEnabled(true); // This only affects V8.
+
+ // HTML5 configuration parametersettings.
+ settings.setAppCacheMaxSize(mWebStorageSizeManager.getAppCacheMaxSize());
+ settings.setAppCachePath(getAppCachePath());
+ settings.setDatabasePath(mContext.getDir("databases", 0).getPath());
+ settings.setGeolocationDatabasePath(mContext.getDir("geolocation", 0).getPath());
+ }
+
+ private void syncSharedSettings() {
+ CookieManager.getInstance().setAcceptCookie(acceptCookies());
+ if (mController != null) {
+ mController.setShouldShowErrorConsole(enableJavascriptConsole());
}
+ }
- protected Void doInBackground(Void... unused) {
- SharedPreferences p =
- PreferenceManager.getDefaultSharedPreferences(mContext);
- // Set the default value for the Application Caches path.
- appCachePath = mContext.getDir("appcache", 0).getPath();
- // Determine the maximum size of the application cache.
- webStorageSizeManager = new WebStorageSizeManager(
- mContext,
- new WebStorageSizeManager.StatFsDiskInfo(appCachePath),
- new WebStorageSizeManager.WebKitAppCacheInfo(appCachePath));
- appCacheMaxSize = webStorageSizeManager.getAppCacheMaxSize();
- // Set the default value for the Database path.
- databasePath = mContext.getDir("databases", 0).getPath();
- // Set the default value for the Geolocation database path.
- geolocationDatabasePath = mContext.getDir("geolocation", 0).getPath();
-
- if (p.getString(PREF_HOMEPAGE, null) == null) {
- // No home page preferences is set, set it to default.
- setHomePage(mContext, getFactoryResetHomeUrl(mContext));
+ private void syncManagedSettings() {
+ syncSharedSettings();
+ synchronized (mManagedSettings) {
+ Iterator<WeakReference<WebSettings>> iter = mManagedSettings.iterator();
+ while (iter.hasNext()) {
+ WeakReference<WebSettings> ref = iter.next();
+ WebSettings settings = ref.get();
+ if (settings == null) {
+ iter.remove();
+ continue;
+ }
+ syncSetting(settings);
}
+ }
+ }
- // the cost of one cached page is ~3M (measured using nytimes.com). For
- // low end devices, we only cache one page. For high end devices, we try
- // to cache more pages, currently choose 5.
- ActivityManager am = (ActivityManager) mContext
- .getSystemService(Context.ACTIVITY_SERVICE);
- if (am.getMemoryClass() > 16) {
- pageCacheCapacity = 5;
+ @Override
+ public void onSharedPreferenceChanged(
+ SharedPreferences sharedPreferences, String key) {
+ syncManagedSettings();
+ if (PREF_SEARCH_ENGINE.equals(key)) {
+ updateSearchEngine(false);
+ }
+ if (PREF_USE_INSTANT_SEARCH.equals(key)) {
+ updateSearchEngine(true);
+ }
+ if (PREF_FULLSCREEN.equals(key)) {
+ if (mController.getUi() != null) {
+ mController.getUi().setFullscreen(useFullscreen());
+ }
+ }
+ }
+
+ static String getFactoryResetHomeUrl(Context context) {
+ String url = context.getResources().getString(R.string.homepage_base);
+ if (url.indexOf("{CID}") != -1) {
+ url = url.replace("{CID}",
+ BrowserProvider.getClientId(context.getContentResolver()));
+ }
+ return url;
+ }
+
+ public LayoutAlgorithm getLayoutAlgorithm() {
+ LayoutAlgorithm layoutAlgorithm = LayoutAlgorithm.NORMAL;
+ if (autofitPages()) {
+ layoutAlgorithm = LayoutAlgorithm.NARROW_COLUMNS;
+ }
+ if (isDebugEnabled()) {
+ if (isSmallScreen()) {
+ layoutAlgorithm = LayoutAlgorithm.SINGLE_COLUMN;
} else {
- pageCacheCapacity = 1;
+ if (isNormalLayout()) {
+ layoutAlgorithm = LayoutAlgorithm.NORMAL;
+ } else {
+ layoutAlgorithm = LayoutAlgorithm.NARROW_COLUMNS;
+ }
}
+ }
+ return layoutAlgorithm;
+ }
- // Read the last active AutoFill profile id.
- autoFillActiveProfileId = p.getInt(
- PREF_AUTOFILL_ACTIVE_PROFILE_ID, autoFillActiveProfileId);
-
- // Load the autofill profile data from the database. We use a database separate
- // to the browser preference DB to make it easier to support multiple profiles
- // and switching between them.
- AutoFillProfileDatabase autoFillDb = AutoFillProfileDatabase.getInstance(mContext);
- Cursor c = autoFillDb.getProfile(autoFillActiveProfileId);
-
- if (c.getCount() > 0) {
- c.moveToFirst();
-
- String fullName = c.getString(c.getColumnIndex(
- AutoFillProfileDatabase.Profiles.FULL_NAME));
- String email = c.getString(c.getColumnIndex(
- AutoFillProfileDatabase.Profiles.EMAIL_ADDRESS));
- String company = c.getString(c.getColumnIndex(
- AutoFillProfileDatabase.Profiles.COMPANY_NAME));
- String addressLine1 = c.getString(c.getColumnIndex(
- AutoFillProfileDatabase.Profiles.ADDRESS_LINE_1));
- String addressLine2 = c.getString(c.getColumnIndex(
- AutoFillProfileDatabase.Profiles.ADDRESS_LINE_2));
- String city = c.getString(c.getColumnIndex(
- AutoFillProfileDatabase.Profiles.CITY));
- String state = c.getString(c.getColumnIndex(
- AutoFillProfileDatabase.Profiles.STATE));
- String zip = c.getString(c.getColumnIndex(
- AutoFillProfileDatabase.Profiles.ZIP_CODE));
- String country = c.getString(c.getColumnIndex(
- AutoFillProfileDatabase.Profiles.COUNTRY));
- String phone = c.getString(c.getColumnIndex(
- AutoFillProfileDatabase.Profiles.PHONE_NUMBER));
- autoFillProfile = new AutoFillProfile(autoFillActiveProfileId,
- fullName, email, company, addressLine1, addressLine2, city,
- state, zip, country, phone);
- }
- c.close();
- autoFillDb.close();
-
- // PreferenceManager.setDefaultValues is TOO SLOW, need to manually keep
- // the defaults in sync
- p.registerOnSharedPreferenceChangeListener(BrowserSettings.this);
- syncSharedPreferences(mContext, p);
-
- synchronized (sSingleton) {
- mLoadFromDbComplete = true;
- sSingleton.notify();
- }
- return null;
+ // TODO: Cache
+ public int getPageCacheCapacity() {
+ // the cost of one cached page is ~3M (measured using nytimes.com). For
+ // low end devices, we only cache one page. For high end devices, we try
+ // to cache more pages, currently choose 5.
+ if (ActivityManager.staticGetMemoryClass() > 16) {
+ return 5;
+ } else {
+ return 1;
}
}
- private void updateSearchEngine(Context ctx, String searchEngineName, boolean force) {
- if (force || searchEngine == null ||
- !searchEngine.getName().equals(searchEngineName)) {
- if (searchEngine != null) {
- if (searchEngine.supportsVoiceSearch()) {
+ public WebStorageSizeManager getWebStorageSizeManager() {
+ return mWebStorageSizeManager;
+ }
+
+ // TODO: Cache
+ private String getAppCachePath() {
+ return mContext.getDir("appcache", 0).getPath();
+ }
+
+ private void updateSearchEngine(boolean force) {
+ String searchEngineName = getSearchEngineName();
+ if (force || mSearchEngine == null ||
+ !mSearchEngine.getName().equals(searchEngineName)) {
+ if (mSearchEngine != null) {
+ if (mSearchEngine.supportsVoiceSearch()) {
// One or more tabs could have been in voice search mode.
// Clear it, since the new SearchEngine may not support
// it, or may handle it differently.
@@ -422,302 +296,32 @@
mController.getTabControl().getTab(i).revertVoiceSearchMode();
}
}
- searchEngine.close();
+ mSearchEngine.close();
}
- searchEngine = SearchEngines.get(ctx, searchEngineName);
+ mSearchEngine = SearchEngines.get(mContext, searchEngineName);
- if (mController != null && (searchEngine instanceof InstantSearchEngine)) {
- ((InstantSearchEngine) searchEngine).setController(mController);
+ if (mController != null && (mSearchEngine instanceof InstantSearchEngine)) {
+ ((InstantSearchEngine) mSearchEngine).setController(mController);
}
}
}
- /* package */ void syncSharedPreferences(Context ctx, SharedPreferences p) {
-
- homeUrl =
- p.getString(PREF_HOMEPAGE, homeUrl);
-
- useInstant = p.getBoolean(PREF_USE_INSTANT, useInstant);
- String searchEngineName = p.getString(PREF_SEARCH_ENGINE,
- SearchEngine.GOOGLE);
- updateSearchEngine(ctx, searchEngineName, false);
-
- loadsImagesAutomatically = p.getBoolean("load_images",
- loadsImagesAutomatically);
- javaScriptEnabled = p.getBoolean("enable_javascript",
- javaScriptEnabled);
- pluginState = WebSettings.PluginState.valueOf(
- p.getString(PREF_PLUGIN_STATE, pluginState.name()));
- javaScriptCanOpenWindowsAutomatically = !p.getBoolean(
- "block_popup_windows",
- !javaScriptCanOpenWindowsAutomatically);
- showSecurityWarnings = p.getBoolean("show_security_warnings",
- showSecurityWarnings);
- rememberPasswords = p.getBoolean("remember_passwords",
- rememberPasswords);
- saveFormData = p.getBoolean("save_formdata",
- saveFormData);
- autoFillEnabled = p.getBoolean("autofill_enabled", autoFillEnabled);
- boolean accept_cookies = p.getBoolean("accept_cookies",
- CookieManager.getInstance().acceptCookie());
- CookieManager.getInstance().setAcceptCookie(accept_cookies);
- openInBackground = p.getBoolean("open_in_background", openInBackground);
- textSize = WebSettings.TextSize.valueOf(
- p.getString(PREF_TEXT_SIZE, textSize.name()));
- zoomDensity = WebSettings.ZoomDensity.valueOf(
- p.getString(PREF_DEFAULT_ZOOM, zoomDensity.name()));
- autoFitPage = p.getBoolean("autofit_pages", autoFitPage);
- loadsPageInOverviewMode = p.getBoolean("load_page",
- loadsPageInOverviewMode);
- useWideViewPort = true; // use wide view port for either setting
- if (autoFitPage) {
- layoutAlgorithm = WebSettings.LayoutAlgorithm.NARROW_COLUMNS;
- } else {
- layoutAlgorithm = WebSettings.LayoutAlgorithm.NORMAL;
- }
- defaultTextEncodingName =
- p.getString(PREF_DEFAULT_TEXT_ENCODING,
- defaultTextEncodingName);
-
- showDebugSettings =
- p.getBoolean(PREF_DEBUG_SETTINGS, showDebugSettings);
- // Debug menu items have precidence if the menu is visible
- if (showDebugSettings) {
- boolean small_screen = p.getBoolean("small_screen",
- layoutAlgorithm ==
- WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
- if (small_screen) {
- layoutAlgorithm = WebSettings.LayoutAlgorithm.SINGLE_COLUMN;
- } else {
- boolean normal_layout = p.getBoolean("normal_layout",
- layoutAlgorithm == WebSettings.LayoutAlgorithm.NORMAL);
- if (normal_layout) {
- layoutAlgorithm = WebSettings.LayoutAlgorithm.NORMAL;
- } else {
- layoutAlgorithm =
- WebSettings.LayoutAlgorithm.NARROW_COLUMNS;
- }
- }
- useWideViewPort = p.getBoolean("wide_viewport", useWideViewPort);
- tracing = p.getBoolean("enable_tracing", tracing);
- lightTouch = p.getBoolean("enable_light_touch", lightTouch);
- navDump = p.getBoolean("enable_nav_dump", navDump);
- showVisualIndicator = p.getBoolean(PREF_VISUAL_INDICATOR, showVisualIndicator);
- }
-
- quickControls = p.getBoolean(PREF_QUICK_CONTROLS, quickControls);
- useMostVisitedHomepage = p.getBoolean(PREF_MOST_VISITED_HOMEPAGE, useMostVisitedHomepage);
-
- // Only set these if this is a dev build or debug is enabled
- if (DEV_BUILD || showDebugSettings()) {
- userAgent = Integer.parseInt(p.getString(PREF_USER_AGENT, "0"));
- hardwareAccelerated = p.getBoolean(PREF_HARDWARE_ACCEL, hardwareAccelerated);
- }
-
- // JS flags is loaded from DB even if showDebugSettings is false,
- // so that it can be set once and be effective all the time.
- jsFlags = p.getString("js_engine_flags", "");
-
- // Read the setting for showing/hiding the JS Console always so that should the
- // user enable debug settings, we already know if we should show the console.
- // The user will never see the console unless they navigate to about:debug,
- // regardless of the setting we read here. This setting is only used after debug
- // is enabled.
- showConsole = p.getBoolean("javascript_console", showConsole);
-
- // HTML5 API flags
- appCacheEnabled = p.getBoolean("enable_appcache", appCacheEnabled);
- databaseEnabled = p.getBoolean("enable_database", databaseEnabled);
- domStorageEnabled = p.getBoolean("enable_domstorage", domStorageEnabled);
- geolocationEnabled = p.getBoolean("enable_geolocation", geolocationEnabled);
- workersEnabled = p.getBoolean("enable_workers", workersEnabled);
-
- update();
- }
-
- public String getHomePage() {
- if (useMostVisitedHomepage) {
- return HomeProvider.MOST_VISITED;
- }
- return homeUrl;
- }
-
public SearchEngine getSearchEngine() {
- return searchEngine;
- }
-
- public String getJsFlags() {
- return jsFlags;
- }
-
- public WebStorageSizeManager getWebStorageSizeManager() {
- return webStorageSizeManager;
- }
-
- public void setHomePage(Context context, String url) {
- Editor ed = PreferenceManager.
- getDefaultSharedPreferences(context).edit();
- ed.putString(PREF_HOMEPAGE, url);
- ed.apply();
- homeUrl = url;
- }
-
- public WebSettings.TextSize getTextSize() {
- return textSize;
- }
-
- public WebSettings.ZoomDensity getDefaultZoom() {
- return zoomDensity;
- }
-
- public boolean openInBackground() {
- return openInBackground;
- }
-
- public boolean showSecurityWarnings() {
- return showSecurityWarnings;
- }
-
- public boolean isTracing() {
- return tracing;
- }
-
- public boolean isLightTouch() {
- return lightTouch;
- }
-
- public boolean isNavDump() {
- return navDump;
- }
-
- public boolean isHardwareAccelerated() {
- return hardwareAccelerated;
- }
-
- public boolean showVisualIndicator() {
- return showVisualIndicator;
- }
-
- public boolean useQuickControls() {
- return quickControls;
- }
-
- public boolean useMostVisitedHomepage() {
- return useMostVisitedHomepage;
- }
-
- public boolean useInstant() {
- return useInstant;
- }
-
- public boolean showDebugSettings() {
- return showDebugSettings;
- }
-
- public void toggleDebugSettings(Context context) {
- showDebugSettings = !showDebugSettings;
- navDump = showDebugSettings;
- syncSharedPreferences(context,
- PreferenceManager.getDefaultSharedPreferences(context));
- update();
- }
-
- public void setAutoFillProfile(Context ctx, AutoFillProfile profile, Message msg) {
- if (profile != null) {
- setActiveAutoFillProfileId(ctx, profile.getUniqueId());
- // Update the AutoFill DB with the new profile.
- new SaveProfileToDbTask(ctx, msg).execute(profile);
- } else {
- // Delete the current profile.
- if (autoFillProfile != null) {
- new DeleteProfileFromDbTask(ctx, msg).execute(autoFillProfile.getUniqueId());
- setActiveAutoFillProfileId(ctx, NO_AUTOFILL_PROFILE_SET);
- }
+ if (mSearchEngine == null) {
+ updateSearchEngine(false);
}
- autoFillProfile = profile;
+ return mSearchEngine;
}
- public AutoFillProfile getAutoFillProfile() {
- return autoFillProfile;
+ public boolean isDebugEnabled() {
+ return mPrefs.getBoolean(PREF_DEBUG_MENU, false);
}
- private void setActiveAutoFillProfileId(Context context, int activeProfileId) {
- autoFillActiveProfileId = activeProfileId;
- Editor ed = PreferenceManager.
- getDefaultSharedPreferences(context).edit();
- ed.putInt(PREF_AUTOFILL_ACTIVE_PROFILE_ID, activeProfileId);
- ed.apply();
+ public void setDebugEnabled(boolean value) {
+ mPrefs.edit().putBoolean(PREF_DEBUG_MENU, value).apply();
}
- /* package */ void disableAutoFill(Context ctx) {
- autoFillEnabled = false;
- Editor ed = PreferenceManager.getDefaultSharedPreferences(ctx).edit();
- ed.putBoolean(PREF_AUTOFILL_ENABLED, false);
- ed.apply();
- }
-
- /**
- * Add a WebSettings object to the list of observers that will be updated
- * when update() is called.
- *
- * @param s A WebSettings object that is strictly tied to the life of a
- * WebView.
- */
- public Observer addObserver(WebSettings s) {
- Observer old = mWebSettingsToObservers.get(s);
- if (old != null) {
- super.deleteObserver(old);
- }
- Observer o = new Observer(s);
- mWebSettingsToObservers.put(s, o);
- super.addObserver(o);
- return o;
- }
-
- /**
- * Delete the given WebSettings observer from the list of observers.
- * @param s The WebSettings object to be deleted.
- */
- public void deleteObserver(WebSettings s) {
- Observer o = mWebSettingsToObservers.get(s);
- if (o != null) {
- mWebSettingsToObservers.remove(s);
- super.deleteObserver(o);
- }
- }
-
- /*
- * Application level method for obtaining a single app instance of the
- * BrowserSettings.
- */
- public static BrowserSettings getInstance() {
- if (sSingleton == null ) {
- sSingleton = new BrowserSettings();
- }
- return sSingleton;
- }
-
- /*
- * Package level method for associating the BrowserSettings with TabControl
- */
- /* package */void setController(Controller ctrl) {
- mController = ctrl;
- updateTabControlSettings();
-
- if (mController != null && (searchEngine instanceof InstantSearchEngine)) {
- ((InstantSearchEngine) searchEngine).setController(mController);
- }
- }
-
- /*
- * Update all the observers of the object.
- */
- /*package*/ void update() {
- setChanged();
- notifyObservers();
- }
-
- /*package*/ void clearCache(Context context) {
+ public void clearCache() {
WebIconDatabase.getInstance().removeAllIcons();
if (mController != null) {
WebView current = mController.getCurrentWebView();
@@ -727,18 +331,18 @@
}
}
- /*package*/ void clearCookies(Context context) {
+ public void clearCookies() {
CookieManager.getInstance().removeAllCookie();
}
- /* package */void clearHistory(Context context) {
- ContentResolver resolver = context.getContentResolver();
+ public void clearHistory() {
+ ContentResolver resolver = mContext.getContentResolver();
Browser.clearHistory(resolver);
Browser.clearSearches(resolver);
}
- /* package */ void clearFormData(Context context) {
- WebViewDatabase.getInstance(context).clearFormData();
+ public void clearFormData() {
+ WebViewDatabase.getInstance(mContext).clearFormData();
if (mController!= null) {
WebView currentTopView = mController.getCurrentTopWebView();
if (currentTopView != null) {
@@ -747,149 +351,255 @@
}
}
- /*package*/ void clearPasswords(Context context) {
- WebViewDatabase db = WebViewDatabase.getInstance(context);
+ public void clearPasswords() {
+ WebViewDatabase db = WebViewDatabase.getInstance(mContext);
db.clearUsernamePassword();
db.clearHttpAuthUsernamePassword();
}
- private void updateTabControlSettings() {
- // Enable/disable the error console.
- mController.setShouldShowErrorConsole(
- showDebugSettings && showConsole);
- }
-
- /*package*/ void clearDatabases(Context context) {
+ public void clearDatabases() {
WebStorage.getInstance().deleteAllData();
}
- /*package*/ void clearLocationAccess(Context context) {
+ public void clearLocationAccess() {
GeolocationPermissions.getInstance().clearAll();
}
- /*package*/ void resetDefaultPreferences(Context ctx) {
- reset();
- SharedPreferences p = PreferenceManager.getDefaultSharedPreferences(ctx);
- p.edit().clear().apply();
- PreferenceManager.setDefaultValues(ctx, R.xml.general_preferences, true);
- PreferenceManager.setDefaultValues(ctx, R.xml.privacy_security_preferences, true);
- PreferenceManager.setDefaultValues(ctx, R.xml.advanced_preferences, true);
- // reset homeUrl
- setHomePage(ctx, getFactoryResetHomeUrl(ctx));
- // reset appcache max size
- appCacheMaxSize = webStorageSizeManager.getAppCacheMaxSize();
- setActiveAutoFillProfileId(ctx, NO_AUTOFILL_PROFILE_SET);
+ public void resetDefaultPreferences() {
+ mPrefs.edit().clear().apply();
+ syncManagedSettings();
}
- /*package*/ static String getFactoryResetHomeUrl(Context context) {
- String url = context.getResources().getString(R.string.homepage_base);
- if (url.indexOf("{CID}") != -1) {
- url = url.replace("{CID}",
- BrowserProvider.getClientId(context.getContentResolver()));
- }
- return url;
+ public AutoFillProfile getAutoFillProfile() {
+ mAutofillHandler.waitForLoad();
+ return mAutofillHandler.getAutoFillProfile();
}
- // Private constructor that does nothing.
- private BrowserSettings() {
- reset();
+ public void setAutoFillProfile(AutoFillProfile profile, Message msg) {
+ mAutofillHandler.waitForLoad();
+ mAutofillHandler.setAutoFillProfile(profile, msg);
}
- private void reset() {
- // Private variables for settings
- // NOTE: these defaults need to be kept in sync with the XML
- // until the performance of PreferenceManager.setDefaultValues()
- // is improved.
- loadsImagesAutomatically = true;
- javaScriptEnabled = true;
- pluginState = WebSettings.PluginState.ON;
- javaScriptCanOpenWindowsAutomatically = false;
- showSecurityWarnings = true;
- rememberPasswords = true;
- saveFormData = true;
- autoFillEnabled = true;
- openInBackground = false;
- autoFitPage = true;
- loadsPageInOverviewMode = true;
- showDebugSettings = false;
- // HTML5 API flags
- appCacheEnabled = true;
- databaseEnabled = true;
- domStorageEnabled = true;
- geolocationEnabled = true;
- workersEnabled = true; // only affects V8. JSC does not have a similar setting
+ public void toggleDebugSettings() {
+ setDebugEnabled(!isDebugEnabled());
}
- private abstract class AutoFillProfileDbTask<T> extends AsyncTask<T, Void, Void> {
- Context mContext;
- AutoFillProfileDatabase mAutoFillProfileDb;
- Message mCompleteMessage;
+ // -----------------------------
+ // getter/setters for accessibility_preferences.xml
+ // -----------------------------
- public AutoFillProfileDbTask(Context ctx, Message msg) {
- mContext = ctx;
- mCompleteMessage = msg;
- }
-
- protected void onPostExecute(Void result) {
- if (mCompleteMessage != null) {
- mCompleteMessage.sendToTarget();
- }
- mAutoFillProfileDb.close();
- }
-
- abstract protected Void doInBackground(T... values);
+ // TODO: Cache
+ public TextSize getTextSize() {
+ String textSize = mPrefs.getString(PREF_TEXT_SIZE, "NORMAL");
+ return TextSize.valueOf(textSize);
}
-
- private class SaveProfileToDbTask extends AutoFillProfileDbTask<AutoFillProfile> {
- public SaveProfileToDbTask(Context ctx, Message msg) {
- super(ctx, msg);
- }
-
- protected Void doInBackground(AutoFillProfile... values) {
- mAutoFillProfileDb = AutoFillProfileDatabase.getInstance(mContext);
- assert autoFillActiveProfileId != NO_AUTOFILL_PROFILE_SET;
- AutoFillProfile newProfile = values[0];
- mAutoFillProfileDb.addOrUpdateProfile(autoFillActiveProfileId, newProfile);
- return null;
- }
+ public int getMinimumFontSize() {
+ return mPrefs.getInt(PREF_MIN_FONT_SIZE, 1);
}
- private class DeleteProfileFromDbTask extends AutoFillProfileDbTask<Integer> {
- public DeleteProfileFromDbTask(Context ctx, Message msg) {
- super(ctx, msg);
- }
-
- protected Void doInBackground(Integer... values) {
- mAutoFillProfileDb = AutoFillProfileDatabase.getInstance(mContext);
- int id = values[0];
- assert id > 0;
- mAutoFillProfileDb.dropProfile(id);
- return null;
- }
+ public boolean forceEnableUserScalable() {
+ return mPrefs.getBoolean(PREF_FORCE_USERSCALABLE, false);
}
- @Override
- public void onSharedPreferenceChanged(
- SharedPreferences p, String key) {
- if (PREF_HARDWARE_ACCEL.equals(key)) {
- hardwareAccelerated = p.getBoolean(PREF_HARDWARE_ACCEL, hardwareAccelerated);
- } else if (PREF_VISUAL_INDICATOR.equals(key)) {
- showVisualIndicator = p.getBoolean(PREF_VISUAL_INDICATOR, showVisualIndicator);
- } else if (PREF_USER_AGENT.equals(key)) {
- userAgent = Integer.parseInt(p.getString(PREF_USER_AGENT, "0"));
- update();
- } else if (PREF_QUICK_CONTROLS.equals(key)) {
- quickControls = p.getBoolean(PREF_QUICK_CONTROLS, quickControls);
- } else if (PREF_MOST_VISITED_HOMEPAGE.equals(key)) {
- useMostVisitedHomepage = p.getBoolean(PREF_MOST_VISITED_HOMEPAGE, useMostVisitedHomepage);
- } else if (PREF_USE_INSTANT.equals(key)) {
- useInstant = p.getBoolean(PREF_USE_INSTANT, useInstant);
- updateSearchEngine(mController.getActivity(), SearchEngine.GOOGLE, true);
- } else if (PREF_SEARCH_ENGINE.equals(key)) {
- final String searchEngineName = p.getString(PREF_SEARCH_ENGINE,
- SearchEngine.GOOGLE);
- updateSearchEngine(mController.getActivity(), searchEngineName, false);
- }
+ // -----------------------------
+ // getter/setters for advanced_preferences.xml
+ // -----------------------------
+
+ public String getSearchEngineName() {
+ return mPrefs.getString(PREF_SEARCH_ENGINE, SearchEngine.GOOGLE);
}
+
+ public boolean openInBackground() {
+ return mPrefs.getBoolean(PREF_OPEN_IN_BACKGROUND, false);
+ }
+
+ public boolean enableJavascript() {
+ return mPrefs.getBoolean(PREF_ENABLE_JAVASCRIPT, true);
+ }
+
+ // TODO: Cache
+ public PluginState getPluginState() {
+ String state = mPrefs.getString(PREF_PLUGIN_STATE, "ON");
+ return PluginState.valueOf(state);
+ }
+
+ // TODO: Cache
+ public ZoomDensity getDefaultZoom() {
+ String zoom = mPrefs.getString(PREF_DEFAULT_ZOOM, "MEDIUM");
+ return ZoomDensity.valueOf(zoom);
+ }
+
+ public boolean loadPageInOverviewMode() {
+ return mPrefs.getBoolean(PREF_LOAD_PAGE, true);
+ }
+
+ public boolean autofitPages() {
+ return mPrefs.getBoolean(PREF_AUTOFIT_PAGES, true);
+ }
+
+ public boolean blockPopupWindows() {
+ return mPrefs.getBoolean(PREF_BLOCK_POPUP_WINDOWS, true);
+ }
+
+ public boolean loadImages() {
+ return mPrefs.getBoolean(PREF_LOAD_IMAGES, true);
+ }
+
+ public String getDefaultTextEncoding() {
+ return mPrefs.getString(PREF_DEFAULT_TEXT_ENCODING, null);
+ }
+
+ // -----------------------------
+ // getter/setters for general_preferences.xml
+ // -----------------------------
+
+ public String getHomePage() {
+ if (useMostVisitedHomepage()) {
+ return HomeProvider.MOST_VISITED;
+ }
+ return mPrefs.getString(PREF_HOMEPAGE, getFactoryResetHomeUrl(mContext));
+ }
+
+ public void setHomePage(String value) {
+ mPrefs.edit().putString(PREF_HOMEPAGE, value).apply();
+ }
+
+ public boolean isAutofillEnabled() {
+ return mPrefs.getBoolean(PREF_AUTOFILL_ENABLED, true);
+ }
+
+ public void setAutofillEnabled(boolean value) {
+ mPrefs.edit().putBoolean(PREF_AUTOFILL_ENABLED, value).apply();
+ }
+
+ // -----------------------------
+ // getter/setters for debug_preferences.xml
+ // -----------------------------
+
+ public boolean isHardwareAccelerated() {
+ if (!isDebugEnabled()) {
+ return true;
+ }
+ return mPrefs.getBoolean(PREF_ENABLE_HARDWARE_ACCEL, true);
+ }
+
+ public int getUserAgent() {
+ if (!isDebugEnabled()) {
+ return 0;
+ }
+ return Integer.parseInt(mPrefs.getString(PREF_USER_AGENT, "0"));
+ }
+
+ // -----------------------------
+ // getter/setters for hidden_debug_preferences.xml
+ // -----------------------------
+
+ public boolean enableVisualIndicator() {
+ if (!isDebugEnabled()) {
+ return false;
+ }
+ return mPrefs.getBoolean(PREF_ENABLE_VISUAL_INDICATOR, false);
+ }
+
+ public boolean enableJavascriptConsole() {
+ if (!isDebugEnabled()) {
+ return false;
+ }
+ return mPrefs.getBoolean(PREF_JAVASCRIPT_CONSOLE, true);
+ }
+
+ public boolean isSmallScreen() {
+ if (!isDebugEnabled()) {
+ return false;
+ }
+ return mPrefs.getBoolean(PREF_SMALL_SCREEN, false);
+ }
+
+ public boolean isWideViewport() {
+ if (!isDebugEnabled()) {
+ return true;
+ }
+ return mPrefs.getBoolean(PREF_WIDE_VIEWPORT, true);
+ }
+
+ public boolean isNormalLayout() {
+ if (!isDebugEnabled()) {
+ return false;
+ }
+ return mPrefs.getBoolean(PREF_NORMAL_LAYOUT, false);
+ }
+
+ public boolean isTracing() {
+ if (!isDebugEnabled()) {
+ return false;
+ }
+ return mPrefs.getBoolean(PREF_ENABLE_TRACING, false);
+ }
+
+ public boolean enableLightTouch() {
+ if (!isDebugEnabled()) {
+ return false;
+ }
+ return mPrefs.getBoolean(PREF_ENABLE_LIGHT_TOUCH, false);
+ }
+
+ public boolean enableNavDump() {
+ if (!isDebugEnabled()) {
+ return false;
+ }
+ return mPrefs.getBoolean(PREF_ENABLE_NAV_DUMP, false);
+ }
+
+ public String getJsEngineFlags() {
+ if (!isDebugEnabled()) {
+ return "";
+ }
+ return mPrefs.getString(PREF_JS_ENGINE_FLAGS, "");
+ }
+
+ // -----------------------------
+ // getter/setters for lab_preferences.xml
+ // -----------------------------
+
+ public boolean useQuickControls() {
+ return mPrefs.getBoolean(PREF_ENABLE_QUICK_CONTROLS, false);
+ }
+
+ public boolean useMostVisitedHomepage() {
+ return mPrefs.getBoolean(PREF_USE_MOST_VISITED_HOMEPAGE, false);
+ }
+
+ public boolean useInstantSearch() {
+ return mPrefs.getBoolean(PREF_USE_INSTANT_SEARCH, false);
+ }
+
+ public boolean useFullscreen() {
+ return mPrefs.getBoolean(PREF_FULLSCREEN, false);
+ }
+
+ // -----------------------------
+ // getter/setters for privacy_security_preferences.xml
+ // -----------------------------
+
+ public boolean showSecurityWarnings() {
+ return mPrefs.getBoolean(PREF_SHOW_SECURITY_WARNINGS, true);
+ }
+
+ public boolean acceptCookies() {
+ return mPrefs.getBoolean(PREF_ACCEPT_COOKIES, true);
+ }
+
+ public boolean saveFormdata() {
+ return mPrefs.getBoolean(PREF_SAVE_FORMDATA, true);
+ }
+
+ public boolean enableGeolocation() {
+ return mPrefs.getBoolean(PREF_ENABLE_GEOLOCATION, true);
+ }
+
+ public boolean rememberPasswords() {
+ return mPrefs.getBoolean(PREF_REMEMBER_PASSWORDS, true);
+ }
+
}
diff --git a/src/com/android/browser/ScrollWebView.java b/src/com/android/browser/BrowserWebView.java
similarity index 83%
rename from src/com/android/browser/ScrollWebView.java
rename to src/com/android/browser/BrowserWebView.java
index 8c89e51..9be9ad9 100644
--- a/src/com/android/browser/ScrollWebView.java
+++ b/src/com/android/browser/BrowserWebView.java
@@ -18,6 +18,7 @@
import android.content.Context;
import android.graphics.Bitmap;
+import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
@@ -28,14 +29,14 @@
/**
* Manage WebView scroll events
*/
-public class ScrollWebView extends WebView implements Runnable {
+public class BrowserWebView extends WebView implements Runnable {
private ScrollListener mScrollListener;
private boolean mIsCancelled;
private boolean mBackgroundRemoved = false;
private boolean mUserInitiated = false;
private TitleBarBase mTitleBar;
- private Bitmap mBitmap;
+ private Bitmap mCapture;
/**
* @param context
@@ -43,7 +44,7 @@
* @param defStyle
* @param javascriptInterfaces
*/
- public ScrollWebView(Context context, AttributeSet attrs, int defStyle,
+ public BrowserWebView(Context context, AttributeSet attrs, int defStyle,
Map<String, Object> javascriptInterfaces, boolean privateBrowsing) {
super(context, attrs, defStyle, javascriptInterfaces, privateBrowsing);
}
@@ -53,7 +54,7 @@
* @param attrs
* @param defStyle
*/
- public ScrollWebView(
+ public BrowserWebView(
Context context, AttributeSet attrs, int defStyle, boolean privateBrowsing) {
super(context, attrs, defStyle, privateBrowsing);
}
@@ -62,18 +63,24 @@
* @param context
* @param attrs
*/
- public ScrollWebView(Context context, AttributeSet attrs) {
+ public BrowserWebView(Context context, AttributeSet attrs) {
super(context, attrs);
}
/**
* @param context
*/
- public ScrollWebView(Context context) {
+ public BrowserWebView(Context context) {
super(context);
}
@Override
+ protected void onSizeChanged(int w, int h, int ow, int oh) {
+ super.onSizeChanged(w, h, ow, oh);
+ mCapture = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
+ }
+
+ @Override
protected int getTitleHeight() {
return (mTitleBar != null) ? mTitleBar.getEmbeddedHeight() : 0;
}
@@ -140,6 +147,14 @@
public void onScroll(int visibleTitleHeight, boolean userInitiated);
}
+ protected Bitmap capture() {
+ if (mCapture == null) return null;
+ Canvas c = new Canvas(mCapture);
+ c.translate(-getScrollX(), -(getScrollY() + getVisibleTitleHeight()));
+ onDraw(c);
+ return mCapture;
+ }
+
@Override
protected void onDraw(android.graphics.Canvas c) {
super.onDraw(c);
diff --git a/src/com/android/browser/BrowserYesNoPreference.java b/src/com/android/browser/BrowserYesNoPreference.java
index caea092..d5d5205 100644
--- a/src/com/android/browser/BrowserYesNoPreference.java
+++ b/src/com/android/browser/BrowserYesNoPreference.java
@@ -35,25 +35,25 @@
if (positiveResult) {
setEnabled(false);
- Context context = getContext();
- if (BrowserSettings.PREF_CLEAR_CACHE.equals(getKey())) {
- BrowserSettings.getInstance().clearCache(context);
- BrowserSettings.getInstance().clearDatabases(context);
- } else if (BrowserSettings.PREF_CLEAR_COOKIES.equals(getKey())) {
- BrowserSettings.getInstance().clearCookies(context);
- } else if (BrowserSettings.PREF_CLEAR_HISTORY.equals(getKey())) {
- BrowserSettings.getInstance().clearHistory(context);
- } else if (BrowserSettings.PREF_CLEAR_FORM_DATA.equals(getKey())) {
- BrowserSettings.getInstance().clearFormData(context);
- } else if (BrowserSettings.PREF_CLEAR_PASSWORDS.equals(getKey())) {
- BrowserSettings.getInstance().clearPasswords(context);
- } else if (BrowserSettings.PREF_EXTRAS_RESET_DEFAULTS.equals(
+ BrowserSettings settings = BrowserSettings.getInstance();
+ if (PreferenceKeys.PREF_PRIVACY_CLEAR_CACHE.equals(getKey())) {
+ settings.clearCache();
+ settings.clearDatabases();
+ } else if (PreferenceKeys.PREF_PRIVACY_CLEAR_COOKIES.equals(getKey())) {
+ settings.clearCookies();
+ } else if (PreferenceKeys.PREF_PRIVACY_CLEAR_HISTORY.equals(getKey())) {
+ settings.clearHistory();
+ } else if (PreferenceKeys.PREF_PRIVACY_CLEAR_FORM_DATA.equals(getKey())) {
+ settings.clearFormData();
+ } else if (PreferenceKeys.PREF_PRIVACY_CLEAR_PASSWORDS.equals(getKey())) {
+ settings.clearPasswords();
+ } else if (PreferenceKeys.PREF_RESET_DEFAULT_PREFERENCES.equals(
getKey())) {
- BrowserSettings.getInstance().resetDefaultPreferences(context);
+ settings.resetDefaultPreferences();
setEnabled(true);
- } else if (BrowserSettings.PREF_CLEAR_GEOLOCATION_ACCESS.equals(
+ } else if (PreferenceKeys.PREF_PRIVACY_CLEAR_GEOLOCATION_ACCESS.equals(
getKey())) {
- BrowserSettings.getInstance().clearLocationAccess(context);
+ settings.clearLocationAccess();
}
}
}
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index a028882..0f33380 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -198,6 +198,7 @@
// Tabs' notion of whether they represent bookmarked sites.
private ContentObserver mBookmarksObserver;
private DataController mDataController;
+ private CrashRecoveryHandler mCrashRecoveryHandler;
private static class ClearThumbnails extends AsyncTask<File, Void, Void> {
@Override
@@ -219,6 +220,7 @@
mDataController = DataController.getInstance(mActivity);
mTabControl = new TabControl(this);
mSettings.setController(this);
+ mCrashRecoveryHandler = new CrashRecoveryHandler(this);
mUrlHandler = new UrlHandler(this);
mIntentHandler = new IntentHandler(mActivity, this);
@@ -252,6 +254,15 @@
}
void start(final Bundle icicle, final Intent intent) {
+ if (icicle != null) {
+ mCrashRecoveryHandler.clearState();
+ doStart(icicle, intent);
+ } else {
+ mCrashRecoveryHandler.startRecovery(intent);
+ }
+ }
+
+ void doStart(final Bundle icicle, final Intent intent) {
// Unless the last browser usage was within 24 hours, destroy any
// remaining incognito tabs.
@@ -279,12 +290,12 @@
GoogleAccountLogin.startLoginIfNeeded(mActivity,
new Runnable() {
@Override public void run() {
- start(icicle, intent, currentTab, restoreIncognitoTabs);
+ onPreloginFinished(icicle, intent, currentTab, restoreIncognitoTabs);
}
});
}
- private void start(Bundle icicle, Intent intent, int currentTab,
+ private void onPreloginFinished(Bundle icicle, Intent intent, int currentTab,
boolean restoreIncognitoTabs) {
if (currentTab == -1) {
final Bundle extra = intent.getExtras();
@@ -334,7 +345,7 @@
new ClearThumbnails().execute(mTabControl.getThumbnailDir()
.listFiles());
// Read JavaScript flags if it exists.
- String jsFlags = getSettings().getJsFlags();
+ String jsFlags = getSettings().getJsEngineFlags();
if (jsFlags.trim().length() != 0) {
getCurrentWebView().setJsFlags(jsFlags);
}
@@ -610,6 +621,7 @@
mNetworkHandler.onPause();
WebView.disablePlatformNotifications();
+ mCrashRecoveryHandler.clearState();
}
void onSaveInstanceState(Bundle outState) {
@@ -911,6 +923,11 @@
}
mDataController.updateVisitedHistory(url);
WebIconDatabase.getInstance().retainIconForPageUrl(url);
+ if (!mActivityPaused) {
+ // Since we clear the state in onPause, don't backup the current
+ // state if we are already paused
+ mCrashRecoveryHandler.backupState();
+ }
}
@Override
@@ -1056,14 +1073,20 @@
mActivity.startActivity(intent);
}
- public void activateVoiceSearchMode(String title) {
- mUi.showVoiceTitleBar(title);
+ @Override
+ public void activateVoiceSearchMode(String title, List<String> results) {
+ mUi.showVoiceTitleBar(title, results);
}
public void revertVoiceSearchMode(Tab tab) {
mUi.revertVoiceTitleBar(tab);
}
+ public boolean supportsVoiceSearch() {
+ SearchEngine searchEngine = getSettings().getSearchEngine();
+ return (searchEngine != null && searchEngine.supportsVoiceSearch());
+ }
+
public void showCustomView(Tab tab, View view,
WebChromeClient.CustomViewCallback callback) {
if (tab.inForeground()) {
@@ -1098,7 +1121,7 @@
case PREFERENCES_PAGE:
if (resultCode == Activity.RESULT_OK && intent != null) {
String action = intent.getStringExtra(Intent.EXTRA_TEXT);
- if (BrowserSettings.PREF_CLEAR_HISTORY.equals(action)) {
+ if (PreferenceKeys.PREF_PRIVACY_CLEAR_HISTORY.equals(action)) {
mTabControl.removeParentChildRelationShips();
}
}
@@ -1335,8 +1358,7 @@
boolean showNewTab = mTabControl.canCreateNewTab();
MenuItem newTabItem
= menu.findItem(R.id.open_newtab_context_menu_id);
- newTabItem.setTitle(
- BrowserSettings.getInstance().openInBackground()
+ newTabItem.setTitle(getSettings().openInBackground()
? R.string.contextmenu_openlink_newwindow_background
: R.string.contextmenu_openlink_newwindow);
newTabItem.setVisible(showNewTab);
@@ -1465,12 +1487,12 @@
PackageManager.MATCH_DEFAULT_ONLY);
menu.findItem(R.id.share_page_menu_id).setVisible(ri != null);
- boolean isNavDump = mSettings.isNavDump();
+ boolean isNavDump = mSettings.enableNavDump();
final MenuItem nav = menu.findItem(R.id.dump_nav_menu_id);
nav.setVisible(isNavDump);
nav.setEnabled(isNavDump);
- boolean showDebugSettings = mSettings.showDebugSettings();
+ boolean showDebugSettings = mSettings.isDebugEnabled();
final MenuItem counter = menu.findItem(R.id.dump_counters_menu_id);
counter.setVisible(showDebugSettings);
counter.setEnabled(showDebugSettings);
@@ -1774,7 +1796,6 @@
// title bar once again.
mExtendedMenuOpen = false;
mUi.onExtendedMenuClosed(mInLoad);
- mUi.onOptionsMenuOpened();
}
}
} else {
@@ -2103,7 +2124,8 @@
mTabControl.removeTab(tab);
}
- protected void setActiveTab(Tab tab) {
+ @Override
+ public void setActiveTab(Tab tab) {
// monkey protection against delayed start
if (tab != null) {
mTabControl.setCurrentTab(tab);
@@ -2414,12 +2436,6 @@
startSearch(result, false, bundle, false);
}
- @Override
- public void startSearch(String url) {
- startSearch(mSettings.getHomePage().equals(url) ? null : url, true,
- null, false);
- }
-
private void startSearch(String initialQuery, boolean selectInitialQuery,
Bundle appSearchData, boolean globalSearch) {
if (appSearchData == null) {
diff --git a/src/com/android/browser/CrashRecoveryHandler.java b/src/com/android/browser/CrashRecoveryHandler.java
new file mode 100644
index 0000000..9e98e76
--- /dev/null
+++ b/src/com/android/browser/CrashRecoveryHandler.java
@@ -0,0 +1,120 @@
+/*
+ * 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.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.DialogInterface.OnClickListener;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Debug;
+import android.os.Parcel;
+import android.util.Log;
+
+import java.io.ByteArrayOutputStream;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+
+public class CrashRecoveryHandler {
+
+ private static final String LOGTAG = "BrowserCrashRecovery";
+ private static final String STATE_FILE = "browser_state.parcel";
+ private static final int BUFFER_SIZE = 4096;
+
+ private Controller mController;
+
+ public CrashRecoveryHandler(Controller controller) {
+ mController = controller;
+ }
+
+ public void backupState() {
+ final Bundle state = new Bundle();
+ mController.onSaveInstanceState(state);
+ final Context context = mController.getActivity();
+ new Thread() {
+ @Override
+ public void run() {
+ Parcel p = Parcel.obtain();
+ try {
+ state.writeToParcel(p, 0);
+ FileOutputStream fout = context.openFileOutput(STATE_FILE,
+ Context.MODE_PRIVATE);
+ fout.write(p.marshall());
+ fout.close();
+ } catch (Exception e) {
+ Log.i(LOGTAG, "Failed to save persistent state", e);
+ } finally {
+ p.recycle();
+ }
+ }
+ }.start();
+ }
+
+ public void clearState() {
+ Context context = mController.getActivity();
+ context.deleteFile(STATE_FILE);
+ }
+
+ public void promptToRecover(final Bundle state, final Intent intent) {
+ new AlertDialog.Builder(mController.getActivity())
+ .setTitle(R.string.recover_title)
+ .setMessage(R.string.recover_prompt)
+ .setPositiveButton(R.string.recover_yes, new OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ mController.doStart(state, intent);
+ }
+ })
+ .setNegativeButton(R.string.recover_no, new OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ clearState();
+ mController.doStart(null, intent);
+ }
+ })
+ .show();
+ }
+
+ public void startRecovery(Intent intent) {
+ Parcel parcel = Parcel.obtain();
+ try {
+ Context context = mController.getActivity();
+ FileInputStream fin = context.openFileInput(STATE_FILE);
+ ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
+ byte[] buffer = new byte[BUFFER_SIZE];
+ int read;
+ while ((read = fin.read(buffer)) > 0) {
+ dataStream.write(buffer, 0, read);
+ }
+ byte[] data = dataStream.toByteArray();
+ parcel.unmarshall(data, 0, data.length);
+ parcel.setDataPosition(0);
+ Bundle state = parcel.readBundle();
+ promptToRecover(state, intent);
+ } catch (FileNotFoundException e) {
+ // No state to recover
+ mController.doStart(null, intent);
+ } catch (Exception e) {
+ Log.w(LOGTAG, "Failed to recover state!", e);
+ mController.doStart(null, intent);
+ } finally {
+ parcel.recycle();
+ }
+ }
+}
diff --git a/src/com/android/browser/InstantSearchEngine.java b/src/com/android/browser/InstantSearchEngine.java
index 85e494a..6ff7db7 100644
--- a/src/com/android/browser/InstantSearchEngine.java
+++ b/src/com/android/browser/InstantSearchEngine.java
@@ -174,7 +174,12 @@
* visible tab.
*/
private void switchSearchboxIfNeeded() {
- final SearchBox searchBox = getCurrentWebview().getSearchBox();
+ final WebView current = getCurrentWebview();
+ if (current == null) {
+ return;
+ }
+
+ final SearchBox searchBox = current.getSearchBox();
if (searchBox != mSearchBox) {
if (mSearchBox != null) {
mSearchBox.removeSearchBoxListener(mListener);
@@ -188,7 +193,12 @@
}
private boolean isInstantPage() {
- String currentUrl = getCurrentWebview().getUrl();
+ final WebView current = getCurrentWebview();
+ if (current == null) {
+ return false;
+ }
+
+ final String currentUrl = current.getUrl();
if (currentUrl != null) {
Uri uri = Uri.parse(currentUrl);
@@ -210,7 +220,10 @@
mController.getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
- getCurrentWebview().loadUrl(getInstantBaseUrl());
+ final WebView current = getCurrentWebview();
+ if (current != null) {
+ current.loadUrl(getInstantBaseUrl());
+ }
}
});
}
@@ -292,7 +305,12 @@
}
private int rescaleHeight(int height) {
- final float scale = getCurrentWebview().getScale();
+ final WebView current = getCurrentWebview();
+ if (current == null) {
+ return 0;
+ }
+
+ final float scale = current.getScale();
if (scale != 0) {
return (int) (height / scale);
}
@@ -306,8 +324,10 @@
if (rescaledHeight != mHeight) {
mHeight = rescaledHeight;
- mSearchBox.setDimensions(0, 0, 0, rescaledHeight);
- mSearchBox.onresize();
+ if (mSearchBox != null) {
+ mSearchBox.setDimensions(0, 0, 0, rescaledHeight);
+ mSearchBox.onresize();
+ }
}
}
diff --git a/src/com/android/browser/IntentHandler.java b/src/com/android/browser/IntentHandler.java
index fa8bfbc..1322d96 100644
--- a/src/com/android/browser/IntentHandler.java
+++ b/src/com/android/browser/IntentHandler.java
@@ -187,7 +187,7 @@
} else if ("about:debug.nav".equals(urlData.mUrl)) {
current.getWebView().debugDump();
} else {
- mSettings.toggleDebugSettings(mActivity);
+ mSettings.toggleDebugSettings();
}
return;
}
diff --git a/src/com/android/browser/NavScreen.java b/src/com/android/browser/NavScreen.java
new file mode 100644
index 0000000..e636b2b
--- /dev/null
+++ b/src/com/android/browser/NavScreen.java
@@ -0,0 +1,385 @@
+/*
+ * 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.Activity;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.webkit.WebView;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.AdapterView.OnItemSelectedListener;
+import android.widget.BaseAdapter;
+import android.widget.FrameLayout;
+import android.widget.Gallery;
+import android.widget.ImageButton;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.ListPopupWindow;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class NavScreen extends LinearLayout implements OnClickListener {
+
+ UiController mUiController;
+ PhoneUi mUi;
+ Tab mTab;
+ Activity mActivity;
+
+ View mTopPanel;
+ ImageButton mBack;
+ ImageButton mRefresh;
+ ImageButton mForward;
+ ImageButton mTabs;
+ ImageButton mBookmarks;
+ ImageButton mMore;
+ ImageButton mNewTab;
+ ImageButton mNewIncognito;
+ FrameLayout mHolder;
+
+ Gallery mFlipper;
+ int mTabWidth;
+ int mTabHeight;
+ TabAdapter mAdapter;
+ ListPopupWindow mPopup;
+
+ public NavScreen(Activity activity, UiController ctl, PhoneUi ui) {
+ super(activity);
+ mActivity = activity;
+ mUiController = ctl;
+ mUi = ui;
+ init();
+ }
+
+ protected Tab getSelectedTab() {
+ return (Tab) mFlipper.getSelectedItem();
+ }
+
+ protected void setTabDimensions(int w, int h) {
+ mTabWidth = w;
+ mTabHeight = h;
+ requestLayout();
+ }
+
+ protected void showMenu() {
+ Menu menu = mUi.getMenu();
+ menu.setGroupVisible(R.id.NAV_MENU, false);
+
+ MenuAdapter menuAdapter = new MenuAdapter(mContext);
+ menuAdapter.setMenu(menu);
+ ListPopupWindow popup = new ListPopupWindow(mContext);
+ popup.setInputMethodMode(ListPopupWindow.INPUT_METHOD_NOT_NEEDED);
+ popup.setAdapter(menuAdapter);
+ popup.setModal(true);
+ popup.setAnchorView(mMore);
+ popup.setWidth((int) mContext.getResources().getDimension(
+ R.dimen.menu_width));
+ popup.show();
+ mPopup = popup;
+ }
+
+ protected float getToolbarHeight() {
+ return mActivity.getResources().getDimension(R.dimen.toolbar_height);
+ }
+
+ protected void dismissMenu() {
+ if (mPopup != null) {
+ mPopup.dismiss();
+ }
+ }
+
+ private void init() {
+ LayoutInflater.from(mContext).inflate(R.layout.nav_screen, this);
+ LinearLayout content = (LinearLayout) findViewById(R.id.nav_screen);
+ mTopPanel = findViewById(R.id.navtop);
+ mBack = (ImageButton) findViewById(R.id.back);
+ mForward = (ImageButton) findViewById(R.id.forward);
+ mRefresh = (ImageButton) findViewById(R.id.refresh);
+ mTabs = (ImageButton) findViewById(R.id.tabs);
+ mBookmarks = (ImageButton) findViewById(R.id.bookmarks);
+ mNewTab = (ImageButton) findViewById(R.id.newtab);
+ mNewIncognito = (ImageButton) findViewById(R.id.newincognito);
+ mMore = (ImageButton) findViewById(R.id.more);
+ mBack.setOnClickListener(this);
+ mForward.setOnClickListener(this);
+ mRefresh.setOnClickListener(this);
+ mTabs.setOnClickListener(this);
+ mBookmarks.setOnClickListener(this);
+ mNewTab.setOnClickListener(this);
+ mNewIncognito.setOnClickListener(this);
+ mMore.setOnClickListener(this);
+ mHolder = (FrameLayout) findViewById(R.id.galleryholder);
+ FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
+ LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
+ mFlipper = new TabGallery(mContext);
+ mFlipper.setSpacing((int)(mContext.getResources()
+ .getDimension(R.dimen.nav_tab_spacing)));
+ mFlipper.setLayoutParams(lp);
+ mHolder.addView(mFlipper, 0);
+ mAdapter = new TabAdapter(mContext, mUiController.getTabControl());
+ mFlipper.setAdapter(mAdapter);
+ setTab(mUi.getActiveTab(), true);
+ mFlipper.setOnItemClickListener(new OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView<?> parent, View view,
+ int position, long id) {
+ // post as runnable to prevent bug in gesturedetector
+ // when view is removed in click handler
+ // sends action_cancel before action_up
+ mFlipper.post(new Runnable() {
+ public void run() {
+ close();
+ }
+ });
+ }
+ });
+ mFlipper.setOnItemSelectedListener(new OnItemSelectedListener() {
+ @Override
+ public void onItemSelected(AdapterView<?> parent, View view,
+ int position, long id) {
+ final Tab tab = mAdapter.getItem(position);
+ setTab(tab, false);
+ }
+
+ @Override
+ public void onNothingSelected(AdapterView<?> parent) {
+ }
+ });
+ }
+
+ private void setTab(Tab tab, boolean updateFlipper) {
+ mTab = tab;
+ // refresh state from tab
+ WebView web = tab.getWebView();
+ if (web != null) {
+ mBack.setImageResource(web.canGoBack()
+ ? R.drawable.ic_back_holo_dark
+ : R.drawable.ic_back_disabled_holo_dark);
+ mForward.setImageResource(web.canGoForward()
+ ? R.drawable.ic_forward_holo_dark
+ : R.drawable.ic_forward_disabled_holo_dark);
+ }
+ if (updateFlipper) {
+ mFlipper.setSelection(mUiController.getTabControl().getTabIndex(tab));
+ }
+ }
+
+ @Override
+ public void onClick(View v) {
+ WebView web = (mTab != null) ? mTab.getWebView() : null;
+ if (web != null) {
+ if (mBack == v) {
+ mUi.hideNavScreen(true);
+ web.goBack();
+ } else if (mForward == v) {
+ mUi.hideNavScreen(true);
+ web.goForward();
+ } else if (mRefresh == v) {
+ mUi.hideNavScreen(true);
+ web.reload();
+ }
+ }
+ if (mBookmarks == v) {
+ mUi.hideNavScreen(false);
+ mUiController.bookmarksOrHistoryPicker(false);
+ } else if (mTabs == v) {
+ mUi.hideNavScreen(false);
+ mUi.showActiveTabsPage();
+ } else if (mNewTab == v) {
+ mUi.hideNavScreen(true);
+ mUiController.openTabToHomePage();
+ } else if (mMore == v) {
+ showMenu();
+ } else if (mNewIncognito == v) {
+ mUi.hideNavScreen(true);
+ mUiController.openIncognitoTab();
+ }
+ }
+
+ protected void close() {
+ close(true);
+ }
+
+ protected void close(boolean animate) {
+ mUi.hideNavScreen(animate);
+ Tab tab = (Tab) mFlipper.getSelectedItem();
+ if (tab != mUi.getActiveTab()) {
+ mUiController.setActiveTab(tab);
+ }
+ }
+
+ class TabGallery extends Gallery {
+
+ public TabGallery(Context ctx) {
+ super(ctx);
+ setUnselectedAlpha(0.3f);
+ }
+
+ @Override
+ protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
+ return new Gallery.LayoutParams(
+ LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
+ }
+
+ @Override
+ protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams lp) {
+ return generateDefaultLayoutParams();
+ }
+
+ }
+
+ class TabAdapter extends BaseAdapter {
+
+ Context context;
+ TabControl tabControl;
+
+ public TabAdapter(Context ctx, TabControl tc) {
+ context = ctx;
+ tabControl = tc;
+ }
+
+ void onCloseTab(Tab tab) {
+ if (tab != null) {
+ mUiController.closeTab(tab);
+ if (tabControl.getTabCount() == 0) {
+ mUiController.openTabToHomePage();
+ mUi.hideNavScreen(false);
+ } else {
+ notifyDataSetChanged();
+ }
+ }
+ }
+
+ @Override
+ public int getCount() {
+ return tabControl.getTabCount();
+ }
+
+ @Override
+ public Tab getItem(int position) {
+ return tabControl.getTab(position);
+ }
+
+ public long getItemId(int position) {
+ return position;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ ImageView content = null;
+ if (convertView == null) {
+ convertView = LayoutInflater.from(context).inflate(R.layout.nav_tab_view,
+ null);
+ content = (ImageView) convertView.findViewById(R.id.content);
+ content.setLayoutParams(new LayoutParams(mTabWidth, mTabHeight));
+ } else {
+ content = (ImageView) convertView.findViewById(R.id.content);
+ }
+ View tbar = convertView.findViewById(R.id.titlebar);
+ TextView title = (TextView) convertView.findViewById(R.id.title);
+ ImageView icon = (ImageView) convertView.findViewById(R.id.favicon);
+ ImageButton close = (ImageButton) convertView.findViewById(R.id.closetab);
+ final Tab tab = getItem(position);
+ icon.setImageDrawable(mUi.getFaviconDrawable(tab.getFavicon()));
+ title.setText(tab.getUrl());
+ Bitmap screen = tab.getScreenshot();
+ content.setImageBitmap(screen);
+ close.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ onCloseTab(tab);
+ }
+ });
+ tbar.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ close(false);
+ mUi.editUrl(false);
+ }
+ });
+ return convertView;
+ }
+ }
+
+ private class MenuAdapter extends BaseAdapter implements OnClickListener {
+
+ List<MenuItem> mItems;
+ LayoutInflater mInflater;
+
+ public MenuAdapter(Context ctx) {
+ mInflater = LayoutInflater.from(ctx);
+ mItems = new ArrayList<MenuItem>();
+ }
+
+ public void setMenu(Menu menu) {
+ mItems.clear();
+ for (int i = 0; i < menu.size(); i++) {
+ MenuItem item = menu.getItem(i);
+ if (item.isEnabled() && item.isVisible()) {
+ mItems.add(item);
+ }
+ }
+ notifyDataSetChanged();
+ }
+
+ @Override
+ public int getCount() {
+ return mItems.size();
+ }
+
+ @Override
+ public MenuItem getItem(int position) {
+ return mItems.get(position);
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return position;
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (v.getTag() != null) {
+ dismissMenu();
+ mActivity.closeOptionsMenu();
+ mUi.hideNavScreen(false);
+ mUiController.onOptionsItemSelected((MenuItem) v.getTag());
+ }
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ final MenuItem item = mItems.get(position);
+ View view = mInflater.inflate(R.layout.qc_menu_item, null);
+ TextView label = (TextView) view.findViewById(R.id.title);
+ label.setText(item.getTitle());
+ label.setTag(item);
+ label.setOnClickListener(this);
+ return label;
+ }
+
+ }
+
+}
diff --git a/src/com/android/browser/PhoneUi.java b/src/com/android/browser/PhoneUi.java
index f1939e4..13a5257 100644
--- a/src/com/android/browser/PhoneUi.java
+++ b/src/com/android/browser/PhoneUi.java
@@ -16,18 +16,19 @@
package com.android.browser;
+import android.animation.Animator;
+import android.animation.Animator.AnimatorListener;
+import android.animation.AnimatorSet;
+import android.animation.ObjectAnimator;
import android.app.Activity;
-import android.content.Context;
-import android.graphics.PixelFormat;
import android.util.Log;
import android.view.ActionMode;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.Menu;
-import android.view.MotionEvent;
import android.view.View;
-import android.view.WindowManager;
import android.webkit.WebView;
+import android.widget.FrameLayout;
/**
* Ui for regular phone screen sizes
@@ -35,13 +36,17 @@
public class PhoneUi extends BaseUi {
private static final String LOGTAG = "PhoneUi";
+ private static final float NAV_TAB_SCALE = 0.75f;
- private TitleBar mTitleBar;
+ private TitleBarPhone mTitleBar;
private ActiveTabsPage mActiveTabsPage;
- private TouchProxy mTitleOverlay;
+ private boolean mUseQuickControls;
+ private PieControl mPieControl;
+ private NavScreen mNavScreen;
boolean mExtendedMenuOpen;
boolean mOptionsMenuOpen;
+ boolean mAnimating;
/**
* @param browser
@@ -49,11 +54,13 @@
*/
public PhoneUi(Activity browser, UiController controller) {
super(browser, controller);
- mTitleBar = new TitleBar(mActivity, mUiController, this);
+ 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());
}
@Override
@@ -62,23 +69,6 @@
mActivity.getActionBar().hide();
}
- // webview factory
-
- @Override
- public WebView createWebView(boolean privateBrowsing) {
- // Create a new WebView
- WebView w = new WebView(mActivity, null,
- android.R.attr.webViewStyle, privateBrowsing);
- initWebViewSettings(w);
- return w;
- }
-
- @Override
- public WebView createSubWebView(boolean privateBrowsing) {
- WebView web = createWebView(privateBrowsing);
- return web;
- }
-
// lifecycle
@Override
@@ -100,8 +90,10 @@
@Override
public void editUrl(boolean clearInput) {
- String url = getActiveTab().getUrl();
- mUiController.startSearch(url);
+ if (mUseQuickControls) {
+ getTitleBar().setShowProgressOnly(false);
+ }
+ super.editUrl(clearInput);
}
@Override
@@ -110,11 +102,31 @@
// if tab page is showing, hide it
mUiController.removeActiveTabsPage(true);
return true;
+ } else if (mNavScreen != null) {
+ mNavScreen.close();
+ return true;
}
return super.onBackKey();
}
@Override
+ public boolean dispatchKey(int code, KeyEvent event) {
+ if (!isComboViewShowing()) {
+ switch (code) {
+ case KeyEvent.KEYCODE_MENU:
+ if (mNavScreen == null) {
+ showNavScreen();
+ return true;
+ } else {
+ mNavScreen.close();
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
public void onProgressChanged(Tab tab) {
if (tab.inForeground()) {
int progress = tab.getLoadProgress();
@@ -122,9 +134,16 @@
if (progress == 100) {
if (!mOptionsMenuOpen || !mExtendedMenuOpen) {
hideTitleBar();
+ if (mUseQuickControls) {
+ mTitleBar.setShowProgressOnly(false);
+ }
}
} else {
if (!mOptionsMenuOpen || mExtendedMenuOpen) {
+ if (mUseQuickControls && !mTitleBar.isEditingUrl()) {
+ mTitleBar.setShowProgressOnly(true);
+ setTitleGravity(Gravity.TOP);
+ }
showTitleBar();
}
}
@@ -132,41 +151,41 @@
}
@Override
- public void setActiveTab(Tab tab) {
- super.setActiveTab(tab);
- WebView view = tab.getWebView();
+ public void setActiveTab(final Tab tab) {
+ captureTab(mActiveTab);
+ super.setActiveTab(tab, true);
+ setActiveTab(tab, true);
+ }
+
+ @Override
+ void setActiveTab(Tab tab, boolean needsAttaching) {
+ BrowserWebView view = (BrowserWebView) tab.getWebView();
// TabControl.setCurrentTab has been called before this,
// so the tab is guaranteed to have a webview
if (view == null) {
Log.e(LOGTAG, "active tab with no webview detected");
return;
}
- view.setEmbeddedTitleBar(getTitleBar());
+ // Request focus on the top window.
+ if (mUseQuickControls) {
+ mPieControl.forceToTop(mContentView);
+ view.setScrollListener(null);
+ } else {
+ // check if title bar is already attached by animation
+ if (mTitleBar.getParent() == null) {
+ view.setEmbeddedTitleBar(mTitleBar);
+ }
+ }
if (tab.isInVoiceSearchMode()) {
- showVoiceTitleBar(tab.getVoiceDisplayTitle());
+ showVoiceTitleBar(tab.getVoiceDisplayTitle(), tab.getVoiceSearchResults());
} else {
revertVoiceTitleBar(tab);
}
+ updateLockIconToLatest(tab);
tab.getTopWindow().requestFocus();
}
@Override
- protected void showTitleBar() {
- if (canShowTitleBar()) {
- setTitleGravity(Gravity.TOP);
- super.showTitleBar();
- }
- }
-
- @Override
- protected void hideTitleBar() {
- if (isTitleBarShowing()) {
- setTitleGravity(Gravity.NO_GRAVITY);
- super.hideTitleBar();
- }
- }
-
- @Override
protected TitleBarBase getTitleBar() {
return mTitleBar;
}
@@ -175,6 +194,7 @@
@Override
public void showActiveTabsPage() {
+ captureTab(mActiveTab);
mActiveTabsPage = new ActiveTabsPage(mActivity, mUiController);
mTitleBar.setVisibility(View.GONE);
hideTitleBar();
@@ -200,42 +220,6 @@
// menu handling callbacks
@Override
- public void onOptionsMenuOpened() {
- mOptionsMenuOpen = true;
- // options menu opened, show title bar
- showTitleBar();
- if (mTitleOverlay == null) {
- // This assumes that getTitleBar always returns the same View
- mTitleOverlay = new TouchProxy(mActivity, getTitleBar());
- }
- mActivity.getWindowManager().addView(mTitleOverlay,
- mTitleOverlay.getWindowLayoutParams());
- }
-
- @Override
- public void onExtendedMenuOpened() {
- // Switching the menu to expanded view, so hide the
- // title bar.
- mExtendedMenuOpen = true;
- hideTitleBar();
- }
-
- @Override
- public void onOptionsMenuClosed(boolean inLoad) {
- mOptionsMenuOpen = false;
- mActivity.getWindowManager().removeView(mTitleOverlay);
- if (!inLoad && !getTitleBar().hasFocus()) {
- hideTitleBar();
- }
- }
-
- @Override
- public void onExtendedMenuClosed(boolean inLoad) {
- mExtendedMenuOpen = false;
- showTitleBar();
- }
-
- @Override
public void onContextMenuCreated(Menu menu) {
hideTitleBar();
}
@@ -255,36 +239,181 @@
}
@Override
- public boolean dispatchKey(int code, KeyEvent event) {
- return false;
+ public void onActionModeFinished(boolean inLoad) {
+ if (inLoad) {
+ if (mUseQuickControls) {
+ mTitleBar.setShowProgressOnly(true);
+ }
+ showTitleBar();
+ }
+ mActivity.getActionBar().hide();
}
- static class TouchProxy extends View {
-
- View mTarget;
-
- TouchProxy(Context context, View target) {
- super(context);
- mTarget = target;
- }
-
- @Override
- public boolean dispatchTouchEvent(MotionEvent event) {
- return mTarget.dispatchTouchEvent(event);
- }
-
- WindowManager.LayoutParams getWindowLayoutParams() {
- WindowManager.LayoutParams params =
- new WindowManager.LayoutParams(
- mTarget.getWidth(),
- mTarget.getHeight(),
- WindowManager.LayoutParams.TYPE_APPLICATION,
- WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
- PixelFormat.TRANSPARENT);
- params.gravity = Gravity.TOP | Gravity.LEFT;
- params.y = mTarget.getTop();
- params.x = mTarget.getLeft();
- return params;
+ @Override
+ protected void setTitleGravity(int gravity) {
+ if (mUseQuickControls) {
+ FrameLayout.LayoutParams lp =
+ (FrameLayout.LayoutParams) getTitleBar().getLayoutParams();
+ lp.gravity = gravity;
+ getTitleBar().setLayoutParams(lp);
+ } else {
+ super.setTitleGravity(gravity);
}
}
+
+ private void setUseQuickControls(boolean useQuickControls) {
+ mUseQuickControls = useQuickControls;
+ getTitleBar().setUseQuickControls(mUseQuickControls);
+ if (useQuickControls) {
+ mPieControl = new PieControl(mActivity, mUiController, this);
+ mPieControl.attachToContainer(mContentView);
+ WebView web = getWebView();
+ if (web != null) {
+ web.setEmbeddedTitleBar(null);
+ }
+ } else {
+ if (mPieControl != null) {
+ mPieControl.removeFromContainer(mContentView);
+ }
+ WebView web = getWebView();
+ if (web != null) {
+ web.setEmbeddedTitleBar(mTitleBar);
+ }
+ setTitleGravity(Gravity.NO_GRAVITY);
+ }
+ }
+
+ @Override
+ protected void captureTab(final Tab tab) {
+ if (mUseQuickControls) {
+ super.captureTab(tab);
+ } else {
+ captureTab(tab,
+ mActivity.getWindowManager().getDefaultDisplay().getWidth(),
+ mActivity.getWindowManager().getDefaultDisplay().getHeight());
+ }
+ }
+
+ void showNavScreen() {
+ if (mAnimating) return;
+ mAnimating = true;
+ mNavScreen = new NavScreen(mActivity, mUiController, this);
+ float yoffset = 0;
+ WebView web = getWebView();
+ if (web != null) {
+ int w = web.getWidth();
+ int h = web.getHeight();
+ yoffset = mNavScreen.getToolbarHeight() - web.getVisibleTitleHeight();
+ mNavScreen.setTabDimensions((int) (w * NAV_TAB_SCALE),
+ (int) (h * NAV_TAB_SCALE));
+ }
+ // Add the custom view to its container.
+ mCustomViewContainer.addView(mNavScreen, COVER_SCREEN_GRAVITY_CENTER);
+ mContentView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
+ ObjectAnimator animx = ObjectAnimator.ofFloat(mContentView,
+ "scaleX", 1.0f, NAV_TAB_SCALE);
+ ObjectAnimator animy = ObjectAnimator.ofFloat(mContentView,
+ "scaleY", 1.0f, NAV_TAB_SCALE);
+ ObjectAnimator translatey = ObjectAnimator.ofFloat(mContentView,
+ "translationY", 0, yoffset * NAV_TAB_SCALE);
+ AnimatorSet anims = new AnimatorSet();
+ anims.setDuration(200);
+ anims.addListener(new AnimatorListener() {
+
+ @Override
+ public void onAnimationCancel(Animator animation) {
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ finishShowNavScreen();
+ }
+
+ @Override
+ public void onAnimationRepeat(Animator animation) {
+ }
+
+ @Override
+ public void onAnimationStart(Animator animation) {
+ }
+ });
+ anims.playTogether(animx, animy, translatey);
+ anims.start();
+ }
+
+ private void finishShowNavScreen() {
+ // Hide the content view.
+ mContentView.setLayerType(View.LAYER_TYPE_NONE, null);
+ mContentView.setVisibility(View.GONE);
+ mContentView.setScaleX(1.0f);
+ mContentView.setScaleY(1.0f);
+ mContentView.setTranslationY(0);
+ BrowserWebView web = (BrowserWebView) getWebView();
+ if (web != null) {
+ mActiveTab.setScreenshot(web.capture());
+ }
+ // Finally show the custom view container.
+ mCustomViewContainer.setVisibility(View.VISIBLE);
+ mCustomViewContainer.bringToFront();
+ mAnimating = false;
+ }
+
+ void hideNavScreen(boolean animateToPage) {
+ if (mAnimating || mNavScreen == null) return;
+ mAnimating = true;
+ mNavScreen.setLayerType(View.LAYER_TYPE_HARDWARE, null);
+ if (animateToPage) {
+ float yoffset = 0;
+ WebView web = mNavScreen.getSelectedTab().getWebView();
+ if (web != null) {
+ yoffset = mNavScreen.getToolbarHeight() - web.getVisibleTitleHeight();
+ }
+ ObjectAnimator animx = ObjectAnimator.ofFloat(mNavScreen, "scaleX",
+ 1.0f, 1 / NAV_TAB_SCALE);
+ ObjectAnimator animy = ObjectAnimator.ofFloat(mNavScreen, "scaleY",
+ 1.0f, 1 / NAV_TAB_SCALE);
+ ObjectAnimator translatey = ObjectAnimator.ofFloat(mNavScreen,
+ "translationY", 0, -yoffset);
+ AnimatorSet anims = new AnimatorSet();
+ anims.setDuration(200);
+ anims.addListener(new AnimatorListener() {
+
+ @Override
+ public void onAnimationCancel(Animator animation) {
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ finishHideNavScreen();
+ }
+
+ @Override
+ public void onAnimationRepeat(Animator animation) {
+ }
+
+ @Override
+ public void onAnimationStart(Animator animation) {
+ }
+ });
+ anims.playTogether(animx, animy, translatey);
+ anims.start();
+ } else {
+ finishHideNavScreen();
+ }
+
+ }
+
+ private void finishHideNavScreen() {
+ // Hide the custom view.
+ mNavScreen.setVisibility(View.GONE);
+ mNavScreen.setLayerType(View.LAYER_TYPE_NONE, null);
+ // Remove the custom view from its container.
+ mCustomViewContainer.removeView(mNavScreen);
+ mNavScreen = null;
+ mCustomViewContainer.setVisibility(View.GONE);
+ // Show the content view.
+ mContentView.setVisibility(View.VISIBLE);
+ mAnimating = false;
+ }
+
}
diff --git a/src/com/android/browser/PieControl.java b/src/com/android/browser/PieControl.java
index 38ed1bb..684cd1a 100644
--- a/src/com/android/browser/PieControl.java
+++ b/src/com/android/browser/PieControl.java
@@ -50,7 +50,7 @@
private Activity mActivity;
private UiController mUiController;
- private XLargeUi mUi;
+ private BaseUi mUi;
private PieMenu mPie;
private PieItem mBack;
private PieItem mForward;
@@ -66,7 +66,7 @@
private TextView mTabsCount;
private int mItemSize;
- public PieControl(Activity activity, UiController controller, XLargeUi ui) {
+ public PieControl(Activity activity, UiController controller, BaseUi ui) {
mActivity = activity;
mUiController = controller;
mUi = ui;
@@ -107,7 +107,7 @@
menuview.setLayoutListener(new OnLayoutListener() {
@Override
public void onLayout(int ax, int ay, boolean left) {
- mActivity.openOptionsMenu();
+ buildMenu();
}
});
@@ -128,10 +128,10 @@
// level 2
mPie.addItem(mForward);
mPie.addItem(mRefresh);
+ mPie.addItem(mOptions);
mPie.addItem(mShowTabs);
mPie.addItem(mNewTab);
mPie.addItem(mClose);
- mPie.addItem(mOptions);
mPie.setController(this);
}
container.addView(mPie);
@@ -146,7 +146,9 @@
}
- protected void onMenuOpened(Menu menu) {
+ private void buildMenu() {
+ Menu menu = mUi.getMenu();
+ menu.setGroupVisible(R.id.NAV_MENU, false);
mMenuAdapter.setMenu(menu);
}
@@ -205,12 +207,12 @@
web.reload();
}
} else if (mUrl.getView() == v) {
- mUi.showTitleBarAndEdit();
+ mUi.editUrl(false);
} else if (mBookmarks.getView() == v) {
mUiController.bookmarksOrHistoryPicker(false);
} else if (mNewTab.getView() == v) {
mUiController.openTabToHomePage();
- mUi.showTitleBarAndEdit();
+ mUi.editUrl(false);
} else if (mClose.getView() == v) {
mUiController.closeCurrentTab();
}
diff --git a/src/com/android/browser/PreferenceKeys.java b/src/com/android/browser/PreferenceKeys.java
new file mode 100644
index 0000000..f7230df
--- /dev/null
+++ b/src/com/android/browser/PreferenceKeys.java
@@ -0,0 +1,97 @@
+/*
+ * 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;
+
+public interface PreferenceKeys {
+
+ static final String PREF_AUTOFILL_ACTIVE_PROFILE_ID = "autofill_active_profile_id";
+ static final String PREF_DEBUG_MENU = "debug_menu";
+
+ // ----------------------
+ // Keys for accessibility_preferences.xml
+ // ----------------------
+ static final String PREF_MIN_FONT_SIZE = "min_font_size";
+ static final String PREF_TEXT_SIZE = "text_size";
+ static final String PREF_FORCE_USERSCALABLE = "force_userscalable";
+
+ // ----------------------
+ // Keys for advanced_preferences.xml
+ // ----------------------
+ static final String PREF_AUTOFIT_PAGES = "autofit_pages";
+ static final String PREF_BLOCK_POPUP_WINDOWS = "block_popup_windows";
+ static final String PREF_DEFAULT_TEXT_ENCODING = "default_text_encoding";
+ static final String PREF_DEFAULT_ZOOM = "default_zoom";
+ static final String PREF_ENABLE_JAVASCRIPT = "enable_javascript";
+ static final String PREF_LOAD_IMAGES = "load_images";
+ static final String PREF_LOAD_PAGE = "load_page";
+ static final String PREF_OPEN_IN_BACKGROUND = "open_in_background";
+ static final String PREF_PLUGIN_STATE = "plugin_state";
+ static final String PREF_RESET_DEFAULT_PREFERENCES = "reset_default_preferences";
+ static final String PREF_SEARCH_ENGINE = "search_engine";
+ static final String PREF_WEBSITE_SETTINGS = "website_settings";
+
+ // ----------------------
+ // Keys for debug_preferences.xml
+ // ----------------------
+ static final String PREF_ENABLE_HARDWARE_ACCEL = "enable_hardware_accel";
+ static final String PREF_USER_AGENT = "user_agent";
+
+ // ----------------------
+ // Keys for general_preferences.xml
+ // ----------------------
+ static final String PREF_AUTOFILL_ENABLED = "autofill_enabled";
+ static final String PREF_AUTOFILL_PROFILE = "autofill_profile";
+ static final String PREF_HOMEPAGE = "homepage";
+ static final String PREF_SYNC_WITH_CHROME = "sync_with_chrome";
+
+ // ----------------------
+ // Keys for hidden_debug_preferences.xml
+ // ----------------------
+ static final String PREF_ENABLE_LIGHT_TOUCH = "enable_light_touch";
+ static final String PREF_ENABLE_NAV_DUMP = "enable_nav_dump";
+ static final String PREF_ENABLE_TRACING = "enable_tracing";
+ static final String PREF_ENABLE_VISUAL_INDICATOR = "enable_visual_indicator";
+ static final String PREF_JAVASCRIPT_CONSOLE = "javascript_console";
+ static final String PREF_JS_ENGINE_FLAGS = "js_engine_flags";
+ static final String PREF_NORMAL_LAYOUT = "normal_layout";
+ static final String PREF_SMALL_SCREEN = "small_screen";
+ static final String PREF_WIDE_VIEWPORT = "wide_viewport";
+
+ // ----------------------
+ // Keys for lab_preferences.xml
+ // ----------------------
+ static final String PREF_ENABLE_QUICK_CONTROLS = "enable_quick_controls";
+ static final String PREF_USE_MOST_VISITED_HOMEPAGE = "use_most_visited_homepage";
+ static final String PREF_USE_INSTANT_SEARCH = "use_instant_search";
+ static final String PREF_FULLSCREEN = "fullscreen";
+
+ // ----------------------
+ // Keys for privacy_security_preferences.xml
+ // ----------------------
+ static final String PREF_ACCEPT_COOKIES = "accept_cookies";
+ static final String PREF_ENABLE_GEOLOCATION = "enable_geolocation";
+ static final String PREF_PRIVACY_CLEAR_CACHE = "privacy_clear_cache";
+ static final String PREF_PRIVACY_CLEAR_COOKIES = "privacy_clear_cookies";
+ static final String PREF_PRIVACY_CLEAR_FORM_DATA = "privacy_clear_form_data";
+ static final String PREF_PRIVACY_CLEAR_GEOLOCATION_ACCESS = "privacy_clear_geolocation_access";
+ static final String PREF_PRIVACY_CLEAR_HISTORY = "privacy_clear_history";
+ static final String PREF_PRIVACY_CLEAR_PASSWORDS = "privacy_clear_passwords";
+ static final String PREF_REMEMBER_PASSWORDS = "remember_passwords";
+ static final String PREF_SAVE_FORMDATA = "save_formdata";
+ static final String PREF_SHOW_SECURITY_WARNINGS = "show_security_warnings";
+
+}
diff --git a/src/com/android/browser/SuggestionsAdapter.java b/src/com/android/browser/SuggestionsAdapter.java
index ecdaa15..91ee501 100644
--- a/src/com/android/browser/SuggestionsAdapter.java
+++ b/src/com/android/browser/SuggestionsAdapter.java
@@ -71,6 +71,7 @@
final Object mResultsLock = new Object();
List<String> mVoiceResults;
boolean mIncognitoMode;
+ BrowserSettings mSettings;
interface CompletionListener {
@@ -82,6 +83,7 @@
public SuggestionsAdapter(Context ctx, CompletionListener listener) {
mContext = ctx;
+ mSettings = BrowserSettings.getInstance();
mListener = listener;
mLinesPortrait = mContext.getResources().
getInteger(R.integer.max_suggest_lines_portrait);
@@ -276,7 +278,7 @@
}
private boolean shouldProcessEmptyQuery() {
- final SearchEngine searchEngine = BrowserSettings.getInstance().getSearchEngine();
+ final SearchEngine searchEngine = mSettings.getSearchEngine();
return searchEngine.wantsEmptyQuery();
}
@@ -541,7 +543,7 @@
if (mCursor != null) {
mCursor.close();
}
- SearchEngine searchEngine = BrowserSettings.getInstance().getSearchEngine();
+ SearchEngine searchEngine = mSettings.getSearchEngine();
if (!TextUtils.isEmpty(constraint)) {
if (searchEngine != null && searchEngine.supportsSuggestions()) {
mCursor = searchEngine.getSuggestions(mContext, constraint.toString());
@@ -560,7 +562,7 @@
}
private boolean useInstant() {
- return BrowserSettings.getInstance().useInstant();
+ return mSettings.useInstantSearch();
}
public void clearCache() {
diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java
index 863fc95..3508005 100644
--- a/src/com/android/browser/Tab.java
+++ b/src/com/android/browser/Tab.java
@@ -139,6 +139,7 @@
DownloadTouchIcon mTouchIconLoader;
private Bitmap mScreenshot;
+ private BrowserSettings mSettings;
// All the state needed for a page
private static class PageState {
@@ -313,7 +314,9 @@
mVoiceSearchData.mLastVoiceSearchTitle
= mVoiceSearchData.mVoiceSearchResults.get(index);
if (mInForeground) {
- mWebViewController.activateVoiceSearchMode(mVoiceSearchData.mLastVoiceSearchTitle);
+ mWebViewController.activateVoiceSearchMode(
+ mVoiceSearchData.mLastVoiceSearchTitle,
+ mVoiceSearchData.mVoiceSearchResults);
}
if (mVoiceSearchData.mVoiceSearchHtmls != null) {
// When index was found it was already ensured that it was valid
@@ -709,7 +712,7 @@
setLockIconType(LockIcon.LOCK_ICON_UNSECURE);
return;
}
- if (BrowserSettings.getInstance().showSecurityWarnings()) {
+ if (mSettings.showSecurityWarnings()) {
final LayoutInflater factory =
LayoutInflater.from(mActivity);
final View warningsView =
@@ -1015,7 +1018,7 @@
public void onExceededDatabaseQuota(String url,
String databaseIdentifier, long currentQuota, long estimatedSize,
long totalUsedQuota, WebStorage.QuotaUpdater quotaUpdater) {
- BrowserSettings.getInstance().getWebStorageSizeManager()
+ mSettings.getWebStorageSizeManager()
.onExceededDatabaseQuota(url, databaseIdentifier,
currentQuota, estimatedSize, totalUsedQuota,
quotaUpdater);
@@ -1034,7 +1037,7 @@
@Override
public void onReachedMaxAppCacheSize(long spaceNeeded,
long totalUsedQuota, WebStorage.QuotaUpdater quotaUpdater) {
- BrowserSettings.getInstance().getWebStorageSizeManager()
+ mSettings.getWebStorageSizeManager()
.onReachedMaxAppCacheSize(spaceNeeded, totalUsedQuota,
quotaUpdater);
}
@@ -1172,10 +1175,7 @@
if (disableAutoFill.isChecked()) {
// Disable autofill and show a toast with how to turn it on again.
- BrowserSettings s = BrowserSettings.getInstance();
- s.addObserver(mMainView.getSettings());
- s.disableAutoFill(mActivity);
- s.update();
+ mSettings.setAutofillEnabled(false);
Toast.makeText(mActivity,
R.string.autofill_setup_dialog_negative_toast,
Toast.LENGTH_LONG).show();
@@ -1294,10 +1294,12 @@
String url) {
mWebViewController = wvcontroller;
mActivity = mWebViewController.getActivity();
+ mSettings = BrowserSettings.getInstance();
mCloseOnExit = closeOnExit;
mAppId = appId;
mDataController = DataController.getInstance(mActivity);
- mCurrentState = new PageState(mActivity, w.isPrivateBrowsingEnabled());
+ mCurrentState = new PageState(mActivity, w != null
+ ? w.isPrivateBrowsingEnabled() : false);
mInPageLoad = false;
mInForeground = false;
@@ -1366,7 +1368,6 @@
void destroy() {
if (mMainView != null) {
dismissSubWindow();
- BrowserSettings.getInstance().deleteObserver(mMainView.getSettings());
// save the WebView to call destroy() after detach it from the tab
WebView webView = mMainView;
setWebView(null);
@@ -1428,8 +1429,6 @@
void dismissSubWindow() {
if (mSubView != null) {
mWebViewController.endActionMode();
- BrowserSettings.getInstance().deleteObserver(
- mSubView.getSettings());
mSubView.destroy();
mSubView = null;
mSubViewContainer = null;
diff --git a/src/com/android/browser/TabBar.java b/src/com/android/browser/TabBar.java
index 1d17cb3..31c0740 100644
--- a/src/com/android/browser/TabBar.java
+++ b/src/com/android/browser/TabBar.java
@@ -16,7 +16,7 @@
package com.android.browser;
-import com.android.browser.ScrollWebView.ScrollListener;
+import com.android.browser.BrowserWebView.ScrollListener;
import android.animation.Animator;
import android.animation.Animator.AnimatorListener;
@@ -202,7 +202,7 @@
mUi.hideTitleBar();
} else {
mUi.stopWebViewScrolling();
- mUi.showTitleBarAndEdit();
+ mUi.editUrl(false);
}
} else if (mUi.isTitleBarShowing() && !isLoading()) {
mUi.stopEditingUrl();
diff --git a/src/com/android/browser/TabControl.java b/src/com/android/browser/TabControl.java
index af9928a..07c9fa5 100644
--- a/src/com/android/browser/TabControl.java
+++ b/src/com/android/browser/TabControl.java
@@ -16,11 +16,8 @@
package com.android.browser;
-import com.android.browser.IntentHandler.UrlData;
-
import android.os.Bundle;
import android.util.Log;
-import android.webkit.WebBackForwardList;
import android.webkit.WebView;
import java.io.File;
diff --git a/src/com/android/browser/TitleBar.java b/src/com/android/browser/TitleBar.java
deleted file mode 100644
index 686416c..0000000
--- a/src/com/android/browser/TitleBar.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * Copyright (C) 2009 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.Activity;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.content.res.Resources;
-import android.graphics.drawable.Drawable;
-import android.speech.RecognizerIntent;
-import android.text.SpannableString;
-import android.text.Spanned;
-import android.text.TextUtils;
-import android.text.style.ImageSpan;
-import android.view.ContextMenu;
-import android.view.LayoutInflater;
-import android.view.MenuInflater;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.View.OnFocusChangeListener;
-import android.widget.ImageButton;
-import android.widget.ImageView;
-
-/**
- * This class represents a title bar for a particular "tab" or "window" in the
- * browser.
- */
-public class TitleBar extends TitleBarBase implements OnFocusChangeListener,
- OnClickListener {
-
- private Activity mActivity;
- private ImageButton mBookmarkButton;
- private PageProgressView mHorizontalProgress;
- private ImageButton mStopButton;
- private Drawable mBookmarkDrawable;
- private Drawable mVoiceDrawable;
- private boolean mInLoad;
- private Intent mVoiceSearchIntent;
- private ImageSpan mArcsSpan;
-
- public TitleBar(Activity activity, UiController controller, PhoneUi ui) {
- super(activity, controller, ui);
- LayoutInflater factory = LayoutInflater.from(activity);
- factory.inflate(R.layout.title_bar, this);
- mActivity = activity;
-
- mUrlInput = (UrlInputView) findViewById(R.id.url_input);
- mUrlInput.setCompoundDrawablePadding(5);
- mUrlInput.setContainer(this);
- mUrlInput.setSelectAllOnFocus(true);
- mUrlInput.setController(mUiController);
- mUrlInput.setUrlInputListener(this);
- mUrlInput.setOnFocusChangeListener(this);
-
- mLockIcon = (ImageView) findViewById(R.id.lock);
- mFavicon = (ImageView) findViewById(R.id.favicon);
- mStopButton = (ImageButton) findViewById(R.id.stop);
- mBookmarkButton = (ImageButton) findViewById(R.id.bookmark);
- mStopButton.setOnClickListener(this);
- mBookmarkButton.setOnClickListener(this);
-
- mHorizontalProgress = (PageProgressView) findViewById(
- R.id.progress_horizontal);
- mVoiceSearchIntent = new Intent(RecognizerIntent.ACTION_WEB_SEARCH);
- mVoiceSearchIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
- RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH);
- // This extra tells voice search not to send the application id in its
- // results intent - http://b/2546173
- //
- // TODO: Make a constant for this extra.
- mVoiceSearchIntent.putExtra("android.speech.extras.SEND_APPLICATION_ID_EXTRA",
- false);
- PackageManager pm = activity.getPackageManager();
- ResolveInfo ri = pm.resolveActivity(mVoiceSearchIntent,
- PackageManager.MATCH_DEFAULT_ONLY);
- Resources resources = getResources();
- if (ri == null) {
- mVoiceSearchIntent = null;
- } else {
- mVoiceDrawable = resources.getDrawable(
- android.R.drawable.ic_btn_speak_now);
- }
- mBookmarkDrawable = mBookmarkButton.getDrawable();
- mArcsSpan = new ImageSpan(activity, R.drawable.arcs,
- ImageSpan.ALIGN_BASELINE);
- }
-
- @Override
- public void createContextMenu(ContextMenu menu) {
- MenuInflater inflater = mActivity.getMenuInflater();
- inflater.inflate(R.menu.title_context, menu);
- mActivity.onCreateContextMenu(menu, this, null);
- }
-
- /**
- * Change the TitleBar to or from voice mode. If there is no package to
- * handle voice search, the TitleBar cannot be set to voice mode.
- */
- @Override
- void setInVoiceMode(boolean inVoiceMode) {
- if (mInVoiceMode == inVoiceMode) return;
- mInVoiceMode = inVoiceMode && mVoiceSearchIntent != null;
- Drawable titleDrawable;
- if (mInVoiceMode) {
- mBookmarkButton.setImageDrawable(mVoiceDrawable);
- mUrlInput.setEllipsize(null);
- mBookmarkButton.setVisibility(View.VISIBLE);
- mStopButton.setVisibility(View.GONE);
- } else {
- if (mInLoad) {
- mBookmarkButton.setVisibility(View.GONE);
- mStopButton.setVisibility(View.VISIBLE);
- } else {
- mBookmarkButton.setVisibility(View.VISIBLE);
- mStopButton.setVisibility(View.GONE);
- mBookmarkButton.setImageDrawable(mBookmarkDrawable);
- }
- mUrlInput.setEllipsize(TextUtils.TruncateAt.END);
- }
- mUrlInput.setSingleLine(!mInVoiceMode);
- }
-
- /**
- * Update the progress, from 0 to 100.
- */
- @Override
- void setProgress(int newProgress) {
- if (newProgress >= PROGRESS_MAX) {
- mHorizontalProgress.setVisibility(View.GONE);
- if (!mInVoiceMode) {
- mBookmarkButton.setImageDrawable(mBookmarkDrawable);
- mBookmarkButton.setVisibility(View.VISIBLE);
- mStopButton.setVisibility(View.GONE);
- }
- mInLoad = false;
- } else {
- mHorizontalProgress.setProgress(newProgress * PageProgressView.MAX_PROGRESS
- / PROGRESS_MAX);
- if (!mInLoad) {
- mHorizontalProgress.setVisibility(View.VISIBLE);
- if (!mInVoiceMode) {
- mBookmarkButton.setVisibility(View.GONE);
- mStopButton.setVisibility(View.VISIBLE);
- }
- mInLoad = true;
- }
- }
- }
-
- /**
- * Update the text displayed in the title bar.
- * @param title String to display. If null, the new tab string will be
- * shown.
- */
- @Override
- void setDisplayTitle(String title) {
- if (title == null) {
- mUrlInput.setText(R.string.new_tab);
- } else {
- if (mInVoiceMode) {
- // Add two spaces. The second one will be replaced with an
- // image, and the first one will put space between it and the
- // text
- SpannableString spannable = new SpannableString(title + " ");
- int end = spannable.length();
- spannable.setSpan(mArcsSpan, end - 1, end,
- Spanned.SPAN_MARK_POINT);
- mUrlInput.setText(spannable);
- } else {
- mUrlInput.setText(title);
- }
- }
- }
-
- @Override
- public void onFocusChange(View v, boolean hasFocus) {
- if (v == mUrlInput && hasFocus) {
- mActivity.closeOptionsMenu();
- }
- }
-
- @Override
- public void onClick(View v) {
- if (v == mStopButton) {
- mUiController.stopLoading();
- } else if (v == mBookmarkButton) {
- mUiController.bookmarkCurrentPage(AddBookmarkPage.DEFAULT_FOLDER_ID,
- true);
- }
- }
-
- @Override
- public void setCurrentUrlIsBookmark(boolean isBookmark) {
- mBookmarkButton.setActivated(isBookmark);
- }
-}
diff --git a/src/com/android/browser/TitleBarBase.java b/src/com/android/browser/TitleBarBase.java
index 601d35f..4dc960c 100644
--- a/src/com/android/browser/TitleBarBase.java
+++ b/src/com/android/browser/TitleBarBase.java
@@ -16,29 +16,51 @@
package com.android.browser;
+import com.android.browser.UI.DropdownChangeListener;
import com.android.browser.UrlInputView.UrlInputListener;
+import com.android.browser.autocomplete.SuggestedTextController.TextChangeWatcher;
+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.graphics.Bitmap;
-import android.graphics.Color;
-import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
-import android.graphics.drawable.LayerDrawable;
-import android.graphics.drawable.PaintDrawable;
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.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.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.LinearLayout;
+import android.widget.ProgressBar;
+import android.widget.RelativeLayout;
+import android.widget.Spinner;
+import android.widget.TextView;
+
+import java.util.List;
/**
* Base class for a title bar used by the browser.
*/
-public class TitleBarBase extends LinearLayout implements UrlInputListener {
+public class TitleBarBase extends RelativeLayout
+ implements OnClickListener, OnFocusChangeListener, UrlInputListener,
+ TextChangeWatcher, DeviceAccountLogin.AutoLoginCallback {
protected static final int PROGRESS_MAX = 100;
@@ -46,22 +68,206 @@
protected ImageView mFavicon;
protected ImageView mLockIcon;
- protected Drawable mGenericFavicon;
protected UiController mUiController;
protected BaseUi mBaseUi;
+ protected FrameLayout mParent;
+ protected PageProgressView mProgress;
protected UrlInputView mUrlInput;
protected boolean mInVoiceMode;
+ protected View mContainer;
- public TitleBarBase(Context context, UiController controller, BaseUi ui) {
+
+ // 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;
- mGenericFavicon = context.getResources().getDrawable(
- R.drawable.app_web_browser_sm);
+ mParent = parent;
}
- /* package */ void setProgress(int newProgress) {}
- /* package */ void setDisplayTitle(String title) {}
+ 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 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);
+ 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);
+ 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;
@@ -74,52 +280,206 @@
}
/* package */ void setFavicon(Bitmap icon) {
- assert mFavicon != null;
- Drawable[] array = new Drawable[3];
- array[0] = new PaintDrawable(Color.BLACK);
- PaintDrawable p = new PaintDrawable(Color.WHITE);
- array[1] = p;
- if (icon == null) {
- array[2] = mGenericFavicon;
- } else {
- array[2] = new BitmapDrawable(icon);
- }
- LayerDrawable d = new LayerDrawable(array);
- d.setLayerInset(1, 1, 1, 1, 1);
- d.setLayerInset(2, 2, 2, 2, 2);
- mFavicon.setImageDrawable(d);
- }
-
- /* package */ void setInVoiceMode(boolean inVoiceMode) {}
-
- /* package */ void setIncognitoMode(boolean incognito) {}
-
- void setTitleGravity(int gravity) {
- int newTop = 0;
- int newLeft = 0;
- View parent = (View) getParent();
- if (parent != null) {
- newLeft = parent.getScrollX();
- }
- if (gravity != Gravity.NO_GRAVITY) {
- if (parent != null) {
- if (gravity == Gravity.TOP) {
- newTop = parent.getScrollY();
- } else if (gravity == Gravity.BOTTOM) {
- newTop = parent.getScrollY() + parent.getHeight() - getHeight();
- }
- }
- }
- AbsoluteLayout.LayoutParams lp = (AbsoluteLayout.LayoutParams) getLayoutParams();
- if (lp != null) {
- lp.x = newLeft;
- lp.y = newTop;
- setLayoutParams(lp);
- }
+ mFavicon.setImageDrawable(mBaseUi.getFaviconDrawable(icon));
}
public int getEmbeddedHeight() {
- return getHeight();
+ 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;
+ }
+
+ @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);
+ }
+ }
+ }
+
+ @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) {
+ 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);
+ }
+ }
+ }
+ mUrlInput.clearNeedsUpdate();
+ }
+
+ protected void setFocusState(boolean focus) {
+ if (focus) {
+ updateSearchMode(false);
+ }
+ }
+
+ protected void updateSearchMode(boolean userEdited) {
+ setSearchMode(!userEdited || TextUtils.isEmpty(mUrlInput.getUserText()));
+ }
+
+ 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()) {
+ // check if input field is empty and adjust voice search state
+ updateSearchMode(true);
+ // 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
@@ -183,4 +543,58 @@
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/TitleBarPhone.java b/src/com/android/browser/TitleBarPhone.java
new file mode 100644
index 0000000..9242f99
--- /dev/null
+++ b/src/com/android/browser/TitleBarPhone.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2009 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 com.android.browser.autocomplete.SuggestedTextController.TextChangeWatcher;
+
+import android.app.Activity;
+import android.content.Context;
+import android.view.ContextMenu;
+import android.view.MenuInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.View.OnFocusChangeListener;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+
+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 {
+
+ private Activity mActivity;
+ private ImageView mStopButton;
+ private ImageView mVoiceButton;
+ private boolean mHasLockIcon;
+
+ public TitleBarPhone(Activity activity, UiController controller, PhoneUi ui,
+ FrameLayout parent) {
+ super(activity, controller, ui, parent);
+ mActivity = activity;
+ initLayout(activity, R.layout.title_bar);
+ }
+
+ @Override
+ protected void initLayout(Context context, int layoutId) {
+ super.initLayout(context, layoutId);
+ mLockIcon = (ImageView) findViewById(R.id.lock);
+ mFavicon = (ImageView) findViewById(R.id.favicon);
+ mStopButton = (ImageView) findViewById(R.id.stop);
+ mStopButton.setOnClickListener(this);
+ mVoiceButton = (ImageView) findViewById(R.id.voice);
+ mVoiceButton.setOnClickListener(this);
+ setFocusState(false);
+ }
+
+ @Override
+ public void createContextMenu(ContextMenu menu) {
+ MenuInflater inflater = mActivity.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);
+ }
+
+ @Override
+ protected void setSearchMode(boolean voiceSearchEnabled) {
+ boolean showvoicebutton = voiceSearchEnabled &&
+ mUiController.supportsVoiceSearch();
+ mVoiceButton.setVisibility(showvoicebutton ? View.VISIBLE :
+ View.GONE);
+ }
+
+ @Override
+ protected void setFocusState(boolean focus) {
+ super.setFocusState(focus);
+ if (focus) {
+ mHasLockIcon = (mLockIcon.getVisibility() == View.VISIBLE);
+ mLockIcon.setVisibility(View.GONE);
+ mStopButton.setVisibility(View.GONE);
+ mVoiceButton.setVisibility(View.VISIBLE);
+ } else {
+ mLockIcon.setVisibility(mHasLockIcon ? View.VISIBLE : View.GONE);
+ if (mInLoad) {
+ mStopButton.setVisibility(View.VISIBLE);
+ } else {
+ mStopButton.setVisibility(View.GONE);
+ }
+ mVoiceButton.setVisibility(View.GONE);
+ }
+ }
+
+ @Override
+ protected void onProgressStarted() {
+ setFocusState(mUrlInput.hasFocus());
+ }
+
+ @Override
+ protected void onProgressStopped() {
+ setFocusState(mUrlInput.hasFocus());
+ }
+
+ /**
+ * Update the text displayed in the title bar.
+ * @param title String to display. If null, the new tab string will be
+ * shown.
+ */
+ @Override
+ void setDisplayTitle(String title) {
+ if (title == null) {
+ mUrlInput.setText(R.string.new_tab);
+ } else {
+ mUrlInput.setText(title);
+ }
+ }
+
+ @Override
+ public void onFocusChange(View v, boolean hasFocus) {
+ if (v == mUrlInput) {
+ if (hasFocus) {
+ mActivity.closeOptionsMenu();
+ }
+ }
+ super.onFocusChange(v, hasFocus);
+ if (!hasFocus) {
+ mBaseUi.hideTitleBar();
+ }
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (v == mStopButton) {
+ mUiController.stopLoading();
+ } else if (v == mVoiceButton) {
+ mUiController.startVoiceSearch();
+ } else {
+ super.onClick(v);
+ }
+ }
+
+}
diff --git a/src/com/android/browser/TitleBarXLarge.java b/src/com/android/browser/TitleBarXLarge.java
index 5f02002..567b35a 100644
--- a/src/com/android/browser/TitleBarXLarge.java
+++ b/src/com/android/browser/TitleBarXLarge.java
@@ -16,37 +16,21 @@
package com.android.browser;
-import com.android.browser.UI.DropdownChangeListener;
import com.android.browser.autocomplete.SuggestedTextController.TextChangeWatcher;
-import com.android.browser.search.SearchEngine;
-import android.accounts.Account;
import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;
-import android.view.ContextThemeWrapper;
-import android.view.KeyEvent;
-import android.view.LayoutInflater;
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.webkit.WebView;
-import android.widget.AbsoluteLayout;
-import android.widget.ArrayAdapter;
-import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.ImageView;
-import android.widget.ProgressBar;
-import android.widget.Spinner;
-import android.widget.TextView;
import java.util.List;
@@ -62,37 +46,23 @@
private Drawable mStopDrawable;
private Drawable mReloadDrawable;
- private View mContainer;
+ private View mUrlContainer;
private ImageButton mBackButton;
private ImageButton mForwardButton;
private ImageView mStar;
private ImageView mUrlIcon;
private ImageView mSearchButton;
- private View mUrlContainer;
private View mGoButton;
private ImageView mStopButton;
private View mAllButton;
private View mClearButton;
private ImageView mVoiceSearch;
- private PageProgressView mProgressView;
private Drawable mFocusDrawable;
private Drawable mUnfocusDrawable;
- // Auto-login UI
- private View mAutoLogin;
- private Spinner mAutoLoginAccount;
- private Button mAutoLoginLogin;
- private ProgressBar mAutoLoginProgress;
- private TextView mAutoLoginError;
- private ImageButton mAutoLoginCancel;
- private DeviceAccountLogin mAutoLoginHandler;
- private ArrayAdapter<String> mAccountsAdapter;
-
- private boolean mInLoad;
- private boolean mUseQuickControls;
public TitleBarXLarge(Activity activity, UiController controller,
- XLargeUi ui) {
- super(activity, controller, ui);
+ XLargeUi ui, FrameLayout parent) {
+ super(activity, controller, ui, parent);
mUi = ui;
Resources resources = activity.getResources();
mStopDrawable = resources.getDrawable(R.drawable.ic_stop_holo_dark);
@@ -102,27 +72,12 @@
mUnfocusDrawable = resources.getDrawable(
R.drawable.textfield_default_holo_dark);
mInVoiceMode = false;
- initLayout(activity);
+ initLayout(activity, R.layout.url_bar);
}
@Override
- void setTitleGravity(int gravity) {
- if (mUseQuickControls) {
- FrameLayout.LayoutParams lp =
- (FrameLayout.LayoutParams) getLayoutParams();
- lp.gravity = gravity;
- setLayoutParams(lp);
- } else {
- super.setTitleGravity(gravity);
- }
- }
-
- private void initLayout(Context context) {
- LayoutInflater factory = LayoutInflater.from(context);
- factory.inflate(R.layout.url_bar, this);
-
- mContainer = findViewById(R.id.taburlbar);
- mUrlInput = (UrlInputView) findViewById(R.id.url_focused);
+ protected void initLayout(Context context, int layoutId) {
+ super.initLayout(context, layoutId);
mAllButton = findViewById(R.id.all_btn);
// TODO: Change enabled states based on whether you can go
// back/forward. Probably should be done inside onPageStarted.
@@ -136,7 +91,6 @@
mGoButton = findViewById(R.id.go);
mClearButton = findViewById(R.id.clear);
mVoiceSearch = (ImageView) findViewById(R.id.voicesearch);
- mProgressView = (PageProgressView) findViewById(R.id.progress);
mUrlContainer = findViewById(R.id.urlbar_focused);
mBackButton.setOnClickListener(this);
mForwardButton.setOnClickListener(this);
@@ -147,23 +101,7 @@
mGoButton.setOnClickListener(this);
mClearButton.setOnClickListener(this);
mVoiceSearch.setOnClickListener(this);
- mUrlInput.setUrlInputListener(this);
mUrlInput.setContainer(mUrlContainer);
- 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 =
- (ImageButton) mAutoLogin.findViewById(R.id.autologin_close);
- mAutoLoginCancel.setOnClickListener(this);
-
setFocusState(false);
}
@@ -179,100 +117,6 @@
}
}
- void updateAutoLogin(Tab tab, boolean animate) {
- DeviceAccountLogin login = tab.getDeviceAccountLogin();
- if (login != null) {
- mAutoLoginHandler = login;
- mAutoLogin.setVisibility(View.VISIBLE);
- 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.GONE);
- 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.GONE);
- mAutoLoginError.setVisibility(View.VISIBLE);
- break;
- case DeviceAccountLogin.INITIAL:
- break;
- default:
- throw new IllegalStateException();
- }
- if (mUseQuickControls) {
- mUi.showTitleBar();
- } else {
- if (animate) {
- mAutoLogin.startAnimation(AnimationUtils.loadAnimation(
- getContext(), R.anim.autologin_enter));
- }
- }
- } else {
- mAutoLoginHandler = null;
- if (mUseQuickControls) {
- mUi.hideTitleBar();
- mAutoLogin.setVisibility(View.GONE);
- mUi.refreshWebView();
- } else {
- if (animate) {
- hideAutoLogin();
- } else if (mAutoLogin.getAnimation() == null) {
- mAutoLogin.setVisibility(View.GONE);
- mUi.refreshWebView();
- }
- }
- }
- }
-
- boolean inAutoLogin() {
- return mAutoLoginHandler != null;
- }
-
- 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 int getEmbeddedHeight() {
- int height = mContainer.getHeight();
- if (mAutoLogin.getVisibility() == View.VISIBLE) {
- height += mAutoLogin.getHeight();
- }
- return height;
- }
-
- void setUseQuickControls(boolean useQuickControls) {
- mUseQuickControls = useQuickControls;
- setLayoutParams(makeLayoutParams());
- }
-
- void setShowProgressOnly(boolean progress) {
- if (progress && !inAutoLogin()) {
- mContainer.setVisibility(View.GONE);
- } else {
- mContainer.setVisibility(View.VISIBLE);
- }
- }
-
@Override
public void onFocusChange(View view, boolean hasFocus) {
// if losing focus and not in touch mode, leave as is
@@ -308,47 +152,6 @@
mStar.setActivated(isBookmark);
}
- /**
- * 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) {
- mProgressView.setVisibility(View.GONE);
- }
- if (!mUrlInput.hasFocus()) {
- mUrlInput.requestFocus();
- }
- if (clearInput) {
- mUrlInput.setText("");
- } else if (mInVoiceMode) {
- mUrlInput.showDropDown();
- }
- }
-
- boolean isEditingUrl() {
- return mUrlInput.hasFocus();
- }
-
- void stopEditingUrl() {
- mUrlInput.clearFocus();
- }
-
- private void hideAutoLogin() {
- Animation anim = AnimationUtils.loadAnimation(
- getContext(), R.anim.autologin_exit);
- anim.setAnimationListener(new AnimationListener() {
- @Override public void onAnimationEnd(Animation a) {
- mAutoLogin.setVisibility(View.GONE);
- mUi.refreshWebView();
- }
- @Override public void onAnimationStart(Animation a) {}
- @Override public void onAnimationRepeat(Animation a) {}
- });
- mAutoLogin.startAnimation(anim);
- }
@Override
public void onClick(View v) {
@@ -374,33 +177,12 @@
clearOrClose();
} else if (mVoiceSearch == v) {
mUiController.startVoiceSearch();
- } else if (mAutoLoginCancel == v) {
- if (mAutoLoginHandler != null) {
- mAutoLoginHandler.cancel();
- mAutoLoginHandler = null;
- }
- hideAutoLogin();
- } 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 {
+ super.onClick(v);
}
}
@Override
- public void loginFailed() {
- mAutoLoginAccount.setEnabled(true);
- mAutoLoginLogin.setEnabled(true);
- mAutoLoginProgress.setVisibility(View.GONE);
- mAutoLoginError.setVisibility(View.VISIBLE);
- }
-
- @Override
void setFavicon(Bitmap icon) { }
private void clearOrClose() {
@@ -413,10 +195,10 @@
}
}
- private void setFocusState(boolean focus) {
+ @Override
+ protected void setFocusState(boolean focus) {
+ super.setFocusState(focus);
if (focus) {
- mUrlInput.setDropDownWidth(mUrlContainer.getWidth());
- mUrlInput.setDropDownHorizontalOffset(-mUrlInput.getLeft());
mSearchButton.setVisibility(View.GONE);
mStar.setVisibility(View.GONE);
mClearButton.setVisibility(View.VISIBLE);
@@ -446,41 +228,25 @@
}
}
- /**
- * Update the progress, from 0 to 100.
- */
@Override
- void setProgress(int newProgress) {
- boolean blockvisuals = mUseQuickControls && isEditingUrl();
- if (newProgress >= PROGRESS_MAX) {
- if (!blockvisuals) {
- mProgressView.setProgress(PageProgressView.MAX_PROGRESS);
- mProgressView.setVisibility(View.GONE);
- mStopButton.setImageDrawable(mReloadDrawable);
- }
- mInLoad = false;
- } else {
- if (!mInLoad) {
- if (!blockvisuals) {
- mProgressView.setVisibility(View.VISIBLE);
- mStopButton.setImageDrawable(mStopDrawable);
- }
- mInLoad = true;
- }
- mProgressView.setProgress(newProgress * PageProgressView.MAX_PROGRESS
- / PROGRESS_MAX);
- }
+ protected void onProgressStarted() {
+ mStopButton.setImageDrawable(mStopDrawable);
}
- private void updateSearchMode(boolean userEdited) {
+ @Override
+ protected void onProgressStopped() {
+ mStopButton.setImageDrawable(mReloadDrawable);
+ }
+
+ @Override
+ protected void updateSearchMode(boolean userEdited) {
setSearchMode(!userEdited || TextUtils.isEmpty(mUrlInput.getUserText()));
}
- private void setSearchMode(boolean voiceSearchEnabled) {
- SearchEngine searchEngine = BrowserSettings.getInstance()
- .getSearchEngine();
+ @Override
+ protected void setSearchMode(boolean voiceSearchEnabled) {
boolean showvoicebutton = voiceSearchEnabled &&
- (searchEngine != null && searchEngine.supportsVoiceSearch());
+ mUiController.supportsVoiceSearch();
mVoiceSearch.setVisibility(showvoicebutton ? View.VISIBLE :
View.GONE);
mGoButton.setVisibility(voiceSearchEnabled ? View.GONE :
@@ -488,45 +254,14 @@
}
@Override
- /* package */ void setDisplayTitle(String title) {
- if (!isEditingUrl()) {
- mUrlInput.setText(title, false);
- }
- }
-
- // UrlInput text watcher
-
- @Override
- public void onTextChanged(String newText) {
- if (mUrlInput.hasFocus()) {
- // check if input field is empty and adjust voice search state
- updateSearchMode(true);
- // clear voice mode when user types
- setInVoiceMode(false, null);
- }
- }
-
- // voicesearch
-
- @Override
- public void setInVoiceMode(boolean voicemode) {
- setInVoiceMode(voicemode, null);
- }
-
public void setInVoiceMode(boolean voicemode, List<String> voiceResults) {
- mInVoiceMode = voicemode;
- mUrlInput.setVoiceResults(voiceResults);
+ super.setInVoiceMode(voicemode, voiceResults);
if (voicemode) {
mUrlIcon.setImageDrawable(mSearchButton.getDrawable());
}
}
@Override
- void setIncognitoMode(boolean incognito) {
- mUrlInput.setIncognitoMode(incognito);
- }
-
- @Override
public View focusSearch(View focused, int dir) {
if (FOCUS_DOWN == dir && hasFocus()) {
return getCurrentWebView();
@@ -534,30 +269,4 @@
return super.focusSearch(focused, dir);
}
- void clearCompletions() {
- mUrlInput.setSuggestedText(null);
- }
-
- @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);
- }
-
- private WebView getCurrentWebView() {
- Tab t = mUi.getActiveTab();
- if (t != null) {
- return t.getWebView();
- } else {
- return null;
- }
- }
-
- void registerDropdownChangeListener(DropdownChangeListener d) {
- mUrlInput.registerDropdownChangeListener(d);
- }
}
diff --git a/src/com/android/browser/UI.java b/src/com/android/browser/UI.java
index 368c829..bb34ada 100644
--- a/src/com/android/browser/UI.java
+++ b/src/com/android/browser/UI.java
@@ -85,7 +85,7 @@
public boolean isCustomViewShowing();
- public void showVoiceTitleBar(String title);
+ public void showVoiceTitleBar(String title, List<String> results);
public void revertVoiceTitleBar(Tab tab);
@@ -132,4 +132,6 @@
void showAutoLogin(Tab tab);
void hideAutoLogin(Tab tab);
+
+ void setFullscreen(boolean enabled);
}
diff --git a/src/com/android/browser/UiController.java b/src/com/android/browser/UiController.java
index 65fa5f8..2b3ee69 100644
--- a/src/com/android/browser/UiController.java
+++ b/src/com/android/browser/UiController.java
@@ -44,6 +44,8 @@
Tab openIncognitoTab();
+ void setActiveTab(Tab tab);
+
boolean switchToTab(int tabIndex);
void closeCurrentTab();
@@ -56,10 +58,10 @@
void bookmarksOrHistoryPicker(boolean openHistory);
- void startSearch(String url);
-
void startVoiceSearch();
+ boolean supportsVoiceSearch();
+
void showVoiceSearchResults(String title);
void editUrl();
diff --git a/src/com/android/browser/UrlHandler.java b/src/com/android/browser/UrlHandler.java
index 03bab9b..fbbc3cf 100644
--- a/src/com/android/browser/UrlHandler.java
+++ b/src/com/android/browser/UrlHandler.java
@@ -37,6 +37,9 @@
*/
public class UrlHandler {
+ static final String RLZ_PROVIDER = "com.google.android.partnersetup.rlzappprovider";
+ static final Uri RLZ_PROVIDER_URI = Uri.parse("content://" + RLZ_PROVIDER + "/");
+
// Use in overrideUrlLoading
/* package */ final static String SCHEME_WTAI = "wtai://wp/";
/* package */ final static String SCHEME_WTAI_MC = "wtai://wp/mc;";
@@ -268,8 +271,7 @@
private boolean rlzProviderPresent() {
if (mIsProviderPresent == null) {
PackageManager pm = mActivity.getPackageManager();
- mIsProviderPresent = pm.resolveContentProvider(
- BrowserSettings.RLZ_PROVIDER, 0) != null;
+ mIsProviderPresent = pm.resolveContentProvider(RLZ_PROVIDER, 0) != null;
}
return mIsProviderPresent;
}
@@ -280,7 +282,7 @@
if (mRlzUri == null) {
String ap = mActivity.getResources()
.getString(R.string.rlz_access_point);
- mRlzUri = Uri.withAppendedPath(BrowserSettings.RLZ_PROVIDER_URI, ap);
+ mRlzUri = Uri.withAppendedPath(RLZ_PROVIDER_URI, ap);
}
return mRlzUri;
}
diff --git a/src/com/android/browser/UrlInputView.java b/src/com/android/browser/UrlInputView.java
index 350d772..7545e6a 100644
--- a/src/com/android/browser/UrlInputView.java
+++ b/src/com/android/browser/UrlInputView.java
@@ -175,7 +175,7 @@
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
- if (BrowserSettings.getInstance().useInstant() &&
+ if (BrowserSettings.getInstance().useInstantSearch() &&
(actionId == EditorInfo.IME_ACTION_NEXT)) {
// When instant is turned on AND the user chooses to complete
// using the tab key, then use the completion rather than the
@@ -296,4 +296,13 @@
void registerDropdownChangeListener(DropdownChangeListener d) {
mDropdownListener = d;
}
+
+ /*
+ * no-op to prevent scrolling of webview when embedded titlebar
+ * gets edited
+ */
+ @Override
+ public boolean requestRectangleOnScreen(Rect rect, boolean immediate) {
+ return false;
+ }
}
diff --git a/src/com/android/browser/WebViewController.java b/src/com/android/browser/WebViewController.java
index 6b44207..93ca410 100644
--- a/src/com/android/browser/WebViewController.java
+++ b/src/com/android/browser/WebViewController.java
@@ -31,6 +31,8 @@
import android.webkit.WebChromeClient;
import android.webkit.WebView;
+import java.util.List;
+
/**
* WebView aspect of the controller
*/
@@ -85,7 +87,7 @@
void onUserCanceledSsl(Tab tab);
- void activateVoiceSearchMode(String title);
+ void activateVoiceSearchMode(String title, List<String> results);
void revertVoiceSearchMode(Tab tab);
diff --git a/src/com/android/browser/XLargeUi.java b/src/com/android/browser/XLargeUi.java
index 8c34fc9..4bfd3cf 100644
--- a/src/com/android/browser/XLargeUi.java
+++ b/src/com/android/browser/XLargeUi.java
@@ -16,26 +16,19 @@
package com.android.browser;
-import com.android.browser.ScrollWebView.ScrollListener;
+import com.android.browser.BrowserWebView.ScrollListener;
-import android.animation.Animator;
-import android.animation.Animator.AnimatorListener;
-import android.animation.ObjectAnimator;
import android.app.ActionBar;
import android.app.Activity;
-import android.content.pm.PackageManager;
-import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.ActionMode;
import android.view.Gravity;
import android.view.KeyEvent;
-import android.view.Menu;
import android.view.View;
import android.webkit.WebChromeClient.CustomViewCallback;
import android.webkit.WebView;
-import android.widget.FrameLayout;
import java.util.List;
@@ -50,8 +43,6 @@
private TabBar mTabBar;
private TitleBarXLarge mTitleBar;
- private Animator mTitleBarAnimator;
- private boolean mSkipTitleBarAnimations;
private boolean mUseQuickControls;
private PieControl mPieControl;
@@ -64,7 +55,8 @@
public XLargeUi(Activity browser, UiController controller) {
super(browser, controller);
mHandler = new Handler();
- mTitleBar = new TitleBarXLarge(mActivity, mUiController, this);
+ mTitleBar = new TitleBarXLarge(mActivity, mUiController, this,
+ mContentView);
mTitleBar.setProgress(100);
mTabBar = new TabBar(mActivity, mUiController, this);
mActionBar = mActivity.getActionBar();
@@ -103,16 +95,16 @@
checkTabCount();
mPieControl = new PieControl(mActivity, mUiController, this);
mPieControl.attachToContainer(mContentView);
- Tab tab = getActiveTab();
- if ((tab != null) && (tab.getWebView() != null)) {
- tab.getWebView().setEmbeddedTitleBar(null);
+ WebView web = getWebView();
+ if (web != null) {
+ web.setEmbeddedTitleBar(null);
}
} else {
mActivity.getActionBar().show();
if (mPieControl != null) {
mPieControl.removeFromContainer(mContentView);
}
- WebView web = mTabControl.getCurrentWebView();
+ WebView web = getWebView();
if (web != null) {
web.setEmbeddedTitleBar(mTitleBar);
}
@@ -134,7 +126,7 @@
@Override
public void onResume() {
super.onResume();
- if (!BrowserSettings.getInstance().useInstant()) {
+ if (!BrowserSettings.getInstance().useInstantSearch()) {
mTitleBar.clearCompletions();
}
}
@@ -149,23 +141,14 @@
@Override
public WebView createWebView(boolean privateBrowsing) {
// Create a new WebView
- ScrollWebView w = new ScrollWebView(mActivity, null,
- android.R.attr.webViewStyle, privateBrowsing);
- initWebViewSettings(w);
+ BrowserWebView w = (BrowserWebView) super.createWebView(privateBrowsing);
w.setScrollListener(this);
- boolean supportsMultiTouch = mActivity.getPackageManager()
- .hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH);
- w.getSettings().setDisplayZoomControls(!supportsMultiTouch);
- w.setExpandedTileBounds(true); // smoother scrolling
return w;
}
@Override
public WebView createSubWebView(boolean privateBrowsing) {
- ScrollWebView web = (ScrollWebView) createWebView(privateBrowsing);
- // no scroll listener for subview
- web.setScrollListener(null);
- return web;
+ return super.createWebView(privateBrowsing);
}
@Override
@@ -174,7 +157,7 @@
}
void stopWebViewScrolling() {
- ScrollWebView web = (ScrollWebView) mUiController.getCurrentWebView();
+ BrowserWebView web = (BrowserWebView) mUiController.getCurrentWebView();
if (web != null) {
web.stopScroll();
}
@@ -188,31 +171,10 @@
mTabBar.onProgress(tab, progress);
if (tab.inForeground()) {
mTitleBar.setProgress(progress);
- if (progress == 100) {
- if (!mTitleBar.isEditingUrl() && !mTitleBar.inAutoLogin()) {
- hideTitleBar();
- if (mUseQuickControls) {
- mTitleBar.setShowProgressOnly(false);
- }
- }
- } else {
- if (!isTitleBarShowing()) {
- if (mUseQuickControls && !mTitleBar.isEditingUrl()) {
- mTitleBar.setShowProgressOnly(true);
- setTitleGravity(Gravity.TOP);
- }
- showTitleBar();
- }
- }
}
}
@Override
- public boolean needsRestoreAllTabs() {
- return true;
- }
-
- @Override
public void addTab(Tab tab) {
mTabBar.onNewTab(tab);
}
@@ -223,9 +185,8 @@
@Override
public void setActiveTab(final Tab tab) {
- cancelTitleBarAnimation(true);
- mSkipTitleBarAnimations = true;
- stopEditingUrl();
+ mTitleBar.cancelTitleBarAnimation(true);
+ mTitleBar.setSkipTitleBarAnimations(true);
if (mUseQuickControls) {
if (mActiveTab != null) {
captureTab(mActiveTab);
@@ -233,12 +194,12 @@
}
super.setActiveTab(tab, true);
setActiveTab(tab, true);
- mSkipTitleBarAnimations = false;
+ mTitleBar.setSkipTitleBarAnimations(false);
}
@Override
void setActiveTab(Tab tab, boolean needsAttaching) {
- ScrollWebView view = (ScrollWebView) tab.getWebView();
+ BrowserWebView view = (BrowserWebView) tab.getWebView();
// TabControl.setCurrentTab has been called before this,
// so the tab is guaranteed to have a webview
if (view == null) {
@@ -259,7 +220,7 @@
}
mTabBar.onSetActiveTab(tab);
if (tab.isInVoiceSearchMode()) {
- showVoiceTitleBar(tab.getVoiceDisplayTitle());
+ showVoiceTitleBar(tab.getVoiceDisplayTitle(), tab.getVoiceSearchResults());
} else {
revertVoiceTitleBar(tab);
}
@@ -267,15 +228,6 @@
tab.getTopWindow().requestFocus();
}
- public void captureTab(final Tab tab) {
- Bitmap sshot = Controller.createScreenshot(tab,
- (int) mActivity.getResources()
- .getDimension(R.dimen.qc_thumb_width),
- (int) mActivity.getResources()
- .getDimension(R.dimen.qc_thumb_height));
- tab.setScreenshot(sshot);
- }
-
@Override
public void updateTabs(List<Tab> tabs) {
mTabBar.updateTabs(tabs);
@@ -284,11 +236,11 @@
@Override
public void removeTab(Tab tab) {
- cancelTitleBarAnimation(true);
- mSkipTitleBarAnimations = true;
+ mTitleBar.cancelTitleBarAnimation(true);
+ mTitleBar.setSkipTitleBarAnimations(true);
super.removeTab(tab);
mTabBar.onRemoveTab(tab);
- mSkipTitleBarAnimations = false;
+ mTitleBar.setSkipTitleBarAnimations(false);
}
protected void onRemoveTabCompleted(Tab tab) {
@@ -304,17 +256,10 @@
@Override
public void editUrl(boolean clearInput) {
- if (mUiController.isInCustomActionMode()) {
- mUiController.endActionMode();
+ if (mUseQuickControls) {
+ getTitleBar().setShowProgressOnly(false);
}
- showTitleBar();
- mTitleBar.startEditingUrl(clearInput);
- }
-
- void showTitleBarAndEdit() {
- mTitleBar.setShowProgressOnly(false);
- showTitleBar();
- mTitleBar.startEditingUrl(false);
+ super.editUrl(clearInput);
}
void stopEditingUrl() {
@@ -324,24 +269,7 @@
@Override
protected void showTitleBar() {
if (canShowTitleBar()) {
- if (mUseQuickControls) {
- mContentView.addView(mTitleBar);
- } else {
- if (!mSkipTitleBarAnimations) {
- cancelTitleBarAnimation(false);
- int visibleHeight = getVisibleTitleHeight();
- float startPos = (-mTitleBar.getEmbeddedHeight() + visibleHeight);
- if (mTitleBar.getTranslationY() != 0) {
- startPos = Math.max(startPos, mTitleBar.getTranslationY());
- }
- mTitleBarAnimator = ObjectAnimator.ofFloat(mTitleBar,
- "translationY",
- startPos, 0);
- mTitleBarAnimator.start();
- }
- setTitleGravity(Gravity.TOP);
- }
- super.showTitleBar();
+ mTitleBar.show();
mTabBar.onShowTitleBar();
}
}
@@ -350,66 +278,10 @@
protected void hideTitleBar() {
if (isTitleBarShowing()) {
mTabBar.onHideTitleBar();
- if (mUseQuickControls) {
- mContentView.removeView(mTitleBar);
- } else {
- if (!mSkipTitleBarAnimations) {
- cancelTitleBarAnimation(false);
- int visibleHeight = getVisibleTitleHeight();
- mTitleBarAnimator = ObjectAnimator.ofFloat(mTitleBar,
- "translationY", mTitleBar.getTranslationY(),
- (-mTitleBar.getEmbeddedHeight() + visibleHeight));
- mTitleBarAnimator.addListener(mHideTileBarAnimatorListener);
- mTitleBarAnimator.start();
- } else {
- setTitleGravity(Gravity.NO_GRAVITY);
- }
- }
- super.hideTitleBar();
+ mTitleBar.hide();
}
}
- private void cancelTitleBarAnimation(boolean reset) {
- if (mTitleBarAnimator != null) {
- mTitleBarAnimator.cancel();
- mTitleBarAnimator = null;
- }
- if (reset) {
- mTitleBar.setTranslationY(0);
- }
- }
-
- private int getVisibleTitleHeight() {
- WebView webview = mActiveTab != null ? mActiveTab.getWebView() : null;
- return webview != null ? webview.getVisibleTitleHeight() : 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) {
- mTitleBar.setTranslationY(0);
- }
- setTitleGravity(Gravity.NO_GRAVITY);
- }
-
- @Override
- public void onAnimationCancel(Animator animation) {
- mWasCanceled = true;
- }
- };
-
public boolean isEditingUrl() {
return mTitleBar.isEditingUrl();
}
@@ -421,12 +293,7 @@
@Override
protected void setTitleGravity(int gravity) {
- if (mUseQuickControls) {
- FrameLayout.LayoutParams lp =
- (FrameLayout.LayoutParams) mTitleBar.getLayoutParams();
- lp.gravity = gravity;
- mTitleBar.setLayoutParams(lp);
- } else {
+ if (!mUseQuickControls) {
super.setTitleGravity(gravity);
}
}
@@ -460,18 +327,6 @@
}
@Override
- protected void updateAutoLogin(Tab tab, boolean animate) {
- mTitleBar.updateAutoLogin(tab, animate);
- }
-
- protected void refreshWebView() {
- Tab tab = getActiveTab();
- if ((tab != null) && (tab.getWebView() != null)) {
- tab.getWebView().invalidate();
- }
- }
-
- @Override
public void setUrlTitle(Tab tab) {
super.setUrlTitle(tab);
mTabBar.onUrlAndTitle(tab, tab.getUrl(), tab.getTitle());
@@ -485,11 +340,7 @@
}
@Override
- public void showVoiceTitleBar(String title) {
- List<String> vsresults = null;
- if (getActiveTab() != null) {
- vsresults = getActiveTab().getVoiceSearchResults();
- }
+ public void showVoiceTitleBar(String title, List<String> vsresults) {
mTitleBar.setInVoiceMode(true, vsresults);
mTitleBar.setDisplayTitle(title);
}
@@ -549,19 +400,4 @@
return mTabBar;
}
- @Override
- public void registerDropdownChangeListener(DropdownChangeListener d) {
- mTitleBar.registerDropdownChangeListener(d);
- }
-
- @Override
- public boolean onPrepareOptionsMenu(Menu menu) {
- if (mUseQuickControls) {
- mPieControl.onMenuOpened(menu);
- return false;
- } else {
- return true;
- }
- }
-
}
diff --git a/src/com/android/browser/autocomplete/SuggestiveAutoCompleteTextView.java b/src/com/android/browser/autocomplete/SuggestiveAutoCompleteTextView.java
index e51a629..50ba758 100644
--- a/src/com/android/browser/autocomplete/SuggestiveAutoCompleteTextView.java
+++ b/src/com/android/browser/autocomplete/SuggestiveAutoCompleteTextView.java
@@ -752,7 +752,7 @@
}
private void updateText(SuggestionsAdapter adapter) {
- if (!BrowserSettings.getInstance().useInstant()) {
+ if (!BrowserSettings.getInstance().useInstantSearch()) {
return;
}
diff --git a/src/com/android/browser/preferences/AccessibilityPreferencesFragment.java b/src/com/android/browser/preferences/AccessibilityPreferencesFragment.java
new file mode 100644
index 0000000..99bd687
--- /dev/null
+++ b/src/com/android/browser/preferences/AccessibilityPreferencesFragment.java
@@ -0,0 +1,84 @@
+/*
+ * 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.preferences;
+
+import com.android.browser.PreferenceKeys;
+import com.android.browser.R;
+
+import android.content.res.Resources;
+import android.os.Bundle;
+import android.preference.Preference;
+import android.preference.PreferenceFragment;
+import android.view.View;
+
+public class AccessibilityPreferencesFragment extends PreferenceFragment
+ implements Preference.OnPreferenceChangeListener {
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ addPreferencesFromResource(R.xml.accessibility_preferences);
+
+ Preference e = findPreference(PreferenceKeys.PREF_TEXT_SIZE);
+ e.setOnPreferenceChangeListener(this);
+ e.setSummary(getVisualTextSizeName(
+ getPreferenceScreen().getSharedPreferences()
+ .getString(PreferenceKeys.PREF_TEXT_SIZE, null)) );
+ }
+
+ @Override
+ public void onViewCreated(View view, Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ getListView().setItemsCanFocus(true);
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference pref, Object objValue) {
+ if (getActivity() == null) {
+ // We aren't attached, so don't accept preferences changes from the
+ // invisible UI.
+ return false;
+ }
+
+ if (pref.getKey().equals(PreferenceKeys.PREF_TEXT_SIZE)) {
+ pref.setSummary(getVisualTextSizeName((String) objValue));
+ return true;
+ }
+ return false;
+ }
+
+ private CharSequence getVisualTextSizeName(String enumName) {
+ Resources res = getActivity().getResources();
+ CharSequence[] visualNames = res.getTextArray(R.array.pref_text_size_choices);
+ CharSequence[] enumNames = res.getTextArray(R.array.pref_text_size_values);
+
+ // Sanity check
+ if (visualNames.length != enumNames.length) {
+ return "";
+ }
+
+ int length = enumNames.length;
+ for (int i = 0; i < length; i++) {
+ if (enumNames[i].equals(enumName)) {
+ return visualNames[i];
+ }
+ }
+
+ return "";
+ }
+
+}
\ No newline at end of file
diff --git a/src/com/android/browser/preferences/AdvancedPreferencesFragment.java b/src/com/android/browser/preferences/AdvancedPreferencesFragment.java
index e2e45f5..2cc504e 100644
--- a/src/com/android/browser/preferences/AdvancedPreferencesFragment.java
+++ b/src/com/android/browser/preferences/AdvancedPreferencesFragment.java
@@ -17,7 +17,7 @@
package com.android.browser.preferences;
import com.android.browser.BrowserActivity;
-import com.android.browser.BrowserSettings;
+import com.android.browser.PreferenceKeys;
import com.android.browser.R;
import android.content.Intent;
@@ -46,28 +46,22 @@
addPreferencesFromResource(R.xml.advanced_preferences);
PreferenceScreen websiteSettings = (PreferenceScreen) findPreference(
- BrowserSettings.PREF_WEBSITE_SETTINGS);
+ PreferenceKeys.PREF_WEBSITE_SETTINGS);
websiteSettings.setFragment(WebsiteSettingsFragment.class.getName());
- Preference e = findPreference(BrowserSettings.PREF_TEXT_SIZE);
- e.setOnPreferenceChangeListener(this);
- e.setSummary(getVisualTextSizeName(
- getPreferenceScreen().getSharedPreferences()
- .getString(BrowserSettings.PREF_TEXT_SIZE, null)) );
-
- e = findPreference(BrowserSettings.PREF_DEFAULT_ZOOM);
+ Preference e = findPreference(PreferenceKeys.PREF_DEFAULT_ZOOM);
e.setOnPreferenceChangeListener(this);
e.setSummary(getVisualDefaultZoomName(
getPreferenceScreen().getSharedPreferences()
- .getString(BrowserSettings.PREF_DEFAULT_ZOOM, null)) );
+ .getString(PreferenceKeys.PREF_DEFAULT_ZOOM, null)) );
- e = findPreference(BrowserSettings.PREF_DEFAULT_TEXT_ENCODING);
+ e = findPreference(PreferenceKeys.PREF_DEFAULT_TEXT_ENCODING);
e.setOnPreferenceChangeListener(this);
- e = findPreference(BrowserSettings.PREF_EXTRAS_RESET_DEFAULTS);
+ e = findPreference(PreferenceKeys.PREF_RESET_DEFAULT_PREFERENCES);
e.setOnPreferenceChangeListener(this);
- e = findPreference(BrowserSettings.PREF_PLUGIN_STATE);
+ e = findPreference(PreferenceKeys.PREF_PLUGIN_STATE);
e.setOnPreferenceChangeListener(this);
updatePluginSummary((ListPreference) e);
}
@@ -85,7 +79,7 @@
public void onResume() {
super.onResume();
final PreferenceScreen websiteSettings = (PreferenceScreen) findPreference(
- BrowserSettings.PREF_WEBSITE_SETTINGS);
+ PreferenceKeys.PREF_WEBSITE_SETTINGS);
websiteSettings.setEnabled(false);
WebStorage.getInstance().getOrigins(new ValueCallback<Map>() {
@Override
@@ -114,23 +108,20 @@
return false;
}
- if (pref.getKey().equals(BrowserSettings.PREF_TEXT_SIZE)) {
- pref.setSummary(getVisualTextSizeName((String) objValue));
- return true;
- } else if (pref.getKey().equals(BrowserSettings.PREF_DEFAULT_ZOOM)) {
+ if (pref.getKey().equals(PreferenceKeys.PREF_DEFAULT_ZOOM)) {
pref.setSummary(getVisualDefaultZoomName((String) objValue));
return true;
- } else if (pref.getKey().equals(BrowserSettings.PREF_DEFAULT_TEXT_ENCODING)) {
+ } else if (pref.getKey().equals(PreferenceKeys.PREF_DEFAULT_TEXT_ENCODING)) {
pref.setSummary((String) objValue);
return true;
- } else if (pref.getKey().equals(BrowserSettings.PREF_EXTRAS_RESET_DEFAULTS)) {
+ } else if (pref.getKey().equals(PreferenceKeys.PREF_RESET_DEFAULT_PREFERENCES)) {
Boolean value = (Boolean) objValue;
if (value.booleanValue() == true) {
startActivity(new Intent(BrowserActivity.ACTION_RESTART, null,
getActivity(), BrowserActivity.class));
return true;
}
- } else if (pref.getKey().equals(BrowserSettings.PREF_PLUGIN_STATE)) {
+ } else if (pref.getKey().equals(PreferenceKeys.PREF_PLUGIN_STATE)) {
ListPreference lp = (ListPreference) pref;
lp.setValue((String) objValue);
updatePluginSummary(lp);
@@ -139,26 +130,6 @@
return false;
}
- private CharSequence getVisualTextSizeName(String enumName) {
- Resources res = getActivity().getResources();
- CharSequence[] visualNames = res.getTextArray(R.array.pref_text_size_choices);
- CharSequence[] enumNames = res.getTextArray(R.array.pref_text_size_values);
-
- // Sanity check
- if (visualNames.length != enumNames.length) {
- return "";
- }
-
- int length = enumNames.length;
- for (int i = 0; i < length; i++) {
- if (enumNames[i].equals(enumName)) {
- return visualNames[i];
- }
- }
-
- return "";
- }
-
private CharSequence getVisualDefaultZoomName(String enumName) {
Resources res = getActivity().getResources();
CharSequence[] visualNames = res.getTextArray(R.array.pref_default_zoom_choices);
diff --git a/src/com/android/browser/preferences/DebugPreferencesFragment.java b/src/com/android/browser/preferences/DebugPreferencesFragment.java
index 0a82371..984c12a 100644
--- a/src/com/android/browser/preferences/DebugPreferencesFragment.java
+++ b/src/com/android/browser/preferences/DebugPreferencesFragment.java
@@ -18,21 +18,14 @@
import com.android.browser.BrowserActivity;
import com.android.browser.BrowserSettings;
-import com.android.browser.Controller;
+import com.android.browser.PreferenceKeys;
import com.android.browser.R;
-import android.content.Context;
import android.content.Intent;
-import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
-import android.preference.PreferenceActivity.Header;
import android.preference.PreferenceFragment;
-import android.preference.PreferenceManager.OnActivityResultListener;
-
-import java.io.IOException;
-import java.io.Serializable;
public class DebugPreferencesFragment extends PreferenceFragment
implements OnPreferenceChangeListener {
@@ -43,11 +36,7 @@
// Load the XML preferences file
addPreferencesFromResource(R.xml.debug_preferences);
- if (BrowserSettings.getInstance().showDebugSettings()) {
- addPreferencesFromResource(R.xml.hidden_debug_preferences);
- }
-
- Preference e = findPreference(BrowserSettings.PREF_HARDWARE_ACCEL);
+ Preference e = findPreference(PreferenceKeys.PREF_ENABLE_HARDWARE_ACCEL);
e.setOnPreferenceChangeListener(this);
}
diff --git a/src/com/android/browser/preferences/GeneralPreferencesFragment.java b/src/com/android/browser/preferences/GeneralPreferencesFragment.java
index 0c63ab5..879b95d 100644
--- a/src/com/android/browser/preferences/GeneralPreferencesFragment.java
+++ b/src/com/android/browser/preferences/GeneralPreferencesFragment.java
@@ -19,7 +19,7 @@
import com.android.browser.BrowserBookmarksPage;
import com.android.browser.BrowserHomepagePreference;
import com.android.browser.BrowserPreferencesPage;
-import com.android.browser.BrowserSettings;
+import com.android.browser.PreferenceKeys;
import com.android.browser.R;
import com.android.browser.widget.BookmarkThumbnailWidgetProvider;
@@ -62,10 +62,10 @@
// Load the XML preferences file
addPreferencesFromResource(R.xml.general_preferences);
- Preference e = findPreference(BrowserSettings.PREF_HOMEPAGE);
+ Preference e = findPreference(PreferenceKeys.PREF_HOMEPAGE);
e.setOnPreferenceChangeListener(this);
e.setSummary(getPreferenceScreen().getSharedPreferences()
- .getString(BrowserSettings.PREF_HOMEPAGE, null));
+ .getString(PreferenceKeys.PREF_HOMEPAGE, null));
((BrowserHomepagePreference) e).setCurrentPage(
getActivity().getIntent().getStringExtra(BrowserPreferencesPage.CURRENT_PAGE));
mSharedPrefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
@@ -81,7 +81,7 @@
return false;
}
- if (pref.getKey().equals(BrowserSettings.PREF_HOMEPAGE)) {
+ if (pref.getKey().equals(PreferenceKeys.PREF_HOMEPAGE)) {
pref.setSummary((String) objValue);
return true;
}
@@ -202,8 +202,8 @@
new GetAccountsTask(getActivity()).execute();
PreferenceScreen autoFillSettings =
- (PreferenceScreen)findPreference(BrowserSettings.PREF_AUTOFILL_PROFILE);
- autoFillSettings.setDependency(BrowserSettings.PREF_AUTOFILL_ENABLED);
+ (PreferenceScreen)findPreference(PreferenceKeys.PREF_AUTOFILL_PROFILE);
+ autoFillSettings.setDependency(PreferenceKeys.PREF_AUTOFILL_ENABLED);
}
@Override
diff --git a/src/com/android/browser/preferences/LabPreferencesFragment.java b/src/com/android/browser/preferences/LabPreferencesFragment.java
index a06dc3e..f99b96d 100644
--- a/src/com/android/browser/preferences/LabPreferencesFragment.java
+++ b/src/com/android/browser/preferences/LabPreferencesFragment.java
@@ -18,6 +18,7 @@
import com.android.browser.BrowserActivity;
import com.android.browser.BrowserSettings;
+import com.android.browser.PreferenceKeys;
import com.android.browser.R;
import com.android.browser.search.SearchEngine;
@@ -41,22 +42,26 @@
// Load the XML preferences file
addPreferencesFromResource(R.xml.lab_preferences);
- Preference e = findPreference(BrowserSettings.PREF_QUICK_CONTROLS);
- e.setOnPreferenceChangeListener(this);
- useInstantPref = findPreference(BrowserSettings.PREF_USE_INSTANT);
+ Preference e = findPreference(PreferenceKeys.PREF_ENABLE_QUICK_CONTROLS);
+ if (e != null) {
+ e.setOnPreferenceChangeListener(this);
+ }
+ useInstantPref = findPreference(PreferenceKeys.PREF_USE_INSTANT_SEARCH);
}
@Override
public void onResume() {
super.onResume();
- useInstantPref.setEnabled(false);
+ if (useInstantPref != null) {
+ useInstantPref.setEnabled(false);
- // Enable the "use instant" preference only if the selected
- // search engine is google.
- if (mBrowserSettings.getSearchEngine() != null) {
- final String currentName = mBrowserSettings.getSearchEngine().getName();
- if (SearchEngine.GOOGLE.equals(currentName)) {
- useInstantPref.setEnabled(true);
+ // Enable the "use instant" preference only if the selected
+ // search engine is google.
+ if (mBrowserSettings.getSearchEngine() != null) {
+ final String currentName = mBrowserSettings.getSearchEngine().getName();
+ if (SearchEngine.GOOGLE.equals(currentName)) {
+ useInstantPref.setEnabled(true);
+ }
}
}
}
diff --git a/src/com/android/browser/preferences/MinFontSizePreference.java b/src/com/android/browser/preferences/MinFontSizePreference.java
new file mode 100644
index 0000000..22092b0
--- /dev/null
+++ b/src/com/android/browser/preferences/MinFontSizePreference.java
@@ -0,0 +1,170 @@
+/*
+ * 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.preferences;
+
+import com.android.browser.R;
+
+import android.content.Context;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.preference.Preference;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.SeekBar;
+import android.widget.SeekBar.OnSeekBarChangeListener;
+
+public class MinFontSizePreference extends Preference implements OnSeekBarChangeListener {
+
+ // range from 1:6..24
+ static final int MIN = 5;
+ static final int MAX = 23;
+ private int mProgress;
+ View mRoot;
+
+ public MinFontSizePreference(
+ Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ public MinFontSizePreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public MinFontSizePreference(Context context) {
+ super(context);
+ }
+
+ @Override
+ public View getView(View convertView, ViewGroup parent) {
+ if (mRoot == null) {
+ LayoutInflater inflater = LayoutInflater.from(getContext());
+ mRoot = inflater.inflate(R.layout.min_font_size, parent, false);
+ SeekBar seek = (SeekBar) mRoot.findViewById(R.id.seekbar);
+ seek.setMax((MAX - MIN));
+ seek.setProgress(mProgress);
+ seek.setOnSeekBarChangeListener(this);
+ }
+ return mRoot;
+ }
+
+ @Override
+ protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
+ mProgress = restoreValue ? getPersistedInt(mProgress)
+ : (Integer) defaultValue;
+ mProgress -= 1;
+ }
+
+ @Override
+ public void onProgressChanged(
+ SeekBar seekBar, int progress, boolean fromUser) {
+ if (fromUser) {
+ if (progress == 0) {
+ persistInt(1);
+ } else {
+ persistInt(progress + MIN + 1);
+ }
+ }
+ mRoot.invalidate();
+ }
+
+ @Override
+ public void onStartTrackingTouch(SeekBar seekBar) {
+ }
+
+ @Override
+ public void onStopTrackingTouch(SeekBar seekBar) {
+ }
+
+
+ @Override
+ protected Parcelable onSaveInstanceState() {
+ /*
+ * Suppose a client uses this preference type without persisting. We
+ * must save the instance state so it is able to, for example, survive
+ * orientation changes.
+ */
+
+ final Parcelable superState = super.onSaveInstanceState();
+ if (isPersistent()) {
+ // No need to save instance state since it's persistent
+ return superState;
+ }
+
+ // Save the instance state
+ final SavedState myState = new SavedState(superState);
+ myState.progress = mProgress;
+ return myState;
+ }
+
+ @Override
+ protected void onRestoreInstanceState(Parcelable state) {
+ if (!state.getClass().equals(SavedState.class)) {
+ // Didn't save state for us in onSaveInstanceState
+ super.onRestoreInstanceState(state);
+ return;
+ }
+
+ // Restore the instance state
+ SavedState myState = (SavedState) state;
+ super.onRestoreInstanceState(myState.getSuperState());
+ mProgress = myState.progress;
+ notifyChanged();
+ }
+
+ /**
+ * SavedState, a subclass of {@link BaseSavedState}, will store the state
+ * of MyPreference, a subclass of Preference.
+ * <p>
+ * It is important to always call through to super methods.
+ */
+ private static class SavedState extends BaseSavedState {
+ int progress;
+
+ public SavedState(Parcel source) {
+ super(source);
+
+ // Restore the click counter
+ progress = source.readInt();
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ super.writeToParcel(dest, flags);
+
+ // Save the click counter
+ dest.writeInt(progress);
+ }
+
+ public SavedState(Parcelable superState) {
+ super(superState);
+ }
+
+ public static final Parcelable.Creator<SavedState> CREATOR =
+ new Parcelable.Creator<SavedState>() {
+ public SavedState createFromParcel(Parcel in) {
+ return new SavedState(in);
+ }
+
+ public SavedState[] newArray(int size) {
+ return new SavedState[size];
+ }
+ };
+ }
+
+}
diff --git a/src/com/android/browser/preferences/PrivacySecurityPreferencesFragment.java b/src/com/android/browser/preferences/PrivacySecurityPreferencesFragment.java
index 2266608..35e6e43 100644
--- a/src/com/android/browser/preferences/PrivacySecurityPreferencesFragment.java
+++ b/src/com/android/browser/preferences/PrivacySecurityPreferencesFragment.java
@@ -16,7 +16,7 @@
package com.android.browser.preferences;
-import com.android.browser.BrowserSettings;
+import com.android.browser.PreferenceKeys;
import com.android.browser.R;
import android.app.Activity;
@@ -28,18 +28,14 @@
public class PrivacySecurityPreferencesFragment extends PreferenceFragment
implements Preference.OnPreferenceChangeListener {
- private BrowserSettings mSettings;
-
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- mSettings = BrowserSettings.getInstance();
-
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.privacy_security_preferences);
- Preference e = findPreference(BrowserSettings.PREF_CLEAR_HISTORY);
+ Preference e = findPreference(PreferenceKeys.PREF_PRIVACY_CLEAR_HISTORY);
e.setOnPreferenceChangeListener(this);
}
@@ -50,7 +46,7 @@
@Override
public boolean onPreferenceChange(Preference pref, Object objValue) {
- if (pref.getKey().equals(BrowserSettings.PREF_CLEAR_HISTORY)
+ if (pref.getKey().equals(PreferenceKeys.PREF_PRIVACY_CLEAR_HISTORY)
&& ((Boolean) objValue).booleanValue() == true) {
// Need to tell the browser to remove the parent/child relationship
// between tabs
diff --git a/src/com/android/browser/preferences/WebViewPreview.java b/src/com/android/browser/preferences/WebViewPreview.java
new file mode 100644
index 0000000..a269dbd
--- /dev/null
+++ b/src/com/android/browser/preferences/WebViewPreview.java
@@ -0,0 +1,106 @@
+/*
+ * 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.preferences;
+
+import com.android.browser.BrowserSettings;
+import com.android.browser.R;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
+import android.content.res.Resources;
+import android.preference.Preference;
+import android.preference.PreferenceManager;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.webkit.WebSettings;
+import android.webkit.WebView;
+
+public class WebViewPreview extends Preference implements OnSharedPreferenceChangeListener {
+
+ // 80 char line width limit? Rules are made to be broken.
+ static final String HTML_FORMAT = "<html><head><style type=\"text/css\">p { margin: 2px auto;}</style><body><p style=\"font-size: .4em\">%s</p><p style=\"font-size: .7em\">%s</p><p style=\"font-size: 1em\">%s</p><p style=\"font-size: 1.3em\">%s</p><p style=\"font-size: 1.6em\">%s</p></body></html>";
+
+ String HTML;
+ private View mRoot;
+ private WebView mWebView;
+
+ public WebViewPreview(
+ Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ init(context);
+ }
+
+ public WebViewPreview(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ init(context);
+ }
+
+ public WebViewPreview(Context context) {
+ super(context);
+ init(context);
+ }
+
+ void init(Context context) {
+ Resources res = context.getResources();
+ Object[] visualNames = res.getStringArray(R.array.pref_text_size_choices);
+ HTML = String.format(HTML_FORMAT, visualNames);
+ }
+
+ void updatePreview() {
+ if (mWebView == null) return;
+
+ WebSettings ws = mWebView.getSettings();
+ BrowserSettings bs = BrowserSettings.getInstance();
+ ws.setMinimumFontSize(bs.getMinimumFontSize());
+ ws.setTextSize(bs.getTextSize());
+ mWebView.loadData(HTML, "text/html", "utf-8");
+ }
+
+ @Override
+ public View getView(View convertView, ViewGroup parent) {
+ if (mWebView == null) {
+ LayoutInflater inflater = LayoutInflater.from(getContext());
+ mRoot = inflater.inflate(R.layout.webview_preview, parent, false);
+ mWebView = (WebView) mRoot.findViewById(R.id.webview);
+ mWebView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
+ }
+ updatePreview();
+ return mRoot;
+ }
+
+ @Override
+ protected void onAttachedToHierarchy(PreferenceManager preferenceManager) {
+ super.onAttachedToHierarchy(preferenceManager);
+ getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
+ }
+
+ @Override
+ protected void onPrepareForRemoval() {
+ getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
+ super.onPrepareForRemoval();
+ }
+
+ @Override
+ public void onSharedPreferenceChanged(
+ SharedPreferences sharedPreferences, String key) {
+ updatePreview();
+ }
+
+}
diff --git a/src/com/android/browser/search/SearchEngines.java b/src/com/android/browser/search/SearchEngines.java
index a159f17..fd967f9 100644
--- a/src/com/android/browser/search/SearchEngines.java
+++ b/src/com/android/browser/search/SearchEngines.java
@@ -32,7 +32,7 @@
private static final String TAG = "SearchEngines";
public static SearchEngine getDefaultSearchEngine(Context context) {
- if (BrowserSettings.getInstance().useInstant()) {
+ if (BrowserSettings.getInstance().useInstantSearch()) {
return new InstantSearchEngine(context, DefaultSearchEngine.create(context));
}
diff --git a/src/com/android/browser/view/StopProgressView.java b/src/com/android/browser/view/StopProgressView.java
new file mode 100644
index 0000000..64fa5d0
--- /dev/null
+++ b/src/com/android/browser/view/StopProgressView.java
@@ -0,0 +1,98 @@
+
+package com.android.browser.view;
+
+import com.android.browser.R;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
+import android.widget.ProgressBar;
+
+
+public class StopProgressView extends ProgressBar {
+
+ Drawable mOverlayDrawable;
+ Drawable mProgressDrawable;
+ int mWidth;
+ int mHeight;
+
+ /**
+ * @param context
+ * @param attrs
+ * @param defStyle
+ * @param styleRes
+ */
+ public StopProgressView(Context context, AttributeSet attrs, int defStyle, int styleRes) {
+ super(context, attrs, defStyle, styleRes);
+ init(attrs);
+ }
+
+ /**
+ * @param context
+ * @param attrs
+ * @param defStyle
+ */
+ public StopProgressView(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ init(attrs);
+ }
+
+ /**
+ * @param context
+ * @param attrs
+ */
+ public StopProgressView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ init(attrs);
+ }
+
+ /**
+ * @param context
+ */
+ public StopProgressView(Context context) {
+ super(context);
+ init(null);
+ }
+
+ private void init(AttributeSet attrs) {
+ mProgressDrawable = getIndeterminateDrawable();
+ setImageDrawable(mContext.getResources()
+ .getDrawable(R.drawable.ic_stop_holo_dark));
+ }
+
+ public void hideProgress() {
+ setIndeterminateDrawable(null);
+ }
+
+ public void showProgress() {
+ setIndeterminateDrawable(mProgressDrawable);
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ super.onLayout(changed, left, top, right, bottom);
+ mWidth = (right - left) * 2 / 3;
+ mHeight = (bottom - top) * 2 / 3;
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+ if (mOverlayDrawable != null) {
+ int l = (getWidth() - mWidth) / 2;
+ int t = (getHeight() - mHeight) / 2;
+ mOverlayDrawable.setBounds(l, t, l + mWidth, t + mHeight);
+ mOverlayDrawable.draw(canvas);
+ }
+ }
+
+ public Drawable getDrawable() {
+ return mOverlayDrawable;
+ }
+
+ public void setImageDrawable(Drawable d) {
+ mOverlayDrawable = d;
+ }
+
+}
diff --git a/src/com/android/browser/view/TabHolderView.java b/src/com/android/browser/view/TabHolderView.java
new file mode 100644
index 0000000..c5a2b32
--- /dev/null
+++ b/src/com/android/browser/view/TabHolderView.java
@@ -0,0 +1,52 @@
+/*
+ * 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.view;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.widget.LinearLayout;
+
+public class TabHolderView extends LinearLayout {
+
+ /**
+ * @param context
+ * @param attrs
+ * @param defStyle
+ */
+ public TabHolderView(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ /**
+ * @param context
+ * @param attrs
+ */
+ public TabHolderView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ /**
+ * @param context
+ */
+ public TabHolderView(Context context) {
+ super(context);
+ }
+
+ @Override
+ public void setPressed(boolean p) {}
+
+}