am 91ca6ba6: am 93265e4b: am ea5e14db: Merge "Unused variables in AddNewBookmark"
* commit '91ca6ba651a8fd6275db09a66faf8610a8ea15d8':
Unused variables in AddNewBookmark
diff --git a/Android.mk b/Android.mk
index e015dda..a5a47b3 100644
--- a/Android.mk
+++ b/Android.mk
@@ -4,7 +4,8 @@
LOCAL_MODULE_TAGS := optional
LOCAL_STATIC_JAVA_LIBRARIES := \
- android-common
+ android-common \
+ guava
LOCAL_SRC_FILES := \
$(call all-java-files-under, src) \
@@ -12,6 +13,8 @@
LOCAL_PACKAGE_NAME := Browser
+LOCAL_PROGUARD_FLAG_FILES := proguard.flags
+
LOCAL_EMMA_COVERAGE_FILTER := *,-com.android.common.*
include $(BUILD_PACKAGE)
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index dc8f599..955687b 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -25,20 +25,23 @@
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
- <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/>
+ <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission android:name="android.permission.INTERNET" />
+ <uses-permission android:name="android.permission.SEND_DOWNLOAD_COMPLETED_INTENTS" />
<uses-permission android:name="android.permission.SET_WALLPAPER" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
+ <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
<uses-permission android:name="com.android.browser.permission.READ_HISTORY_BOOKMARKS"/>
<uses-permission android:name="com.android.browser.permission.WRITE_HISTORY_BOOKMARKS"/>
- <uses-permission android:name="android.permission.SEND_DOWNLOAD_COMPLETED_INTENTS" />
+ <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/>
<application android:name="Browser"
android:label="@string/application_name"
- android:icon="@drawable/ic_launcher_browser"
+ android:icon="@mipmap/ic_launcher_browser"
android:backupAgent=".BrowserBackupAgent"
+ android:hardwareAccelerated="true"
android:taskAffinity="android.task.browser" >
<provider android:name="BrowserProvider"
@@ -49,12 +52,21 @@
<path-permission android:path="/bookmarks/search_suggest_query"
android:readPermission="android.permission.GLOBAL_SEARCH" />
</provider>
+ <provider android:name=".provider.BrowserProvider2"
+ android:authorities="com.android.browser"
+ android:multiprocess="true"
+ android:readPermission="com.android.browser.permission.READ_HISTORY_BOOKMARKS"
+ android:writePermission="com.android.browser.permission.WRITE_HISTORY_BOOKMARKS">
+ <path-permission android:path="/bookmarks/search_suggest_query"
+ android:readPermission="android.permission.GLOBAL_SEARCH" />
+ </provider>
<activity android:name="BrowserActivity"
android:label="@string/application_name"
android:launchMode="singleTask"
android:alwaysRetainTaskState="true"
android:configChanges="orientation|keyboardHidden"
android:theme="@style/BrowserTheme"
+ android:hardwareAccelerated="false"
android:windowSoftInputMode="adjustResize" >
<intent-filter>
<action android:name="android.speech.action.VOICE_SEARCH_RESULTS" />
@@ -85,6 +97,16 @@
<data android:mimeType="application/xhtml+xml"/>
<data android:mimeType="application/vnd.wap.xhtml+xml"/>
</intent-filter>
+ <!-- For viewing saved web archives. -->
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.BROWSABLE" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:scheme="http" />
+ <data android:scheme="https" />
+ <data android:scheme="file" />
+ <data android:mimeType="application/x-webarchive-xml"/>
+ </intent-filter>
<!-- We are also the main entry point of the browser. -->
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -119,50 +141,33 @@
<meta-data android:name="android.app.searchable"
android:resource="@xml/searchable" />
</activity>
-
- <activity android:name="CombinedBookmarkHistoryActivity" android:label="@string/bookmarks"
- android:excludeFromRecents="true"
- android:launchMode="singleTop" android:configChanges="orientation|keyboardHidden"
- android:theme="@style/BookmarkTheme" >
- <meta-data android:name="android.app.default_searchable"
- android:value=".BrowserActivity" />
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- </intent-filter>
- </activity>
-
<activity android:name="BrowserBookmarksPage" android:label="@string/bookmarks"
android:launchMode="singleTop" android:configChanges="orientation|keyboardHidden">
</activity>
- <activity-alias android:name="ShortcutBookmarksPage"
- android:targetActivity="BrowserBookmarksPage"
+ <activity android:name="ShortcutActivity"
+ android:theme="@style/ShortcutTheme"
android:label="@string/shortcut_bookmark"
- android:icon="@drawable/ic_launcher_shortcut_browser_bookmark">
+ android:icon="@mipmap/ic_launcher_shortcut_browser_bookmark">
<intent-filter>
<action android:name="android.intent.action.CREATE_SHORTCUT" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
- </activity-alias>
+ </activity>
<activity android:name="BrowserDownloadPage" android:label=""
android:configChanges="orientation|keyboardHidden">
</activity>
- <activity android:name="BrowserPreferencesPage" android:label="@string/menu_preferences"
- android:configChanges="orientation|keyboardHidden">
+ <activity android:name="BrowserPreferencesPage" android:label="@string/menu_preferences">
</activity>
<activity android:name="BrowserHistoryPage" android:label=""
android:configChanges="orientation|keyboardHidden">
</activity>
- <activity android:name="WebsiteSettingsActivity" android:label=""
- android:configChanges="orientation|keyboardHidden">
- </activity>
-
<activity android:name="BookmarkSearch"
android:label="@string/bookmarks_search"
android:stateNotNeeded="true"
@@ -176,8 +181,10 @@
android:resource="@xml/bookmarks_searchable" />
</activity>
- <activity android:name="AddBookmarkPage" android:label="Save bookmark" android:theme="@android:style/Theme.Dialog"
- android:configChanges="orientation|keyboardHidden" android:windowSoftInputMode="stateHidden">
+ <activity android:name="AddBookmarkPage" android:label="Save bookmark"
+ android:theme="@style/Dialog"
+ android:configChanges="orientation|keyboardHidden"
+ android:windowSoftInputMode="stateHidden">
<intent-filter>
<action android:name="android.intent.action.INSERT" />
<category android:name="android.intent.category.DEFAULT" />
@@ -185,22 +192,42 @@
</intent-filter>
</activity>
- <!--receiver android:name=".widget.BookmarkWidgetProvider" android:label="@string/bookmarks">
- <intent-filter>
- <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
- </intent-filter>
- <meta-data android:name="android.appwidget.provider" android:resource="@xml/bookmarkwidget"/>
- </receiver>
+ <activity android:name="SaveToHomescreenDialog" android:label="Save to homescreen" android:theme="@android:style/Theme.Dialog"
+ android:configChanges="orientation|keyboardHidden" android:windowSoftInputMode="stateHidden">
+ </activity>
- <service android:name=".widget.BookmarkWidgetService" /-->
+ <!-- Bookmark list homescreen widget -->
+ <receiver
+ android:name=".widget.BookmarkListWidgetProvider"
+ android:label="@string/bookmarks">
+ <intent-filter>
+ <action
+ android:name="android.appwidget.action.APPWIDGET_UPDATE" />
+ <action
+ android:name="com.android.browser.BOOKMARK_APPWIDGET_UPDATE" />
+ </intent-filter>
+ <meta-data
+ android:name="android.appwidget.provider"
+ android:resource="@xml/bookmarklistwidget_info" />
+ </receiver>
+ <service
+ android:name=".widget.BookmarkListWidgetService"
+ android:exported="true" />
<!-- Makes .BrowserActivity the search target for any activity in Browser -->
<meta-data android:name="android.app.default_searchable" android:value=".BrowserActivity" />
+ <!-- Application code for RLZ tracking. RLZ assigns non-unique, non-personally identifiable
+ tracking labels to client products; these labels sometimes appear in Google search
+ queries. See http://code.google.com/p/rlz for more info.
+
+ This value signifies to the RLZ client that this application uses RLZ tracking. -->
+ <meta-data android:name="com.google.android.partnersetup.RLZ_ACCESS_POINT"
+ android:value="@string/rlz_access_point" />
+
<receiver android:name=".OpenDownloadReceiver">
<intent-filter>
<action android:name="android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED"/>
- <data android:scheme="content" android:mimeType="vnd.android.cursor.item/download"/>
</intent-filter>
</receiver>
</application>
diff --git a/CleanSpec.mk b/CleanSpec.mk
index b84e1b6..722b4a4 100644
--- a/CleanSpec.mk
+++ b/CleanSpec.mk
@@ -43,6 +43,7 @@
#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/core_intermediates)
#$(call add-clean-step, find $(OUT_DIR) -type f -name "IGTalkSession*" -print0 | xargs -0 rm -f)
#$(call add-clean-step, rm -rf $(PRODUCT_OUT)/data/*)
+$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/Browser_intermediates)
# ************************************************
# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
diff --git a/proguard.flags b/proguard.flags
new file mode 100644
index 0000000..888c238
--- /dev/null
+++ b/proguard.flags
@@ -0,0 +1,2 @@
+# Most of the classes in this package are fragments only referenced from XML
+-keep class com.android.browser.preferences.*
diff --git a/res/anim/dialog_exit.xml b/res/anim/dialog_exit.xml
deleted file mode 100644
index dacb5c3..0000000
--- a/res/anim/dialog_exit.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 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.
--->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android"
- android:interpolator="@android:anim/accelerate_interpolator">
- <translate android:fromYDelta="0" android:toYDelta="50%" android:duration="50"/>
- <alpha android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="50" />
-</set>
-
diff --git a/res/drawable-hdpi/crumb_divider.9.png b/res/drawable-hdpi/crumb_divider.9.png
new file mode 100644
index 0000000..f748ffa
--- /dev/null
+++ b/res/drawable-hdpi/crumb_divider.9.png
Binary files differ
diff --git a/res/drawable-hdpi/default_video_poster.png b/res/drawable-hdpi/default_video_poster.png
new file mode 100644
index 0000000..9bbaf9c
--- /dev/null
+++ b/res/drawable-hdpi/default_video_poster.png
Binary files differ
diff --git a/res/drawable-hdpi/dialog_divider_horizontal_light.9.png b/res/drawable-hdpi/dialog_divider_horizontal_light.9.png
deleted file mode 100644
index 8659acf..0000000
--- a/res/drawable-hdpi/dialog_divider_horizontal_light.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/divider_vert.9.png b/res/drawable-hdpi/divider_vert.9.png
new file mode 100644
index 0000000..2c5646e
--- /dev/null
+++ b/res/drawable-hdpi/divider_vert.9.png
Binary files differ
diff --git a/res/drawable-hdpi/fav_incognito.png b/res/drawable-hdpi/fav_incognito.png
new file mode 100644
index 0000000..b8acde2
--- /dev/null
+++ b/res/drawable-hdpi/fav_incognito.png
Binary files differ
diff --git a/res/drawable-hdpi/frame_bookmark_thumb_pressed.9.png b/res/drawable-hdpi/frame_bookmark_thumb_pressed.9.png
new file mode 100644
index 0000000..95f3ab5
--- /dev/null
+++ b/res/drawable-hdpi/frame_bookmark_thumb_pressed.9.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_add_string.png b/res/drawable-hdpi/ic_add_string.png
new file mode 100644
index 0000000..0775776
--- /dev/null
+++ b/res/drawable-hdpi/ic_add_string.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_arrow_left.png b/res/drawable-hdpi/ic_arrow_left.png
new file mode 100644
index 0000000..bcbe3f6
--- /dev/null
+++ b/res/drawable-hdpi/ic_arrow_left.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_arrow_right.png b/res/drawable-hdpi/ic_arrow_right.png
new file mode 100644
index 0000000..6095533
--- /dev/null
+++ b/res/drawable-hdpi/ic_arrow_right.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_back_normal.png b/res/drawable-hdpi/ic_back_normal.png
new file mode 100644
index 0000000..1e1b446
--- /dev/null
+++ b/res/drawable-hdpi/ic_back_normal.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_bookmarks_history_normal.png b/res/drawable-hdpi/ic_bookmarks_history_normal.png
new file mode 100644
index 0000000..5110097
--- /dev/null
+++ b/res/drawable-hdpi/ic_bookmarks_history_normal.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_btn_bookmarks.png b/res/drawable-hdpi/ic_btn_bookmarks.png
deleted file mode 100644
index 092590b..0000000
--- a/res/drawable-hdpi/ic_btn_bookmarks.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_btn_close_panel.png b/res/drawable-hdpi/ic_btn_close_panel.png
deleted file mode 100644
index a1327c2..0000000
--- a/res/drawable-hdpi/ic_btn_close_panel.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 04fda7f..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 100755
index 20e1fbc..0000000
--- a/res/drawable-hdpi/ic_btn_find.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_btn_find_next.png b/res/drawable-hdpi/ic_btn_find_next.png
deleted file mode 100644
index b696a6b..0000000
--- a/res/drawable-hdpi/ic_btn_find_next.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_btn_find_prev.png b/res/drawable-hdpi/ic_btn_find_prev.png
deleted file mode 100644
index 5550c5a..0000000
--- a/res/drawable-hdpi/ic_btn_find_prev.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 839915b..0000000
--- a/res/drawable-hdpi/ic_btn_select_all.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_btn_share.png b/res/drawable-hdpi/ic_btn_share.png
deleted file mode 100644
index 44db9b1..0000000
--- a/res/drawable-hdpi/ic_btn_share.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_clear_search.png b/res/drawable-hdpi/ic_clear_search.png
new file mode 100644
index 0000000..e8e67b4
--- /dev/null
+++ b/res/drawable-hdpi/ic_clear_search.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_favorite_off_normal.png b/res/drawable-hdpi/ic_favorite_off_normal.png
new file mode 100644
index 0000000..4741464
--- /dev/null
+++ b/res/drawable-hdpi/ic_favorite_off_normal.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_folder.9.png b/res/drawable-hdpi/ic_folder.9.png
new file mode 100644
index 0000000..c1c9d54
--- /dev/null
+++ b/res/drawable-hdpi/ic_folder.9.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_forward_normal.png b/res/drawable-hdpi/ic_forward_normal.png
new file mode 100644
index 0000000..1cbf28a
--- /dev/null
+++ b/res/drawable-hdpi/ic_forward_normal.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_go_normal_white.png b/res/drawable-hdpi/ic_go_normal_white.png
new file mode 100644
index 0000000..1ae9ed9
--- /dev/null
+++ b/res/drawable-hdpi/ic_go_normal_white.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_home.png b/res/drawable-hdpi/ic_home.png
new file mode 100644
index 0000000..2b5fd01
--- /dev/null
+++ b/res/drawable-hdpi/ic_home.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_launcher_browser.png b/res/drawable-hdpi/ic_launcher_browser.png
deleted file mode 100644
index f11581f..0000000
--- a/res/drawable-hdpi/ic_launcher_browser.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_launcher_drm_file.png b/res/drawable-hdpi/ic_launcher_drm_file.png
deleted file mode 100644
index 9df1c55..0000000
--- a/res/drawable-hdpi/ic_launcher_drm_file.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_launcher_shortcut_browser_bookmark_icon.png b/res/drawable-hdpi/ic_launcher_shortcut_browser_bookmark_icon.png
deleted file mode 100644
index 57fc915..0000000
--- a/res/drawable-hdpi/ic_launcher_shortcut_browser_bookmark_icon.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_add_bookmark.png b/res/drawable-hdpi/ic_menu_add_bookmark.png
index c54eb7e..28beaaa 100644
--- a/res/drawable-hdpi/ic_menu_add_bookmark.png
+++ b/res/drawable-hdpi/ic_menu_add_bookmark.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_bookmarks.png b/res/drawable-hdpi/ic_menu_bookmarks.png
index fd63499..3644acf 100755
--- a/res/drawable-hdpi/ic_menu_bookmarks.png
+++ b/res/drawable-hdpi/ic_menu_bookmarks.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_downloads.png b/res/drawable-hdpi/ic_menu_downloads.png
new file mode 100644
index 0000000..c85f6a2
--- /dev/null
+++ b/res/drawable-hdpi/ic_menu_downloads.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_downloads_normal.png b/res/drawable-hdpi/ic_menu_downloads_normal.png
new file mode 100644
index 0000000..b1ef0fe
--- /dev/null
+++ b/res/drawable-hdpi/ic_menu_downloads_normal.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_findonpage_normal.png b/res/drawable-hdpi/ic_menu_findonpage_normal.png
new file mode 100644
index 0000000..f4f8f85
--- /dev/null
+++ b/res/drawable-hdpi/ic_menu_findonpage_normal.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_incognito_normal.png b/res/drawable-hdpi/ic_menu_incognito_normal.png
new file mode 100644
index 0000000..dbecf6f
--- /dev/null
+++ b/res/drawable-hdpi/ic_menu_incognito_normal.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_list.png b/res/drawable-hdpi/ic_menu_list.png
deleted file mode 100644
index 2b921b3..0000000
--- a/res/drawable-hdpi/ic_menu_list.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_new_window.png b/res/drawable-hdpi/ic_menu_new_window.png
index 36aee01..fa544fc 100644
--- a/res/drawable-hdpi/ic_menu_new_window.png
+++ b/res/drawable-hdpi/ic_menu_new_window.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_pageinfo.png b/res/drawable-hdpi/ic_menu_pageinfo.png
new file mode 100644
index 0000000..293a021
--- /dev/null
+++ b/res/drawable-hdpi/ic_menu_pageinfo.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_pageinfo_normal.png b/res/drawable-hdpi/ic_menu_pageinfo_normal.png
new file mode 100644
index 0000000..b783a65
--- /dev/null
+++ b/res/drawable-hdpi/ic_menu_pageinfo_normal.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_settings.png b/res/drawable-hdpi/ic_menu_settings.png
new file mode 100644
index 0000000..46be101
--- /dev/null
+++ b/res/drawable-hdpi/ic_menu_settings.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_settings_normal.png b/res/drawable-hdpi/ic_menu_settings_normal.png
new file mode 100644
index 0000000..f07be97
--- /dev/null
+++ b/res/drawable-hdpi/ic_menu_settings_normal.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_share.png b/res/drawable-hdpi/ic_menu_share.png
new file mode 100644
index 0000000..4b69736
--- /dev/null
+++ b/res/drawable-hdpi/ic_menu_share.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_share_normal.png b/res/drawable-hdpi/ic_menu_share_normal.png
new file mode 100644
index 0000000..b50b58f
--- /dev/null
+++ b/res/drawable-hdpi/ic_menu_share_normal.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_thumbnail.png b/res/drawable-hdpi/ic_menu_thumbnail.png
deleted file mode 100644
index 705b02b..0000000
--- a/res/drawable-hdpi/ic_menu_thumbnail.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_windows.png b/res/drawable-hdpi/ic_menu_windows.png
index 0e80009..0a27b95 100644
--- a/res/drawable-hdpi/ic_menu_windows.png
+++ b/res/drawable-hdpi/ic_menu_windows.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_partial_secure.png b/res/drawable-hdpi/ic_partial_secure.png
new file mode 100644
index 0000000..76ba96a
--- /dev/null
+++ b/res/drawable-hdpi/ic_partial_secure.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_pressed.png b/res/drawable-hdpi/ic_pressed.png
new file mode 100644
index 0000000..fd1c7d9
--- /dev/null
+++ b/res/drawable-hdpi/ic_pressed.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_refresh_normal.png b/res/drawable-hdpi/ic_refresh_normal.png
new file mode 100644
index 0000000..9ee3078
--- /dev/null
+++ b/res/drawable-hdpi/ic_refresh_normal.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_search_normal.png b/res/drawable-hdpi/ic_search_normal.png
new file mode 100644
index 0000000..343d2ca
--- /dev/null
+++ b/res/drawable-hdpi/ic_search_normal.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_secure.png b/res/drawable-hdpi/ic_secure.png
new file mode 100644
index 0000000..4f15fc4
--- /dev/null
+++ b/res/drawable-hdpi/ic_secure.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_stop.png b/res/drawable-hdpi/ic_stop.png
new file mode 100644
index 0000000..0f1337f
--- /dev/null
+++ b/res/drawable-hdpi/ic_stop.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_stop_normal.png b/res/drawable-hdpi/ic_stop_normal.png
new file mode 100644
index 0000000..18ca67a
--- /dev/null
+++ b/res/drawable-hdpi/ic_stop_normal.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_tab_close.png b/res/drawable-hdpi/ic_tab_close.png
new file mode 100644
index 0000000..e501486
--- /dev/null
+++ b/res/drawable-hdpi/ic_tab_close.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_web_white.png b/res/drawable-hdpi/ic_web_white.png
new file mode 100644
index 0000000..fec99ca
--- /dev/null
+++ b/res/drawable-hdpi/ic_web_white.png
Binary files differ
diff --git a/res/drawable-hdpi/list_divider_vert.9.png b/res/drawable-hdpi/list_divider_vert.9.png
new file mode 100644
index 0000000..d99730a
--- /dev/null
+++ b/res/drawable-hdpi/list_divider_vert.9.png
Binary files differ
diff --git a/res/drawable-hdpi/progress.9.png b/res/drawable-hdpi/progress.9.png
new file mode 100644
index 0000000..398bee4
--- /dev/null
+++ b/res/drawable-hdpi/progress.9.png
Binary files differ
diff --git a/res/drawable-hdpi/ssl_icon.png b/res/drawable-hdpi/ssl_icon.png
deleted file mode 100644
index 666debc..0000000
--- a/res/drawable-hdpi/ssl_icon.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/tab_selected_bg.9.png b/res/drawable-hdpi/tab_selected_bg.9.png
new file mode 100644
index 0000000..4e0f740
--- /dev/null
+++ b/res/drawable-hdpi/tab_selected_bg.9.png
Binary files differ
diff --git a/res/drawable-hdpi/tab_unselected_bg.9.png b/res/drawable-hdpi/tab_unselected_bg.9.png
new file mode 100644
index 0000000..9ab7c56
--- /dev/null
+++ b/res/drawable-hdpi/tab_unselected_bg.9.png
Binary files differ
diff --git a/res/drawable-hdpi/tabbar_bg.9.png b/res/drawable-hdpi/tabbar_bg.9.png
new file mode 100644
index 0000000..01dabd0
--- /dev/null
+++ b/res/drawable-hdpi/tabbar_bg.9.png
Binary files differ
diff --git a/res/drawable-hdpi/text_field_results.9.png b/res/drawable-hdpi/text_field_results.9.png
new file mode 100644
index 0000000..bd4bcc5
--- /dev/null
+++ b/res/drawable-hdpi/text_field_results.9.png
Binary files differ
diff --git a/res/drawable-hdpi/urlbar_bg.9.png b/res/drawable-hdpi/urlbar_bg.9.png
new file mode 100644
index 0000000..c35383e
--- /dev/null
+++ b/res/drawable-hdpi/urlbar_bg.9.png
Binary files differ
diff --git a/res/drawable-mdpi/crumb_divider.9.png b/res/drawable-mdpi/crumb_divider.9.png
new file mode 100644
index 0000000..8c8fd43
--- /dev/null
+++ b/res/drawable-mdpi/crumb_divider.9.png
Binary files differ
diff --git a/res/drawable/default_video_poster.png b/res/drawable-mdpi/default_video_poster.png
similarity index 100%
rename from res/drawable/default_video_poster.png
rename to res/drawable-mdpi/default_video_poster.png
Binary files differ
diff --git a/res/drawable-mdpi/dialog_divider_horizontal_light.9.png b/res/drawable-mdpi/dialog_divider_horizontal_light.9.png
deleted file mode 100755
index b69619b..0000000
--- a/res/drawable-mdpi/dialog_divider_horizontal_light.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/divider_vert.9.png b/res/drawable-mdpi/divider_vert.9.png
new file mode 100644
index 0000000..2c5646e
--- /dev/null
+++ b/res/drawable-mdpi/divider_vert.9.png
Binary files differ
diff --git a/res/drawable-mdpi/fav_incognito.png b/res/drawable-mdpi/fav_incognito.png
new file mode 100644
index 0000000..6a120b9
--- /dev/null
+++ b/res/drawable-mdpi/fav_incognito.png
Binary files differ
diff --git a/res/drawable-mdpi/frame_bookmark_thumb_pressed.9.png b/res/drawable-mdpi/frame_bookmark_thumb_pressed.9.png
new file mode 100755
index 0000000..8bae932
--- /dev/null
+++ b/res/drawable-mdpi/frame_bookmark_thumb_pressed.9.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_add_string.png b/res/drawable-mdpi/ic_add_string.png
new file mode 100644
index 0000000..e3b95cb
--- /dev/null
+++ b/res/drawable-mdpi/ic_add_string.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_arrow_left.png b/res/drawable-mdpi/ic_arrow_left.png
new file mode 100644
index 0000000..58be4bd
--- /dev/null
+++ b/res/drawable-mdpi/ic_arrow_left.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_arrow_right.png b/res/drawable-mdpi/ic_arrow_right.png
new file mode 100644
index 0000000..6272038
--- /dev/null
+++ b/res/drawable-mdpi/ic_arrow_right.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_back_normal.png b/res/drawable-mdpi/ic_back_normal.png
new file mode 100644
index 0000000..7e09a94
--- /dev/null
+++ b/res/drawable-mdpi/ic_back_normal.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_bookmarks_history_normal.png b/res/drawable-mdpi/ic_bookmarks_history_normal.png
new file mode 100644
index 0000000..60a7b4a
--- /dev/null
+++ b/res/drawable-mdpi/ic_bookmarks_history_normal.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_btn_bookmarks.png b/res/drawable-mdpi/ic_btn_bookmarks.png
deleted file mode 100644
index c307fee..0000000
--- a/res/drawable-mdpi/ic_btn_bookmarks.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_btn_close_panel.png b/res/drawable-mdpi/ic_btn_close_panel.png
deleted file mode 100644
index b6e1ce1..0000000
--- a/res/drawable-mdpi/ic_btn_close_panel.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_btn_find_next.png b/res/drawable-mdpi/ic_btn_find_next.png
deleted file mode 100644
index abdc247..0000000
--- a/res/drawable-mdpi/ic_btn_find_next.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_btn_find_prev.png b/res/drawable-mdpi/ic_btn_find_prev.png
deleted file mode 100644
index 4e3da1d..0000000
--- a/res/drawable-mdpi/ic_btn_find_prev.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_clear_search.png b/res/drawable-mdpi/ic_clear_search.png
new file mode 100644
index 0000000..e8e67b4
--- /dev/null
+++ b/res/drawable-mdpi/ic_clear_search.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_favorite_off_normal.png b/res/drawable-mdpi/ic_favorite_off_normal.png
new file mode 100644
index 0000000..4741464
--- /dev/null
+++ b/res/drawable-mdpi/ic_favorite_off_normal.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_folder.9.png b/res/drawable-mdpi/ic_folder.9.png
new file mode 100644
index 0000000..431aae8
--- /dev/null
+++ b/res/drawable-mdpi/ic_folder.9.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_forward_normal.png b/res/drawable-mdpi/ic_forward_normal.png
new file mode 100644
index 0000000..f306403
--- /dev/null
+++ b/res/drawable-mdpi/ic_forward_normal.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_go_normal_white.png b/res/drawable-mdpi/ic_go_normal_white.png
new file mode 100644
index 0000000..1ae9ed9
--- /dev/null
+++ b/res/drawable-mdpi/ic_go_normal_white.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_home.png b/res/drawable-mdpi/ic_home.png
new file mode 100644
index 0000000..df2dbc6
--- /dev/null
+++ b/res/drawable-mdpi/ic_home.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_launcher_browser.png b/res/drawable-mdpi/ic_launcher_browser.png
deleted file mode 100644
index b76c169..0000000
--- a/res/drawable-mdpi/ic_launcher_browser.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_launcher_drm_file.png b/res/drawable-mdpi/ic_launcher_drm_file.png
deleted file mode 100644
index 57378b2..0000000
--- a/res/drawable-mdpi/ic_launcher_drm_file.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_launcher_shortcut_browser_bookmark_icon.png b/res/drawable-mdpi/ic_launcher_shortcut_browser_bookmark_icon.png
deleted file mode 100644
index ba82911..0000000
--- a/res/drawable-mdpi/ic_launcher_shortcut_browser_bookmark_icon.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_add_bookmark.png b/res/drawable-mdpi/ic_menu_add_bookmark.png
index ce451b3..3e38bb9 100644
--- a/res/drawable-mdpi/ic_menu_add_bookmark.png
+++ b/res/drawable-mdpi/ic_menu_add_bookmark.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_bookmarks.png b/res/drawable-mdpi/ic_menu_bookmarks.png
old mode 100644
new mode 100755
index c6a3cdb..1ac78b6
--- a/res/drawable-mdpi/ic_menu_bookmarks.png
+++ b/res/drawable-mdpi/ic_menu_bookmarks.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_downloads.png b/res/drawable-mdpi/ic_menu_downloads.png
new file mode 100644
index 0000000..9851f60
--- /dev/null
+++ b/res/drawable-mdpi/ic_menu_downloads.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_downloads_normal.png b/res/drawable-mdpi/ic_menu_downloads_normal.png
new file mode 100644
index 0000000..37b6b75
--- /dev/null
+++ b/res/drawable-mdpi/ic_menu_downloads_normal.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_findonpage_normal.png b/res/drawable-mdpi/ic_menu_findonpage_normal.png
new file mode 100644
index 0000000..bea6e44
--- /dev/null
+++ b/res/drawable-mdpi/ic_menu_findonpage_normal.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_incognito_normal.png b/res/drawable-mdpi/ic_menu_incognito_normal.png
new file mode 100644
index 0000000..2e78dc6
--- /dev/null
+++ b/res/drawable-mdpi/ic_menu_incognito_normal.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_list.png b/res/drawable-mdpi/ic_menu_list.png
deleted file mode 100644
index 36bf8d6..0000000
--- a/res/drawable-mdpi/ic_menu_list.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_new_window.png b/res/drawable-mdpi/ic_menu_new_window.png
index 4fdea6c..c767979 100644
--- a/res/drawable-mdpi/ic_menu_new_window.png
+++ b/res/drawable-mdpi/ic_menu_new_window.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_pageinfo.png b/res/drawable-mdpi/ic_menu_pageinfo.png
new file mode 100644
index 0000000..adf5c2a
--- /dev/null
+++ b/res/drawable-mdpi/ic_menu_pageinfo.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_pageinfo_normal.png b/res/drawable-mdpi/ic_menu_pageinfo_normal.png
new file mode 100644
index 0000000..3422e98
--- /dev/null
+++ b/res/drawable-mdpi/ic_menu_pageinfo_normal.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_settings.png b/res/drawable-mdpi/ic_menu_settings.png
new file mode 100644
index 0000000..a98a18b
--- /dev/null
+++ b/res/drawable-mdpi/ic_menu_settings.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_settings_normal.png b/res/drawable-mdpi/ic_menu_settings_normal.png
new file mode 100644
index 0000000..bd2c30a
--- /dev/null
+++ b/res/drawable-mdpi/ic_menu_settings_normal.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_share.png b/res/drawable-mdpi/ic_menu_share.png
new file mode 100644
index 0000000..b09e74d
--- /dev/null
+++ b/res/drawable-mdpi/ic_menu_share.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_share_normal.png b/res/drawable-mdpi/ic_menu_share_normal.png
new file mode 100644
index 0000000..4410baa
--- /dev/null
+++ b/res/drawable-mdpi/ic_menu_share_normal.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_thumbnail.png b/res/drawable-mdpi/ic_menu_thumbnail.png
deleted file mode 100644
index be4ed5e..0000000
--- a/res/drawable-mdpi/ic_menu_thumbnail.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_windows.png b/res/drawable-mdpi/ic_menu_windows.png
index c33de2b..cdc4d83 100644
--- a/res/drawable-mdpi/ic_menu_windows.png
+++ b/res/drawable-mdpi/ic_menu_windows.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_partial_secure.png b/res/drawable-mdpi/ic_partial_secure.png
new file mode 100644
index 0000000..b3ca0cc
--- /dev/null
+++ b/res/drawable-mdpi/ic_partial_secure.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_pressed.png b/res/drawable-mdpi/ic_pressed.png
new file mode 100644
index 0000000..fd1c7d9
--- /dev/null
+++ b/res/drawable-mdpi/ic_pressed.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_refresh_normal.png b/res/drawable-mdpi/ic_refresh_normal.png
new file mode 100644
index 0000000..f8ce51d
--- /dev/null
+++ b/res/drawable-mdpi/ic_refresh_normal.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_search_category_bookmark.png b/res/drawable-mdpi/ic_search_category_bookmark.png
old mode 100755
new mode 100644
index d228408..4b3bd2d
--- a/res/drawable-mdpi/ic_search_category_bookmark.png
+++ b/res/drawable-mdpi/ic_search_category_bookmark.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_search_category_browser.png b/res/drawable-mdpi/ic_search_category_browser.png
index da8d4e3..d721425 100644
--- a/res/drawable-mdpi/ic_search_category_browser.png
+++ b/res/drawable-mdpi/ic_search_category_browser.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_search_category_history.png b/res/drawable-mdpi/ic_search_category_history.png
old mode 100755
new mode 100644
index 12cd51c..1a3fc98
--- a/res/drawable-mdpi/ic_search_category_history.png
+++ b/res/drawable-mdpi/ic_search_category_history.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_search_category_suggest.png b/res/drawable-mdpi/ic_search_category_suggest.png
old mode 100755
new mode 100644
index a4ed7aa..0216581
--- a/res/drawable-mdpi/ic_search_category_suggest.png
+++ b/res/drawable-mdpi/ic_search_category_suggest.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_search_normal.png b/res/drawable-mdpi/ic_search_normal.png
new file mode 100644
index 0000000..e1fa6d3
--- /dev/null
+++ b/res/drawable-mdpi/ic_search_normal.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_secure.png b/res/drawable-mdpi/ic_secure.png
new file mode 100644
index 0000000..70d7edd
--- /dev/null
+++ b/res/drawable-mdpi/ic_secure.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_stop.png b/res/drawable-mdpi/ic_stop.png
new file mode 100644
index 0000000..19b2e15
--- /dev/null
+++ b/res/drawable-mdpi/ic_stop.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_stop_normal.png b/res/drawable-mdpi/ic_stop_normal.png
new file mode 100644
index 0000000..6bd22f9
--- /dev/null
+++ b/res/drawable-mdpi/ic_stop_normal.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_tab_close.png b/res/drawable-mdpi/ic_tab_close.png
new file mode 100644
index 0000000..2f23842
--- /dev/null
+++ b/res/drawable-mdpi/ic_tab_close.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_web_white.png b/res/drawable-mdpi/ic_web_white.png
new file mode 100644
index 0000000..fec99ca
--- /dev/null
+++ b/res/drawable-mdpi/ic_web_white.png
Binary files differ
diff --git a/res/drawable-mdpi/list_divider_vert.9.png b/res/drawable-mdpi/list_divider_vert.9.png
new file mode 100644
index 0000000..d99730a
--- /dev/null
+++ b/res/drawable-mdpi/list_divider_vert.9.png
Binary files differ
diff --git a/res/drawable-mdpi/progress.9.png b/res/drawable-mdpi/progress.9.png
new file mode 100644
index 0000000..08de04c
--- /dev/null
+++ b/res/drawable-mdpi/progress.9.png
Binary files differ
diff --git a/res/drawable-mdpi/ssl_icon.png b/res/drawable-mdpi/ssl_icon.png
deleted file mode 100644
index 032e683..0000000
--- a/res/drawable-mdpi/ssl_icon.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/tab_selected_bg.9.png b/res/drawable-mdpi/tab_selected_bg.9.png
new file mode 100644
index 0000000..261982e
--- /dev/null
+++ b/res/drawable-mdpi/tab_selected_bg.9.png
Binary files differ
diff --git a/res/drawable-mdpi/tab_unselected_bg.9.png b/res/drawable-mdpi/tab_unselected_bg.9.png
new file mode 100644
index 0000000..5d483e0
--- /dev/null
+++ b/res/drawable-mdpi/tab_unselected_bg.9.png
Binary files differ
diff --git a/res/drawable-mdpi/tabbar_bg.9.png b/res/drawable-mdpi/tabbar_bg.9.png
new file mode 100644
index 0000000..bb9928d
--- /dev/null
+++ b/res/drawable-mdpi/tabbar_bg.9.png
Binary files differ
diff --git a/res/drawable-mdpi/text_field_results.9.png b/res/drawable-mdpi/text_field_results.9.png
new file mode 100644
index 0000000..167c42d
--- /dev/null
+++ b/res/drawable-mdpi/text_field_results.9.png
Binary files differ
diff --git a/res/drawable-mdpi/urlbar_bg.9.png b/res/drawable-mdpi/urlbar_bg.9.png
new file mode 100644
index 0000000..18b49e7
--- /dev/null
+++ b/res/drawable-mdpi/urlbar_bg.9.png
Binary files differ
diff --git a/res/menu/bookmarks.xml b/res/drawable/bookmark_thumb_selector.xml
similarity index 63%
copy from res/menu/bookmarks.xml
copy to res/drawable/bookmark_thumb_selector.xml
index a8781c2..5219d90 100644
--- a/res/menu/bookmarks.xml
+++ b/res/drawable/bookmark_thumb_selector.xml
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
+<!-- Copyright (C) 2010 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
-
+
http://www.apache.org/licenses/LICENSE-2.0
-
+
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -14,10 +14,8 @@
limitations under the License.
-->
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:id="@+id/new_context_menu_id"
- android:icon="@drawable/ic_menu_add_bookmark"
- android:title="@string/bookmark_page" />
- <item android:id="@+id/switch_mode_menu_id"
- />
-</menu>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_pressed="true" android:drawable="@drawable/frame_bookmark_thumb_pressed" />
+ <item android:drawable="@android:color/transparent" />
+</selector>
+
diff --git a/res/menu/bookmarks.xml b/res/drawable/browserbarbutton.xml
similarity index 63%
copy from res/menu/bookmarks.xml
copy to res/drawable/browserbarbutton.xml
index a8781c2..d3eebbe 100644
--- a/res/menu/bookmarks.xml
+++ b/res/drawable/browserbarbutton.xml
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
+<!-- Copyright (C) 2010 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
-
+
http://www.apache.org/licenses/LICENSE-2.0
-
+
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -14,10 +14,8 @@
limitations under the License.
-->
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:id="@+id/new_context_menu_id"
- android:icon="@drawable/ic_menu_add_bookmark"
- android:title="@string/bookmark_page" />
- <item android:id="@+id/switch_mode_menu_id"
- />
-</menu>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_pressed="true"
+ android:drawable="@drawable/ic_pressed" />
+ <item android:state_pressed="false" android:drawable="@drawable/clear" />
+</selector>
diff --git a/res/drawable/button_bg_selected.xml b/res/drawable/button_bg_selected.xml
new file mode 100644
index 0000000..d0c677b
--- /dev/null
+++ b/res/drawable/button_bg_selected.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+ <!--
+ Copyright (C) 2010 The Android Open Source Project Licensed under the
+ Apache License, Version 2.0 (the "License"); you may not use this file
+ except in compliance with the License. You may obtain a copy of the
+ License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by
+ applicable law or agreed to in writing, software distributed under the
+ License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+ CONDITIONS OF ANY KIND, either express or implied. See the License for
+ the specific language governing permissions and limitations under the
+ License.
+ -->
+<shape
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle">
+ <solid
+ android:color="#ff4d83ba" />
+</shape>
\ No newline at end of file
diff --git a/res/anim/dialog_enter.xml b/res/drawable/clear.xml
similarity index 62%
rename from res/anim/dialog_enter.xml
rename to res/drawable/clear.xml
index f98d845..267db10 100644
--- a/res/anim/dialog_enter.xml
+++ b/res/drawable/clear.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
+<!-- Copyright (C) 2010 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -14,8 +14,10 @@
limitations under the License.
-->
-<set xmlns:android="http://schemas.android.com/apk/res/android"
- android:interpolator="@android:anim/decelerate_interpolator">
- <translate android:fromYDelta="25%" android:toYDelta="0" android:duration="75"/>
- <alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="75" />
-</set>
+<!-- Used by browserbarbutton to show a clear background for the non pressed
+ state -->
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+ <solid android:color="#00000000"/>
+ <padding android:left="4dp" android:top="4dp"
+ android:right="4dp" android:bottom="4dp" />
+</shape>
diff --git a/res/drawable/ic_menu_incognito.png b/res/drawable/ic_menu_incognito.png
new file mode 100644
index 0000000..d5a7022
--- /dev/null
+++ b/res/drawable/ic_menu_incognito.png
Binary files differ
diff --git a/res/drawable/pattern_carbon_fiber_dark.png b/res/drawable/pattern_carbon_fiber_dark.png
deleted file mode 100644
index 07af4b6..0000000
--- a/res/drawable/pattern_carbon_fiber_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/preview.png b/res/drawable/preview.png
new file mode 100644
index 0000000..b363ab5
--- /dev/null
+++ b/res/drawable/preview.png
Binary files differ
diff --git a/res/menu/bookmarks.xml b/res/drawable/tab_background.xml
similarity index 62%
copy from res/menu/bookmarks.xml
copy to res/drawable/tab_background.xml
index a8781c2..6fc3ee3 100644
--- a/res/menu/bookmarks.xml
+++ b/res/drawable/tab_background.xml
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
+<!-- Copyright (C) 2010 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
-
+
http://www.apache.org/licenses/LICENSE-2.0
-
+
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -14,10 +14,13 @@
limitations under the License.
-->
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:id="@+id/new_context_menu_id"
- android:icon="@drawable/ic_menu_add_bookmark"
- android:title="@string/bookmark_page" />
- <item android:id="@+id/switch_mode_menu_id"
- />
-</menu>
+<selector
+ xmlns:android="http://schemas.android.com/apk/res/android">
+ <item
+ android:state_activated="true"
+ android:drawable="@drawable/tab_selected_bg" />
+ <item
+ android:state_activated="false"
+ android:drawable="@drawable/tab_unselected_bg">
+ </item>
+</selector>
diff --git a/res/layout-land/http_authentication.xml b/res/layout-land/http_authentication.xml
index c008ceb..3fa7e4f 100644
--- a/res/layout-land/http_authentication.xml
+++ b/res/layout-land/http_authentication.xml
@@ -18,7 +18,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
- android:orientation="vertical">
+ android:orientation="vertical" >
<TableLayout
android:layout_width="match_parent"
@@ -28,15 +28,11 @@
<TableRow>
<TextView android:id="@+id/username_view"
- android:textSize="18sp"
- android:textColor="@color/username_text"
android:text="@string/username"
android:gravity="right"
android:layout_marginLeft="20dip" />
<EditText android:id="@+id/username_edit"
- android:textSize="18sp"
- android:textColor="@color/username_edit"
android:scrollHorizontally="true"
android:autoText="false"
android:capitalize="none"
@@ -49,15 +45,11 @@
<TableRow>
<TextView android:id="@+id/password_view"
- android:textSize="18sp"
- android:textColor="@color/password_text"
android:text="@string/password"
android:gravity="right"
android:layout_marginLeft="20dip" />
<EditText android:id="@+id/password_edit"
- android:textSize="18sp"
- android:textColor="@color/password_edit"
android:scrollHorizontally="true"
android:autoText="false"
android:capitalize="none"
diff --git a/res/layout-land/ssl_certificate.xml b/res/layout-land/ssl_certificate.xml
index 44c5904..6505fe5 100644
--- a/res/layout-land/ssl_certificate.xml
+++ b/res/layout-land/ssl_certificate.xml
@@ -56,8 +56,6 @@
android:id="@+id/issued_to_header"
android:text="@string/issued_to"
android:textStyle="bold"
- android:textSize="14sp"
- android:textColor="@color/ssl_text_label"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_marginLeft="20dip"
@@ -69,15 +67,11 @@
<TextView
android:id="@+id/to_common_header"
android:text="@string/common_name"
- android:textSize="14sp"
- android:textColor="@color/ssl_text_label"
android:gravity="left"
android:layout_marginLeft="20dip" />
<TextView
android:id="@+id/to_common"
- android:textSize="14sp"
- android:textColor="@color/ssl_text_value"
android:gravity="left"
android:layout_marginLeft="10dip"
android:layout_marginRight="20dip"
@@ -89,15 +83,11 @@
<TextView
android:id="@+id/to_org_header"
android:text="@string/org_name"
- android:textSize="14sp"
- android:textColor="@color/ssl_text_label"
android:gravity="left"
android:layout_marginLeft="20dip" />
<TextView
android:id="@+id/to_org"
- android:textSize="14sp"
- android:textColor="@color/ssl_text_value"
android:gravity="left"
android:layout_marginLeft="10dip"
android:layout_marginRight="20dip"
@@ -109,15 +99,11 @@
<TextView
android:id="@+id/to_org_unit_header"
android:text="@string/org_unit"
- android:textSize="14sp"
- android:textColor="@color/ssl_text_label"
android:gravity="left"
android:layout_marginLeft="20dip" />
<TextView
android:id="@+id/to_org_unit"
- android:textSize="14sp"
- android:textColor="@color/ssl_text_value"
android:gravity="left"
android:layout_marginLeft="10dip"
android:layout_marginRight="20dip"
@@ -129,8 +115,6 @@
android:id="@+id/issued_to_header"
android:text="@string/issued_by"
android:textStyle="bold"
- android:textSize="14sp"
- android:textColor="@color/ssl_text_label"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_marginLeft="20dip"
@@ -142,15 +126,11 @@
<TextView
android:id="@+id/by_common_header"
android:text="@string/common_name"
- android:textSize="14sp"
- android:textColor="@color/ssl_text_label"
android:gravity="left"
android:layout_marginLeft="20dip" />
<TextView
android:id="@+id/by_common"
- android:textSize="14sp"
- android:textColor="@color/ssl_text_value"
android:gravity="left"
android:layout_marginLeft="10dip"
android:layout_marginRight="20dip"
@@ -162,15 +142,11 @@
<TextView
android:id="@+id/by_org_header"
android:text="@string/org_name"
- android:textSize="14sp"
- android:textColor="@color/ssl_text_label"
android:gravity="left"
android:layout_marginLeft="20dip" />
<TextView
android:id="@+id/by_org"
- android:textSize="14sp"
- android:textColor="@color/ssl_text_value"
android:gravity="left"
android:layout_marginLeft="10dip"
android:layout_marginRight="20dip"
@@ -182,15 +158,11 @@
<TextView
android:id="@+id/by_org_unit_header"
android:text="@string/org_unit"
- android:textSize="14sp"
- android:textColor="@color/ssl_text_label"
android:gravity="left"
android:layout_marginLeft="20dip" />
<TextView
android:id="@+id/by_org_unit"
- android:textSize="14sp"
- android:textColor="@color/ssl_text_value"
android:gravity="left"
android:layout_marginLeft="10dip"
android:layout_marginRight="20dip"
@@ -204,8 +176,6 @@
android:layout_width="wrap_content"
android:text="@string/validity_period"
android:textStyle="bold"
- android:textSize="14sp"
- android:textColor="@color/ssl_text_label"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip"
android:layout_marginBottom="7dip" />
@@ -217,8 +187,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/issued_on"
- android:textSize="14sp"
- android:textColor="@color/ssl_text_label"
android:gravity="left"
android:layout_marginLeft="20dip" />
@@ -226,8 +194,6 @@
android:id="@+id/issued_on"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
- android:textSize="14sp"
- android:textColor="@color/ssl_text_value"
android:gravity="left"
android:layout_marginLeft="10dip"
android:layout_marginRight="20dip"
@@ -242,8 +208,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/expires_on"
- android:textSize="14sp"
- android:textColor="@color/ssl_text_label"
android:gravity="left"
android:layout_marginLeft="20dip" />
@@ -251,8 +215,6 @@
android:id="@+id/expires_on"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
- android:textSize="14sp"
- android:textColor="@color/ssl_text_value"
android:gravity="left"
android:layout_marginLeft="10dip"
android:layout_marginRight="20dip"
diff --git a/res/layout/autofill_settings_fragment.xml b/res/layout/autofill_settings_fragment.xml
new file mode 100644
index 0000000..b0e0f53
--- /dev/null
+++ b/res/layout/autofill_settings_fragment.xml
@@ -0,0 +1,279 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:fillViewport="true">
+
+ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:text="@string/pref_autofill_profile_editor" />
+
+ <View
+ android:layout_height="20dip"
+ android:layout_width="match_parent" />
+
+ <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:shrinkColumns="1"
+ android:stretchColumns="1">
+ <TableRow
+ android:layout_height="match_parent"
+ android:layout_weight="1">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="center_vertical"
+ android:padding="10dip"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:text="@string/autofill_profile_editor_name" />
+ <EditText android:id="@+id/autofill_profile_editor_name_edit"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:padding="10dip"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:inputType="textPersonName|textCapWords"
+ android:singleLine="true" />
+ </TableRow>
+ <TableRow
+ android:layout_height="match_parent"
+ android:layout_weight="1">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="center_vertical"
+ android:padding="10dip"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:text="@string/autofill_profile_editor_company_name" />
+ <EditText android:id="@+id/autofill_profile_editor_company_name_edit"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:padding="10dip"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:inputType="textCapWords"
+ android:singleLine="true" />
+ </TableRow>
+ <TableRow
+ android:layout_height="match_parent"
+ android:layout_weight="1">
+ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:padding="10dip"
+ android:orientation="vertical">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="center_vertical"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:text="@string/autofill_profile_editor_address_line_1" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="center_vertical"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:text="@string/autofill_profile_editor_address_line_1_hint" />
+ </LinearLayout>
+ <EditText android:id="@+id/autofill_profile_editor_address_line_1_edit"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:padding="10dip"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:inputType="textCapWords"
+ android:singleLine="true" />
+ </TableRow>
+ <TableRow
+ android:layout_height="match_parent"
+ android:layout_weight="1">
+ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:padding="10dip"
+ android:orientation="vertical">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="center_vertical"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:text="@string/autofill_profile_editor_address_line_2" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="center_vertical"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:text="@string/autofill_profile_editor_address_line_2_hint" />
+ </LinearLayout>
+ <EditText android:id="@+id/autofill_profile_editor_address_line_2_edit"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:padding="10dip"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:inputType="textCapWords"
+ android:singleLine="true" />
+ </TableRow>
+ <TableRow
+ android:layout_height="match_parent"
+ android:layout_weight="1">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="center_vertical"
+ android:padding="10dip"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:text="@string/autofill_profile_editor_city" />
+ <EditText android:id="@+id/autofill_profile_editor_city_edit"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:padding="10dip"
+ android:inputType="textCapWords"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:singleLine="true" />
+ </TableRow>
+ <TableRow
+ android:layout_height="match_parent"
+ android:layout_weight="1">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="center_vertical"
+ android:padding="10dip"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:text="@string/autofill_profile_editor_state" />
+ <EditText android:id="@+id/autofill_profile_editor_state_edit"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:padding="10dip"
+ android:inputType="textCapWords"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:singleLine="true" />
+ </TableRow>
+ <TableRow
+ android:layout_height="match_parent"
+ android:layout_weight="1">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="center_vertical"
+ android:padding="10dip"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:text="@string/autofill_profile_editor_zip_code" />
+ <EditText android:id="@+id/autofill_profile_editor_zip_code_edit"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:padding="10dip"
+ android:inputType="textCapCharacters"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:singleLine="true" />
+ </TableRow>
+ <TableRow
+ android:layout_height="match_parent"
+ android:layout_weight="1">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="center_vertical"
+ android:padding="10dip"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:text="@string/autofill_profile_editor_country" />
+ <EditText android:id="@+id/autofill_profile_editor_country_edit"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:padding="10dip"
+ android:inputType="textCapWords"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:singleLine="true" />
+ </TableRow>
+ <TableRow
+ android:layout_height="match_parent"
+ android:layout_weight="1">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="center_vertical"
+ android:padding="10dip"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:text="@string/autofill_profile_editor_phone_number" />
+ <EditText android:id="@+id/autofill_profile_editor_phone_number_edit"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:padding="10dip"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:singleLine="true"
+ android:phoneNumber="true" />
+ </TableRow>
+ <TableRow
+ android:layout_height="match_parent"
+ android:layout_weight="1">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="center_vertical"
+ android:padding="10dip"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:text="@string/autofill_profile_editor_email_address" />
+ <EditText android:id="@+id/autofill_profile_editor_email_address_edit"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:padding="10dip"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:inputType="textEmailAddress"
+ android:singleLine="true" />
+ </TableRow>
+ </TableLayout>
+
+ <View
+ android:layout_height="20dip"
+ android:layout_width="match_parent" />
+
+ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:gravity="center">
+ <Button
+ android:id="@+id/autofill_profile_editor_save_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/autofill_profile_editor_save_profile"
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+
+ <Button
+ android:id="@+id/autofill_profile_editor_cancel_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/cancel"
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+
+ <Button
+ android:id="@+id/autofill_profile_editor_delete_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/autofill_profile_editor_delete_profile"
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+ </LinearLayout>
+
+ </LinearLayout>
+</ScrollView>
diff --git a/res/layout/bookmark_list.xml b/res/layout/bookmark_list.xml
new file mode 100644
index 0000000..720685b
--- /dev/null
+++ b/res/layout/bookmark_list.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/list_item"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:minHeight="@dimen/widgetItemMinHeight"
+ android:orientation="horizontal"
+ android:padding="8dip">
+ <ImageView
+ android:id="@+id/favicon"
+ android:layout_height="24dp"
+ android:layout_width="24dp"
+ android:layout_gravity="center_vertical"
+ android:scaleType="fitXY"/>
+ <TextView
+ android:id="@+id/label"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:padding="8dip"
+ android:maxLines="1"
+ android:scrollHorizontally="true"
+ android:ellipsize="marquee"/>
+</LinearLayout>
diff --git a/res/layout/bookmark_thumbnail.xml b/res/layout/bookmark_thumbnail.xml
index 1f017d0..91d8db7 100644
--- a/res/layout/bookmark_thumbnail.xml
+++ b/res/layout/bookmark_thumbnail.xml
@@ -23,39 +23,12 @@
<ImageView android:id="@+id/thumb"
android:src="@drawable/browser_thumbnail"
- android:scaleType="center"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
+ android:scaleType="centerCrop"
+ android:layout_height="@dimen/bookmarkThumbnailHeight"
+ android:layout_width="@dimen/bookmarkThumbnailWidth"
android:layout_gravity="center"
/>
- <!-- FIXME: Want to have a gradient over the thumb -->
-
- <!-- This holds the star for addbookmark -->
- <LinearLayout android:id="@+id/holder"
- android:layout_height="match_parent"
- android:layout_width="match_parent"
- android:orientation="horizontal"
- android:background="#99000000"
- android:gravity="center"
- android:layout_alignBottom="@+id/thumb"
- android:layout_alignTop="@+id/thumb"
- >
- <ImageView
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:src="@drawable/ic_list_bookmark"
- />
- <TextView
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textStyle="bold"
- android:textColor="@color/white"
- android:text="@string/add_bookmark_short"
- />
- </LinearLayout>
-
<TextView android:id="@+id/label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
diff --git a/res/layout/bookmarklistwidget.xml b/res/layout/bookmarklistwidget.xml
new file mode 100644
index 0000000..17aee1d
--- /dev/null
+++ b/res/layout/bookmarklistwidget.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:background="@null"
+ android:focusable="true"
+ android:clickable="true">
+ <LinearLayout
+ android:id="@+id/header"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:padding="8dip"
+ android:background="@color/bookmarkWidgetHeader">
+ <ImageView
+ android:id="@+id/logo"
+ android:layout_width="32dp"
+ android:layout_height="32dp"
+ android:src="@mipmap/ic_launcher_browser" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:text="@string/tab_bookmarks"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:paddingLeft="8dip" />
+ </LinearLayout>
+ <ListView
+ android:id="@+id/bookmarks_list"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@color/bookmarkWidgetItemBackground"
+ android:cacheColorHint="@color/bookmarkWidgetItemBackground"
+ android:dividerHeight="1px"
+ android:divider="@color/bookmarkWidgetDivider" />
+</LinearLayout>
diff --git a/res/layout/bookmarklistwidget_item.xml b/res/layout/bookmarklistwidget_item.xml
new file mode 100644
index 0000000..9e41d39
--- /dev/null
+++ b/res/layout/bookmarklistwidget_item.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/list_item"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:minHeight="@dimen/widgetItemMinHeight"
+ android:orientation="horizontal"
+ android:padding="8dip"
+ android:background="@color/bookmarkWidgetFolderBackground">
+ <ImageView
+ android:id="@+id/thumb"
+ android:src="@drawable/browser_thumbnail"
+ android:layout_height="24dp"
+ android:layout_width="24dp"
+ android:layout_gravity="center_vertical"
+ android:scaleType="fitXY"/>
+ <TextView
+ android:id="@+id/label"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:paddingLeft="8dip"
+ android:maxLines="1"
+ android:scrollHorizontally="true"
+ android:ellipsize="marquee"/>
+</LinearLayout>
diff --git a/res/layout/bookmarks.xml b/res/layout/bookmarks.xml
new file mode 100644
index 0000000..28f83e4
--- /dev/null
+++ b/res/layout/bookmarks.xml
@@ -0,0 +1,62 @@
+<?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.
+-->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <FrameLayout
+ android:id="@+id/header_container"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:visibility="gone" />
+
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ <GridView
+ android:id="@+id/grid"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:horizontalSpacing="16dip"
+ android:verticalSpacing="16dip"
+ android:stretchMode="spacingWidth"
+ android:scrollbarStyle="insideInset"
+ android:listSelector="@drawable/bookmark_thumb_selector"
+ android:drawSelectorOnTop="true"
+ android:focusable="true"
+ android:focusableInTouchMode="true"
+ android:numColumns="auto_fit" />
+ <ListView
+ android:id="@+id/list"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:focusable="true"
+ android:focusableInTouchMode="true"
+ android:visibility="gone"/>
+ <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_bookmarks_folder"
+ android:visibility="gone" />
+ </FrameLayout>
+
+</LinearLayout>
diff --git a/res/layout/bookmarks_header.xml b/res/layout/bookmarks_header.xml
new file mode 100644
index 0000000..5d83892
--- /dev/null
+++ b/res/layout/bookmarks_header.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="48dip"
+ android:orientation="horizontal">
+
+ <com.android.browser.BreadCrumbView
+ android:id="@+id/crumbs"
+ android:layout_width="0dip"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:paddingLeft="16dip" />
+
+ <TextView
+ android:id="@+id/select_bookmark_view"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:text="@string/bookmark_thumbnail_view"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:gravity="center_vertical" />
+
+</LinearLayout>
diff --git a/res/layout/bookmarks_history.xml b/res/layout/bookmarks_history.xml
new file mode 100644
index 0000000..3294434
--- /dev/null
+++ b/res/layout/bookmarks_history.xml
@@ -0,0 +1,112 @@
+<?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_width="match_parent"
+ android:layout_height="match_parent"
+ android:paddingTop="8dip"
+ android:orientation="vertical"
+ android:background="@color/black">
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="48dip">
+
+ <LinearLayout
+ android:id="@+id/tabs"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ style="@style/ActionBarStyle">
+ <TextView
+ android:id="@+id/bmtab"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:paddingLeft="32dip"
+ android:paddingRight="32dip"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:gravity="center_vertical"
+ android:text="@string/bookmarks"
+ android:drawableLeft="@drawable/ic_tab_bookmarks_selected"
+ android:drawablePadding="16dip"
+ android:background="@drawable/tab_background" />
+ <ImageView
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:paddingTop="8dp"
+ android:paddingBottom="8dp"
+ android:src="@drawable/divider_vert" />
+ <TextView
+ android:id="@+id/historytab"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:paddingLeft="32dip"
+ android:paddingRight="32dip"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:gravity="center_vertical"
+ android:text="@string/tab_history"
+ android:drawableLeft="@drawable/ic_tab_history_selected"
+ android:drawablePadding="16dip"
+ android:background="@drawable/tab_background" />
+ </LinearLayout>
+
+ <FrameLayout
+ android:id="@+id/header_container"
+ android:layout_width="0dip"
+ android:layout_weight="1"
+ android:layout_height="match_parent" />
+
+ <ImageView
+ android:id="@+id/seperate_select_add"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:paddingRight="16dip"
+ android:paddingLeft="16dip"
+ android:src="@drawable/divider_vert" />
+
+ <TextView
+ android:id="@+id/addbm"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:text="@string/add_new_bookmark"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:gravity="center_vertical"
+ android:background="@null"
+ android:drawableLeft="@drawable/ic_favorite_off_normal"
+ android:drawablePadding="16dip" />
+
+ <ImageView
+ android:id="@+id/seperate_select_add"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:paddingLeft="16dip"
+ android:src="@drawable/divider_vert" />
+
+ <ImageView
+ android:id="@+id/home"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:src="@drawable/ic_home"
+ android:paddingRight="16dip"
+ android:paddingLeft="16dip"
+ android:scaleType="center" />
+
+ </LinearLayout>
+ <FrameLayout
+ android:id="@+id/fragment"
+ android:paddingTop="8dip"
+ android:layout_width="match_parent"
+ android:layout_height="0dip"
+ android:layout_weight="1.0" />
+</LinearLayout>
diff --git a/res/layout/bookmarkwidget.xml b/res/layout/bookmarkwidget.xml
index 2416e4f..c7c2a90 100644
--- a/res/layout/bookmarkwidget.xml
+++ b/res/layout/bookmarkwidget.xml
@@ -31,7 +31,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dip"
- android:src="@drawable/ic_btn_find_prev" />
+ android:src="@*android:drawable/ic_btn_find_prev" />
<TextView
android:id="@+id/title"
@@ -49,7 +49,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dip"
- android:src="@drawable/ic_btn_find_next" />
+ android:src="@*android:drawable/ic_btn_find_next" />
</LinearLayout>
diff --git a/res/layout/browser_add_bookmark.xml b/res/layout/browser_add_bookmark.xml
index e8a08a4..c547389 100644
--- a/res/layout/browser_add_bookmark.xml
+++ b/res/layout/browser_add_bookmark.xml
@@ -15,72 +15,169 @@
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
+ android:layout_width="@dimen/add_bookmark_width"
android:layout_height="wrap_content"
android:orientation="vertical"
>
+ <RelativeLayout android:id="@+id/crumb_holder"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:visibility="gone"
+ >
+ <com.android.browser.BreadCrumbView android:id="@+id/crumbs"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentLeft="true"
+ android:layout_toLeftOf="@+id/add_divider"
+ />
+ <TextView
+ android:id="@+id/add_new_folder"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentRight="true"
+ android:layout_alignBaseline="@+id/crumbs"
+ android:drawableLeft="@drawable/ic_add_string"
+ android:gravity="center_vertical"
+ android:text="@string/new_folder"
+ android:visibility="gone"
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+ <ImageView android:id="@+id/add_divider"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_toLeftOf="@+id/add_new_folder"
+ android:src="@drawable/crumb_divider"
+ />
+ </RelativeLayout>
+ <TextView android:id="@+id/fake_title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:drawableLeft="@drawable/ic_list_bookmark"
+ android:text="@string/bookmark_this_page"
+ android:layout_gravity="left"
+ android:gravity="center_vertical"
+ android:textAppearance="?android:attr/textAppearanceMedium" />
- <ImageView android:id="@+id/titleDivider"
+ <View android:id="@+id/titleDivider"
android:layout_width="match_parent"
android:layout_height="1dip"
- android:scaleType="fitXY"
android:gravity="fill_horizontal"
- android:src="@drawable/dialog_divider_horizontal_light"
- android:layout_marginLeft="10dip"
- android:layout_marginRight="10dip"/>
+ android:background="?android:attr/colorForeground"
+ />
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ <TableLayout android:id="@+id/default_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
- android:orientation="vertical"
- android:paddingTop="5dip"
- android:paddingBottom="13dip"
+ android:stretchColumns="1"
+ android:shrinkColumns="1"
+ android:paddingTop="20dip"
android:paddingLeft="20dip"
android:paddingRight="20dip" >
-
+ <TableRow>
<TextView
android:id="@+id/titleText"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
+ android:layout_marginBottom="40dip"
android:text="@string/name"
- android:gravity="left"
android:textAppearance="?android:attr/textAppearanceMedium" />
<EditText
android:id="@+id/title"
android:layout_height="wrap_content"
- android:layout_width="250dip"
+ android:layout_width="wrap_content"
+ android:layout_marginRight="20dip"
+ android:layout_marginLeft="20dip"
android:gravity="fill_horizontal"
android:inputType="textCapSentences"
- android:selectAllOnFocus="true"
+ android:ellipsize="end"
android:textAppearance="?android:attr/textAppearanceMedium" />
-
+ </TableRow>
-
+ <TableRow
+ android:id="@+id/row_address">
<TextView
android:id="@+id/addressText"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="@string/location"
android:gravity="left"
+ android:layout_marginBottom="40dip"
android:textAppearance="?android:attr/textAppearanceMedium" />
<EditText
android:id="@+id/address"
android:layout_height="wrap_content"
- android:layout_width="250dip"
+ android:layout_width="wrap_content"
+ android:layout_marginRight="20dip"
+ android:layout_marginLeft="20dip"
android:hint="@string/http"
android:gravity="fill_horizontal"
android:inputType="textUri"
- android:selectAllOnFocus="true"
+ android:ellipsize="end"
android:textAppearance="?android:attr/textAppearanceMedium" />
+ </TableRow>
+ <TableRow>
+ <TextView
+ android:id="@+id/add_to"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:text="@string/containing_folder"
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+
+ <TextView
+ android:id="@+id/folder"
+ android:layout_height="wrap_content"
+ android:layout_width="250dip"
+ android:layout_marginRight="20dip"
+ android:layout_marginLeft="20dip"
+ android:gravity="center_vertical"
+ android:singleLine="true"
+ android:ellipsize="start"
+ android:text="@string/bookmarks"
+ android:drawableLeft="@drawable/ic_menu_bookmarks"
+ android:layout_marginBottom="40dip"
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+ </TableRow>
+ </TableLayout>
+
+ <LinearLayout android:id="@+id/folder_selector"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/folder_selector_height"
+ android:orientation="vertical"
+ android:visibility="gone"
+ >
+
+ <ListView
+ android:id="@+id/list"
+ android:layout_marginLeft="16dip"
+ android:layout_marginRight="16dip"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ />
+ <TextView
+ android:id="@+id/empty"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:visibility="gone"
+ android:layout_marginLeft="16dip"
+ android:layout_marginTop="16dip"
+ android:text="@string/no_subfolders"
+ android:textStyle="italic"
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+ <EditText
+ android:id="@+id/folder_namer"
+ android:layout_marginLeft="16dip"
+ android:layout_marginRight="16dip"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:visibility="gone"
+ />
</LinearLayout>
-
+
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:background="#c6c3c6"
android:minHeight="54dip"
android:orientation="horizontal"
android:paddingTop="4dip"
@@ -103,4 +200,3 @@
</LinearLayout>
</LinearLayout>
-
diff --git a/res/layout/browser_find.xml b/res/layout/browser_find.xml
deleted file mode 100644
index e2f0cf6..0000000
--- a/res/layout/browser_find.xml
+++ /dev/null
@@ -1,76 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 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/findControls"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingTop="5dip"
- android:paddingLeft="4dip"
- android:paddingRight="4dip"
- android:paddingBottom="1dip"
- android:background="@android:drawable/bottom_bar">
- <ImageButton
- android:src="@drawable/ic_btn_find_prev"
- android:id="@+id/previous"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- />
-
- <ImageButton
- android:src="@drawable/ic_btn_find_next"
- android:id="@+id/next"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- />
-
- <LinearLayout
- android:layout_height="wrap_content"
- android:layout_width="0dip"
- android:layout_weight="1"
- android:orientation="vertical"
- android:layout_marginRight="6dip"
- >
- <EditText android:id="@+id/edit"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:scrollHorizontally="true"
- android:inputType="text"
- android:hint="@string/find_dot"
- />
- <LinearLayout android:id="@+id/matches_view"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:orientation="horizontal"
- android:layout_gravity="right"
- android:visibility="invisible"
- >
- <TextView android:id="@+id/matches"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="right"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?android:attr/textColorSecondaryInverse"
- />
- </LinearLayout>
- </LinearLayout>
- <ImageButton android:id="@+id/done"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:src="@drawable/ic_btn_close_panel"
- />
-</LinearLayout>
-
diff --git a/res/layout/browser_select.xml b/res/layout/browser_select.xml
deleted file mode 100644
index b30be8d..0000000
--- a/res/layout/browser_select.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/selectControls"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingTop="5dip"
- android:paddingLeft="4dip"
- android:paddingRight="4dip"
- android:paddingBottom="1dip"
- android:background="@android:drawable/bottom_bar">
- <ImageButton
- android:src="@drawable/ic_btn_copy"
- android:id="@+id/copy"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- />
-
- <ImageButton
- android:src="@drawable/ic_btn_share"
- android:id="@+id/share"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- />
-
- <ImageButton
- android:src="@drawable/ic_btn_select_all"
- android:id="@+id/select_all"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- />
-
- <ImageButton
- android:src="@drawable/ic_btn_find"
- android:id="@+id/find"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- />
-
- <LinearLayout
- android:layout_height="fill_parent"
- android:layout_width="fill_parent"
- android:layout_weight="1"
- />
-
- <ImageButton
- android:src="@drawable/ic_btn_close_panel"
- android:id="@+id/done"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- />
-</LinearLayout>
-
diff --git a/res/layout/browser_subwindow.xml b/res/layout/browser_subwindow.xml
index adf3284..a3868cd 100644
--- a/res/layout/browser_subwindow.xml
+++ b/res/layout/browser_subwindow.xml
@@ -28,12 +28,6 @@
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@android:drawable/dialog_frame" >
- <WebView android:id="@+id/webview"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:fadeScrollbars="true"
- android:scrollbarStyle="outsideOverlay"
- android:layout_weight="1" />
</LinearLayout>
</FrameLayout>
<LinearLayout
diff --git a/res/layout/custom_screen.xml b/res/layout/custom_screen.xml
index 90dc324..525f30c 100644
--- a/res/layout/custom_screen.xml
+++ b/res/layout/custom_screen.xml
@@ -22,6 +22,7 @@
android:layout_height="match_parent"
/>
<LinearLayout android:orientation="vertical"
+ android:id="@+id/vertical_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
diff --git a/res/layout/empty_history.xml b/res/layout/empty_history.xml
deleted file mode 100644
index 4484a16..0000000
--- a/res/layout/empty_history.xml
+++ /dev/null
@@ -1,26 +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.
--->
-
-<TextView xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/empty_view"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:text="@string/empty_history"
- android:background="@color/black"
- android:textColor="@color/white"
- android:gravity="center"
- android:textStyle="bold"
- />
diff --git a/res/layout/folder_list_item.xml b/res/layout/folder_list_item.xml
new file mode 100644
index 0000000..56c597b
--- /dev/null
+++ b/res/layout/folder_list_item.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+ <ImageView
+ android:id="@+id/icon1"
+ style="@style/HoloIcon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="center_vertical"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:src="@drawable/ic_go_normal_white" />
+ <TextView
+ android:id="@android:id/text1"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:gravity="center_vertical"
+ android:paddingLeft="6dip"
+ android:minHeight="?android:attr/listPreferredItemHeight" />
+</LinearLayout>
diff --git a/res/layout/history.xml b/res/layout/history.xml
new file mode 100644
index 0000000..f6e844a
--- /dev/null
+++ b/res/layout/history.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+>
+
+ <ExpandableListView android:id="@android:id/list"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:drawSelectorOnTop="false"
+ />
+
+ <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>
\ No newline at end of file
diff --git a/res/layout/http_authentication.xml b/res/layout/http_authentication.xml
index cc785c9..cee3a42 100644
--- a/res/layout/http_authentication.xml
+++ b/res/layout/http_authentication.xml
@@ -18,14 +18,13 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
- android:orientation="vertical">
+ android:orientation="vertical"
+ >
<TextView
android:id="@+id/username_view"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
- android:textSize="18sp"
- android:textColor="@color/username_text"
android:text="@string/username"
android:gravity="left"
android:layout_marginTop="12dip"
@@ -34,8 +33,6 @@
<EditText
android:id="@+id/username_edit"
- android:textSize="18sp"
- android:textColor="@color/username_edit"
android:scrollHorizontally="true"
android:inputType="text"
android:gravity="fill_horizontal"
@@ -48,8 +45,6 @@
android:id="@+id/password_view"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
- android:textSize="18sp"
- android:textColor="@color/password_text"
android:text="@string/password"
android:gravity="left"
android:layout_marginLeft="20dip"
@@ -57,8 +52,6 @@
<EditText
android:id="@+id/password_edit"
- android:textSize="18sp"
- android:textColor="@color/password_edit"
android:scrollHorizontally="true"
android:inputType="textPassword"
android:gravity="fill_horizontal"
diff --git a/res/layout/import_bookmarks_dialog.xml b/res/layout/import_bookmarks_dialog.xml
new file mode 100644
index 0000000..f10f35d
--- /dev/null
+++ b/res/layout/import_bookmarks_dialog.xml
@@ -0,0 +1,47 @@
+<?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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:padding="8dip"
+>
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/import_bookmarks_dialog_description"
+ />
+
+ <LinearLayout android:id="@+id/accountList"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ />
+
+ <Button android:id="@+id/remove"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/import_bookmarks_dialog_remove"
+ android:maxLines="2"
+ />
+
+ <Button android:id="@+id/cancel"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@android:string/cancel"
+ />
+</LinearLayout>
\ No newline at end of file
diff --git a/res/menu/bookmarks.xml b/res/layout/import_bookmarks_dialog_button.xml
similarity index 69%
copy from res/menu/bookmarks.xml
copy to res/layout/import_bookmarks_dialog_button.xml
index a8781c2..cf8f628 100644
--- a/res/menu/bookmarks.xml
+++ b/res/layout/import_bookmarks_dialog_button.xml
@@ -14,10 +14,9 @@
limitations under the License.
-->
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:id="@+id/new_context_menu_id"
- android:icon="@drawable/ic_menu_add_bookmark"
- android:title="@string/bookmark_page" />
- <item android:id="@+id/switch_mode_menu_id"
- />
-</menu>
+<Button xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/import_bookmarks_dialog_remove"
+ android:maxLines="2"
+/>
diff --git a/res/layout/page_info.xml b/res/layout/page_info.xml
index 275fcf4..7feb24e 100644
--- a/res/layout/page_info.xml
+++ b/res/layout/page_info.xml
@@ -31,8 +31,6 @@
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:textStyle="bold"
- android:textSize="14sp"
- android:textColor="@color/white"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip"
android:layout_marginTop="12dip"
@@ -49,8 +47,6 @@
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="@string/page_info_address"
- android:textSize="14sp"
- android:textColor="@color/white"
android:gravity="left"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip"
@@ -60,8 +56,6 @@
android:id="@+id/address"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
- android:textSize="14sp"
- android:textColor="@color/white"
android:gravity="left"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip"
diff --git a/res/layout/pref_homepage_buttons.xml b/res/layout/pref_homepage_buttons.xml
new file mode 100644
index 0000000..fe21beb
--- /dev/null
+++ b/res/layout/pref_homepage_buttons.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+
+ This layout provides the structure for a browser tab. A tab contains the
+ WebView and any number of other UI elements specific to that tab.
+ Currently, the only such element is the Geolocation permissions prompt.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="horizontal"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal">
+
+ <Button android:id="@+id/use_current"
+ android:text="@string/pref_use_current"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginRight="16dp" />
+
+ <Button android:id="@+id/use_default"
+ android:text="@string/pref_use_default"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+
+</LinearLayout>
diff --git a/res/layout/ssl_certificate.xml b/res/layout/ssl_certificate.xml
index a137d66..28f50a3 100644
--- a/res/layout/ssl_certificate.xml
+++ b/res/layout/ssl_certificate.xml
@@ -57,8 +57,6 @@
android:layout_width="wrap_content"
android:text="@string/issued_to"
android:textStyle="bold"
- android:textSize="14sp"
- android:textColor="@color/ssl_text_label"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip"
android:layout_marginBottom="10dip" />
@@ -69,8 +67,6 @@
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="@string/common_name"
- android:textSize="14sp"
- android:textColor="@color/ssl_text_label"
android:gravity="left"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip" />
@@ -79,8 +75,6 @@
android:id="@+id/to_common"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
- android:textSize="14sp"
- android:textColor="@color/ssl_text_value"
android:gravity="left"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip"
@@ -92,8 +86,6 @@
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="@string/org_name"
- android:textSize="14sp"
- android:textColor="@color/ssl_text_label"
android:gravity="left"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip" />
@@ -102,8 +94,6 @@
android:id="@+id/to_org"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
- android:textSize="14sp"
- android:textColor="@color/ssl_text_value"
android:gravity="left"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip"
@@ -115,8 +105,6 @@
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="@string/org_unit"
- android:textSize="14sp"
- android:textColor="@color/ssl_text_label"
android:gravity="left"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip" />
@@ -125,8 +113,6 @@
android:id="@+id/to_org_unit"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
- android:textSize="14sp"
- android:textColor="@color/ssl_text_value"
android:gravity="left"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip"
@@ -139,8 +125,6 @@
android:layout_width="wrap_content"
android:text="@string/issued_by"
android:textStyle="bold"
- android:textSize="14sp"
- android:textColor="@color/ssl_text_label"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip"
android:layout_marginBottom="10dip" />
@@ -151,8 +135,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/common_name"
- android:textSize="14sp"
- android:textColor="@color/ssl_text_label"
android:gravity="left"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip" />
@@ -161,8 +143,6 @@
android:id="@+id/by_common"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
- android:textSize="14sp"
- android:textColor="@color/ssl_text_value"
android:gravity="left"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip"
@@ -174,8 +154,6 @@
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="@string/org_name"
- android:textSize="14sp"
- android:textColor="@color/ssl_text_label"
android:gravity="left"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip" />
@@ -184,8 +162,6 @@
android:id="@+id/by_org"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
- android:textSize="14sp"
- android:textColor="@color/ssl_text_value"
android:gravity="left"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip"
@@ -197,8 +173,6 @@
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="@string/org_unit"
- android:textSize="14sp"
- android:textColor="@color/ssl_text_label"
android:gravity="left"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip" />
@@ -207,8 +181,6 @@
android:id="@+id/by_org_unit"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
- android:textSize="14sp"
- android:textColor="@color/ssl_text_value"
android:gravity="left"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip"
@@ -221,8 +193,6 @@
android:layout_width="wrap_content"
android:text="@string/validity_period"
android:textStyle="bold"
- android:textSize="14sp"
- android:textColor="@color/ssl_text_label"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip"
android:layout_marginBottom="10dip" />
@@ -233,8 +203,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/issued_on"
- android:textSize="14sp"
- android:textColor="@color/ssl_text_label"
android:gravity="left"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip" />
@@ -243,8 +211,6 @@
android:id="@+id/issued_on"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
- android:textSize="14sp"
- android:textColor="@color/ssl_text_value"
android:gravity="left"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip"
@@ -256,8 +222,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/expires_on"
- android:textSize="14sp"
- android:textColor="@color/ssl_text_label"
android:gravity="left"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip" />
@@ -266,8 +230,6 @@
android:id="@+id/expires_on"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
- android:textSize="14sp"
- android:textColor="@color/ssl_text_value"
android:gravity="left"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip"
diff --git a/res/layout/ssl_success.xml b/res/layout/ssl_success.xml
index e819f23..16f7f58 100644
--- a/res/layout/ssl_success.xml
+++ b/res/layout/ssl_success.xml
@@ -34,8 +34,7 @@
android:layout_width="wrap_content"
android:gravity="left"
android:layout_weight="1"
- android:textSize="18sp"
- android:textColor="@color/ssl_text_label"
+ android:textAppearance="?android:attr/textAppearanceLarge"
android:layout_marginLeft="10dip"
android:layout_marginRight="20dip"
android:layout_marginBottom="12dip" />
diff --git a/res/layout/ssl_warning.xml b/res/layout/ssl_warning.xml
index 285c189..749629d 100644
--- a/res/layout/ssl_warning.xml
+++ b/res/layout/ssl_warning.xml
@@ -31,8 +31,7 @@
android:id="@+id/warning"
android:gravity="left"
android:layout_weight="1"
- android:textSize="18sp"
- android:textColor="@color/ssl_text_label"
+ android:textAppearance="?android:attr/textAppearanceLarge"
android:layout_marginLeft="10dip"
android:layout_marginRight="20dip"
android:layout_marginBottom="12dip" />
diff --git a/res/layout/ssl_warnings.xml b/res/layout/ssl_warnings.xml
index 7e43256..3fe73d3 100644
--- a/res/layout/ssl_warnings.xml
+++ b/res/layout/ssl_warnings.xml
@@ -30,8 +30,7 @@
android:id="@+id/warnings_header"
android:layout_height="wrap_content"
android:layout_width="match_parent"
- android:textSize="18sp"
- android:textColor="@color/ssl_text_label"
+ android:textAppearance="?android:attr/textAppearanceLarge"
android:gravity="left"
android:text="@string/ssl_warnings_header"
android:layout_marginRight="20dip"
diff --git a/res/layout/suggestion_item.xml b/res/layout/suggestion_item.xml
new file mode 100644
index 0000000..fd1d851
--- /dev/null
+++ b/res/layout/suggestion_item.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/* //device/apps/common/assets/res/any/layout/simple_spinner_item.xml
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="56dip"
+ android:orientation="horizontal"
+ android:gravity="center_vertical"
+ android:baselineAligned="false"
+ >
+ <ImageView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:id="@+id/icon1"
+ android:scaleType="center"
+ style="@style/HoloButton" />
+ <RelativeLayout
+ android:paddingTop="0dip"
+ android:paddingBottom="0dip"
+ android:layout_width="0dip"
+ android:layout_weight="1"
+ android:layout_height="wrap_content" >
+ <TextView
+ android:id="@android:id/text1"
+ style="@style/SuggestionLineMedium"
+ android:singleLine="true"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
+ <TextView
+ android:id="@android:id/text2"
+ style="@style/SuggestionLineSmall"
+ android:singleLine="true"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_below="@android:id/text1"
+ android:layout_alignLeft="@android:id/text1" />
+ </RelativeLayout>
+ <ImageView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:id="@+id/divider"
+ android:scaleType="center"
+ android:src="@drawable/divider_vert"
+ />
+ <ImageButton
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:id="@+id/icon2"
+ android:scaleType="center"
+ style="@style/HoloButton"
+ android:src="@drawable/ic_add_string"
+ android:background="@drawable/browserbarbutton"
+ />
+ <View
+ android:id="@+id/spacer"
+ android:layout_width="16dip"
+ android:layout_height="match_parent"
+ />
+</LinearLayout>
diff --git a/res/layout/suggestion_two_column.xml b/res/layout/suggestion_two_column.xml
new file mode 100644
index 0000000..cc4f2e2
--- /dev/null
+++ b/res/layout/suggestion_two_column.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/* //device/apps/common/assets/res/any/layout/simple_spinner_item.xml
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:gravity="center_vertical"
+ android:baselineAligned="false">
+ <include
+ android:id="@+id/suggest1"
+ android:layout_height="56dip"
+ android:layout_width="0dip"
+ android:layout_weight="1"
+ layout="@layout/suggestion_item"
+ />
+ <ImageView
+ android:id="@+id/suggestion_divider"
+ android:layout_width="wrap_content"
+ android:layout_height="56dip"
+ android:background="@drawable/list_divider_vert" />
+ <include
+ android:id="@+id/suggest2"
+ android:layout_height="56dip"
+ android:layout_width="0dip"
+ android:layout_weight="1"
+ layout="@layout/suggestion_item"
+ />
+</LinearLayout>
diff --git a/res/layout/tab_bar.xml b/res/layout/tab_bar.xml
new file mode 100644
index 0000000..2726055
--- /dev/null
+++ b/res/layout/tab_bar.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+ <!--
+ Copyright 2010, The Android Open Source Project Licensed under the
+ Apache License, Version 2.0 (the "License"); you may not use this file
+ except in compliance with the License. You may obtain a copy of the
+ License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by
+ applicable law or agreed to in writing, software distributed under the
+ License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+ CONDITIONS OF ANY KIND, either express or implied. See the License for
+ the specific language governing permissions and limitations under the
+ License.
+ -->
+<merge
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/tabbarcontent"
+ android:layout_width="match_parent"
+ android:layout_height="48dip"
+ android:orientation="horizontal"
+ style="@style/ActionBarStyle"
+ >
+ <com.android.browser.TabScrollView
+ android:id="@+id/tabs"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:orientation="horizontal" />
+ <ImageButton
+ android:id="@+id/newtab"
+ android:src="@drawable/ic_menu_new_window"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ style="@style/HoloButton"
+ android:background="@drawable/browserbarbutton" />
+</merge>
\ No newline at end of file
diff --git a/res/layout/tab_title.xml b/res/layout/tab_title.xml
new file mode 100644
index 0000000..a2da03d
--- /dev/null
+++ b/res/layout/tab_title.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+ <!--
+ Copyright 2010, The Android Open Source Project Licensed under the
+ Apache License, Version 2.0 (the "License"); you may not use this file
+ except in compliance with the License. You may obtain a copy of the
+ License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by
+ applicable law or agreed to in writing, software distributed under the
+ License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+ CONDITIONS OF ANY KIND, either express or implied. See the License for
+ the specific language governing permissions and limitations under the
+ License.
+ -->
+<merge
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:gravity="center_vertical"
+ android:orientation="horizontal"
+ android:background="@drawable/tab_background">
+ <ImageView
+ android:id="@+id/incognito"
+ android:layout_width="16dip"
+ android:layout_height="16dip"
+ android:layout_marginLeft="3dip"
+ android:gravity="center_vertical"
+ android:src="@drawable/fav_incognito"
+ android:visibility="gone" />
+ <ImageView
+ android:id="@+id/favicon"
+ android:layout_width="20dip"
+ android:layout_height="20dip"
+ android:layout_marginLeft="16dip" />
+ <ImageView
+ android:id="@+id/lock"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="16dip"
+ android:visibility="gone" />
+ <TextView
+ android:id="@+id/title"
+ android:layout_height="match_parent"
+ android:layout_width="0dip"
+ android:layout_weight="1.0"
+ android:layout_marginLeft="16dip"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textColor="@color/white"
+ android:gravity="center_vertical"
+ android:scrollHorizontally="true"
+ android:fadingEdge="horizontal"
+ android:fadingEdgeLength="24dip"
+ android:lines="1"
+ android:singleLine="true" />
+ <ImageButton
+ android:id="@+id/close"
+ android:background="@drawable/browserbarbutton"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="16dip"
+ android:layout_marginRight="16dip"
+ android:src="@drawable/ic_tab_close" />
+</merge>
diff --git a/res/layout/tab_view_add_incognito_tab.xml b/res/layout/tab_view_add_incognito_tab.xml
new file mode 100644
index 0000000..d07b4f5
--- /dev/null
+++ b/res/layout/tab_view_add_incognito_tab.xml
@@ -0,0 +1,39 @@
+<?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_list_new_window"/>
+ <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/tabs.xml b/res/layout/tabs.xml
deleted file mode 100644
index c212547..0000000
--- a/res/layout/tabs.xml
+++ /dev/null
@@ -1,37 +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.
--->
-<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@android:id/tabhost"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <LinearLayout
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <TabWidget android:id="@android:id/tabs"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- />
-
- <FrameLayout android:id="@android:id/tabcontent"
- android:layout_width="match_parent"
- android:layout_height="0dip"
- android:layout_weight="1"
- />
- </LinearLayout>
-</TabHost>
diff --git a/res/layout/title_bar.xml b/res/layout/title_bar.xml
index 9f0cb51..a7e50b7 100644
--- a/res/layout/title_bar.xml
+++ b/res/layout/title_bar.xml
@@ -65,8 +65,6 @@
android:layout_width="0dip"
android:layout_weight="1.0"
android:layout_marginLeft="3dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:textColor="@color/black"
android:gravity="center_vertical"
android:singleLine="true"
android:ellipsize="end"
@@ -90,7 +88,7 @@
android:layout_marginRight="-5dip"
android:scaleType="center"
android:background="@drawable/btn_bookmark"
- android:src="@drawable/ic_btn_bookmarks"
+ android:src="@drawable/ic_list_bookmark"
/>
</LinearLayout>
</LinearLayout>
diff --git a/res/layout/url_bar.xml b/res/layout/url_bar.xml
new file mode 100644
index 0000000..f695ae3
--- /dev/null
+++ b/res/layout/url_bar.xml
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="utf-8"?>
+ <!--
+ Copyright 2010, The Android Open Source Project Licensed under the
+ Apache License, Version 2.0 (the "License"); you may not use this file
+ except in compliance with the License. You may obtain a copy of the
+ License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by
+ applicable law or agreed to in writing, software distributed under the
+ License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+ CONDITIONS OF ANY KIND, either express or implied. See the License for
+ the specific language governing permissions and limitations under the
+ License.
+ -->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/content"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+ <LinearLayout
+ android:id="@+id/taburlbar"
+ android:layout_width="match_parent"
+ android:layout_height="48dip"
+ android:orientation="horizontal"
+ android:background="@drawable/urlbar_bg">
+ <ImageButton
+ android:id="@+id/back"
+ android:src="@drawable/ic_back_normal"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ style="@style/HoloButton"
+ android:background="@drawable/browserbarbutton" />
+ <ImageButton
+ android:id="@+id/forward"
+ android:src="@drawable/ic_forward_normal"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ style="@style/HoloButton"
+ android:background="@drawable/browserbarbutton" />
+ <ImageView
+ android:id="@+id/stop"
+ android:background="@drawable/browserbarbutton"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ style="@style/HoloButton"
+ android:gravity="center_vertical"
+ android:src="@drawable/ic_stop_normal" />
+ <LinearLayout
+ android:id="@+id/urlbar_unfocused"
+ android:layout_width="0dip"
+ android:layout_height="match_parent"
+ android:layout_weight="1.0"
+ android:background="@null"
+ android:orientation="horizontal">
+ <ImageView
+ android:id="@+id/browsericon"
+ android:src="@drawable/ic_web_white"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ style="@style/HoloButton" />
+ <ImageView
+ android:id="@+id/lock"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ style="@style/HoloIcon"
+ android:visibility="gone" />
+ <TextView
+ android:id="@+id/url_unfocused"
+ android:layout_width="0dip"
+ android:layout_weight="1.0"
+ android:layout_height="match_parent"
+ android:background="@null"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textColor="#ffc0c0c0"
+ android:hint="@string/search_hint"
+ android:gravity="center_vertical"
+ android:singleLine="true"
+ android:ellipsize="end"
+ android:lines="1"
+ android:scrollHorizontally="true" />
+ <view class="com.android.browser.TitleBarXLarge$CustomCheck"
+ android:id="@+id/star"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ style="@style/HoloButton"
+ android:focusable="false"
+ android:button="@android:drawable/btn_star"
+ android:background="@drawable/browserbarbutton" />
+ </LinearLayout>
+ <LinearLayout
+ android:id="@+id/urlbar_focused"
+ android:layout_width="0dip"
+ android:layout_height="match_parent"
+ android:layout_weight="1.0"
+ android:orientation="horizontal"
+ android:background="@drawable/text_field_results"
+ android:visibility="gone">
+ <ImageView
+ android:id="@+id/searchicon"
+ android:src="@drawable/ic_search_category_suggest"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ style="@style/HoloButton" />
+ <com.android.browser.UrlInputView
+ android:id="@+id/url_focused"
+ android:layout_width="0dip"
+ android:layout_weight="1.0"
+ android:layout_height="match_parent"
+ android:background="@null"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textColor="@color/black"
+ android:hint="@string/search_hint"
+ android:gravity="center_vertical"
+ android:singleLine="true"
+ android:ellipsize="end"
+ android:lines="1"
+ android:scrollHorizontally="true"
+ android:inputType="textUri"
+ android:imeOptions="actionGo"
+ style="@style/Suggestions" />
+ <ImageView
+ android:id="@+id/clear"
+ android:src="@drawable/ic_clear_search"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ style="@style/HoloButton" />
+ </LinearLayout>
+ <ImageButton
+ android:id="@+id/go"
+ android:src="@drawable/ic_go_normal_white"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:visibility="gone"
+ android:gravity="center_vertical"
+ style="@style/HoloButton"
+ android:background="@drawable/browserbarbutton" />
+ <ImageButton
+ android:id="@+id/search"
+ android:src="@drawable/ic_search_normal"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:gravity="center_vertical"
+ style="@style/HoloButton"
+ android:background="@drawable/browserbarbutton" />
+ <ImageButton
+ android:id="@+id/all_btn"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:scaleType="center"
+ style="@style/HoloButton"
+ android:background="@drawable/browserbarbutton"
+ android:src="@drawable/ic_bookmarks_history_normal" />
+ </LinearLayout>
+ <com.android.browser.PageProgressView
+ android:id="@+id/progress"
+ android:layout_width="match_parent"
+ android:layout_height="22dip"
+ android:background="@null"
+ android:src="@drawable/progress"
+ android:layout_marginTop="-11dip"
+ android:visibility="gone" />
+</LinearLayout>
diff --git a/res/layout/website_settings.xml b/res/layout/website_settings.xml
new file mode 100644
index 0000000..ed95148
--- /dev/null
+++ b/res/layout/website_settings.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:background="@android:color/transparent">
+
+ <ListView android:id="@android:id/list"
+ android:layout_width="match_parent"
+ android:layout_height="0px"
+ android:layout_weight="1"
+ android:clipToPadding="false"
+ android:drawSelectorOnTop="false"
+ android:cacheColorHint="@android:color/transparent"
+ android:scrollbarAlwaysDrawVerticalTrack="true" />
+
+ <Button android:id="@+id/clear_all_button"
+ android:layout_width="150dip"
+ android:layout_height="wrap_content"
+ android:layout_margin="5dip"
+ android:text="@string/website_settings_clear_all"
+ android:visibility="gone" />
+</LinearLayout>
diff --git a/res/menu-xlarge/browser.xml b/res/menu-xlarge/browser.xml
new file mode 100644
index 0000000..7af3e8c
--- /dev/null
+++ b/res/menu-xlarge/browser.xml
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+ <group android:id="@+id/MAIN_MENU">
+ <item android:id="@+id/newtab"
+ android:icon="@drawable/ic_menu_new_window"
+ android:title="@string/new_tab"
+ android:showAsAction="never"
+ android:alphabeticShortcut="n" />
+ <item android:id="@+id/incognito_menu_id"
+ android:title="@string/new_incognito_tab"
+ android:icon="@drawable/ic_menu_incognito_normal" />
+ <item android:id="@+id/find_menu_id"
+ android:title="@*android:string/find_on_page"
+ android:icon="@drawable/ic_menu_findonpage_normal"
+ android:alphabeticShortcut="f" />
+ <item android:id="@+id/share_page_menu_id"
+ android:title="@string/share_page"
+ android:icon="@drawable/ic_menu_share_normal"
+ android:alphabeticShortcut="s" />
+ <item android:id="@+id/page_info_menu_id"
+ android:title="@string/page_info"
+ android:icon="@drawable/ic_menu_pageinfo_normal"
+ android:alphabeticShortcut="g" />
+ <item android:id="@+id/view_downloads_menu_id"
+ android:title="@string/menu_view_download"
+ android:icon="@drawable/ic_menu_downloads_normal"
+ android:alphabeticShortcut="d" />
+ <item android:id="@+id/preferences_menu_id"
+ android:title="@string/menu_preferences"
+ android:icon="@drawable/ic_menu_settings_normal"
+ android:alphabeticShortcut="p" />
+ <!-- followings are debug only -->
+ <item android:id="@+id/dump_nav_menu_id"
+ android:title="@string/dump_nav"
+ android:visible="false" />
+ <item android:id="@+id/dump_counters_menu_id"
+ android:title="@string/dump_counters"
+ android:visible="false" />
+ </group>
+ <group android:id="@+id/MAIN_SHORTCUT_MENU" android:visible="false">
+ <item android:id="@+id/homepage_menu_id"
+ android:alphabeticShortcut=" " />
+ <item android:id="@+id/classic_history_menu_id"
+ android:alphabeticShortcut="h" />
+ <item android:id="@+id/zoom_in_menu_id"
+ android:alphabeticShortcut="i" />
+ <item android:id="@+id/zoom_out_menu_id"
+ android:alphabeticShortcut="o" />
+ <item android:id="@+id/window_one_menu_id"
+ android:alphabeticShortcut="1" />
+ <item android:id="@+id/window_two_menu_id"
+ android:alphabeticShortcut="2" />
+ <item android:id="@+id/window_three_menu_id"
+ android:alphabeticShortcut="3" />
+ <item android:id="@+id/window_four_menu_id"
+ android:alphabeticShortcut="4" />
+ <item android:id="@+id/window_five_menu_id"
+ android:alphabeticShortcut="5" />
+ <item android:id="@+id/window_six_menu_id"
+ android:alphabeticShortcut="6" />
+ <item android:id="@+id/window_seven_menu_id"
+ android:alphabeticShortcut="7" />
+ <item android:id="@+id/window_eight_menu_id"
+ android:alphabeticShortcut="8" />
+ <item android:id="@+id/back_menu_id"
+ android:alphabeticShortcut="j" />
+ <item android:id="@+id/forward_menu_id"
+ android:alphabeticShortcut="k" />
+ <item android:id="@+id/bookmarks_menu_id"
+ android:alphabeticShortcut="b" />
+ <item android:id="@+id/add_bookmark_menu_id"
+ android:alphabeticShortcut="a" />
+ <item android:id="@+id/stop_reload_menu_id"
+ android:alphabeticShortcut="r" />
+ <item android:id="@+id/goto_menu_id"
+ android:alphabeticShortcut="l" />
+ <item android:id="@+id/close_menu_id"
+ android:alphabeticShortcut="w" />
+ </group>
+</menu>
diff --git a/res/menu/bookmarks.xml b/res/menu/bookmark_view.xml
similarity index 71%
copy from res/menu/bookmarks.xml
copy to res/menu/bookmark_view.xml
index a8781c2..fdfd672 100644
--- a/res/menu/bookmarks.xml
+++ b/res/menu/bookmark_view.xml
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
+<!-- Copyright (C) 2010 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
-
+
http://www.apache.org/licenses/LICENSE-2.0
-
+
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -15,9 +15,8 @@
-->
<menu xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:id="@+id/new_context_menu_id"
- android:icon="@drawable/ic_menu_add_bookmark"
- android:title="@string/bookmark_page" />
- <item android:id="@+id/switch_mode_menu_id"
- />
+ <item android:id="@+id/thumbnail_view"
+ android:title="@string/bookmark_thumbnail_view"/>
+ <item android:id="@+id/list_view"
+ android:title="@string/bookmark_list_view"/>
</menu>
diff --git a/res/menu/bookmarkscontext.xml b/res/menu/bookmarkscontext.xml
index badbb00..4d7ec7a 100644
--- a/res/menu/bookmarkscontext.xml
+++ b/res/menu/bookmarkscontext.xml
@@ -15,11 +15,8 @@
-->
<menu xmlns:android="http://schemas.android.com/apk/res/android">
- <group android:id="@+id/ADD_MENU">
- <item android:id="@+id/new_context_menu_id"
- android:title="@string/save_to_bookmarks"/>
- </group>
- <group android:id="@+id/CONTEXT_MENU">
+ <group android:id="@+id/BOOKMARK_CONTEXT_MENU"
+ android:visible="false">
<item android:id="@+id/open_context_menu_id"
android:title="@string/open_bookmark"/>
<item android:id="@+id/new_window_context_menu_id"
@@ -37,4 +34,11 @@
<item android:id="@+id/homepage_context_menu_id"
android:title="@string/set_as_homepage"/>
</group>
+ <group android:id="@+id/FOLDER_CONTEXT_MENU"
+ android:visible="false">
+ <item android:id="@+id/edit_context_menu_id"
+ android:title="@string/edit_folder"/>
+ <item android:id="@+id/delete_context_menu_id"
+ android:title="@string/delete_folder"/>
+ </group>
</menu>
diff --git a/res/menu/browser.xml b/res/menu/browser.xml
index 4793c21..e00ee26 100644
--- a/res/menu/browser.xml
+++ b/res/menu/browser.xml
@@ -40,22 +40,24 @@
android:icon="@drawable/ic_menu_add_bookmark"
android:alphabeticShortcut="a" />
<item android:id="@+id/find_menu_id"
- android:title="@string/find_dot"
+ android:title="@*android:string/find_on_page"
+ android:icon="@*android:drawable/ic_menu_find"
android:alphabeticShortcut="f" />
- <item android:id="@+id/select_text_id"
- android:title="@string/select_dot"
- android:alphabeticShortcut="e" />
- <item android:id="@+id/page_info_menu_id"
- android:title="@string/page_info"
- android:alphabeticShortcut="g" />
<item android:id="@+id/share_page_menu_id"
android:title="@string/share_page"
+ android:icon="@drawable/ic_menu_share"
android:alphabeticShortcut="s" />
+ <item android:id="@+id/page_info_menu_id"
+ android:title="@string/page_info"
+ android:icon="@drawable/ic_menu_pageinfo"
+ android:alphabeticShortcut="g" />
<item android:id="@+id/view_downloads_menu_id"
android:title="@string/menu_view_download"
+ android:icon="@drawable/ic_menu_downloads"
android:alphabeticShortcut="d" />
<item android:id="@+id/preferences_menu_id"
android:title="@string/menu_preferences"
+ android:icon="@drawable/ic_menu_settings"
android:alphabeticShortcut="p" />
<!-- followings are debug only -->
<item android:id="@+id/dump_nav_menu_id"
@@ -91,16 +93,10 @@
<item android:id="@+id/window_eight_menu_id"
android:alphabeticShortcut="8" />
<item android:id="@+id/back_menu_id"
- android:title="@string/back"
- android:drawable="@*android:drawable/ic_menu_back"
android:alphabeticShortcut="j" />
<item android:id="@+id/goto_menu_id"
- android:title="@string/goto_dot"
- android:alphabeticShortcut="l"
- android:icon="@android:drawable/ic_menu_search"/>
+ android:alphabeticShortcut="l" />
<item android:id="@+id/close_menu_id"
- android:icon="@drawable/ic_btn_close_panel"
- android:title="@string/tab_picker_remove_tab"
android:alphabeticShortcut="w" />
</group>
<!-- these items are toggled in and out of @+id/stop_reload_menu_id -->
diff --git a/res/menu/browsercontext.xml b/res/menu/browsercontext.xml
index 70cf8d4..f5361d5 100644
--- a/res/menu/browsercontext.xml
+++ b/res/menu/browsercontext.xml
@@ -57,5 +57,9 @@
<item android:id="@+id/set_wallpaper_context_menu_id"
android:title="@string/contextmenu_set_wallpaper"/>
</group>
+ <group android:id="@+id/SELECT_TEXT_MENU">
+ <item android:id="@+id/select_text_menu_id"
+ android:title="@string/select_dot"/>
+ </group>
</menu>
diff --git a/res/menu/folder_choice.xml b/res/menu/folder_choice.xml
new file mode 100644
index 0000000..c62e2f8
--- /dev/null
+++ b/res/menu/folder_choice.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:id="@+id/home_screen"
+ android:icon="@*android:drawable/ic_menu_home"
+ android:title="@string/add_to_homescreen_menu_option"/>
+ <item android:id="@+id/bookmarks"
+ android:icon="@drawable/ic_menu_bookmarks"
+ android:title="@string/add_to_bookmarks_menu_option"/>
+ <item android:id="@+id/other"
+ android:icon="@*android:drawable/ic_menu_archive"
+ android:title="@string/add_to_other_folder_menu_option"/>
+</menu>
diff --git a/res/menu/historycontext.xml b/res/menu/historycontext.xml
index bd4ede4..3eaeb20 100644
--- a/res/menu/historycontext.xml
+++ b/res/menu/historycontext.xml
@@ -15,6 +15,7 @@
-->
<menu xmlns:android="http://schemas.android.com/apk/res/android">
+ <group android:id="@+id/CONTEXT_MENU">
<item android:id="@+id/open_context_menu_id"
android:title="@string/contextmenu_openlink"/>
<item android:id="@+id/new_window_context_menu_id"
@@ -29,4 +30,5 @@
android:title="@string/remove_history_item"/>
<item android:id="@+id/homepage_context_menu_id"
android:title="@string/set_as_homepage"/>
+ </group>
</menu>
diff --git a/res/menu/bookmarks.xml b/res/menu/url_selection.xml
similarity index 72%
rename from res/menu/bookmarks.xml
rename to res/menu/url_selection.xml
index a8781c2..1bb6d0e 100644
--- a/res/menu/bookmarks.xml
+++ b/res/menu/url_selection.xml
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
+<!-- Copyright (C) 2010 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
-
+
http://www.apache.org/licenses/LICENSE-2.0
-
+
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -15,9 +15,10 @@
-->
<menu xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:id="@+id/new_context_menu_id"
- android:icon="@drawable/ic_menu_add_bookmark"
- android:title="@string/bookmark_page" />
- <item android:id="@+id/switch_mode_menu_id"
+ <item android:id="@+id/share"
+ android:icon="@drawable/ic_menu_share_normal"
+ android:title="@string/menu_share_url"
+ android:showAsAction="always|withText"
/>
</menu>
+
diff --git a/res/menu/websitesettings.xml b/res/menu/websitesettings.xml
deleted file mode 100644
index 5acc8a5..0000000
--- a/res/menu/websitesettings.xml
+++ /dev/null
@@ -1,21 +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.
--->
-
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:id="@+id/website_settings_menu_clear_all"
- android:title="@string/website_settings_clear_all"
- android:icon="@android:drawable/ic_menu_close_clear_cancel" />
-</menu>
-
diff --git a/res/mipmap-hdpi/ic_launcher_browser.png b/res/mipmap-hdpi/ic_launcher_browser.png
new file mode 100644
index 0000000..2ca92c8
--- /dev/null
+++ b/res/mipmap-hdpi/ic_launcher_browser.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_launcher_shortcut_browser_bookmark.png b/res/mipmap-hdpi/ic_launcher_shortcut_browser_bookmark.png
similarity index 100%
rename from res/drawable-hdpi/ic_launcher_shortcut_browser_bookmark.png
rename to res/mipmap-hdpi/ic_launcher_shortcut_browser_bookmark.png
Binary files differ
diff --git a/res/mipmap-mdpi/ic_launcher_browser.png b/res/mipmap-mdpi/ic_launcher_browser.png
new file mode 100755
index 0000000..f9d6172
--- /dev/null
+++ b/res/mipmap-mdpi/ic_launcher_browser.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_launcher_shortcut_browser_bookmark.png b/res/mipmap-mdpi/ic_launcher_shortcut_browser_bookmark.png
similarity index 100%
rename from res/drawable-mdpi/ic_launcher_shortcut_browser_bookmark.png
rename to res/mipmap-mdpi/ic_launcher_shortcut_browser_bookmark.png
Binary files differ
diff --git a/res/mipmap-xlarge/ic_launcher_browser.png b/res/mipmap-xlarge/ic_launcher_browser.png
new file mode 100644
index 0000000..2ca92c8
--- /dev/null
+++ b/res/mipmap-xlarge/ic_launcher_browser.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_launcher_shortcut_browser_bookmark.png b/res/mipmap-xlarge/ic_launcher_shortcut_browser_bookmark.png
similarity index 100%
copy from res/drawable-hdpi/ic_launcher_shortcut_browser_bookmark.png
copy to res/mipmap-xlarge/ic_launcher_shortcut_browser_bookmark.png
Binary files differ
diff --git a/res/raw/favicon_amazon.ico b/res/raw/favicon_amazon.ico
new file mode 100644
index 0000000..20a959c
--- /dev/null
+++ b/res/raw/favicon_amazon.ico
Binary files differ
diff --git a/res/raw/favicon_bbc.ico b/res/raw/favicon_bbc.ico
new file mode 100644
index 0000000..8f62b07
--- /dev/null
+++ b/res/raw/favicon_bbc.ico
Binary files differ
diff --git a/res/raw/favicon_cnn.ico b/res/raw/favicon_cnn.ico
new file mode 100644
index 0000000..4a8421d
--- /dev/null
+++ b/res/raw/favicon_cnn.ico
Binary files differ
diff --git a/res/raw/favicon_ebay.ico b/res/raw/favicon_ebay.ico
new file mode 100644
index 0000000..d7c8a5e
--- /dev/null
+++ b/res/raw/favicon_ebay.ico
Binary files differ
diff --git a/res/raw/favicon_espn.ico b/res/raw/favicon_espn.ico
new file mode 100644
index 0000000..2dbe28a
--- /dev/null
+++ b/res/raw/favicon_espn.ico
Binary files differ
diff --git a/res/raw/favicon_facebook.ico b/res/raw/favicon_facebook.ico
new file mode 100644
index 0000000..ea0c6a3
--- /dev/null
+++ b/res/raw/favicon_facebook.ico
Binary files differ
diff --git a/res/raw/favicon_google.ico b/res/raw/favicon_google.ico
new file mode 100644
index 0000000..ee7c943
--- /dev/null
+++ b/res/raw/favicon_google.ico
Binary files differ
diff --git a/res/raw/favicon_msn.ico b/res/raw/favicon_msn.ico
new file mode 100644
index 0000000..b2279f5
--- /dev/null
+++ b/res/raw/favicon_msn.ico
Binary files differ
diff --git a/res/raw/favicon_myspace.ico b/res/raw/favicon_myspace.ico
new file mode 100644
index 0000000..22c46be
--- /dev/null
+++ b/res/raw/favicon_myspace.ico
Binary files differ
diff --git a/res/raw/favicon_nytimes.ico b/res/raw/favicon_nytimes.ico
new file mode 100644
index 0000000..fb4d000
--- /dev/null
+++ b/res/raw/favicon_nytimes.ico
Binary files differ
diff --git a/res/raw/favicon_picasa.ico b/res/raw/favicon_picasa.ico
new file mode 100644
index 0000000..22133b8
--- /dev/null
+++ b/res/raw/favicon_picasa.ico
Binary files differ
diff --git a/res/raw/favicon_weatherchannel.ico b/res/raw/favicon_weatherchannel.ico
new file mode 100644
index 0000000..5a56818
--- /dev/null
+++ b/res/raw/favicon_weatherchannel.ico
Binary files differ
diff --git a/res/raw/favicon_wikipedia.ico b/res/raw/favicon_wikipedia.ico
new file mode 100644
index 0000000..31b0e38
--- /dev/null
+++ b/res/raw/favicon_wikipedia.ico
Binary files differ
diff --git a/res/raw/favicon_yahoo.ico b/res/raw/favicon_yahoo.ico
new file mode 100644
index 0000000..d7761e5
--- /dev/null
+++ b/res/raw/favicon_yahoo.ico
Binary files differ
diff --git a/res/raw/thumb_amazon.png b/res/raw/thumb_amazon.png
new file mode 100644
index 0000000..4dd2f35
--- /dev/null
+++ b/res/raw/thumb_amazon.png
Binary files differ
diff --git a/res/raw/thumb_bbc.png b/res/raw/thumb_bbc.png
new file mode 100644
index 0000000..dff0424
--- /dev/null
+++ b/res/raw/thumb_bbc.png
Binary files differ
diff --git a/res/raw/thumb_cnn.png b/res/raw/thumb_cnn.png
new file mode 100644
index 0000000..3d6fdc9
--- /dev/null
+++ b/res/raw/thumb_cnn.png
Binary files differ
diff --git a/res/raw/thumb_ebay.png b/res/raw/thumb_ebay.png
new file mode 100644
index 0000000..023f678
--- /dev/null
+++ b/res/raw/thumb_ebay.png
Binary files differ
diff --git a/res/raw/thumb_espn.png b/res/raw/thumb_espn.png
new file mode 100644
index 0000000..c0882eb
--- /dev/null
+++ b/res/raw/thumb_espn.png
Binary files differ
diff --git a/res/raw/thumb_facebook.png b/res/raw/thumb_facebook.png
new file mode 100644
index 0000000..a8c047f
--- /dev/null
+++ b/res/raw/thumb_facebook.png
Binary files differ
diff --git a/res/raw/thumb_google.png b/res/raw/thumb_google.png
new file mode 100644
index 0000000..c54e6ea
--- /dev/null
+++ b/res/raw/thumb_google.png
Binary files differ
diff --git a/res/raw/thumb_msn.png b/res/raw/thumb_msn.png
new file mode 100644
index 0000000..4ad710f
--- /dev/null
+++ b/res/raw/thumb_msn.png
Binary files differ
diff --git a/res/raw/thumb_myspace.png b/res/raw/thumb_myspace.png
new file mode 100644
index 0000000..d6f6e76
--- /dev/null
+++ b/res/raw/thumb_myspace.png
Binary files differ
diff --git a/res/raw/thumb_nytimes.png b/res/raw/thumb_nytimes.png
new file mode 100644
index 0000000..d6849c3
--- /dev/null
+++ b/res/raw/thumb_nytimes.png
Binary files differ
diff --git a/res/raw/thumb_picasa.png b/res/raw/thumb_picasa.png
new file mode 100644
index 0000000..5ec2d7a
--- /dev/null
+++ b/res/raw/thumb_picasa.png
Binary files differ
diff --git a/res/raw/thumb_weatherchannel.png b/res/raw/thumb_weatherchannel.png
new file mode 100644
index 0000000..a190a0c
--- /dev/null
+++ b/res/raw/thumb_weatherchannel.png
Binary files differ
diff --git a/res/raw/thumb_wikipedia.png b/res/raw/thumb_wikipedia.png
new file mode 100644
index 0000000..7929468
--- /dev/null
+++ b/res/raw/thumb_wikipedia.png
Binary files differ
diff --git a/res/raw/thumb_yahoo.png b/res/raw/thumb_yahoo.png
new file mode 100644
index 0000000..08dd759
--- /dev/null
+++ b/res/raw/thumb_yahoo.png
Binary files differ
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
new file mode 100644
index 0000000..9a74533
--- /dev/null
+++ b/res/values-ar/strings.xml
@@ -0,0 +1,401 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2007 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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="application_name" msgid="1935869255545976415">"المتصفح"</string>
+ <string name="choose_upload" msgid="3649366287575002063">"اختر ملفًا لتحميله"</string>
+ <string name="new_tab" msgid="4505722538297295141">"نافذة جديدة"</string>
+ <!-- no translation found for new_incognito_tab (5821404839654751753) -->
+ <skip />
+ <string name="active_tabs" msgid="3050623868203544623">"نظام التشغيل Windows"</string>
+ <string name="tab_bookmarks" msgid="2305793036003473653">"الإشارات"</string>
+ <string name="tab_most_visited" msgid="1077402532455000703">"الأكثر زيارة"</string>
+ <string name="tab_history" msgid="1979267558744613746">"سجلّ"</string>
+ <string name="added_to_bookmarks" msgid="1020224130695956728">"تمت الإضافة إلى الإشارات"</string>
+ <string name="removed_from_bookmarks" msgid="6063705902028438800">"تمت إزالته من الإشارات"</string>
+ <string name="sign_in_to" msgid="5939425800148759165">"تسجيل الدخول إلى <xliff:g id="HOSTNAME">%s1</xliff:g> \"<xliff:g id="REALM">%s2</xliff:g>\""</string>
+ <string name="username" msgid="5057566336518215922">"الاسم"</string>
+ <string name="password" msgid="1177138552305184404">"كلمة المرور"</string>
+ <string name="action" msgid="183105774472071343">"تسجيل الدخول"</string>
+ <string name="bookmarks_search" msgid="5229596268214362873">"المتصفح"</string>
+ <string name="cancel" msgid="3017274947407233702">"إلغاء"</string>
+ <string name="ok" msgid="1509280796718850364">"موافق"</string>
+ <string name="title_bar_loading" msgid="7438217780834640678">"جارٍ التحميل…"</string>
+ <string name="page_info" msgid="4048529256302257195">"معلومات الصفحة"</string>
+ <string name="page_info_view" msgid="5303490449842635158">"عرض معلومات الصفحة"</string>
+ <string name="page_info_address" msgid="2222306609532903254">"العنوان:"</string>
+ <string name="ssl_warnings_header" msgid="79744901983636370">"هناك مشكلات في شهادة الأمان لهذا الموقع."</string>
+ <string name="ssl_continue" msgid="8031515015829358457">"متابعة"</string>
+ <string name="security_warning" msgid="6607795404322797541">"تحذير أمان"</string>
+ <string name="view_certificate" msgid="1472768887529093862">"عرض الشهادة"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
+ <string name="ssl_untrusted" msgid="5369967226521102194">"هذه الشهادة ليست من جهة موثوق بها."</string>
+ <string name="ssl_mismatch" msgid="558688832420069896">"اسم الموقع لا يتطابق مع الاسم على الشهادة."</string>
+ <string name="ssl_expired" msgid="5739349389499575559">"انتهت صلاحية هذه الشهادة."</string>
+ <string name="ssl_not_yet_valid" msgid="2893167846212645846">"هذه الشهادة ليست صالحة بعد."</string>
+ <string name="ssl_certificate" msgid="5226747157992111668">"شهادة الأمان"</string>
+ <string name="ssl_certificate_is_valid" msgid="7096160815933145579">"هذه الشهادة صالحة."</string>
+ <string name="issued_to" msgid="9032338008819841339">"تم الإصدار إلى:"</string>
+ <string name="common_name" msgid="5745530093500062357">"الاسم الشائع:"</string>
+ <string name="org_name" msgid="8868889052889991293">"المؤسسة:"</string>
+ <string name="org_unit" msgid="4489056376307768196">"وحدة تنظيمية:"</string>
+ <string name="issued_by" msgid="6959484326943152487">"تم الإصدار بواسطة:"</string>
+ <string name="validity_period" msgid="57988851973181309">"الصلاحية:"</string>
+ <string name="issued_on" msgid="2082890654801808368">"تم الإصدار في:"</string>
+ <string name="expires_on" msgid="8061200430557020704">"تنتهي الصلاحية في:"</string>
+ <string name="stopping" msgid="4839698519340302982">"جارٍ الإيقاف..."</string>
+ <string name="stop" msgid="5687251076030630074">"إيقاف"</string>
+ <string name="reload" msgid="8585220783228408062">"تحديث"</string>
+ <string name="back" msgid="8414603107175713668">"رجوع"</string>
+ <string name="forward" msgid="4288210890526641577">"إعادة توجيه"</string>
+ <string name="save" msgid="5922311934992468496">"موافق"</string>
+ <string name="do_not_save" msgid="6777633870113477714">"إلغاء"</string>
+ <!-- outdated translation 969988560160364559 --> <string name="location" msgid="3411848697912600125">"الموقع"</string>
+ <!-- no translation found for containing_folder (6771180232953030479) -->
+ <skip />
+ <!-- no translation found for new_folder (7743540149088867917) -->
+ <skip />
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <!-- no translation found for no_subfolders (5880411440592452802) -->
+ <skip />
+ <!-- no translation found for add_to_bookmarks_menu_option (4449323955122214389) -->
+ <skip />
+ <!-- no translation found for add_to_homescreen_menu_option (1461447829242963790) -->
+ <skip />
+ <!-- no translation found for add_to_other_folder_menu_option (5450890093372998187) -->
+ <skip />
+ <!-- outdated translation 5990326151488445481 --> <string name="name" msgid="5462672162695365387">"الاسم"</string>
+ <string name="http" msgid="2163722670597250102">"http://"</string>
+ <!-- outdated translation 4680844117598293907 --> <string name="save_to_bookmarks" msgid="6101482434920313244">"إشارة مرجعية"</string>
+ <!-- no translation found for bookmark_this_page (7530739804320811054) -->
+ <skip />
+ <string name="edit_bookmark" msgid="5024089053490231905">"تعديل الإشارة"</string>
+ <!-- outdated translation 9202323987633899835 --> <string name="create_shortcut_bookmark" msgid="1995095662095484289">"إضافة اختصار إلى الصفحة الرئيسية"</string>
+ <string name="open_bookmark" msgid="8473581305759935790">"فتح"</string>
+ <string name="remove_bookmark" msgid="8407495852801410891">"حذف الإشارة"</string>
+ <string name="remove_from_bookmarks" msgid="4374080666576982775">"إزالة من الإشارات"</string>
+ <string name="remove_history_item" msgid="5021424935726728618">"إزالة من السجل"</string>
+ <string name="set_as_homepage" msgid="4752937379414905560">"تعيين كصفحة رئيسية"</string>
+ <string name="bookmark_saved" msgid="2766434679871317557">"تم الحفظ إلى الإشارات."</string>
+ <string name="bookmark_not_saved" msgid="700600955089376724">"تعذر حفظ الإشارة."</string>
+ <string name="homepage_set" msgid="8768087280310966395">"تم تعيين الصفحة الرئيسية."</string>
+ <string name="bookmark_needs_title" msgid="6245900436119218187">"يجب أن يكون للإشارة اسم."</string>
+ <string name="bookmark_needs_url" msgid="7809876865972755158">"يجب أن يكون للإشارة موقع جغرافي."</string>
+ <string name="bookmark_url_not_valid" msgid="6719785633980202419">"عنوان URL غير صالح."</string>
+ <string name="bookmark_cannot_save_url" msgid="791722768778386941">"لا يمكن وضع إشارة على عنوان URL هذا."</string>
+ <string name="delete_bookmark" msgid="2422989994934201992">"حذف"</string>
+ <string name="bookmark_page" msgid="6845189305130307274">"وضع إشارة على آخر صفحة تم عرضها"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
+ <string name="current_page" msgid="7510129573681663135">"من "</string>
+ <string name="delete_bookmark_warning" msgid="758043186202032205">"سيتم حذف الإشارة \"<xliff:g id="BOOKMARK">%s</xliff:g>\"."</string>
+ <string name="open_in_new_window" msgid="6596775546468054510">"فتح في نافذة جديدة"</string>
+ <string name="goto_dot" msgid="3895839050522602723">"تنفيذ"</string>
+ <!-- no translation found for incognito_tab (5419458065370134289) -->
+ <skip />
+ <string name="select_dot" msgid="6299170761900561967">"تحديد نص"</string>
+ <string name="tab_picker_title" msgid="864478399057782913">"النوافذ الحالية"</string>
+ <string name="tab_picker_remove_tab" msgid="630087809802479397">"إغلاق"</string>
+ <string name="bookmarks" msgid="1961279134885867815">"الإشارات"</string>
+ <string name="shortcut_bookmark" msgid="3974876480401135895">"إشارة"</string>
+ <string name="history" msgid="2451240511251410032">"سجلّ"</string>
+ <string name="menu_view_download" msgid="2124570321712995120">"التنزيلات"</string>
+ <string name="copy_page_url" msgid="7635062169011319208">"نسخ عنوان URL للصفحة"</string>
+ <string name="share_page" msgid="593756995297268343">"مشاركة الصفحة"</string>
+ <!-- no translation found for menu_save_webarchive (3934652434001459581) -->
+ <skip />
+ <!-- no translation found for webarchive_saved (7045250341467345007) -->
+ <skip />
+ <!-- no translation found for webarchive_failed (2880998204746620260) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
+ <string name="contextmenu_openlink" msgid="7237961252214188935">"فتح"</string>
+ <string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"فتح في نافذة جديدة"</string>
+ <string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"وضع إشارة على الرابط"</string>
+ <string name="contextmenu_savelink" msgid="5508554930832538184">"حفظ الرابط"</string>
+ <string name="contextmenu_sharelink" msgid="5392275392280130331">"مشاركة الرابط"</string>
+ <string name="contextmenu_copy" msgid="398860586635404030">"نسخ"</string>
+ <string name="contextmenu_copylink" msgid="5153657160294534270">"نسخ رابط عنوان URL"</string>
+ <string name="contextmenu_download_image" msgid="4243829645180686912">"حفظ الصورة"</string>
+ <string name="contextmenu_view_image" msgid="3870625602053600905">"عرض الصورة"</string>
+ <string name="contextmenu_set_wallpaper" msgid="3691902960115350686">"تعيين كخلفية"</string>
+ <string name="contextmenu_dial_dot" msgid="5856550683415933806">"طلب..."</string>
+ <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="clear" msgid="7070043081700011461">"محو"</string>
+ <string name="replace" msgid="4843033491070384047">"استبدال"</string>
+ <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"الإشارات"</string>
+ <string name="menu_preferences" msgid="6709237687234102240">"الإعدادات"</string>
+ <string name="pref_content_title" msgid="722227111894838633">"إعدادات محتوى الصفحة"</string>
+ <string name="pref_content_load_images" msgid="2125616852957377561">"تحميل الصور"</string>
+ <string name="pref_content_load_images_summary" msgid="5055874125248398584">"عرض الصور على صفحات الويب"</string>
+ <string name="pref_content_block_popups" msgid="7808433807197256726">"حظر النوافذ المنبثقة"</string>
+ <string name="pref_content_javascript" msgid="4570972030299516843">"تمكين جافا سكريبت"</string>
+ <string name="pref_content_open_in_background" msgid="824123779725118663">"فتح في الخلفية"</string>
+ <string name="pref_content_plugins" msgid="7231944644794301582">"تمكين المكونات الإضافية"</string>
+ <string-array name="pref_content_plugins_choices">
+ <item msgid="6745108155096660725">"تشغيل دومًا"</item>
+ <item msgid="2484126708670016519">"عند الطلب"</item>
+ <item msgid="8547442717307793863">"إيقاف"</item>
+ </string-array>
+ <string name="pref_content_open_in_background_summary" msgid="1737664075721181678">"فتح نوافذ جديدة وراء النافذة الحالية"</string>
+ <string name="pref_content_homepage" msgid="6082437160778559806">"تعيين الصفحة الرئيسية"</string>
+ <!-- no translation found for pref_content_search_engine (1620101310821644144) -->
+ <skip />
+ <!-- no translation found for pref_content_search_engine_summary (5162667665858487316) -->
+ <skip />
+ <!-- no translation found for pref_set_homepage_to (7196350233061395098) -->
+ <skip />
+ <!-- outdated translation 1493179933653044553 --> <string name="pref_use_current" msgid="1778622474040406672">"استخدام الصفحة الحالية"</string>
+ <!-- no translation found for pref_use_blank (8503238592551111169) -->
+ <skip />
+ <!-- no translation found for pref_use_default (192587563274735878) -->
+ <skip />
+ <string name="pref_content_autofit" msgid="8260474534053660809">"احتواء تلقائي للصفحات"</string>
+ <string name="pref_content_autofit_summary" msgid="4587831659894879986">"تنسيق صفحات الويب لاحتوائها في الشاشة"</string>
+ <!-- no translation found for pref_personal_title (1447687455755683695) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome (1695182180332194033) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome_summary (7414133931827321055) -->
+ <skip />
+ <!-- no translation found for pref_personal_google_account (952360133341490071) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks (59237515966184432) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks_summary (4791767605662205482) -->
+ <skip />
+ <!-- no translation found for pref_personal_start_syncing (6046972042512655232) -->
+ <skip />
+ <!-- no translation found for pref_personal_account_dialog_title (1390867119887955530) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled (1174197447388234595) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled_summary (422640696197018914) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor (1350709161524642663) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor_summary (6748434431641768870) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_name (8566130291459685955) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_email_address (7967585896612797173) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_company_name (2813443159949210417) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1 (836433242509243081) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1_hint (5965659598509327172) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2 (8194745202893822479) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2_hint (2048330295853546405) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_city (4193225955409148508) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_state (8549739922338171458) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_zip_code (283668573295656671) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_country (7234470301239156656) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_phone_number (4938852821413729276) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_save_profile (8349915287435262888) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_save (6834102203944938409) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_delete (2421442112954362732) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_delete_profile (7112035941146003753) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
+ <string name="pref_privacy_title" msgid="1052470980370846151">"إعدادات الخصوصية"</string>
+ <string name="pref_privacy_clear_cache" msgid="3380316479925886998">"محو ذاكرة التخزين المؤقت"</string>
+ <string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"محو قواعد البيانات والمحتوى المخزن مؤقتًا محليًا"</string>
+ <string name="pref_privacy_clear_cache_dlg" msgid="5541011591300753881">"سيتم حذف قواعد البيانات والمحتوى المخزن مؤقتًا محليًا."</string>
+ <string name="pref_privacy_clear_cookies" msgid="3095583579133780331">"محو جميع بيانات ملف تعريف الارتباط"</string>
+ <string name="pref_privacy_clear_cookies_summary" msgid="6962742063990677520">"محو جميع ملفات تعريف ارتباط المتصفح"</string>
+ <string name="pref_privacy_clear_cookies_dlg" msgid="552855688091432682">"سيتم حذف جميع ملفات تعريف الارتباط."</string>
+ <string name="pref_privacy_clear_history" msgid="8723795508825198477">"محو السجل"</string>
+ <string name="pref_privacy_clear_history_summary" msgid="6868501330708940734">"محو سجل تنقل المتصفح"</string>
+ <string name="pref_privacy_clear_history_dlg" msgid="544903007914753853">"سيتم حذف سجل تنقل المتصفح."</string>
+ <string name="pref_privacy_clear_form_data" msgid="4232668196344383987">"محو بيانات النموذج"</string>
+ <string name="pref_privacy_clear_form_data_summary" msgid="1790390894719517167">"محو كل بيانات النموذج المحفوظة"</string>
+ <string name="pref_privacy_clear_form_data_dlg" msgid="4443621086781197928">"سيتم حذف جميع بيانات النموذج المحفوظة."</string>
+ <string name="pref_privacy_clear_passwords" msgid="4750234112289277480">"محو كلمات المرور"</string>
+ <string name="pref_privacy_clear_passwords_summary" msgid="8856782718942903335">"محو جميع كلمات المرور المحفوظة"</string>
+ <string name="pref_privacy_clear_passwords_dlg" msgid="2083869328824248255">"سيتم حذف جميع كلمات المرور المحفوظة."</string>
+ <string name="pref_privacy_enable_geolocation" msgid="1395040170290765686">"تمكين الموقع"</string>
+ <string name="pref_privacy_enable_geolocation_summary" msgid="8437020934664306205">"السماح للمواقع الإلكترونية بطلب الدخول إلى موقعك الجغرافي"</string>
+ <string name="pref_privacy_clear_geolocation_access" msgid="6649680770030042980">"محو إمكانية الدخول إلى الموقع الجغرافي"</string>
+ <string name="pref_privacy_clear_geolocation_access_summary" msgid="7750143359497314679">"محو إمكانية الدخول إلى الموقع الجغرافي بالنسبة إلى جميع مواقع الويب"</string>
+ <string name="pref_privacy_clear_geolocation_access_dlg" msgid="7327063124488827244">"محو إمكانية الدخول إلى الموقع الجغرافي بالنسبة إلى جميع مواقع الويب"</string>
+ <string name="pref_security_title" msgid="5763978646932160021">"إعدادات الأمان"</string>
+ <string name="pref_security_remember_passwords" msgid="6492957683454529549">"تذكّر كلمات المرور"</string>
+ <string name="pref_security_remember_passwords_summary" msgid="256388703356349137">"حفظ أسماء المستخدمين وكلمات المرور لمواقع الويب"</string>
+ <string name="pref_security_save_form_data" msgid="1213669802810198893">"تذكر بيانات النموذج"</string>
+ <string name="pref_security_save_form_data_summary" msgid="4994074685153708026">"تذكر البيانات التي اكتبها في النماذج لاستخدامها لاحقًا"</string>
+ <string name="pref_security_show_security_warning" msgid="8901135676266754559">"عرض تحذيرات الأمان"</string>
+ <string name="pref_security_show_security_warning_summary" msgid="8968906112720511704">"عرض تحذير إذا كانت هناك مشكلة في أمان الموقع"</string>
+ <string name="pref_security_accept_cookies" msgid="3201367661925047989">"قبول ملفات تعريف الارتباط"</string>
+ <string name="pref_security_accept_cookies_summary" msgid="1465118934875026920">"السماح للمواقع بحفظ بيانات \"ملف تعريف الارتباط\" وقراءتها"</string>
+ <string name="pref_text_size" msgid="3827031324346612208">"حجم النص"</string>
+ <string-array name="pref_text_size_choices">
+ <item msgid="4952686548944739548">"صغير"</item>
+ <item msgid="1950030433642671460">"صغير"</item>
+ <item msgid="4338347520133294584">"عادي"</item>
+ <item msgid="5043128215356351184">"كبير"</item>
+ <item msgid="7201512237890458902">"ضخم"</item>
+ </string-array>
+ <string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"حجم النص"</string>
+ <string name="pref_default_zoom" msgid="8076142259097187395">"التكبير/التصغير الافتراضي"</string>
+ <string-array name="pref_default_zoom_choices">
+ <item msgid="549583171195154919">"بعيد"</item>
+ <item msgid="5619034257768161024">"متوسط"</item>
+ <item msgid="3840999588443167001">"إغلاق"</item>
+ </string-array>
+ <string name="pref_default_zoom_dialogtitle" msgid="6095974367125109021">"التكبير/التصغير الافتراضي"</string>
+ <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="3091250467679722382">"الإعدادات المتقدمة"</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" msgid="8904000515846202110">"إعادة تعيين إلى الافتراضي"</string>
+ <string name="pref_extras_reset_default_summary" msgid="4247870778270414501">"استعادة الإعدادات الافتراضية"</string>
+ <string name="pref_extras_reset_default_dlg" msgid="6640261575874704022">"ستتم إعادة الإعدادات إلى القيم الافتراضية."</string>
+ <string name="pref_extras_reset_default_dlg_title" msgid="2250334970728938936">"إعادة تعيين إلى الإعداد الافتراضي"</string>
+ <string name="pref_development_title" msgid="3263854204533056480">"تصحيح الأخطاء"</string>
+ <string name="pref_default_text_encoding" msgid="5742965543955558478">"تشفير النص"</string>
+ <!-- no translation found for pref_default_text_encoding_choices:7 (2193955365569270096) -->
+ <string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"تشفير النص"</string>
+ <string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"مشكلة في اتصال البيانات"</string>
+ <string name="browserFrameFileErrorLabel" msgid="8063691502792670367">"مشكلة في الملف"</string>
+ <string name="browserFrameFormResubmitLabel" msgid="2685923472682180360">"تأكيد"</string>
+ <string name="browserFrameFormResubmitMessage" msgid="2752182215695632138">"تحتوي الصفحة التي تحاول عرضها على بيانات تم إرسالها فعليًا (\"POSTDATA\"). إذا أعدت إرسال البيانات، فسيتم تكرار أي إجراء نفذه النموذج على الصفحة (مثل إجراء عملية بحث أو شراء عبر الإنترنت)."</string>
+ <string name="loadSuspendedTitle" msgid="675991625288706944">"ليس هناك اتصال بالشبكة"</string>
+ <string name="loadSuspended" msgid="3133656588880851273">"لا يمكن للمتصفح تحميل الصفحة نظرًا لعدم وجود اتصال بالإنترنت."</string>
+ <string name="clear_history" msgid="5998307092715979619">"محو السجل"</string>
+ <string name="browser_history" msgid="1038987118290272525">"الصفحات التي تمت زيارتها حديثًا"</string>
+ <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_button_text" msgid="5235226933877634410">"تنفيذ"</string>
+ <string name="search_settings_description" msgid="1422401062529014107">"الإشارات وسجل الويب"</string>
+ <string name="attention" msgid="3473639060042811244">"تنبيه"</string>
+ <string name="popup_window_attempt" msgid="2673111696288657989">"يحاول هذا الموقع فتح نافذة منبثقة."</string>
+ <string name="allow" msgid="1157313689171991335">"السماح"</string>
+ <string name="block" msgid="9172175889884707800">"حظر"</string>
+ <string name="too_many_windows_dialog_title" msgid="5175503564948906442">"تم بلوغ الحد الأقصى للنوافذ"</string>
+ <string name="too_many_windows_dialog_message" msgid="1398571800233959583">"تعذر فتح نافذة جديدة نظرًا لأنك فتحت الحد الأقصى للنوافذ فعليًا."</string>
+ <string name="too_many_subwindows_dialog_title" msgid="3805453941587725944">"النافذة مفتوحة فعليًا"</string>
+ <string name="too_many_subwindows_dialog_message" msgid="5827289829907966657">"تعذر فتح نافذة منبثقة جديدة نظرًا لأنه يمكن فتح نافذة واحدة فقط في أي وقت."</string>
+ <string name="download_title" msgid="2122874021047565594">"سجل التنزيل"</string>
+ <string name="download_unknown_filename" msgid="4013465542563652175">"<غير معروف>"</string>
+ <string name="download_menu_open" msgid="4888327480367757513">"فتح"</string>
+ <string name="download_menu_clear" msgid="6264454531553418124">"محو من القائمة"</string>
+ <string name="download_menu_delete" msgid="8815502136393894148">"حذف"</string>
+ <string name="download_menu_cancel" msgid="2545333007601851574">"إلغاء التنزيل"</string>
+ <string name="download_menu_cancel_all" msgid="2136550823151999166">"إلغاء كل التنزيلات"</string>
+ <string name="download_cancel_dlg_title" msgid="8909108500262799748">"إلغاء التنزيلات"</string>
+ <string name="download_cancel_dlg_msg" msgid="6285389170052357797">"سيتم إلغاء جميع التنزيلات البالغ عددها <xliff:g id="DOWNLOAD_COUNT">%d</xliff:g> ومحوها من سجل التنزيل."</string>
+ <string name="download_delete_file" msgid="5330036497843073249">"سيتم حذف الملف"</string>
+ <string name="download_file_error_dlg_title" msgid="2693630283595384874">"نفدت المساحة"</string>
+ <string name="download_file_error_dlg_msg" msgid="5156405410324072471">"تعذر تنزيل <xliff:g id="FILENAME">%s</xliff:g>."\n"حرر بعض المساحة على هاتفك وحاول مرة أخرى."</string>
+ <string name="download_failed_generic_dlg_title" msgid="6106781095337833391">"أخفق التنزيل"</string>
+ <!-- outdated translation 605904452159416792 --> <string name="download_no_sdcard_dlg_title" product="nosdcard" msgid="56777245081568508">"ليس هناك بطاقة SD"</string>
+ <string name="download_no_sdcard_dlg_title" product="default" msgid="605904452159416792">"ليس هناك بطاقة SD"</string>
+ <!-- no translation found for download_no_sdcard_dlg_msg (3144652102051031721) -->
+ <skip />
+ <string name="download_no_sdcard_dlg_msg" product="default" msgid="2616399456116301518">"يلزم وجود بطاقة SD لتنزيل <xliff:g id="FILENAME">%s</xliff:g>."</string>
+ <!-- outdated translation 6877712666046917741 --> <string name="download_sdcard_busy_dlg_title" product="nosdcard" msgid="8081445664689818973">"بطاقة SD غير متوفرة"</string>
+ <string name="download_sdcard_busy_dlg_title" product="default" msgid="6877712666046917741">"بطاقة SD غير متوفرة"</string>
+ <!-- outdated translation 3473883538192835204 --> <string name="download_sdcard_busy_dlg_msg" product="nosdcard" msgid="3979329954835690147">"بطاقة SD مشغولة. للسماح بالتنزيلات، حدد \"إيقاف تشغيل تخزين USB\" في التنبيه."</string>
+ <string name="download_sdcard_busy_dlg_msg" product="default" msgid="3473883538192835204">"بطاقة SD مشغولة. للسماح بالتنزيلات، حدد \"إيقاف تشغيل تخزين USB\" في التنبيه."</string>
+ <string name="download_no_application_title" msgid="1286056729168874295">"لا يمكن فتح الملف"</string>
+ <string name="retry" msgid="1835923075542266721">"إعادة المحاولة"</string>
+ <string name="no_downloads" msgid="3947445710685021498">"سجل التنزيل فارغ."</string>
+ <string name="download_error" msgid="413496839831257187">"أخفق التنزيل."</string>
+ <string name="download_success" msgid="2279041638155595203">"اكتمل تنزيل <xliff:g id="FILE">%s</xliff:g>."</string>
+ <string name="download_running" msgid="2622942231322015059">"جارٍ التنزيل..."</string>
+ <string name="download_pending" msgid="2599683668575349559">"جارٍ بدء التنزيل..."</string>
+ <string name="download_pending_network" msgid="6548714525679461053">"في انتظار اتصال البيانات..."</string>
+ <string name="download_running_paused" msgid="6418029352085656495">"في انتظار اتصال البيانات..."</string>
+ <string name="download_canceled" msgid="6057083743144492515">"تم إلغاء التنزيل."</string>
+ <string name="download_not_acceptable" msgid="313769696131563652">"لا يمكن التنزيل. المحتوى غير معتمد على هذا الهاتف."</string>
+ <string name="download_file_error" msgid="1206648050615176113">"لا يمكن إنهاء التنزيل. ليس هناك مساحة كافية."</string>
+ <string name="download_length_required" msgid="9038605488460437406">"لا يمكن التنزيل. لا يمكن تحديد حجم العنصر."</string>
+ <string name="download_precondition_failed" msgid="8327584102874295580">"تمت مقاطعة التنزيل. ولا يمكن استئنافه."</string>
+ <string name="search_the_web" msgid="6046130189241962337">"البحث في الويب"</string>
+ <string name="webstorage_outofspace_notification_title" msgid="1160474608059771788">"سعة تخزين المتصفح ممتلئة"</string>
+ <string name="webstorage_outofspace_notification_text" msgid="7341075135051829692">"انقر لتحرير مساحة."</string>
+ <string name="webstorage_clear_data_title" msgid="689484577124333977">"محو البيانات المخزنة"</string>
+ <string name="webstorage_clear_data_dialog_title" msgid="345457466368974706">"محو البيانات المخزنة"</string>
+ <string name="webstorage_clear_data_dialog_message" msgid="6678281256970470125">"سيتم حذف جميع البيانات المخزنة بواسطة موقع الويب هذا"</string>
+ <string name="webstorage_clear_data_dialog_ok_button" msgid="2516563534211898636">"محو الكل"</string>
+ <string name="webstorage_clear_data_dialog_cancel_button" msgid="2028867751958942762">"إلغاء"</string>
+ <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_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_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>
+ <string name="geolocation_settings_page_dialog_title" msgid="1549842043381347668">"محو إمكانية الدخول إلى الموقع الجغرافي"</string>
+ <string name="geolocation_settings_page_dialog_message" msgid="7586671987576403993">"سيتم محو إمكانية الدخول إلى الموقع الجغرافي بالنسبة إلى موقع الويب هذا"</string>
+ <string name="geolocation_settings_page_dialog_ok_button" msgid="4789434178048077287">"محو إمكانية الدخول"</string>
+ <string name="geolocation_settings_page_dialog_cancel_button" msgid="7941036504673409747">"إلغاء"</string>
+ <string name="website_settings_clear_all" msgid="8739804325997655980">"محو الكل"</string>
+ <string name="website_settings_clear_all_dialog_title" msgid="7791826325122461718">"هل تريد محو جميع إعدادات موقع الويب؟"</string>
+ <string name="website_settings_clear_all_dialog_message" msgid="6150502090601476333">"سيتم حذف جميع بيانات موقع الويب وأذونات الموقع الجغرافي."</string>
+ <string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"حذف جميع البيانات"</string>
+ <string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"إلغاء"</string>
+ <string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"جارٍ إعداد الخلفية..."</string>
+ <!-- no translation found for defaultBookmarksUpButton (2303951020715704735) -->
+ <skip />
+ <!-- no translation found for empty_bookmarks_folder (7843361614634930942) -->
+ <skip />
+ <!-- no translation found for rlz_access_point (7165847807377650632) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_title (3325557652271172128) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_description (2187665745413495303) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_remove (8105572409059113340) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_import (6933613853573899218) -->
+ <skip />
+</resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
new file mode 100644
index 0000000..1870ee7
--- /dev/null
+++ b/res/values-bg/strings.xml
@@ -0,0 +1,401 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2007 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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="application_name" msgid="1935869255545976415">"Браузър"</string>
+ <string name="choose_upload" msgid="3649366287575002063">"Избор на файл за качване"</string>
+ <string name="new_tab" msgid="4505722538297295141">"Нов прозорец"</string>
+ <!-- no translation found for new_incognito_tab (5821404839654751753) -->
+ <skip />
+ <string name="active_tabs" msgid="3050623868203544623">"Прозорци"</string>
+ <string name="tab_bookmarks" msgid="2305793036003473653">"Отметки"</string>
+ <string name="tab_most_visited" msgid="1077402532455000703">"Най-посещавани"</string>
+ <string name="tab_history" msgid="1979267558744613746">"История"</string>
+ <string name="added_to_bookmarks" msgid="1020224130695956728">"Добавено към отметките"</string>
+ <string name="removed_from_bookmarks" msgid="6063705902028438800">"Премахната от отметки"</string>
+ <string name="sign_in_to" msgid="5939425800148759165">"Влезте в <xliff:g id="HOSTNAME">%s1</xliff:g> „<xliff:g id="REALM">%s2</xliff:g>“"</string>
+ <string name="username" msgid="5057566336518215922">"Име"</string>
+ <string name="password" msgid="1177138552305184404">"Парола"</string>
+ <string name="action" msgid="183105774472071343">"Вход"</string>
+ <string name="bookmarks_search" msgid="5229596268214362873">"Браузър"</string>
+ <string name="cancel" msgid="3017274947407233702">"Отказ"</string>
+ <string name="ok" msgid="1509280796718850364">"OK"</string>
+ <string name="title_bar_loading" msgid="7438217780834640678">"Зарежда се…"</string>
+ <string name="page_info" msgid="4048529256302257195">"Данни за страницата"</string>
+ <string name="page_info_view" msgid="5303490449842635158">"Преглед на данните за страницата"</string>
+ <string name="page_info_address" msgid="2222306609532903254">"Адрес:"</string>
+ <string name="ssl_warnings_header" msgid="79744901983636370">"Има проблеми със сертификата за сигурност за този сайт."</string>
+ <string name="ssl_continue" msgid="8031515015829358457">"Напред"</string>
+ <string name="security_warning" msgid="6607795404322797541">"Предупреждение относно защитата"</string>
+ <string name="view_certificate" msgid="1472768887529093862">"Преглед на сертификата"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
+ <string name="ssl_untrusted" msgid="5369967226521102194">"Сертификатът не е от надежден орган."</string>
+ <string name="ssl_mismatch" msgid="558688832420069896">"Името на сайта не съответства на името в сертификата."</string>
+ <string name="ssl_expired" msgid="5739349389499575559">"Сертификатът е изтекъл."</string>
+ <string name="ssl_not_yet_valid" msgid="2893167846212645846">"Сертификатът още не е валиден."</string>
+ <string name="ssl_certificate" msgid="5226747157992111668">"Сертификат за сигурност"</string>
+ <string name="ssl_certificate_is_valid" msgid="7096160815933145579">"Сертификатът е валиден."</string>
+ <string name="issued_to" msgid="9032338008819841339">"Издаден на:"</string>
+ <string name="common_name" msgid="5745530093500062357">"Общо име:"</string>
+ <string name="org_name" msgid="8868889052889991293">"Организация:"</string>
+ <string name="org_unit" msgid="4489056376307768196">"Организационна единица:"</string>
+ <string name="issued_by" msgid="6959484326943152487">"Издаден от:"</string>
+ <string name="validity_period" msgid="57988851973181309">"Валидност:"</string>
+ <string name="issued_on" msgid="2082890654801808368">"Издаден на:"</string>
+ <string name="expires_on" msgid="8061200430557020704">"Изтича на:"</string>
+ <string name="stopping" msgid="4839698519340302982">"Спира се..."</string>
+ <string name="stop" msgid="5687251076030630074">"Стоп"</string>
+ <string name="reload" msgid="8585220783228408062">"Опресняване"</string>
+ <string name="back" msgid="8414603107175713668">"Назад"</string>
+ <string name="forward" msgid="4288210890526641577">"Напред"</string>
+ <string name="save" msgid="5922311934992468496">"OK"</string>
+ <string name="do_not_save" msgid="6777633870113477714">"Отказ"</string>
+ <!-- outdated translation 969988560160364559 --> <string name="location" msgid="3411848697912600125">"Местоположение"</string>
+ <!-- no translation found for containing_folder (6771180232953030479) -->
+ <skip />
+ <!-- no translation found for new_folder (7743540149088867917) -->
+ <skip />
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <!-- no translation found for no_subfolders (5880411440592452802) -->
+ <skip />
+ <!-- no translation found for add_to_bookmarks_menu_option (4449323955122214389) -->
+ <skip />
+ <!-- no translation found for add_to_homescreen_menu_option (1461447829242963790) -->
+ <skip />
+ <!-- no translation found for add_to_other_folder_menu_option (5450890093372998187) -->
+ <skip />
+ <!-- outdated translation 5990326151488445481 --> <string name="name" msgid="5462672162695365387">"Име"</string>
+ <string name="http" msgid="2163722670597250102">"http://"</string>
+ <!-- outdated translation 588165100024086565 --> <string name="save_to_bookmarks" msgid="6101482434920313244">"Добавяне на отметка"</string>
+ <!-- no translation found for bookmark_this_page (7530739804320811054) -->
+ <skip />
+ <string name="edit_bookmark" msgid="5024089053490231905">"Редактиране на отметката"</string>
+ <!-- outdated translation 9202323987633899835 --> <string name="create_shortcut_bookmark" msgid="1995095662095484289">"Добавяне на пряк път до „Начало“"</string>
+ <string name="open_bookmark" msgid="8473581305759935790">"Отваряне"</string>
+ <string name="remove_bookmark" msgid="8407495852801410891">"Изтриване на отметка"</string>
+ <string name="remove_from_bookmarks" msgid="4374080666576982775">"Премахване от отметки"</string>
+ <string name="remove_history_item" msgid="5021424935726728618">"Премахване от история"</string>
+ <string name="set_as_homepage" msgid="4752937379414905560">"Задаване като начална страница"</string>
+ <string name="bookmark_saved" msgid="2766434679871317557">"Запазено в отметките."</string>
+ <string name="bookmark_not_saved" msgid="700600955089376724">"Отметката не може да бъде запазена."</string>
+ <string name="homepage_set" msgid="8768087280310966395">"Началната страница е зададена."</string>
+ <string name="bookmark_needs_title" msgid="6245900436119218187">"Отметката трябва да има име."</string>
+ <string name="bookmark_needs_url" msgid="7809876865972755158">"Отметката трябва да има местоположение."</string>
+ <string name="bookmark_url_not_valid" msgid="6719785633980202419">"URL адресът не е валиден."</string>
+ <string name="bookmark_cannot_save_url" msgid="791722768778386941">"Не може да бъде създадена отметка към този URL адрес."</string>
+ <string name="delete_bookmark" msgid="2422989994934201992">"Изтриване"</string>
+ <string name="bookmark_page" msgid="6845189305130307274">"Отметка към последно разглежданата страница"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
+ <string name="current_page" msgid="7510129573681663135">"от "</string>
+ <string name="delete_bookmark_warning" msgid="758043186202032205">"Отметката „<xliff:g id="BOOKMARK">%s</xliff:g>“ ще бъде изтрита."</string>
+ <string name="open_in_new_window" msgid="6596775546468054510">"Отваряне в нов прозорец"</string>
+ <string name="goto_dot" msgid="3895839050522602723">"Старт"</string>
+ <!-- no translation found for incognito_tab (5419458065370134289) -->
+ <skip />
+ <string name="select_dot" msgid="6299170761900561967">"Избиране на текст"</string>
+ <string name="tab_picker_title" msgid="864478399057782913">"Текущ прозорец"</string>
+ <string name="tab_picker_remove_tab" msgid="630087809802479397">"Затваряне"</string>
+ <string name="bookmarks" msgid="1961279134885867815">"Отметки"</string>
+ <string name="shortcut_bookmark" msgid="3974876480401135895">"Отметка"</string>
+ <string name="history" msgid="2451240511251410032">"История"</string>
+ <string name="menu_view_download" msgid="2124570321712995120">"Изтеглени"</string>
+ <string name="copy_page_url" msgid="7635062169011319208">"Копиране на URL адреса на страницата"</string>
+ <string name="share_page" msgid="593756995297268343">"Споделяне на страницата"</string>
+ <!-- no translation found for menu_save_webarchive (3934652434001459581) -->
+ <skip />
+ <!-- no translation found for webarchive_saved (7045250341467345007) -->
+ <skip />
+ <!-- no translation found for webarchive_failed (2880998204746620260) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
+ <string name="contextmenu_openlink" msgid="7237961252214188935">"Отваряне"</string>
+ <string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"Отваряне в нов прозорец"</string>
+ <string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"Отметка за връзка"</string>
+ <string name="contextmenu_savelink" msgid="5508554930832538184">"Запазване на връзката"</string>
+ <string name="contextmenu_sharelink" msgid="5392275392280130331">"Споделяне на връзката"</string>
+ <string name="contextmenu_copy" msgid="398860586635404030">"Копиране"</string>
+ <string name="contextmenu_copylink" msgid="5153657160294534270">"Копиране на URL адреса на връзката"</string>
+ <string name="contextmenu_download_image" msgid="4243829645180686912">"Запазване на изображението"</string>
+ <string name="contextmenu_view_image" msgid="3870625602053600905">"Преглед на изображението"</string>
+ <string name="contextmenu_set_wallpaper" msgid="3691902960115350686">"Задаване като тапет"</string>
+ <string name="contextmenu_dial_dot" msgid="5856550683415933806">"Набиране..."</string>
+ <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="clear" msgid="7070043081700011461">"Изчистване"</string>
+ <string name="replace" msgid="4843033491070384047">"Замяна"</string>
+ <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Отметки"</string>
+ <string name="menu_preferences" msgid="6709237687234102240">"Настройки"</string>
+ <string name="pref_content_title" msgid="722227111894838633">"Настройки за съдържанието на страници"</string>
+ <string name="pref_content_load_images" msgid="2125616852957377561">"Зареждане на изображенията"</string>
+ <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Показване на изображенията в уеб страници"</string>
+ <string name="pref_content_block_popups" msgid="7808433807197256726">"Блокиране на изскачащи прозорци"</string>
+ <string name="pref_content_javascript" msgid="4570972030299516843">"Активиране на JavaScript"</string>
+ <string name="pref_content_open_in_background" msgid="824123779725118663">"Отваряне на заден план"</string>
+ <string name="pref_content_plugins" msgid="7231944644794301582">"Активиране на приставки"</string>
+ <string-array name="pref_content_plugins_choices">
+ <item msgid="6745108155096660725">"Винаги включено"</item>
+ <item msgid="2484126708670016519">"При поискване"</item>
+ <item msgid="8547442717307793863">"Изкл."</item>
+ </string-array>
+ <string name="pref_content_open_in_background_summary" msgid="1737664075721181678">"Отваряне на нови прозорци зад текущия"</string>
+ <string name="pref_content_homepage" msgid="6082437160778559806">"Задаване на начална страница"</string>
+ <!-- no translation found for pref_content_search_engine (1620101310821644144) -->
+ <skip />
+ <!-- no translation found for pref_content_search_engine_summary (5162667665858487316) -->
+ <skip />
+ <!-- no translation found for pref_set_homepage_to (7196350233061395098) -->
+ <skip />
+ <!-- outdated translation 1493179933653044553 --> <string name="pref_use_current" msgid="1778622474040406672">"Използване на текущата страница"</string>
+ <!-- no translation found for pref_use_blank (8503238592551111169) -->
+ <skip />
+ <!-- no translation found for pref_use_default (192587563274735878) -->
+ <skip />
+ <string name="pref_content_autofit" msgid="8260474534053660809">"Автоматично побиране на страници"</string>
+ <string name="pref_content_autofit_summary" msgid="4587831659894879986">"Уеб страниците се форматират до размера на екрана"</string>
+ <!-- no translation found for pref_personal_title (1447687455755683695) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome (1695182180332194033) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome_summary (7414133931827321055) -->
+ <skip />
+ <!-- no translation found for pref_personal_google_account (952360133341490071) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks (59237515966184432) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks_summary (4791767605662205482) -->
+ <skip />
+ <!-- no translation found for pref_personal_start_syncing (6046972042512655232) -->
+ <skip />
+ <!-- no translation found for pref_personal_account_dialog_title (1390867119887955530) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled (1174197447388234595) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled_summary (422640696197018914) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor (1350709161524642663) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor_summary (6748434431641768870) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_name (8566130291459685955) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_email_address (7967585896612797173) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_company_name (2813443159949210417) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1 (836433242509243081) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1_hint (5965659598509327172) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2 (8194745202893822479) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2_hint (2048330295853546405) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_city (4193225955409148508) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_state (8549739922338171458) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_zip_code (283668573295656671) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_country (7234470301239156656) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_phone_number (4938852821413729276) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_save_profile (8349915287435262888) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_save (6834102203944938409) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_delete (2421442112954362732) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_delete_profile (7112035941146003753) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
+ <string name="pref_privacy_title" msgid="1052470980370846151">"Настройки за поверителност"</string>
+ <string name="pref_privacy_clear_cache" msgid="3380316479925886998">"Изчистване на кеша"</string>
+ <string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"Изчистване на съдържанието и базите от данни от локалния кеш"</string>
+ <string name="pref_privacy_clear_cache_dlg" msgid="5541011591300753881">"Съдържанието и базите от данни в локалния кеш ще бъдат изтрити."</string>
+ <string name="pref_privacy_clear_cookies" msgid="3095583579133780331">"Изчистване на всички данни за „бисквитки“"</string>
+ <string name="pref_privacy_clear_cookies_summary" msgid="6962742063990677520">"Изчистване на всички „бисквитки“ на браузъра"</string>
+ <string name="pref_privacy_clear_cookies_dlg" msgid="552855688091432682">"Всички „бисквитки“ ще бъдат изтрити."</string>
+ <string name="pref_privacy_clear_history" msgid="8723795508825198477">"Изчистване на историята"</string>
+ <string name="pref_privacy_clear_history_summary" msgid="6868501330708940734">"Изчистване на навигационната история на браузъра"</string>
+ <string name="pref_privacy_clear_history_dlg" msgid="544903007914753853">"Историята на сърфиране на браузъра ще бъде изтрита."</string>
+ <string name="pref_privacy_clear_form_data" msgid="4232668196344383987">"Изчистване на данни за формуляри"</string>
+ <string name="pref_privacy_clear_form_data_summary" msgid="1790390894719517167">"Изчистване на всички запазени данни за формуляри"</string>
+ <string name="pref_privacy_clear_form_data_dlg" msgid="4443621086781197928">"Всички запазени данни за формуляри ще бъдат изтрити."</string>
+ <string name="pref_privacy_clear_passwords" msgid="4750234112289277480">"Изчистване на пароли"</string>
+ <string name="pref_privacy_clear_passwords_summary" msgid="8856782718942903335">"Изчистване на всички запазени пароли"</string>
+ <string name="pref_privacy_clear_passwords_dlg" msgid="2083869328824248255">"Всички запазени пароли ще бъдат изтрити."</string>
+ <string name="pref_privacy_enable_geolocation" msgid="1395040170290765686">"Активиране на местоположение"</string>
+ <string name="pref_privacy_enable_geolocation_summary" msgid="8437020934664306205">"Разрешаване на сайтове да искат достъп до местопол. ви"</string>
+ <string name="pref_privacy_clear_geolocation_access" msgid="6649680770030042980">"Изчистване на достъпа до местопол."</string>
+ <string name="pref_privacy_clear_geolocation_access_summary" msgid="7750143359497314679">"Изчистване на достъпа на всички уебсайтове до местопол. ви"</string>
+ <string name="pref_privacy_clear_geolocation_access_dlg" msgid="7327063124488827244">"Изчистване на достъпа на всички уебсайтове до местопол. ви"</string>
+ <string name="pref_security_title" msgid="5763978646932160021">"Защитни настройки"</string>
+ <string name="pref_security_remember_passwords" msgid="6492957683454529549">"Запомняне на пароли"</string>
+ <string name="pref_security_remember_passwords_summary" msgid="256388703356349137">"Запазване на потребителските имена и паролите за уебсайтове"</string>
+ <string name="pref_security_save_form_data" msgid="1213669802810198893">"Запомняне на данни за формуляри"</string>
+ <string name="pref_security_save_form_data_summary" msgid="4994074685153708026">"Запазване на въведени от мен данни във формуляри за по-късна употреба"</string>
+ <string name="pref_security_show_security_warning" msgid="8901135676266754559">"Показване на предупреждения относно защитата"</string>
+ <string name="pref_security_show_security_warning_summary" msgid="8968906112720511704">"Показване на предупреждение при проблем със сигурността на сайт"</string>
+ <string name="pref_security_accept_cookies" msgid="3201367661925047989">"Приемане на „бисквитки“"</string>
+ <string name="pref_security_accept_cookies_summary" msgid="1465118934875026920">"Разрешаване на сайтове да запазват и четат данни за „бисквитки“"</string>
+ <string name="pref_text_size" msgid="3827031324346612208">"Размер на текста"</string>
+ <string-array name="pref_text_size_choices">
+ <item msgid="4952686548944739548">"Миниатюрен"</item>
+ <item msgid="1950030433642671460">"Малък"</item>
+ <item msgid="4338347520133294584">"Нормален"</item>
+ <item msgid="5043128215356351184">"Голям"</item>
+ <item msgid="7201512237890458902">"Огромен"</item>
+ </string-array>
+ <string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Размер на текста"</string>
+ <string name="pref_default_zoom" msgid="8076142259097187395">"Стандартна промяна на мащаба"</string>
+ <string-array name="pref_default_zoom_choices">
+ <item msgid="549583171195154919">"Далече"</item>
+ <item msgid="5619034257768161024">"Среден"</item>
+ <item msgid="3840999588443167001">"Затваряне"</item>
+ </string-array>
+ <string name="pref_default_zoom_dialogtitle" msgid="6095974367125109021">"Стандартна промяна на мащаба"</string>
+ <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="3091250467679722382">"Разширени настройки"</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" msgid="8904000515846202110">"Възстановяване на стандартните"</string>
+ <string name="pref_extras_reset_default_summary" msgid="4247870778270414501">"Възстановяване на стандартните настройки"</string>
+ <string name="pref_extras_reset_default_dlg" msgid="6640261575874704022">"Настройките ще възвърнат стандартните си стойности."</string>
+ <string name="pref_extras_reset_default_dlg_title" msgid="2250334970728938936">"Възстановяване на стандартните"</string>
+ <string name="pref_development_title" msgid="3263854204533056480">"Отстраняване на грешки"</string>
+ <string name="pref_default_text_encoding" msgid="5742965543955558478">"Текстово кодиране"</string>
+ <!-- no translation found for pref_default_text_encoding_choices:7 (2193955365569270096) -->
+ <string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Текстово кодиране"</string>
+ <string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"Проблем с обмен на данни"</string>
+ <string name="browserFrameFileErrorLabel" msgid="8063691502792670367">"Проблем с файла"</string>
+ <string name="browserFrameFormResubmitLabel" msgid="2685923472682180360">"Потвърждаване"</string>
+ <string name="browserFrameFormResubmitMessage" msgid="2752182215695632138">"Страницата, която се опитвате да видите, съдържа вече изпратени данни („POSTDATA“). Ако ги изпратите отново, всички действия, извършени от формуляра на страницата (като търсене или онлайн покупка), ще бъдат повторени."</string>
+ <string name="loadSuspendedTitle" msgid="675991625288706944">"Няма връзка с мрежата"</string>
+ <string name="loadSuspended" msgid="3133656588880851273">"Браузър не може да зареди тази страница, защото няма връзка с интернет."</string>
+ <string name="clear_history" msgid="5998307092715979619">"Изчистване на историята"</string>
+ <string name="browser_history" msgid="1038987118290272525">"Наскоро посетени страници"</string>
+ <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_button_text" msgid="5235226933877634410">"Старт"</string>
+ <string name="search_settings_description" msgid="1422401062529014107">"Отметки и посетени сайтове"</string>
+ <string name="attention" msgid="3473639060042811244">"Внимание"</string>
+ <string name="popup_window_attempt" msgid="2673111696288657989">"Този сайт се опитва да отвори изскачащ прозорец."</string>
+ <string name="allow" msgid="1157313689171991335">"Разрешаване"</string>
+ <string name="block" msgid="9172175889884707800">"Блокиране"</string>
+ <string name="too_many_windows_dialog_title" msgid="5175503564948906442">"Достигнато е ограничението за прозорци"</string>
+ <string name="too_many_windows_dialog_message" msgid="1398571800233959583">"Не можа да бъде отворен нов прозорец, защото вече сте отворили максималния брой."</string>
+ <string name="too_many_subwindows_dialog_title" msgid="3805453941587725944">"Изскачащият прозорец вече е отворен"</string>
+ <string name="too_many_subwindows_dialog_message" msgid="5827289829907966657">"Не можа да бъде отворен нов изскачащ прозорец – най-много един може да е отворен по всяко време."</string>
+ <string name="download_title" msgid="2122874021047565594">"История на изтеглянията"</string>
+ <string name="download_unknown_filename" msgid="4013465542563652175">"<Неизвестно>"</string>
+ <string name="download_menu_open" msgid="4888327480367757513">"Отваряне"</string>
+ <string name="download_menu_clear" msgid="6264454531553418124">"Изчистване от списък"</string>
+ <string name="download_menu_delete" msgid="8815502136393894148">"Изтриване"</string>
+ <string name="download_menu_cancel" msgid="2545333007601851574">"Анулиране на изтеглянето"</string>
+ <string name="download_menu_cancel_all" msgid="2136550823151999166">"Анулиране на всички изтегляния"</string>
+ <string name="download_cancel_dlg_title" msgid="8909108500262799748">"Анулиране на изтеглянията"</string>
+ <string name="download_cancel_dlg_msg" msgid="6285389170052357797">"Всичките <xliff:g id="DOWNLOAD_COUNT">%d</xliff:g> изтегляния ще бъдат анулирани и изчистени от историята."</string>
+ <string name="download_delete_file" msgid="5330036497843073249">"Файлът ще бъде изтрит"</string>
+ <string name="download_file_error_dlg_title" msgid="2693630283595384874">"Няма място"</string>
+ <string name="download_file_error_dlg_msg" msgid="5156405410324072471">"<xliff:g id="FILENAME">%s</xliff:g> не можа да се изтегли."\n"Освободете място на телефона си и опитайте отново."</string>
+ <string name="download_failed_generic_dlg_title" msgid="6106781095337833391">"Изтеглянето не е успешно"</string>
+ <!-- outdated translation 605904452159416792 --> <string name="download_no_sdcard_dlg_title" product="nosdcard" msgid="56777245081568508">"Няма SD карта"</string>
+ <string name="download_no_sdcard_dlg_title" product="default" msgid="605904452159416792">"Няма SD карта"</string>
+ <!-- no translation found for download_no_sdcard_dlg_msg (3144652102051031721) -->
+ <skip />
+ <string name="download_no_sdcard_dlg_msg" product="default" msgid="2616399456116301518">"Изисква се SD карта за изтеглянето на <xliff:g id="FILENAME">%s</xliff:g>."</string>
+ <!-- outdated translation 6877712666046917741 --> <string name="download_sdcard_busy_dlg_title" product="nosdcard" msgid="8081445664689818973">"Няма SD карта"</string>
+ <string name="download_sdcard_busy_dlg_title" product="default" msgid="6877712666046917741">"Няма SD карта"</string>
+ <!-- outdated translation 3473883538192835204 --> <string name="download_sdcard_busy_dlg_msg" product="nosdcard" msgid="3979329954835690147">"SD картата е заета. За да разрешите изтегляния, изберете „Изключване на USB устройството за съхранение“ в известието."</string>
+ <string name="download_sdcard_busy_dlg_msg" product="default" msgid="3473883538192835204">"SD картата е заета. За да разрешите изтегляния, изберете „Изключване на USB устройството за съхранение“ в известието."</string>
+ <string name="download_no_application_title" msgid="1286056729168874295">"Файлът не може да се отвори"</string>
+ <string name="retry" msgid="1835923075542266721">"Повторен опит"</string>
+ <string name="no_downloads" msgid="3947445710685021498">"Историята на изтеглянията е празна."</string>
+ <string name="download_error" msgid="413496839831257187">"Изтеглянето не е успешно."</string>
+ <string name="download_success" msgid="2279041638155595203">"Изтеглянето на <xliff:g id="FILE">%s</xliff:g> завърши."</string>
+ <string name="download_running" msgid="2622942231322015059">"Изтегля се..."</string>
+ <string name="download_pending" msgid="2599683668575349559">"Изтеглянето се стартира…"</string>
+ <string name="download_pending_network" msgid="6548714525679461053">"Изчаква се връзка за данни..."</string>
+ <string name="download_running_paused" msgid="6418029352085656495">"Изчаква се връзка за данни..."</string>
+ <string name="download_canceled" msgid="6057083743144492515">"Изтеглянето е анулирано."</string>
+ <string name="download_not_acceptable" msgid="313769696131563652">"Не може да се изтегли. Съдържанието не се поддържа от този телефон."</string>
+ <string name="download_file_error" msgid="1206648050615176113">"Изтеглянето не може да завърши. Няма достатъчно място."</string>
+ <string name="download_length_required" msgid="9038605488460437406">"Не може да се изтегли и да се определи размерът на елемента."</string>
+ <string name="download_precondition_failed" msgid="8327584102874295580">"Изтеглянето е прекъснато и не може да бъде възобновено."</string>
+ <string name="search_the_web" msgid="6046130189241962337">"Търсене в мрежата"</string>
+ <string name="webstorage_outofspace_notification_title" msgid="1160474608059771788">"Хранилището на браузъра е пълно"</string>
+ <string name="webstorage_outofspace_notification_text" msgid="7341075135051829692">"Кликнете за освобождаване на място."</string>
+ <string name="webstorage_clear_data_title" msgid="689484577124333977">"Изчистване на съхранени данни"</string>
+ <string name="webstorage_clear_data_dialog_title" msgid="345457466368974706">"Изчистване на съхранени данни"</string>
+ <string name="webstorage_clear_data_dialog_message" msgid="6678281256970470125">"Всички данни, съхранени от този уебсайт, ще бъдат изтрити"</string>
+ <string name="webstorage_clear_data_dialog_ok_button" msgid="2516563534211898636">"Изчистване на всичко"</string>
+ <string name="webstorage_clear_data_dialog_cancel_button" msgid="2028867751958942762">"Отказ"</string>
+ <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_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_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>
+ <string name="geolocation_settings_page_dialog_title" msgid="1549842043381347668">"Изчистване на достъпа до местопол."</string>
+ <string name="geolocation_settings_page_dialog_message" msgid="7586671987576403993">"Достъпът на този сайт до местоположението ще бъде премахнат"</string>
+ <string name="geolocation_settings_page_dialog_ok_button" msgid="4789434178048077287">"Премахване на достъп"</string>
+ <string name="geolocation_settings_page_dialog_cancel_button" msgid="7941036504673409747">"Отказ"</string>
+ <string name="website_settings_clear_all" msgid="8739804325997655980">"Изчистване на всичко"</string>
+ <string name="website_settings_clear_all_dialog_title" msgid="7791826325122461718">"Да се изчистят ли всички настройки за уебсайтове?"</string>
+ <string name="website_settings_clear_all_dialog_message" msgid="6150502090601476333">"Всички данни за уебсайтове и разрешения за местопол. ще бъдат изтрити."</string>
+ <string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"Изтриване на всички данни"</string>
+ <string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"Отказ"</string>
+ <string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"Тапетът се задава..."</string>
+ <!-- no translation found for defaultBookmarksUpButton (2303951020715704735) -->
+ <skip />
+ <!-- no translation found for empty_bookmarks_folder (7843361614634930942) -->
+ <skip />
+ <!-- no translation found for rlz_access_point (7165847807377650632) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_title (3325557652271172128) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_description (2187665745413495303) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_remove (8105572409059113340) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_import (6933613853573899218) -->
+ <skip />
+</resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
new file mode 100644
index 0000000..6affc02
--- /dev/null
+++ b/res/values-ca/strings.xml
@@ -0,0 +1,401 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2007 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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="application_name" msgid="1935869255545976415">"Navegador"</string>
+ <string name="choose_upload" msgid="3649366287575002063">"Trieu un fitxer per penjar-lo"</string>
+ <string name="new_tab" msgid="4505722538297295141">"Finestra nova"</string>
+ <!-- no translation found for new_incognito_tab (5821404839654751753) -->
+ <skip />
+ <string name="active_tabs" msgid="3050623868203544623">"Windows"</string>
+ <string name="tab_bookmarks" msgid="2305793036003473653">"Adreces d\'interès"</string>
+ <string name="tab_most_visited" msgid="1077402532455000703">"Més visitats"</string>
+ <string name="tab_history" msgid="1979267558744613746">"Historial"</string>
+ <string name="added_to_bookmarks" msgid="1020224130695956728">"S\'ha afegit a les adreces d\'interès"</string>
+ <string name="removed_from_bookmarks" msgid="6063705902028438800">"Eliminat de les adreces d\'interès"</string>
+ <string name="sign_in_to" msgid="5939425800148759165">"Inici de sessió a <xliff:g id="HOSTNAME">%s1</xliff:g> \"<xliff:g id="REALM">%s2</xliff:g>\""</string>
+ <string name="username" msgid="5057566336518215922">"Nom"</string>
+ <string name="password" msgid="1177138552305184404">"Contrasenya"</string>
+ <string name="action" msgid="183105774472071343">"Inicia la sessió"</string>
+ <string name="bookmarks_search" msgid="5229596268214362873">"Navegador"</string>
+ <string name="cancel" msgid="3017274947407233702">"Cancel·la"</string>
+ <string name="ok" msgid="1509280796718850364">"D\'acord"</string>
+ <string name="title_bar_loading" msgid="7438217780834640678">"S\'està carregant…"</string>
+ <string name="page_info" msgid="4048529256302257195">"Informació de la pàgina"</string>
+ <string name="page_info_view" msgid="5303490449842635158">"Visualitza la informació de la pàgina"</string>
+ <string name="page_info_address" msgid="2222306609532903254">"Adreça:"</string>
+ <string name="ssl_warnings_header" msgid="79744901983636370">"Hi ha problemes amb el certificat de seguretat per a aquest lloc."</string>
+ <string name="ssl_continue" msgid="8031515015829358457">"Continua"</string>
+ <string name="security_warning" msgid="6607795404322797541">"Advertiment de seguretat"</string>
+ <string name="view_certificate" msgid="1472768887529093862">"Visualitza el certificat"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
+ <string name="ssl_untrusted" msgid="5369967226521102194">"Aquest certificat no és d\'una autoritat de confiança."</string>
+ <string name="ssl_mismatch" msgid="558688832420069896">"El nom del lloc no coincideix amb el nom que consta al certificat."</string>
+ <string name="ssl_expired" msgid="5739349389499575559">"Aquest certificat ha caducat."</string>
+ <string name="ssl_not_yet_valid" msgid="2893167846212645846">"Aquest certificat encara no és vàlid."</string>
+ <string name="ssl_certificate" msgid="5226747157992111668">"Certificat de seguretat"</string>
+ <string name="ssl_certificate_is_valid" msgid="7096160815933145579">"Aquest certificat és vàlid."</string>
+ <string name="issued_to" msgid="9032338008819841339">"Emès per a:"</string>
+ <string name="common_name" msgid="5745530093500062357">"Nom comú:"</string>
+ <string name="org_name" msgid="8868889052889991293">"Organització:"</string>
+ <string name="org_unit" msgid="4489056376307768196">"Unitat organitzativa:"</string>
+ <string name="issued_by" msgid="6959484326943152487">"Publicat per:"</string>
+ <string name="validity_period" msgid="57988851973181309">"Validesa:"</string>
+ <string name="issued_on" msgid="2082890654801808368">"Publicat el:"</string>
+ <string name="expires_on" msgid="8061200430557020704">"Caduca el:"</string>
+ <string name="stopping" msgid="4839698519340302982">"S\'està aturant..."</string>
+ <string name="stop" msgid="5687251076030630074">"Atura"</string>
+ <string name="reload" msgid="8585220783228408062">"Actualitza"</string>
+ <string name="back" msgid="8414603107175713668">"Enrere"</string>
+ <string name="forward" msgid="4288210890526641577">"Següent"</string>
+ <string name="save" msgid="5922311934992468496">"D\'acord"</string>
+ <string name="do_not_save" msgid="6777633870113477714">"Cancel·la"</string>
+ <!-- outdated translation 969988560160364559 --> <string name="location" msgid="3411848697912600125">"Ubicació"</string>
+ <!-- no translation found for containing_folder (6771180232953030479) -->
+ <skip />
+ <!-- no translation found for new_folder (7743540149088867917) -->
+ <skip />
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <!-- no translation found for no_subfolders (5880411440592452802) -->
+ <skip />
+ <!-- no translation found for add_to_bookmarks_menu_option (4449323955122214389) -->
+ <skip />
+ <!-- no translation found for add_to_homescreen_menu_option (1461447829242963790) -->
+ <skip />
+ <!-- no translation found for add_to_other_folder_menu_option (5450890093372998187) -->
+ <skip />
+ <!-- outdated translation 5990326151488445481 --> <string name="name" msgid="5462672162695365387">"Nom"</string>
+ <string name="http" msgid="2163722670597250102">"http://"</string>
+ <!-- outdated translation 588165100024086565 --> <string name="save_to_bookmarks" msgid="6101482434920313244">"Afegeix una adreça d\'interès"</string>
+ <!-- no translation found for bookmark_this_page (7530739804320811054) -->
+ <skip />
+ <string name="edit_bookmark" msgid="5024089053490231905">"Edita l\'adreça d\'interès"</string>
+ <!-- outdated translation 9202323987633899835 --> <string name="create_shortcut_bookmark" msgid="1995095662095484289">"Afegeix una drecera a la pàgina d\'inici"</string>
+ <string name="open_bookmark" msgid="8473581305759935790">"Obre"</string>
+ <string name="remove_bookmark" msgid="8407495852801410891">"Suprimeix l\'adreça d\'interès"</string>
+ <string name="remove_from_bookmarks" msgid="4374080666576982775">"Elimina de les adreces d\'interès"</string>
+ <string name="remove_history_item" msgid="5021424935726728618">"Elimina de l\'historial"</string>
+ <string name="set_as_homepage" msgid="4752937379414905560">"Defineix com a pàgina d\'inici"</string>
+ <string name="bookmark_saved" msgid="2766434679871317557">"S\'ha desat a les adreces d\'interès."</string>
+ <string name="bookmark_not_saved" msgid="700600955089376724">"No es pot desar l\'adreça d\'interès."</string>
+ <string name="homepage_set" msgid="8768087280310966395">"S\'ha definit la pàgina d\'inici."</string>
+ <string name="bookmark_needs_title" msgid="6245900436119218187">"L\'adreça d\'interès ha de tenir un nom."</string>
+ <string name="bookmark_needs_url" msgid="7809876865972755158">"L\'adreça d\'interès ha de tenir una ubicació."</string>
+ <string name="bookmark_url_not_valid" msgid="6719785633980202419">"L\'URL no és vàlid."</string>
+ <string name="bookmark_cannot_save_url" msgid="791722768778386941">"Aquest URL no es pot afegir a les adreces d\'interès."</string>
+ <string name="delete_bookmark" msgid="2422989994934201992">"Supressió"</string>
+ <string name="bookmark_page" msgid="6845189305130307274">"Afegeix l\'última pàgina visualitzada a les adreces d\'interès"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
+ <string name="current_page" msgid="7510129573681663135">"de "</string>
+ <string name="delete_bookmark_warning" msgid="758043186202032205">"Se suprimirà l\'adreça d\'interès \"<xliff:g id="BOOKMARK">%s</xliff:g>\"."</string>
+ <string name="open_in_new_window" msgid="6596775546468054510">"Obre en una finestra nova"</string>
+ <string name="goto_dot" msgid="3895839050522602723">"Vés"</string>
+ <!-- no translation found for incognito_tab (5419458065370134289) -->
+ <skip />
+ <string name="select_dot" msgid="6299170761900561967">"Selecciona text"</string>
+ <string name="tab_picker_title" msgid="864478399057782913">"Finestres actuals"</string>
+ <string name="tab_picker_remove_tab" msgid="630087809802479397">"Tanca"</string>
+ <string name="bookmarks" msgid="1961279134885867815">"Adreces d\'interès"</string>
+ <string name="shortcut_bookmark" msgid="3974876480401135895">"Adreça d\'interès"</string>
+ <string name="history" msgid="2451240511251410032">"Historial"</string>
+ <string name="menu_view_download" msgid="2124570321712995120">"Baixades"</string>
+ <string name="copy_page_url" msgid="7635062169011319208">"Copia l\'URL de la pàgina"</string>
+ <string name="share_page" msgid="593756995297268343">"Comparteix la pàgina"</string>
+ <!-- no translation found for menu_save_webarchive (3934652434001459581) -->
+ <skip />
+ <!-- no translation found for webarchive_saved (7045250341467345007) -->
+ <skip />
+ <!-- no translation found for webarchive_failed (2880998204746620260) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
+ <string name="contextmenu_openlink" msgid="7237961252214188935">"Obre"</string>
+ <string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"Obre en una finestra nova"</string>
+ <string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"Afegeix l\'enllaç a les adreces d\'interès"</string>
+ <string name="contextmenu_savelink" msgid="5508554930832538184">"Desa l\'enllaç"</string>
+ <string name="contextmenu_sharelink" msgid="5392275392280130331">"Comparteix l\'enllaç"</string>
+ <string name="contextmenu_copy" msgid="398860586635404030">"Copia"</string>
+ <string name="contextmenu_copylink" msgid="5153657160294534270">"Copia l\'URL de l\'enllaç"</string>
+ <string name="contextmenu_download_image" msgid="4243829645180686912">"Desa la imatge"</string>
+ <string name="contextmenu_view_image" msgid="3870625602053600905">"Visualitza la imatge"</string>
+ <string name="contextmenu_set_wallpaper" msgid="3691902960115350686">"Defineix com a empaperat"</string>
+ <string name="contextmenu_dial_dot" msgid="5856550683415933806">"Marca..."</string>
+ <string name="contextmenu_add_contact" msgid="3183511922223645716">"Afegeix un contacte"</string>
+ <string name="contextmenu_send_mail" msgid="1014513374828775660">"Envia un correu electrònic"</string>
+ <string name="contextmenu_map" msgid="7471390435434034912">"Mostra al mapa"</string>
+ <string name="choosertitle_sharevia" msgid="4600490613341909086">"Ús compartit mitjançant"</string>
+ <string name="clear" msgid="7070043081700011461">"Esborra"</string>
+ <string name="replace" msgid="4843033491070384047">"Substitueix"</string>
+ <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Adreces d\'interès"</string>
+ <string name="menu_preferences" msgid="6709237687234102240">"Configuració"</string>
+ <string name="pref_content_title" msgid="722227111894838633">"Configuració del contingut de la pàgina"</string>
+ <string name="pref_content_load_images" msgid="2125616852957377561">"Carrega les imatges"</string>
+ <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Mostra les imatges a les pàgines web"</string>
+ <string name="pref_content_block_popups" msgid="7808433807197256726">"Bloqueja les finestres emergents"</string>
+ <string name="pref_content_javascript" msgid="4570972030299516843">"Activa JavaScript"</string>
+ <string name="pref_content_open_in_background" msgid="824123779725118663">"Obre en segon terme"</string>
+ <string name="pref_content_plugins" msgid="7231944644794301582">"Activa els complements"</string>
+ <string-array name="pref_content_plugins_choices">
+ <item msgid="6745108155096660725">"Sempre activat"</item>
+ <item msgid="2484126708670016519">"Segons demanda"</item>
+ <item msgid="8547442717307793863">"Desactivat"</item>
+ </string-array>
+ <string name="pref_content_open_in_background_summary" msgid="1737664075721181678">"Obre finestres noves darrera la finestra actual"</string>
+ <string name="pref_content_homepage" msgid="6082437160778559806">"Defineix la pàgina d\'inici"</string>
+ <!-- no translation found for pref_content_search_engine (1620101310821644144) -->
+ <skip />
+ <!-- no translation found for pref_content_search_engine_summary (5162667665858487316) -->
+ <skip />
+ <!-- no translation found for pref_set_homepage_to (7196350233061395098) -->
+ <skip />
+ <!-- outdated translation 1493179933653044553 --> <string name="pref_use_current" msgid="1778622474040406672">"Utilitza la pàgina actual"</string>
+ <!-- no translation found for pref_use_blank (8503238592551111169) -->
+ <skip />
+ <!-- no translation found for pref_use_default (192587563274735878) -->
+ <skip />
+ <string name="pref_content_autofit" msgid="8260474534053660809">"Ajusta les pàgines automàticament"</string>
+ <string name="pref_content_autofit_summary" msgid="4587831659894879986">"Formata les pàgines web perquè s\'ajustin a la pantalla"</string>
+ <!-- no translation found for pref_personal_title (1447687455755683695) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome (1695182180332194033) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome_summary (7414133931827321055) -->
+ <skip />
+ <!-- no translation found for pref_personal_google_account (952360133341490071) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks (59237515966184432) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks_summary (4791767605662205482) -->
+ <skip />
+ <!-- no translation found for pref_personal_start_syncing (6046972042512655232) -->
+ <skip />
+ <!-- no translation found for pref_personal_account_dialog_title (1390867119887955530) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled (1174197447388234595) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled_summary (422640696197018914) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor (1350709161524642663) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor_summary (6748434431641768870) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_name (8566130291459685955) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_email_address (7967585896612797173) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_company_name (2813443159949210417) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1 (836433242509243081) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1_hint (5965659598509327172) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2 (8194745202893822479) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2_hint (2048330295853546405) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_city (4193225955409148508) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_state (8549739922338171458) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_zip_code (283668573295656671) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_country (7234470301239156656) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_phone_number (4938852821413729276) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_save_profile (8349915287435262888) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_save (6834102203944938409) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_delete (2421442112954362732) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_delete_profile (7112035941146003753) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
+ <string name="pref_privacy_title" msgid="1052470980370846151">"Configuració de privadesa"</string>
+ <string name="pref_privacy_clear_cache" msgid="3380316479925886998">"Esborra la memòria cau"</string>
+ <string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"Esborra el contingut i les bases de dades de la memòria cau local"</string>
+ <string name="pref_privacy_clear_cache_dlg" msgid="5541011591300753881">"Se suprimiran el contingut i les bases de dades de la memòria cau local."</string>
+ <string name="pref_privacy_clear_cookies" msgid="3095583579133780331">"Esborra totes les dades de les galetes"</string>
+ <string name="pref_privacy_clear_cookies_summary" msgid="6962742063990677520">"Esborra totes les galetes del navegador"</string>
+ <string name="pref_privacy_clear_cookies_dlg" msgid="552855688091432682">"Se suprimiran totes les galetes."</string>
+ <string name="pref_privacy_clear_history" msgid="8723795508825198477">"Esborra l\'historial"</string>
+ <string name="pref_privacy_clear_history_summary" msgid="6868501330708940734">"Esborra l\'historial de navegació del navegador"</string>
+ <string name="pref_privacy_clear_history_dlg" msgid="544903007914753853">"Se suprimirà l\'historial de navegació del navegador."</string>
+ <string name="pref_privacy_clear_form_data" msgid="4232668196344383987">"Esborra les dades dels formularis"</string>
+ <string name="pref_privacy_clear_form_data_summary" msgid="1790390894719517167">"Esborra totes les dades de formulari desades"</string>
+ <string name="pref_privacy_clear_form_data_dlg" msgid="4443621086781197928">"Se suprimiran totes les dades de formularis desades."</string>
+ <string name="pref_privacy_clear_passwords" msgid="4750234112289277480">"Esborra les contrasenyes"</string>
+ <string name="pref_privacy_clear_passwords_summary" msgid="8856782718942903335">"Esborra totes les contrasenyes desades"</string>
+ <string name="pref_privacy_clear_passwords_dlg" msgid="2083869328824248255">"Totes les contrasenyes desades se suprimiran."</string>
+ <string name="pref_privacy_enable_geolocation" msgid="1395040170290765686">"Activa la ubicació"</string>
+ <string name="pref_privacy_enable_geolocation_summary" msgid="8437020934664306205">"Permet als llocs sol·licitar accés a la vostra ubicació"</string>
+ <string name="pref_privacy_clear_geolocation_access" msgid="6649680770030042980">"Esborra l\'accés a la ubicació"</string>
+ <string name="pref_privacy_clear_geolocation_access_summary" msgid="7750143359497314679">"Esborra l\'accés a la ubicació per a tots els llocs web"</string>
+ <string name="pref_privacy_clear_geolocation_access_dlg" msgid="7327063124488827244">"Esborra l\'accés a la ubicació per a tots els llocs web"</string>
+ <string name="pref_security_title" msgid="5763978646932160021">"Configuració de seguretat"</string>
+ <string name="pref_security_remember_passwords" msgid="6492957683454529549">"Recorda les contrasenyes"</string>
+ <string name="pref_security_remember_passwords_summary" msgid="256388703356349137">"Desa els noms d\'usuari i les contrasenyes dels llocs"</string>
+ <string name="pref_security_save_form_data" msgid="1213669802810198893">"Recorda les dades del formulari"</string>
+ <string name="pref_security_save_form_data_summary" msgid="4994074685153708026">"Recorda les dades que escric als formularis per utilitzar-les més endavant"</string>
+ <string name="pref_security_show_security_warning" msgid="8901135676266754559">"Mostra els advertiments de seguretat"</string>
+ <string name="pref_security_show_security_warning_summary" msgid="8968906112720511704">"Mostra un advertiment si hi ha un problema amb la seguretat d\'un lloc"</string>
+ <string name="pref_security_accept_cookies" msgid="3201367661925047989">"Accepta les galetes"</string>
+ <string name="pref_security_accept_cookies_summary" msgid="1465118934875026920">"Permet als llocs desar i llegir dades de les \"galetes\""</string>
+ <string name="pref_text_size" msgid="3827031324346612208">"Mida del text"</string>
+ <string-array name="pref_text_size_choices">
+ <item msgid="4952686548944739548">"Molt petita"</item>
+ <item msgid="1950030433642671460">"Petita"</item>
+ <item msgid="4338347520133294584">"Normal"</item>
+ <item msgid="5043128215356351184">"Gran"</item>
+ <item msgid="7201512237890458902">"Enorme"</item>
+ </string-array>
+ <string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Mida del text"</string>
+ <string name="pref_default_zoom" msgid="8076142259097187395">"Zoom predeterminat"</string>
+ <string-array name="pref_default_zoom_choices">
+ <item msgid="549583171195154919">"Lluny"</item>
+ <item msgid="5619034257768161024">"Mitjà"</item>
+ <item msgid="3840999588443167001">"Tanca"</item>
+ </string-array>
+ <string name="pref_default_zoom_dialogtitle" msgid="6095974367125109021">"Zoom predeterminat"</string>
+ <string name="pref_content_load_page" msgid="2219810141690955452">"Obre un resum de les pàgines"</string>
+ <string name="pref_content_load_page_summary" msgid="8792093504054149369">"Mostra un resum de les pàgines que s\'han obert darrerament"</string>
+ <string name="pref_extras_title" msgid="3091250467679722382">"Configuració avançada"</string>
+ <string name="pref_extras_website_settings" msgid="67866640052455549">"Configuració del lloc web"</string>
+ <string name="pref_extras_website_settings_summary" msgid="1656771443223494406">"Configuració avançada de llocs web individuals"</string>
+ <string name="pref_extras_reset_default" msgid="8904000515846202110">"Restableix al valor predeterminat"</string>
+ <string name="pref_extras_reset_default_summary" msgid="4247870778270414501">"Restaura la configuració predeterminada"</string>
+ <string name="pref_extras_reset_default_dlg" msgid="6640261575874704022">"La configuració tornarà als valors predeterminats."</string>
+ <string name="pref_extras_reset_default_dlg_title" msgid="2250334970728938936">"Restableix al valor predeterminat"</string>
+ <string name="pref_development_title" msgid="3263854204533056480">"Depuració"</string>
+ <string name="pref_default_text_encoding" msgid="5742965543955558478">"Codificació del text"</string>
+ <!-- no translation found for pref_default_text_encoding_choices:7 (2193955365569270096) -->
+ <string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Codificació del text"</string>
+ <string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"Problema de connectivitat de dades"</string>
+ <string name="browserFrameFileErrorLabel" msgid="8063691502792670367">"Problema amb el fitxer"</string>
+ <string name="browserFrameFormResubmitLabel" msgid="2685923472682180360">"Confirma"</string>
+ <string name="browserFrameFormResubmitMessage" msgid="2752182215695632138">"La pàgina que proveu de visualitzar conté dades que ja s\'han enviat (\"POSTDATA\"). Si reenvieu les dades, qualsevol acció que hagi executat el formulari de la pàgina (com ara una cerca o bé una compra en línia) es repetirà."</string>
+ <string name="loadSuspendedTitle" msgid="675991625288706944">"No hi ha cap connexió de xarxa"</string>
+ <string name="loadSuspended" msgid="3133656588880851273">"El navegador no pot carregar aquesta pàgina perquè no hi ha connexió a Internet."</string>
+ <string name="clear_history" msgid="5998307092715979619">"Esborra l\'historial"</string>
+ <string name="browser_history" msgid="1038987118290272525">"Pàgines visitades recentment"</string>
+ <string name="empty_history" msgid="8738772352308207274">"L\'historial del navegador és buit."</string>
+ <string name="add_new_bookmark" msgid="8086367791400349049">"Afegeix una adreça d\'interès..."</string>
+ <string name="add_bookmark_short" msgid="3783984330998103735">"Afegeix"</string>
+ <string name="search_hint" msgid="4647356319916631820">"Cerqueu o escriviu l\'URL"</string>
+ <string name="search_button_text" msgid="5235226933877634410">"Vés"</string>
+ <string name="search_settings_description" msgid="1422401062529014107">"Adreces d\'interès i historial web"</string>
+ <string name="attention" msgid="3473639060042811244">"Atenció"</string>
+ <string name="popup_window_attempt" msgid="2673111696288657989">"Aquest lloc prova d\'obrir una finestra emergent."</string>
+ <string name="allow" msgid="1157313689171991335">"Permet"</string>
+ <string name="block" msgid="9172175889884707800">"Bloqueja"</string>
+ <string name="too_many_windows_dialog_title" msgid="5175503564948906442">"S\'ha arribat al límit de finestres"</string>
+ <string name="too_many_windows_dialog_message" msgid="1398571800233959583">"No s\'ha pogut obrir una finestra nova perquè ja n\'heu obert el nombre màxim."</string>
+ <string name="too_many_subwindows_dialog_title" msgid="3805453941587725944">"La finestra emergent ja és oberta"</string>
+ <string name="too_many_subwindows_dialog_message" msgid="5827289829907966657">"No s\'ha pogut obrir una finestra emergent nova perquè només n\'hi pot haver una d\'oberta al mateix temps."</string>
+ <string name="download_title" msgid="2122874021047565594">"Historial de baixades"</string>
+ <string name="download_unknown_filename" msgid="4013465542563652175">"<Desconegut>"</string>
+ <string name="download_menu_open" msgid="4888327480367757513">"Obre"</string>
+ <string name="download_menu_clear" msgid="6264454531553418124">"Esborra de la llista"</string>
+ <string name="download_menu_delete" msgid="8815502136393894148">"Suprimeix"</string>
+ <string name="download_menu_cancel" msgid="2545333007601851574">"Cancel·la la baixada"</string>
+ <string name="download_menu_cancel_all" msgid="2136550823151999166">"Cancel·la totes les baixades"</string>
+ <string name="download_cancel_dlg_title" msgid="8909108500262799748">"Cancel·lació de baixades"</string>
+ <string name="download_cancel_dlg_msg" msgid="6285389170052357797">"Es cancel·laran les <xliff:g id="DOWNLOAD_COUNT">%d</xliff:g> baixades i s\'esborraran de l\'historial de baixades."</string>
+ <string name="download_delete_file" msgid="5330036497843073249">"El fitxer se suprimirà"</string>
+ <string name="download_file_error_dlg_title" msgid="2693630283595384874">"Espai esgotat"</string>
+ <string name="download_file_error_dlg_msg" msgid="5156405410324072471">"No s\'ha pogut baixar <xliff:g id="FILENAME">%s</xliff:g>."\n" Allibereu una mica d\'espai al telèfon i torneu-ho a provar."</string>
+ <string name="download_failed_generic_dlg_title" msgid="6106781095337833391">"Baixada incorrecta"</string>
+ <!-- outdated translation 605904452159416792 --> <string name="download_no_sdcard_dlg_title" product="nosdcard" msgid="56777245081568508">"No hi ha cap targeta SD"</string>
+ <string name="download_no_sdcard_dlg_title" product="default" msgid="605904452159416792">"No hi ha cap targeta SD"</string>
+ <!-- no translation found for download_no_sdcard_dlg_msg (3144652102051031721) -->
+ <skip />
+ <string name="download_no_sdcard_dlg_msg" product="default" msgid="2616399456116301518">"Es necessita una targeta SD per baixar <xliff:g id="FILENAME">%s</xliff:g>."</string>
+ <!-- outdated translation 6877712666046917741 --> <string name="download_sdcard_busy_dlg_title" product="nosdcard" msgid="8081445664689818973">"La targeta SD no està disponible"</string>
+ <string name="download_sdcard_busy_dlg_title" product="default" msgid="6877712666046917741">"La targeta SD no està disponible"</string>
+ <!-- outdated translation 3473883538192835204 --> <string name="download_sdcard_busy_dlg_msg" product="nosdcard" msgid="3979329954835690147">"La targeta SD està ocupada. Per permetre les baixades, seleccioneu \"Desactiva l\'emmagatzematge d\'USB\" a la notificació."</string>
+ <string name="download_sdcard_busy_dlg_msg" product="default" msgid="3473883538192835204">"La targeta SD està ocupada. Per permetre les baixades, seleccioneu \"Desactiva l\'emmagatzematge d\'USB\" a la notificació."</string>
+ <string name="download_no_application_title" msgid="1286056729168874295">"No pot obrir el fitxer"</string>
+ <string name="retry" msgid="1835923075542266721">"Torna-ho a provar"</string>
+ <string name="no_downloads" msgid="3947445710685021498">"L\'historial de baixades és buit."</string>
+ <string name="download_error" msgid="413496839831257187">"Baixada incorrecta."</string>
+ <string name="download_success" msgid="2279041638155595203">"<xliff:g id="FILE">%s</xliff:g>: baixada completa."</string>
+ <string name="download_running" msgid="2622942231322015059">"S\'està baixant..."</string>
+ <string name="download_pending" msgid="2599683668575349559">"S\'està iniciant la baixada…"</string>
+ <string name="download_pending_network" msgid="6548714525679461053">"S\'està esperant la connexió de dades..."</string>
+ <string name="download_running_paused" msgid="6418029352085656495">"S\'està esperant la connexió de dades..."</string>
+ <string name="download_canceled" msgid="6057083743144492515">"S\'ha cancel·lat la baixada."</string>
+ <string name="download_not_acceptable" msgid="313769696131563652">"No es pot baixar. El contingut no és compatible amb aquest telèfon."</string>
+ <string name="download_file_error" msgid="1206648050615176113">"No es pot completar la baixada. No hi ha prou espai."</string>
+ <string name="download_length_required" msgid="9038605488460437406">"No es pot baixar. La mida de l\'element no es pot determinar."</string>
+ <string name="download_precondition_failed" msgid="8327584102874295580">"S\'ha interromput la baixada. No es pot reprendre."</string>
+ <string name="search_the_web" msgid="6046130189241962337">"Cerca al web"</string>
+ <string name="webstorage_outofspace_notification_title" msgid="1160474608059771788">"La memòria del navegador és plena"</string>
+ <string name="webstorage_outofspace_notification_text" msgid="7341075135051829692">"Feu clic per alliberar espai."</string>
+ <string name="webstorage_clear_data_title" msgid="689484577124333977">"Esborra les dades emmagatzemades"</string>
+ <string name="webstorage_clear_data_dialog_title" msgid="345457466368974706">"Esborra les dades emmagatzemades"</string>
+ <string name="webstorage_clear_data_dialog_message" msgid="6678281256970470125">"Se suprimiran totes les dades emmagatzemades per aquest lloc web"</string>
+ <string name="webstorage_clear_data_dialog_ok_button" msgid="2516563534211898636">"Esborra-ho tot"</string>
+ <string name="webstorage_clear_data_dialog_cancel_button" msgid="2028867751958942762">"Cancel·la"</string>
+ <string name="webstorage_origin_summary_mb_stored" msgid="1985885826292236210">"MB emmagatzemats al telèfon"</string>
+ <string name="loading_video" msgid="4887871585216091096">"S\'està carregant el vídeo"</string>
+ <string name="geolocation_permissions_prompt_message" msgid="356796102004052471">"<xliff:g id="WEBSITE_ORIGIN">%s</xliff:g> vol saber la vostra ubicació"</string>
+ <string name="geolocation_permissions_prompt_share" msgid="9084486342048347976">"Comparteix la ubicació"</string>
+ <string name="geolocation_permissions_prompt_dont_share" msgid="6303025160237860300">"Rebutja"</string>
+ <string name="geolocation_permissions_prompt_remember" msgid="3118526300707348308">"Recorda la preferència"</string>
+ <string name="geolocation_permissions_prompt_toast_allowed" msgid="987286072035125498">"Aquest lloc pot accedir a la vostra ubicació. Canvieu aquest paràmetre a Configuració -> Configuració del lloc web"</string>
+ <string name="geolocation_permissions_prompt_toast_disallowed" msgid="7695100950212692515">"Aquest lloc no pot accedir a la vostra ubicació. Canvieu aquest paràmetre a Configuració -> Configuració del lloc web"</string>
+ <string name="geolocation_settings_page_title" msgid="1745477985097536528">"Esborra l\'accés a la ubicació"</string>
+ <string name="geolocation_settings_page_summary_allowed" msgid="9180251524290811398">"Actualment, aquest lloc pot accedir a la vostra ubicació"</string>
+ <string name="geolocation_settings_page_summary_not_allowed" msgid="4589649082203102544">"Aquest lloc no pot accedir actualment a la vostra ubicació"</string>
+ <string name="geolocation_settings_page_dialog_title" msgid="1549842043381347668">"Esborra l\'accés a la ubicació"</string>
+ <string name="geolocation_settings_page_dialog_message" msgid="7586671987576403993">"S\'esborrarà l\'accés a la ubicació d\'aquest lloc web"</string>
+ <string name="geolocation_settings_page_dialog_ok_button" msgid="4789434178048077287">"Esborra l\'accés"</string>
+ <string name="geolocation_settings_page_dialog_cancel_button" msgid="7941036504673409747">"Cancel·la"</string>
+ <string name="website_settings_clear_all" msgid="8739804325997655980">"Esborra-ho tot"</string>
+ <string name="website_settings_clear_all_dialog_title" msgid="7791826325122461718">"Voleu esborrar tota la configuració del lloc web?"</string>
+ <string name="website_settings_clear_all_dialog_message" msgid="6150502090601476333">"Se suprimiran totes les dades i els permisos d\'ubicació del lloc web."</string>
+ <string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"Suprimeix totes les dades"</string>
+ <string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"Cancel·la"</string>
+ <string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"S\'està definint l\'empaperat..."</string>
+ <!-- no translation found for defaultBookmarksUpButton (2303951020715704735) -->
+ <skip />
+ <!-- no translation found for empty_bookmarks_folder (7843361614634930942) -->
+ <skip />
+ <!-- no translation found for rlz_access_point (7165847807377650632) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_title (3325557652271172128) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_description (2187665745413495303) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_remove (8105572409059113340) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_import (6933613853573899218) -->
+ <skip />
+</resources>
diff --git a/res/values-cs-xlarge/strings.xml b/res/values-cs-xlarge/strings.xml
new file mode 100644
index 0000000..092d6c7
--- /dev/null
+++ b/res/values-cs-xlarge/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="new_tab" msgid="7275656655054293038">"Nová karta"</string>
+ <string name="new_incognito_tab" msgid="5149742197322201152">"Nová anonymní karta"</string>
+ <string name="active_tabs" msgid="5324492165541331128">"Karty"</string>
+</resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 4e05771..70cfbc1 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -19,6 +19,7 @@
<string name="application_name" msgid="1935869255545976415">"Prohlížeč"</string>
<string name="choose_upload" msgid="3649366287575002063">"Zvolit soubor, který chcete nahrát."</string>
<string name="new_tab" msgid="4505722538297295141">"Nové okno"</string>
+ <string name="new_incognito_tab" msgid="5821404839654751753">"Nové anonymní okno"</string>
<string name="active_tabs" msgid="3050623868203544623">"Okna"</string>
<string name="tab_bookmarks" msgid="2305793036003473653">"Záložky"</string>
<string name="tab_most_visited" msgid="1077402532455000703">"Nejnavštěvovanější"</string>
@@ -32,12 +33,6 @@
<string name="bookmarks_search" msgid="5229596268214362873">"Prohlížeč"</string>
<string name="cancel" msgid="3017274947407233702">"Zrušit"</string>
<string name="ok" msgid="1509280796718850364">"OK"</string>
- <plurals name="matches_found">
- <item quantity="zero" msgid="6242659159545399963">"Žádné shody"</item>
- <item quantity="one" msgid="4352019729062956802">"Shoda"</item>
- <item quantity="few" msgid="5544267486978946555">"<xliff:g id="NUMBER">%d</xliff:g> shod"</item>
- <item quantity="other" msgid="6616125067364315405">"<xliff:g id="NUMBER">%d</xliff:g> shod"</item>
- </plurals>
<string name="title_bar_loading" msgid="7438217780834640678">"Načítání..."</string>
<string name="page_info" msgid="4048529256302257195">"Informace o stránce"</string>
<string name="page_info_view" msgid="5303490449842635158">"Zobrazit informace o stránce"</string>
@@ -46,6 +41,8 @@
<string name="ssl_continue" msgid="8031515015829358457">"Pokračovat"</string>
<string name="security_warning" msgid="6607795404322797541">"Upozornění zabezpečení"</string>
<string name="view_certificate" msgid="1472768887529093862">"Zobrazit certifikát"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
<string name="ssl_untrusted" msgid="5369967226521102194">"Tento certifikát nepochází od důvěryhodné autority."</string>
<string name="ssl_mismatch" msgid="558688832420069896">"Název webu se neshoduje s názvem uvedeným v certifikátu."</string>
<string name="ssl_expired" msgid="5739349389499575559">"Platnost certifikátu vypršela."</string>
@@ -67,12 +64,23 @@
<string name="forward" msgid="4288210890526641577">"Předat dál"</string>
<string name="save" msgid="5922311934992468496">"OK"</string>
<string name="do_not_save" msgid="6777633870113477714">"Zrušit"</string>
- <string name="location" msgid="969988560160364559">"Místo"</string>
- <string name="name" msgid="5990326151488445481">"Jméno"</string>
+ <string name="location" msgid="3411848697912600125">"Adresa"</string>
+ <string name="containing_folder" msgid="6771180232953030479">"Přidat do složky"</string>
+ <string name="new_folder" msgid="7743540149088867917">"Nová složka"</string>
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <string name="no_subfolders" msgid="5880411440592452802">"Žádné podsložky"</string>
+ <string name="add_to_bookmarks_menu_option" msgid="4449323955122214389">"Záložky"</string>
+ <string name="add_to_homescreen_menu_option" msgid="1461447829242963790">"Plocha"</string>
+ <string name="add_to_other_folder_menu_option" msgid="5450890093372998187">"Jiná složka..."</string>
+ <string name="name" msgid="5462672162695365387">"Štítek"</string>
<string name="http" msgid="2163722670597250102">"http://"</string>
- <string name="save_to_bookmarks" msgid="588165100024086565">"Přidat záložku"</string>
+ <string name="save_to_bookmarks" msgid="6101482434920313244">"Přidat k záložkám"</string>
+ <string name="bookmark_this_page" msgid="7530739804320811054">"Přidat stránku do záložek"</string>
<string name="edit_bookmark" msgid="5024089053490231905">"Upravit záložku"</string>
- <string name="create_shortcut_bookmark" msgid="9202323987633899835">"Přidat odkaz na plochu"</string>
+ <string name="create_shortcut_bookmark" msgid="1995095662095484289">"Přidat zástupce na plochu"</string>
<string name="open_bookmark" msgid="8473581305759935790">"Otevřít"</string>
<string name="remove_bookmark" msgid="8407495852801410891">"Smazat záložku"</string>
<string name="remove_from_bookmarks" msgid="4374080666576982775">"Zrušit přístup k poloze"</string>
@@ -87,13 +95,15 @@
<string name="bookmark_cannot_save_url" msgid="791722768778386941">"Tuto adresu URL nelze přidat do záložek."</string>
<string name="delete_bookmark" msgid="2422989994934201992">"Smazat"</string>
<string name="bookmark_page" msgid="6845189305130307274">"Přidat poslední zobrazenou stránku do záložek"</string>
- <string name="switch_to_thumbnails" msgid="5493351529609043151">"Zobrazit jako miniatury"</string>
- <string name="switch_to_list" msgid="8900531247982121055">"Zrušit přístup k poloze"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
<string name="current_page" msgid="7510129573681663135">"od "</string>
<string name="delete_bookmark_warning" msgid="758043186202032205">"Záložka <xliff:g id="BOOKMARK">%s</xliff:g> bude smazána."</string>
<string name="open_in_new_window" msgid="6596775546468054510">"Otevřít v novém okně"</string>
<string name="goto_dot" msgid="3895839050522602723">"Přejít"</string>
- <string name="find_dot" msgid="6259312434696611957">"Vyhledat na stránce"</string>
+ <string name="incognito_tab" msgid="5419458065370134289">"Otevřít novou anonymní kartu"</string>
<string name="select_dot" msgid="6299170761900561967">"Vybrat text"</string>
<string name="tab_picker_title" msgid="864478399057782913">"Aktuální okna"</string>
<string name="tab_picker_remove_tab" msgid="630087809802479397">"Zavřít"</string>
@@ -103,6 +113,13 @@
<string name="menu_view_download" msgid="2124570321712995120">"Stažené"</string>
<string name="copy_page_url" msgid="7635062169011319208">"Kopírovat adresu URL stránky"</string>
<string name="share_page" msgid="593756995297268343">"Sdílet stránku"</string>
+ <string name="menu_save_webarchive" msgid="3934652434001459581">"Uložit jako webový archiv"</string>
+ <string name="webarchive_saved" msgid="7045250341467345007">"Webový archiv byl uložen."</string>
+ <string name="webarchive_failed" msgid="2880998204746620260">"Uložení webového archivu se nezdařilo."</string>
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
<string name="contextmenu_openlink" msgid="7237961252214188935">"Otevřít"</string>
<string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"Otevřít v novém okně"</string>
<string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"Přidat odkaz do záložek"</string>
@@ -138,11 +155,44 @@
<string name="pref_content_homepage" msgid="6082437160778559806">"Nastavit domovskou stránku"</string>
<string name="pref_content_search_engine" msgid="1620101310821644144">"Nastavit vyhledávač"</string>
<string name="pref_content_search_engine_summary" msgid="5162667665858487316">"Výběr vyhledávače"</string>
- <string name="pref_use_current" msgid="1493179933653044553">"Použít aktuální stránku"</string>
+ <string name="pref_set_homepage_to" msgid="7196350233061395098">"Nastavit na..."</string>
+ <string name="pref_use_current" msgid="1778622474040406672">"Aktuální stránka"</string>
+ <string name="pref_use_blank" msgid="8503238592551111169">"Prázdná stránka"</string>
+ <string name="pref_use_default" msgid="192587563274735878">"Výchozí stránka"</string>
<string name="pref_content_autofit" msgid="8260474534053660809">"Automaticky přizpůsobit"</string>
<string name="pref_content_autofit_summary" msgid="4587831659894879986">"Přizpůsobit velikost webových stránek obrazovce"</string>
- <string name="pref_content_landscape_only" msgid="2022546812766219672">"Zobrazení pouze na šířku"</string>
- <string name="pref_content_landscape_only_summary" msgid="1008238895535428855">"Zobrazit stránky pouze s displejem otočeným na šířku"</string>
+ <string name="pref_personal_title" msgid="1447687455755683695">"Osobní nastavení"</string>
+ <string name="pref_personal_sync_with_chrome" msgid="1695182180332194033">"Synchronizovat s prohlížečem Google Chrome"</string>
+ <string name="pref_personal_sync_with_chrome_summary" msgid="7414133931827321055">"Sdílet záložky a jiná data mezi Prohlížečem systému Android a aplikací Google Chrome"</string>
+ <string name="pref_personal_google_account" msgid="952360133341490071">"Účet Google"</string>
+ <string name="pref_personal_sync_bookmarks" msgid="59237515966184432">"Synchronizovat záložky"</string>
+ <string name="pref_personal_sync_bookmarks_summary" msgid="4791767605662205482">"Synchronizovat záložky mezi Prohlížečem systému Android a aplikací Google Chrome"</string>
+ <string name="pref_personal_start_syncing" msgid="6046972042512655232">"Synchronizovat"</string>
+ <string name="pref_personal_account_dialog_title" msgid="1390867119887955530">"Vyberte účet Google pro sdílení"</string>
+ <string name="pref_autofill_enabled" msgid="1174197447388234595">"Automatické vyplňování formulářů"</string>
+ <string name="pref_autofill_enabled_summary" msgid="422640696197018914">"Vyplňování webových formulářů jediným kliknutím"</string>
+ <string name="pref_autofill_profile_editor" msgid="1350709161524642663">"Nastavení autom. vyplňování"</string>
+ <string name="pref_autofill_profile_editor_summary" msgid="6748434431641768870">"Nastavení a správa automaticky vyplněných formulářů"</string>
+ <string name="autofill_profile_editor_name" msgid="8566130291459685955">"Jméno a příjmení:"</string>
+ <string name="autofill_profile_editor_email_address" msgid="7967585896612797173">"E-mail:"</string>
+ <string name="autofill_profile_editor_company_name" msgid="2813443159949210417">"Název společnosti:"</string>
+ <string name="autofill_profile_editor_address_line_1" msgid="836433242509243081">"1. řádek adresy:"</string>
+ <string name="autofill_profile_editor_address_line_1_hint" msgid="5965659598509327172">"Adresa, č.p., P.O. box"</string>
+ <string name="autofill_profile_editor_address_line_2" msgid="8194745202893822479">"2. řádek adresy:"</string>
+ <string name="autofill_profile_editor_address_line_2_hint" msgid="2048330295853546405">"Pokoj, apartmá, buňka, budova, podlaží apod."</string>
+ <string name="autofill_profile_editor_city" msgid="4193225955409148508">"Město:"</string>
+ <string name="autofill_profile_editor_state" msgid="8549739922338171458">"Stát / Provincie / Oblast:"</string>
+ <string name="autofill_profile_editor_zip_code" msgid="283668573295656671">"PSČ:"</string>
+ <string name="autofill_profile_editor_country" msgid="7234470301239156656">"Země:"</string>
+ <string name="autofill_profile_editor_phone_number" msgid="4938852821413729276">"Telefon:"</string>
+ <string name="autofill_profile_editor_save_profile" msgid="8349915287435262888">"Uložit profil"</string>
+ <string name="autofill_profile_successful_save" msgid="6834102203944938409">"Profil uložen"</string>
+ <string name="autofill_profile_successful_delete" msgid="2421442112954362732">"Profil byl smazán."</string>
+ <string name="autofill_profile_editor_delete_profile" msgid="7112035941146003753">"Vymazat údaje o profilu"</string>
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
<string name="pref_privacy_title" msgid="1052470980370846151">"Nastavení ochrany osobních údajů"</string>
<string name="pref_privacy_clear_cache" msgid="3380316479925886998">"Vymazat mezipaměť"</string>
<string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"Vymazat všechen obsah a databáze uložené do místní mezipaměti"</string>
@@ -208,6 +258,7 @@
<item msgid="891615911084608570">"Japonština (ISO-2022-JP)"</item>
<item msgid="5589150448475151241">"Japonština (SHIFT_JIS)"</item>
<item msgid="7356792686950371843">"Japonština (EUC-JP)"</item>
+ <item msgid="2193955365569270096">"Korejština (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Kódování textu"</string>
<string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"Problémy s datovým připojením"</string>
@@ -296,4 +347,11 @@
<string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"Vymazat všechna data"</string>
<string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"Zrušit"</string>
<string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"Nastavení tapety..."</string>
+ <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Záložky"</string>
+ <string name="empty_bookmarks_folder" msgid="7843361614634930942">"Žádné záložky k zobrazení"</string>
+ <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
+ <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Synchronizovat s účtem Google"</string>
+ <string name="import_bookmarks_dialog_description" msgid="2187665745413495303">"Vaše záložky v systému Android nejsou přidruženy k účtu Google."</string>
+ <string name="import_bookmarks_dialog_remove" msgid="8105572409059113340">"Odebrat záložky systému Android"</string>
+ <string name="import_bookmarks_dialog_import" msgid="6933613853573899218">"Přidat všechny záložky systému Android do záložek účtu <xliff:g id="GOOGLE_ACCOUNT">%s</xliff:g>"</string>
</resources>
diff --git a/res/values-da-xlarge/strings.xml b/res/values-da-xlarge/strings.xml
new file mode 100644
index 0000000..6505d89
--- /dev/null
+++ b/res/values-da-xlarge/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="new_tab" msgid="7275656655054293038">"Ny fane"</string>
+ <string name="new_incognito_tab" msgid="5149742197322201152">"Ny inkognitofane"</string>
+ <string name="active_tabs" msgid="5324492165541331128">"Faner"</string>
+</resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 1e9d0af..2e25c60 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -19,6 +19,7 @@
<string name="application_name" msgid="1935869255545976415">"Browser"</string>
<string name="choose_upload" msgid="3649366287575002063">"Vælg fil til upload"</string>
<string name="new_tab" msgid="4505722538297295141">"Nyt vindue"</string>
+ <string name="new_incognito_tab" msgid="5821404839654751753">"Nyt inkognitovindue"</string>
<string name="active_tabs" msgid="3050623868203544623">"Vinduer"</string>
<string name="tab_bookmarks" msgid="2305793036003473653">"Bogmærker"</string>
<string name="tab_most_visited" msgid="1077402532455000703">"Mest besøgte"</string>
@@ -32,12 +33,6 @@
<string name="bookmarks_search" msgid="5229596268214362873">"Browser"</string>
<string name="cancel" msgid="3017274947407233702">"Annuller"</string>
<string name="ok" msgid="1509280796718850364">"OK"</string>
- <plurals name="matches_found">
- <item quantity="zero" msgid="6242659159545399963">"Der er ingen matches"</item>
- <item quantity="one" msgid="4352019729062956802">"1 match"</item>
- <item quantity="few" msgid="5544267486978946555">"<xliff:g id="NUMBER">%d</xliff:g> matches"</item>
- <item quantity="other" msgid="6616125067364315405">"<xliff:g id="NUMBER">%d</xliff:g> matches"</item>
- </plurals>
<string name="title_bar_loading" msgid="7438217780834640678">"Indlæser ..."</string>
<string name="page_info" msgid="4048529256302257195">"Sideoplysninger"</string>
<string name="page_info_view" msgid="5303490449842635158">"Vis sideoplysninger"</string>
@@ -46,6 +41,8 @@
<string name="ssl_continue" msgid="8031515015829358457">"Fortsæt"</string>
<string name="security_warning" msgid="6607795404322797541">"Sikkerhedsadvarsel"</string>
<string name="view_certificate" msgid="1472768887529093862">"Vis certifikat"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
<string name="ssl_untrusted" msgid="5369967226521102194">"Dette certifikat stammer ikke fra en troværdig kilde."</string>
<string name="ssl_mismatch" msgid="558688832420069896">"Navnet på dette websted stemmer ikke overens med navnet på certifikatet."</string>
<string name="ssl_expired" msgid="5739349389499575559">"Dette certifikat er udløbet."</string>
@@ -67,12 +64,23 @@
<string name="forward" msgid="4288210890526641577">"Fremad"</string>
<string name="save" msgid="5922311934992468496">"OK"</string>
<string name="do_not_save" msgid="6777633870113477714">"Annuller"</string>
- <string name="location" msgid="969988560160364559">"Placering"</string>
- <string name="name" msgid="5990326151488445481">"Navn"</string>
+ <string name="location" msgid="3411848697912600125">"Adresse"</string>
+ <string name="containing_folder" msgid="6771180232953030479">"Føj til"</string>
+ <string name="new_folder" msgid="7743540149088867917">"Ny mappe"</string>
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <string name="no_subfolders" msgid="5880411440592452802">"Ingen undermapper"</string>
+ <string name="add_to_bookmarks_menu_option" msgid="4449323955122214389">"Bogmærker"</string>
+ <string name="add_to_homescreen_menu_option" msgid="1461447829242963790">"Startskærm"</string>
+ <string name="add_to_other_folder_menu_option" msgid="5450890093372998187">"Anden mappe…"</string>
+ <string name="name" msgid="5462672162695365387">"Etiket"</string>
<string name="http" msgid="2163722670597250102">"http://"</string>
- <string name="save_to_bookmarks" msgid="588165100024086565">"Tilføj bogmærke"</string>
+ <string name="save_to_bookmarks" msgid="6101482434920313244">"Føj til bogmærker"</string>
+ <string name="bookmark_this_page" msgid="7530739804320811054">"Tilføj side som bogmærke"</string>
<string name="edit_bookmark" msgid="5024089053490231905">"Rediger bogmærke"</string>
- <string name="create_shortcut_bookmark" msgid="9202323987633899835">"Føj genvej til Start"</string>
+ <string name="create_shortcut_bookmark" msgid="1995095662095484289">"Føj genvej til startskærm"</string>
<string name="open_bookmark" msgid="8473581305759935790">"Åbn"</string>
<string name="remove_bookmark" msgid="8407495852801410891">"Slet bogmærke"</string>
<string name="remove_from_bookmarks" msgid="4374080666576982775">"Fjern fra bogmærker"</string>
@@ -87,13 +95,15 @@
<string name="bookmark_cannot_save_url" msgid="791722768778386941">"Denne webadresse kan ikke tilføjes som bogmærke."</string>
<string name="delete_bookmark" msgid="2422989994934201992">"Slet"</string>
<string name="bookmark_page" msgid="6845189305130307274">"Opret bogmærke for sidst viste side"</string>
- <string name="switch_to_thumbnails" msgid="5493351529609043151">"Miniaturevisning"</string>
- <string name="switch_to_list" msgid="8900531247982121055">"Listevisning"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
<string name="current_page" msgid="7510129573681663135">"fra "</string>
<string name="delete_bookmark_warning" msgid="758043186202032205">"Bogmærket \"<xliff:g id="BOOKMARK">%s</xliff:g>\" slettes."</string>
<string name="open_in_new_window" msgid="6596775546468054510">"Åbn i et nyt vindue"</string>
<string name="goto_dot" msgid="3895839050522602723">"Gå"</string>
- <string name="find_dot" msgid="6259312434696611957">"Find på side"</string>
+ <string name="incognito_tab" msgid="5419458065370134289">"Åbn ny inkognitofane"</string>
<string name="select_dot" msgid="6299170761900561967">"Vælg tekst"</string>
<string name="tab_picker_title" msgid="864478399057782913">"Aktuelle vinduer"</string>
<string name="tab_picker_remove_tab" msgid="630087809802479397">"Luk"</string>
@@ -103,6 +113,13 @@
<string name="menu_view_download" msgid="2124570321712995120">"Downloads"</string>
<string name="copy_page_url" msgid="7635062169011319208">"Kopier sidens webadresse"</string>
<string name="share_page" msgid="593756995297268343">"Del side"</string>
+ <string name="menu_save_webarchive" msgid="3934652434001459581">"Gem som webarkiv"</string>
+ <string name="webarchive_saved" msgid="7045250341467345007">"Webarkivet blev gemt."</string>
+ <string name="webarchive_failed" msgid="2880998204746620260">"Webarkivet blev ikke gemt."</string>
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
<string name="contextmenu_openlink" msgid="7237961252214188935">"Åbn"</string>
<string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"Åbn i et nyt vindue"</string>
<string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"Opret et bogmærke for linket"</string>
@@ -138,11 +155,44 @@
<string name="pref_content_homepage" msgid="6082437160778559806">"Angiv startside"</string>
<string name="pref_content_search_engine" msgid="1620101310821644144">"Angiv søgemaskine"</string>
<string name="pref_content_search_engine_summary" msgid="5162667665858487316">"Vælg en søgemaskine"</string>
- <string name="pref_use_current" msgid="1493179933653044553">"Brug aktuel side"</string>
+ <string name="pref_set_homepage_to" msgid="7196350233061395098">"Angiv som..."</string>
+ <string name="pref_use_current" msgid="1778622474040406672">"Aktuel side"</string>
+ <string name="pref_use_blank" msgid="8503238592551111169">"Tom side"</string>
+ <string name="pref_use_default" msgid="192587563274735878">"Standardside"</string>
<string name="pref_content_autofit" msgid="8260474534053660809">"Tilpas sider automatisk"</string>
<string name="pref_content_autofit_summary" msgid="4587831659894879986">"Tilpas websider, så de passer til skærmen"</string>
- <string name="pref_content_landscape_only" msgid="2022546812766219672">"Kun liggende visning"</string>
- <string name="pref_content_landscape_only_summary" msgid="1008238895535428855">"Vis kun sider i den brede liggende retning"</string>
+ <string name="pref_personal_title" msgid="1447687455755683695">"Personlige indstillinger"</string>
+ <string name="pref_personal_sync_with_chrome" msgid="1695182180332194033">"Synkroniser med Google Chrome"</string>
+ <string name="pref_personal_sync_with_chrome_summary" msgid="7414133931827321055">"Del bogmærker og andre data mellem Android-browser og Google Chrome"</string>
+ <string name="pref_personal_google_account" msgid="952360133341490071">"Google-konto"</string>
+ <string name="pref_personal_sync_bookmarks" msgid="59237515966184432">"Synkroniser bogmærker"</string>
+ <string name="pref_personal_sync_bookmarks_summary" msgid="4791767605662205482">"Synkroniser bogmærker mellem Android-browser og Google Chrome"</string>
+ <string name="pref_personal_start_syncing" msgid="6046972042512655232">"Start synkronisering"</string>
+ <string name="pref_personal_account_dialog_title" msgid="1390867119887955530">"Vælg Google-konto at dele med"</string>
+ <string name="pref_autofill_enabled" msgid="1174197447388234595">"AutoFyld-formular"</string>
+ <string name="pref_autofill_enabled_summary" msgid="422640696197018914">"Udfyld webformularer med et enkelt klik"</string>
+ <string name="pref_autofill_profile_editor" msgid="1350709161524642663">"Indstillinger for AutoFyld"</string>
+ <string name="pref_autofill_profile_editor_summary" msgid="6748434431641768870">"Konfigurer og administrer data for AutoFyld-formularer"</string>
+ <string name="autofill_profile_editor_name" msgid="8566130291459685955">"Fulde navn:"</string>
+ <string name="autofill_profile_editor_email_address" msgid="7967585896612797173">"E-mail:"</string>
+ <string name="autofill_profile_editor_company_name" msgid="2813443159949210417">"Virksomhedsnavn:"</string>
+ <string name="autofill_profile_editor_address_line_1" msgid="836433242509243081">"Adresselinje 1:"</string>
+ <string name="autofill_profile_editor_address_line_1_hint" msgid="5965659598509327172">"Adresse, postboks, c/o"</string>
+ <string name="autofill_profile_editor_address_line_2" msgid="8194745202893822479">"Adresselinje 2:"</string>
+ <string name="autofill_profile_editor_address_line_2_hint" msgid="2048330295853546405">"Lejlighed, suite, afdeling, bygning, etage osv."</string>
+ <string name="autofill_profile_editor_city" msgid="4193225955409148508">"By:"</string>
+ <string name="autofill_profile_editor_state" msgid="8549739922338171458">"Stat/provins/region:"</string>
+ <string name="autofill_profile_editor_zip_code" msgid="283668573295656671">"Postnummer:"</string>
+ <string name="autofill_profile_editor_country" msgid="7234470301239156656">"Land:"</string>
+ <string name="autofill_profile_editor_phone_number" msgid="4938852821413729276">"Telefon:"</string>
+ <string name="autofill_profile_editor_save_profile" msgid="8349915287435262888">"Gem profil"</string>
+ <string name="autofill_profile_successful_save" msgid="6834102203944938409">"Profilen er gemt"</string>
+ <string name="autofill_profile_successful_delete" msgid="2421442112954362732">"Profilen er slettet"</string>
+ <string name="autofill_profile_editor_delete_profile" msgid="7112035941146003753">"Slet profildata"</string>
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
<string name="pref_privacy_title" msgid="1052470980370846151">"Indstillinger for fortrolighed"</string>
<string name="pref_privacy_clear_cache" msgid="3380316479925886998">"Ryd cache"</string>
<string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"Ryd lokalt cachelagret indhold og databaser"</string>
@@ -208,6 +258,7 @@
<item msgid="891615911084608570">"Japansk (ISO-2022-JP)"</item>
<item msgid="5589150448475151241">"Japansk (SHIFT_JIS)"</item>
<item msgid="7356792686950371843">"Japansk (EUC-JP)"</item>
+ <item msgid="2193955365569270096">"Koreansk (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Tekstkodning"</string>
<string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"Dataforbindelsesproblem"</string>
@@ -296,4 +347,11 @@
<string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"Slet alle data"</string>
<string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"Annuller"</string>
<string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"Indstiller tapet ..."</string>
+ <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Bogmærker"</string>
+ <string name="empty_bookmarks_folder" msgid="7843361614634930942">"Der er ingen bogmærker"</string>
+ <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
+ <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Synkroniser med Google-konto"</string>
+ <string name="import_bookmarks_dialog_description" msgid="2187665745413495303">"Dine Android-bogmærker er ikke tilknyttet en Google-konto"</string>
+ <string name="import_bookmarks_dialog_remove" msgid="8105572409059113340">"Fjern dine Android-bogmærker"</string>
+ <string name="import_bookmarks_dialog_import" msgid="6933613853573899218">"Føj dine Android-bogmærker til bogmærker for <xliff:g id="GOOGLE_ACCOUNT">%s</xliff:g>"</string>
</resources>
diff --git a/res/values-de-xlarge/strings.xml b/res/values-de-xlarge/strings.xml
new file mode 100644
index 0000000..b263de1
--- /dev/null
+++ b/res/values-de-xlarge/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="new_tab" msgid="7275656655054293038">"Neuer Tab"</string>
+ <string name="new_incognito_tab" msgid="5149742197322201152">"Neuer Inkognito-Tab"</string>
+ <string name="active_tabs" msgid="5324492165541331128">"Tabs"</string>
+</resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index a942db4..68e10e1 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -19,6 +19,7 @@
<string name="application_name" msgid="1935869255545976415">"Browser"</string>
<string name="choose_upload" msgid="3649366287575002063">"Datei zum Hochladen auswählen"</string>
<string name="new_tab" msgid="4505722538297295141">"Neues Fenster"</string>
+ <string name="new_incognito_tab" msgid="5821404839654751753">"Neues Inkognito-Fenster"</string>
<string name="active_tabs" msgid="3050623868203544623">"Fenster"</string>
<string name="tab_bookmarks" msgid="2305793036003473653">"Lesezeichen"</string>
<string name="tab_most_visited" msgid="1077402532455000703">"Meistbesucht"</string>
@@ -32,12 +33,6 @@
<string name="bookmarks_search" msgid="5229596268214362873">"Browser"</string>
<string name="cancel" msgid="3017274947407233702">"Abbrechen"</string>
<string name="ok" msgid="1509280796718850364">"OK"</string>
- <plurals name="matches_found">
- <item quantity="zero" msgid="6242659159545399963">"Keine Treffer"</item>
- <item quantity="one" msgid="4352019729062956802">"1 Treffer"</item>
- <item quantity="few" msgid="5544267486978946555">"<xliff:g id="NUMBER">%d</xliff:g> Treffer"</item>
- <item quantity="other" msgid="6616125067364315405">"<xliff:g id="NUMBER">%d</xliff:g> Treffer"</item>
- </plurals>
<string name="title_bar_loading" msgid="7438217780834640678">"Wird geladen..."</string>
<string name="page_info" msgid="4048529256302257195">"Seiteninfo"</string>
<string name="page_info_view" msgid="5303490449842635158">"Seiteninfo anzeigen"</string>
@@ -46,6 +41,8 @@
<string name="ssl_continue" msgid="8031515015829358457">"Fortfahren"</string>
<string name="security_warning" msgid="6607795404322797541">"Sicherheitswarnung"</string>
<string name="view_certificate" msgid="1472768887529093862">"Zertifikat anzeigen"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
<string name="ssl_untrusted" msgid="5369967226521102194">"Dieses Zertifikat wurde nicht von einer vertrauenswürdigen Stelle ausgegeben."</string>
<string name="ssl_mismatch" msgid="558688832420069896">"Der Name der Website stimmt nicht mit dem Namen auf dem Zertifikat überein."</string>
<string name="ssl_expired" msgid="5739349389499575559">"Dieses Zertifikat ist abgelaufen."</string>
@@ -67,12 +64,23 @@
<string name="forward" msgid="4288210890526641577">"Vorwärts"</string>
<string name="save" msgid="5922311934992468496">"OK"</string>
<string name="do_not_save" msgid="6777633870113477714">"Abbrechen"</string>
- <string name="location" msgid="969988560160364559">"URL"</string>
- <string name="name" msgid="5990326151488445481">"Name"</string>
+ <string name="location" msgid="3411848697912600125">"Adresse"</string>
+ <string name="containing_folder" msgid="6771180232953030479">"Hinzufügen zu"</string>
+ <string name="new_folder" msgid="7743540149088867917">"Neuer Ordner"</string>
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <string name="no_subfolders" msgid="5880411440592452802">"Keine Unterordner"</string>
+ <string name="add_to_bookmarks_menu_option" msgid="4449323955122214389">"Lesezeichen"</string>
+ <string name="add_to_homescreen_menu_option" msgid="1461447829242963790">"Startbildschirm"</string>
+ <string name="add_to_other_folder_menu_option" msgid="5450890093372998187">"Anderer Ordner..."</string>
+ <string name="name" msgid="5462672162695365387">"Label"</string>
<string name="http" msgid="2163722670597250102">"http://"</string>
- <string name="save_to_bookmarks" msgid="588165100024086565">"Lesezeichen hinzufügen"</string>
+ <string name="save_to_bookmarks" msgid="6101482434920313244">"Zu Lesezeichen hinzufügen"</string>
+ <string name="bookmark_this_page" msgid="7530739804320811054">"Diese Seite als Lesezeichen speichern"</string>
<string name="edit_bookmark" msgid="5024089053490231905">"Lesezeichen bearbeiten"</string>
- <string name="create_shortcut_bookmark" msgid="9202323987633899835">"Verknüpfung auf dem Startbildschirm erstellen"</string>
+ <string name="create_shortcut_bookmark" msgid="1995095662095484289">"Verknüpfung auf dem Startbildschirm erstellen"</string>
<string name="open_bookmark" msgid="8473581305759935790">"Öffnen"</string>
<string name="remove_bookmark" msgid="8407495852801410891">"Lesezeichen löschen"</string>
<string name="remove_from_bookmarks" msgid="4374080666576982775">"Aus Lesezeichen entfernen"</string>
@@ -87,13 +95,15 @@
<string name="bookmark_cannot_save_url" msgid="791722768778386941">"Diese URL kann nicht als Lesezeichen gespeichert werden."</string>
<string name="delete_bookmark" msgid="2422989994934201992">"Löschen"</string>
<string name="bookmark_page" msgid="6845189305130307274">"Lesezeichen für zuletzt besuchte Seite"</string>
- <string name="switch_to_thumbnails" msgid="5493351529609043151">"Miniaturansicht"</string>
- <string name="switch_to_list" msgid="8900531247982121055">"Listenansicht"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
<string name="current_page" msgid="7510129573681663135">"von "</string>
<string name="delete_bookmark_warning" msgid="758043186202032205">"Lesezeichen \"<xliff:g id="BOOKMARK">%s</xliff:g>\" wird gelöscht."</string>
<string name="open_in_new_window" msgid="6596775546468054510">"In neuem Fenster öffnen"</string>
<string name="goto_dot" msgid="3895839050522602723">"Los"</string>
- <string name="find_dot" msgid="6259312434696611957">"Auf Seite suchen"</string>
+ <string name="incognito_tab" msgid="5419458065370134289">"Neuen Inkognito-Tab öffnen"</string>
<string name="select_dot" msgid="6299170761900561967">"Text auswählen"</string>
<string name="tab_picker_title" msgid="864478399057782913">"Aktuelle Fenster"</string>
<string name="tab_picker_remove_tab" msgid="630087809802479397">"Schließen"</string>
@@ -103,6 +113,13 @@
<string name="menu_view_download" msgid="2124570321712995120">"Downloads"</string>
<string name="copy_page_url" msgid="7635062169011319208">"Seiten-URL kopieren"</string>
<string name="share_page" msgid="593756995297268343">"Seitenlink weiterleiten"</string>
+ <string name="menu_save_webarchive" msgid="3934652434001459581">"Als Webarchiv speichern"</string>
+ <string name="webarchive_saved" msgid="7045250341467345007">"Webarchiv gespeichert."</string>
+ <string name="webarchive_failed" msgid="2880998204746620260">"Das Webarchiv wurde nicht gespeichert."</string>
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
<string name="contextmenu_openlink" msgid="7237961252214188935">"Öffnen"</string>
<string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"In neuem Fenster öffnen"</string>
<string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"Link zu Lesezeichen hinzufügen"</string>
@@ -138,11 +155,44 @@
<string name="pref_content_homepage" msgid="6082437160778559806">"Startseite festlegen"</string>
<string name="pref_content_search_engine" msgid="1620101310821644144">"Suchmaschine festlegen"</string>
<string name="pref_content_search_engine_summary" msgid="5162667665858487316">"Suchmaschine auswählen"</string>
- <string name="pref_use_current" msgid="1493179933653044553">"Aktuelle Seite verwenden"</string>
+ <string name="pref_set_homepage_to" msgid="7196350233061395098">"Eingestellt auf..."</string>
+ <string name="pref_use_current" msgid="1778622474040406672">"Aktuelle Seite"</string>
+ <string name="pref_use_blank" msgid="8503238592551111169">"Leere Seite"</string>
+ <string name="pref_use_default" msgid="192587563274735878">"Standardseite"</string>
<string name="pref_content_autofit" msgid="8260474534053660809">"Autom. Anpassung"</string>
<string name="pref_content_autofit_summary" msgid="4587831659894879986">"Webseiten an den Bildschirm anpassen"</string>
- <string name="pref_content_landscape_only" msgid="2022546812766219672">"Anzeige nur im Querformat"</string>
- <string name="pref_content_landscape_only_summary" msgid="1008238895535428855">"Seiten nur im Querformat anzeigen"</string>
+ <string name="pref_personal_title" msgid="1447687455755683695">"Persönliche Einstellungen"</string>
+ <string name="pref_personal_sync_with_chrome" msgid="1695182180332194033">"Mit Google Chrome synchronisieren"</string>
+ <string name="pref_personal_sync_with_chrome_summary" msgid="7414133931827321055">"Lesezeichen und andere Daten zwischen Android-Browser und Google Chrome austauschen"</string>
+ <string name="pref_personal_google_account" msgid="952360133341490071">"Google-Konto"</string>
+ <string name="pref_personal_sync_bookmarks" msgid="59237515966184432">"Lesezeichen synchronisieren"</string>
+ <string name="pref_personal_sync_bookmarks_summary" msgid="4791767605662205482">"Lesezeichen zwischen Android-Browser und Google Chrome synchronisieren"</string>
+ <string name="pref_personal_start_syncing" msgid="6046972042512655232">"Synchronis. starten"</string>
+ <string name="pref_personal_account_dialog_title" msgid="1390867119887955530">"Google-Konto wählen"</string>
+ <string name="pref_autofill_enabled" msgid="1174197447388234595">"Formulare automatisch ausfüllen"</string>
+ <string name="pref_autofill_enabled_summary" msgid="422640696197018914">"Onlineformulare mit einem einzigen Klick ausfüllen"</string>
+ <string name="pref_autofill_profile_editor" msgid="1350709161524642663">"AutoFill-Einstellungen"</string>
+ <string name="pref_autofill_profile_editor_summary" msgid="6748434431641768870">"Angaben für das automatische Ausfüllen von Formularen festlegen und verwalten"</string>
+ <string name="autofill_profile_editor_name" msgid="8566130291459685955">"Vollständiger Name:"</string>
+ <string name="autofill_profile_editor_email_address" msgid="7967585896612797173">"E-Mail:"</string>
+ <string name="autofill_profile_editor_company_name" msgid="2813443159949210417">"Name des Unternehmens:"</string>
+ <string name="autofill_profile_editor_address_line_1" msgid="836433242509243081">"Adresszeile 1:"</string>
+ <string name="autofill_profile_editor_address_line_1_hint" msgid="5965659598509327172">"Straße, Postfach usw."</string>
+ <string name="autofill_profile_editor_address_line_2" msgid="8194745202893822479">"Adresszeile 2:"</string>
+ <string name="autofill_profile_editor_address_line_2_hint" msgid="2048330295853546405">"Apartment, Wohnung, Gebäude, Etage usw."</string>
+ <string name="autofill_profile_editor_city" msgid="4193225955409148508">"Stadt:"</string>
+ <string name="autofill_profile_editor_state" msgid="8549739922338171458">"Bundesland:"</string>
+ <string name="autofill_profile_editor_zip_code" msgid="283668573295656671">"Postleitzahl:"</string>
+ <string name="autofill_profile_editor_country" msgid="7234470301239156656">"Land:"</string>
+ <string name="autofill_profile_editor_phone_number" msgid="4938852821413729276">"Telefon:"</string>
+ <string name="autofill_profile_editor_save_profile" msgid="8349915287435262888">"Profil speichern"</string>
+ <string name="autofill_profile_successful_save" msgid="6834102203944938409">"Profil wurde gespeichert."</string>
+ <string name="autofill_profile_successful_delete" msgid="2421442112954362732">"Profil gelöscht"</string>
+ <string name="autofill_profile_editor_delete_profile" msgid="7112035941146003753">"Profildaten löschen"</string>
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
<string name="pref_privacy_title" msgid="1052470980370846151">"Datenschutzeinstellungen"</string>
<string name="pref_privacy_clear_cache" msgid="3380316479925886998">"Cache löschen"</string>
<string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"Content und Datenbanken aus dem lokalen Cache löschen"</string>
@@ -208,6 +258,7 @@
<item msgid="891615911084608570">"Japanisch (ISO-2022-JP)"</item>
<item msgid="5589150448475151241">"Japanisch (SHIFT_JIS)"</item>
<item msgid="7356792686950371843">"Japanisch (EUC-JP)"</item>
+ <item msgid="2193955365569270096">"Koreanisch (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Textcodierung"</string>
<string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"Datenverbindungsproblem"</string>
@@ -296,4 +347,11 @@
<string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"Alle Daten löschen"</string>
<string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"Abbrechen"</string>
<string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"Hintergrund wird eingestellt..."</string>
+ <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Lesezeichen"</string>
+ <string name="empty_bookmarks_folder" msgid="7843361614634930942">"Es sind keine Lesezeichen vorhanden."</string>
+ <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
+ <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Mit Google-Konto synchronisieren"</string>
+ <string name="import_bookmarks_dialog_description" msgid="2187665745413495303">"Ihre Android-Lesezeichen sind mit keinem Google-Konto verknüpft."</string>
+ <string name="import_bookmarks_dialog_remove" msgid="8105572409059113340">"Android-Lesezeichen entfernen"</string>
+ <string name="import_bookmarks_dialog_import" msgid="6933613853573899218">"Ihre Android-Lesezeichen den Lesezeichen für <xliff:g id="GOOGLE_ACCOUNT">%s</xliff:g> hinzufügen"</string>
</resources>
diff --git a/res/values-el-xlarge/strings.xml b/res/values-el-xlarge/strings.xml
new file mode 100644
index 0000000..b13b54e
--- /dev/null
+++ b/res/values-el-xlarge/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="new_tab" msgid="7275656655054293038">"Νέα καρτέλα"</string>
+ <string name="new_incognito_tab" msgid="5149742197322201152">"Νέα καρτέλα ανών. περιήγησης"</string>
+ <string name="active_tabs" msgid="5324492165541331128">"Καρτέλες"</string>
+</resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 493ec48..2e0c9b3 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -19,6 +19,7 @@
<string name="application_name" msgid="1935869255545976415">"Internet"</string>
<string name="choose_upload" msgid="3649366287575002063">"Επιλογή αρχείου για μεταφόρτωση"</string>
<string name="new_tab" msgid="4505722538297295141">"Νέο παράθυρο"</string>
+ <string name="new_incognito_tab" msgid="5821404839654751753">"Νέο παράθυρο για ανώνυμη περιήγηση"</string>
<string name="active_tabs" msgid="3050623868203544623">"Παράθυρα"</string>
<string name="tab_bookmarks" msgid="2305793036003473653">"Σελιδοδείκτες"</string>
<string name="tab_most_visited" msgid="1077402532455000703">"Οι πιο δημοφιλείς"</string>
@@ -32,12 +33,6 @@
<string name="bookmarks_search" msgid="5229596268214362873">"Internet"</string>
<string name="cancel" msgid="3017274947407233702">"Ακύρωση"</string>
<string name="ok" msgid="1509280796718850364">"OK"</string>
- <plurals name="matches_found">
- <item quantity="zero" msgid="6242659159545399963">"Δεν υπάρχουν αποτελέσματα"</item>
- <item quantity="one" msgid="4352019729062956802">"1 αποτέλεσμα"</item>
- <item quantity="few" msgid="5544267486978946555">"<xliff:g id="NUMBER">%d</xliff:g> αποτελέσματα"</item>
- <item quantity="other" msgid="6616125067364315405">"<xliff:g id="NUMBER">%d</xliff:g> αποτελέσματα"</item>
- </plurals>
<string name="title_bar_loading" msgid="7438217780834640678">"Φόρτωση..."</string>
<string name="page_info" msgid="4048529256302257195">"Πληροφορίες σελίδας"</string>
<string name="page_info_view" msgid="5303490449842635158">"Προβολή πληροφοριών σελίδας"</string>
@@ -46,6 +41,8 @@
<string name="ssl_continue" msgid="8031515015829358457">"Συνέχεια"</string>
<string name="security_warning" msgid="6607795404322797541">"Προειδοποίηση ασφαλείας"</string>
<string name="view_certificate" msgid="1472768887529093862">"Προβολή πιστοποιητικού"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
<string name="ssl_untrusted" msgid="5369967226521102194">"Αυτό το πιστοποιητικό δεν είναι από έμπιστη αρχή."</string>
<string name="ssl_mismatch" msgid="558688832420069896">"Το όνομα του ιστότοπου δεν αντιστοιχεί στο όνομα του πιστοποιητικού."</string>
<string name="ssl_expired" msgid="5739349389499575559">"Αυτό το πιστοποιητικό έχει λήξει."</string>
@@ -67,12 +64,23 @@
<string name="forward" msgid="4288210890526641577">"Εμπρός"</string>
<string name="save" msgid="5922311934992468496">"OK"</string>
<string name="do_not_save" msgid="6777633870113477714">"Ακύρωση"</string>
- <string name="location" msgid="969988560160364559">"Τοποθεσία"</string>
- <string name="name" msgid="5990326151488445481">"Όνομα"</string>
+ <string name="location" msgid="3411848697912600125">"Διεύθυνση"</string>
+ <string name="containing_folder" msgid="6771180232953030479">"Προσθήκη σε"</string>
+ <string name="new_folder" msgid="7743540149088867917">"Νέος φάκελος"</string>
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <string name="no_subfolders" msgid="5880411440592452802">"Δεν υπάρχουν υποφάκελοι"</string>
+ <string name="add_to_bookmarks_menu_option" msgid="4449323955122214389">"Σελιδοδείκτες"</string>
+ <string name="add_to_homescreen_menu_option" msgid="1461447829242963790">"Αρχική οθόνη"</string>
+ <string name="add_to_other_folder_menu_option" msgid="5450890093372998187">"Άλλος φάκελος…"</string>
+ <string name="name" msgid="5462672162695365387">"Ετικέτα"</string>
<string name="http" msgid="2163722670597250102">"http://"</string>
- <string name="save_to_bookmarks" msgid="588165100024086565">"Προσθήκη σελιδοδείκτη"</string>
+ <string name="save_to_bookmarks" msgid="6101482434920313244">"Προσθήκη στους σελιδοδείκτες"</string>
+ <string name="bookmark_this_page" msgid="7530739804320811054">"Προσθήκη στους σελιδοδείκτες"</string>
<string name="edit_bookmark" msgid="5024089053490231905">"Επεξεργασία σελιδοδείκτη"</string>
- <string name="create_shortcut_bookmark" msgid="9202323987633899835">"Προσθήκη συντόμευσης στην αρχική οθόνη"</string>
+ <string name="create_shortcut_bookmark" msgid="1995095662095484289">"Προσθήκη συντόμευσης στην αρχική οθόνη"</string>
<string name="open_bookmark" msgid="8473581305759935790">"Άνοιγμα"</string>
<string name="remove_bookmark" msgid="8407495852801410891">"Διαγραφή σελιδοδείκτη"</string>
<string name="remove_from_bookmarks" msgid="4374080666576982775">"Κατάργηση από τους σελιδοδείκτες"</string>
@@ -87,13 +95,15 @@
<string name="bookmark_cannot_save_url" msgid="791722768778386941">"Η διεύθυνση URL δεν ήταν δυνατό να προστεθεί στους σελιδοδείκτες."</string>
<string name="delete_bookmark" msgid="2422989994934201992">"Διαγραφή"</string>
<string name="bookmark_page" msgid="6845189305130307274">"Προσθήκη της τελευταίας σελίδας που προβλήθηκε στους σελιδοδείκτες"</string>
- <string name="switch_to_thumbnails" msgid="5493351529609043151">"Προβολή μικρογραφίας"</string>
- <string name="switch_to_list" msgid="8900531247982121055">"Προβολή λίστας"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
<string name="current_page" msgid="7510129573681663135">"από "</string>
<string name="delete_bookmark_warning" msgid="758043186202032205">"Ο σελιδοδείκτης \"<xliff:g id="BOOKMARK">%s</xliff:g>\" θα διαγραφεί."</string>
<string name="open_in_new_window" msgid="6596775546468054510">"Άνοιγμα σε νέο παράθυρο"</string>
<string name="goto_dot" msgid="3895839050522602723">"Μετάβαση"</string>
- <string name="find_dot" msgid="6259312434696611957">"Εύρεση στη σελίδα"</string>
+ <string name="incognito_tab" msgid="5419458065370134289">"Άνοιγμα νέας καρτέλας ανώνυμης περιήγησης"</string>
<string name="select_dot" msgid="6299170761900561967">"Επιλογή κειμένου"</string>
<string name="tab_picker_title" msgid="864478399057782913">"Τρέχοντα παράθυρα"</string>
<string name="tab_picker_remove_tab" msgid="630087809802479397">"Κλείσιμο"</string>
@@ -103,6 +113,13 @@
<string name="menu_view_download" msgid="2124570321712995120">"Λήψεις"</string>
<string name="copy_page_url" msgid="7635062169011319208">"Αντιγραφή διεύθυνσης url της σελίδας"</string>
<string name="share_page" msgid="593756995297268343">"Κοινή χρήση σελίδας"</string>
+ <string name="menu_save_webarchive" msgid="3934652434001459581">"Αποθήκευση ως αρχείου ιστού"</string>
+ <string name="webarchive_saved" msgid="7045250341467345007">"Το αρχείο ιστού αποθηκεύθηκε."</string>
+ <string name="webarchive_failed" msgid="2880998204746620260">"Η αποθήκευση του αρχείου ιστού απέτυχε."</string>
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
<string name="contextmenu_openlink" msgid="7237961252214188935">"Άνοιγμα"</string>
<string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"Άνοιγμα σε νέο παράθυρο"</string>
<string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"Πρόσθεση συνδέσμου στους σελιδοδείκτες"</string>
@@ -138,11 +155,44 @@
<string name="pref_content_homepage" msgid="6082437160778559806">"Ορισμός ως αρχική σελίδα"</string>
<string name="pref_content_search_engine" msgid="1620101310821644144">"Ορισμός μηχανής αναζήτησης"</string>
<string name="pref_content_search_engine_summary" msgid="5162667665858487316">"Επιλέξτε μηχανή αναζήτησης"</string>
- <string name="pref_use_current" msgid="1493179933653044553">"Χρήση τρέχουσας σελίδας"</string>
+ <string name="pref_set_homepage_to" msgid="7196350233061395098">"Ορισμός σε..."</string>
+ <string name="pref_use_current" msgid="1778622474040406672">"Τρέχουσα σελίδα"</string>
+ <string name="pref_use_blank" msgid="8503238592551111169">"Κενή σελίδα"</string>
+ <string name="pref_use_default" msgid="192587563274735878">"Προεπιλεγμένη σελίδα"</string>
<string name="pref_content_autofit" msgid="8260474534053660809">"Αυτόματη προσαρμογή σελίδων"</string>
<string name="pref_content_autofit_summary" msgid="4587831659894879986">"Μορφοποίηση ιστοσελίδων για την προσαρμογή τους στο μέγεθος της οθόνης"</string>
- <string name="pref_content_landscape_only" msgid="2022546812766219672">"Προβολή μόνο σε τοπίο"</string>
- <string name="pref_content_landscape_only_summary" msgid="1008238895535428855">"Προβολή σελίδων μόνο στον ευρύτερο προσανατολισμό τοπίου στην οθόνη"</string>
+ <string name="pref_personal_title" msgid="1447687455755683695">"Προσωπικές ρυθμίσεις"</string>
+ <string name="pref_personal_sync_with_chrome" msgid="1695182180332194033">"Συγχρονισμός με Google Chrome"</string>
+ <string name="pref_personal_sync_with_chrome_summary" msgid="7414133931827321055">"Κάντε κοινή χρήση σελιδοδεικτών και άλλων δεδομένων μεταξύ του Προγράμματος περιήγησης του Android και του Google Chrome"</string>
+ <string name="pref_personal_google_account" msgid="952360133341490071">"Λογαριασμός Google"</string>
+ <string name="pref_personal_sync_bookmarks" msgid="59237515966184432">"Συγχρονισμός σελιδοδεικτών"</string>
+ <string name="pref_personal_sync_bookmarks_summary" msgid="4791767605662205482">"Συγχρονισμός σελιδοδεικτών μεταξύ του Προγράμματος περιήγησης του Android και του Google Chrome"</string>
+ <string name="pref_personal_start_syncing" msgid="6046972042512655232">"Έναρξη συγχρονισμού"</string>
+ <string name="pref_personal_account_dialog_title" msgid="1390867119887955530">"Επιλογή λογαριασμού"</string>
+ <string name="pref_autofill_enabled" msgid="1174197447388234595">"Αυτόματη συμπλήρωση φόρμας"</string>
+ <string name="pref_autofill_enabled_summary" msgid="422640696197018914">"Συμπληρώστε φόρμες ιστού με ένα κλικ"</string>
+ <string name="pref_autofill_profile_editor" msgid="1350709161524642663">"Ρυθμίσεις αυτόματης συμπλήρωσης"</string>
+ <string name="pref_autofill_profile_editor_summary" msgid="6748434431641768870">"Ρύθμιση και διαχείριση δεδομένων για φόρμες Αυτόματης συμπλήρωσης"</string>
+ <string name="autofill_profile_editor_name" msgid="8566130291459685955">"Πλήρες όνομα:"</string>
+ <string name="autofill_profile_editor_email_address" msgid="7967585896612797173">"Ηλεκτρονικό ταχυδρομείο:"</string>
+ <string name="autofill_profile_editor_company_name" msgid="2813443159949210417">"Επωνυμία εταιρείας:"</string>
+ <string name="autofill_profile_editor_address_line_1" msgid="836433242509243081">"Γραμμή διεύθυνσης 1:"</string>
+ <string name="autofill_profile_editor_address_line_1_hint" msgid="5965659598509327172">"Διεύθυνση, ταχυδρομική θυρίδα, υπόψη"</string>
+ <string name="autofill_profile_editor_address_line_2" msgid="8194745202893822479">"Γραμμή διεύθυνσης 2:"</string>
+ <string name="autofill_profile_editor_address_line_2_hint" msgid="2048330295853546405">"Διαμέρισμα, σουίτα, αριθμός, κτίριο, όροφος κ.ά."</string>
+ <string name="autofill_profile_editor_city" msgid="4193225955409148508">"Πόλη:"</string>
+ <string name="autofill_profile_editor_state" msgid="8549739922338171458">"Νομός / Επαρχία / Περιοχή:"</string>
+ <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_save_profile" msgid="8349915287435262888">"Αποθήκευση προφίλ"</string>
+ <string name="autofill_profile_successful_save" msgid="6834102203944938409">"Το προφίλ αποθηκεύτηκε"</string>
+ <string name="autofill_profile_successful_delete" msgid="2421442112954362732">"Το προφίλ διαγράφηκε"</string>
+ <string name="autofill_profile_editor_delete_profile" msgid="7112035941146003753">"Διαγρ. δεδομ. προφίλ"</string>
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
<string name="pref_privacy_title" msgid="1052470980370846151">"Ρυθμίσεις απορρήτου"</string>
<string name="pref_privacy_clear_cache" msgid="3380316479925886998">"Εκκαθάριση προσωρινής μνήμης"</string>
<string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"Εκκαθάριση τοπικά αποθηκευμένου στη μνήμη cache περιεχομένου και βάσεων δεδομένων"</string>
@@ -208,6 +258,7 @@
<item msgid="891615911084608570">"Ιαπωνικά (ISO-2022-JP)"</item>
<item msgid="5589150448475151241">"Ιαπωνικά (SHIFT_JIS)"</item>
<item msgid="7356792686950371843">"Ιαπωνικά (EUC-JP)"</item>
+ <item msgid="2193955365569270096">"Κορεατικά (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Κωδικοποίηση κειμένου"</string>
<string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"Πρόβλημα σύνδεσης δεδομένων"</string>
@@ -296,4 +347,11 @@
<string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"Διαγραφή όλων των δεδομένων"</string>
<string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"Ακύρωση"</string>
<string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"Ρύθμιση ταπετσαρίας..."</string>
+ <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Σελιδοδείκτες"</string>
+ <string name="empty_bookmarks_folder" msgid="7843361614634930942">"Δεν υπάρχουν σελιδοδείκτες"</string>
+ <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
+ <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Συγχρον. με Λογαριασμό Google"</string>
+ <string name="import_bookmarks_dialog_description" msgid="2187665745413495303">"Οι σελιδοδείκτες σας Android δεν σχετίζονται με κάποιον Λογαριασμό Google"</string>
+ <string name="import_bookmarks_dialog_remove" msgid="8105572409059113340">"Καταργήστε τους σελιδοδείκτες σας Android"</string>
+ <string name="import_bookmarks_dialog_import" msgid="6933613853573899218">"Προσθ. τους σελιδοδείκτες Android στους σελιδοδείκτες του <xliff:g id="GOOGLE_ACCOUNT">%s</xliff:g>"</string>
</resources>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
new file mode 100644
index 0000000..2658285
--- /dev/null
+++ b/res/values-en-rGB/strings.xml
@@ -0,0 +1,396 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2007 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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="application_name" msgid="1935869255545976415">"Browser"</string>
+ <string name="choose_upload" msgid="3649366287575002063">"Choose file for upload"</string>
+ <string name="new_tab" msgid="4505722538297295141">"New window"</string>
+ <!-- no translation found for new_incognito_tab (5821404839654751753) -->
+ <skip />
+ <string name="active_tabs" msgid="3050623868203544623">"Windows"</string>
+ <string name="tab_bookmarks" msgid="2305793036003473653">"Bookmarks"</string>
+ <string name="tab_most_visited" msgid="1077402532455000703">"Most visited"</string>
+ <string name="tab_history" msgid="1979267558744613746">"History"</string>
+ <string name="added_to_bookmarks" msgid="1020224130695956728">"Added to bookmarks"</string>
+ <string name="removed_from_bookmarks" msgid="6063705902028438800">"Removed from bookmarks"</string>
+ <string name="sign_in_to" msgid="5939425800148759165">"Sign in to <xliff:g id="HOSTNAME">%s1</xliff:g> \"<xliff:g id="REALM">%s2</xliff:g>\""</string>
+ <string name="username" msgid="5057566336518215922">"Name"</string>
+ <string name="password" msgid="1177138552305184404">"Password"</string>
+ <string name="action" msgid="183105774472071343">"Sign in"</string>
+ <string name="bookmarks_search" msgid="5229596268214362873">"Browser"</string>
+ <string name="cancel" msgid="3017274947407233702">"Cancel"</string>
+ <string name="ok" msgid="1509280796718850364">"OK"</string>
+ <string name="title_bar_loading" msgid="7438217780834640678">"Loading…"</string>
+ <string name="page_info" msgid="4048529256302257195">"Page info"</string>
+ <string name="page_info_view" msgid="5303490449842635158">"View page info"</string>
+ <string name="page_info_address" msgid="2222306609532903254">"Address:"</string>
+ <string name="ssl_warnings_header" msgid="79744901983636370">"There are problems with the security certificate for this site."</string>
+ <string name="ssl_continue" msgid="8031515015829358457">"Continue"</string>
+ <string name="security_warning" msgid="6607795404322797541">"Security warning"</string>
+ <string name="view_certificate" msgid="1472768887529093862">"View certificate"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
+ <string name="ssl_untrusted" msgid="5369967226521102194">"This certificate is not from a trusted authority."</string>
+ <string name="ssl_mismatch" msgid="558688832420069896">"The name of the site does not match the name on the certificate."</string>
+ <string name="ssl_expired" msgid="5739349389499575559">"This certificate has expired."</string>
+ <string name="ssl_not_yet_valid" msgid="2893167846212645846">"This certificate is not valid yet."</string>
+ <string name="ssl_certificate" msgid="5226747157992111668">"Security certificate"</string>
+ <string name="ssl_certificate_is_valid" msgid="7096160815933145579">"This certificate is valid."</string>
+ <string name="issued_to" msgid="9032338008819841339">"Issued to:"</string>
+ <string name="common_name" msgid="5745530093500062357">"Common name:"</string>
+ <string name="org_name" msgid="8868889052889991293">"Organisation:"</string>
+ <string name="org_unit" msgid="4489056376307768196">"Organisational unit:"</string>
+ <string name="issued_by" msgid="6959484326943152487">"Issued by:"</string>
+ <string name="validity_period" msgid="57988851973181309">"Validity:"</string>
+ <string name="issued_on" msgid="2082890654801808368">"Issued on:"</string>
+ <string name="expires_on" msgid="8061200430557020704">"Expires on:"</string>
+ <string name="stopping" msgid="4839698519340302982">"Stopping…"</string>
+ <string name="stop" msgid="5687251076030630074">"Stop"</string>
+ <string name="reload" msgid="8585220783228408062">"Refresh"</string>
+ <string name="back" msgid="8414603107175713668">"Back"</string>
+ <string name="forward" msgid="4288210890526641577">"Forward"</string>
+ <string name="save" msgid="5922311934992468496">"OK"</string>
+ <string name="do_not_save" msgid="6777633870113477714">"Cancel"</string>
+ <!-- outdated translation 969988560160364559 --> <string name="location" msgid="3411848697912600125">"Location"</string>
+ <!-- no translation found for containing_folder (6771180232953030479) -->
+ <skip />
+ <!-- no translation found for new_folder (7743540149088867917) -->
+ <skip />
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <!-- no translation found for no_subfolders (5880411440592452802) -->
+ <skip />
+ <!-- no translation found for add_to_bookmarks_menu_option (4449323955122214389) -->
+ <skip />
+ <!-- no translation found for add_to_homescreen_menu_option (1461447829242963790) -->
+ <skip />
+ <!-- no translation found for add_to_other_folder_menu_option (5450890093372998187) -->
+ <skip />
+ <!-- outdated translation 5990326151488445481 --> <string name="name" msgid="5462672162695365387">"Name"</string>
+ <string name="http" msgid="2163722670597250102">"http://"</string>
+ <string name="save_to_bookmarks" msgid="6101482434920313244">"Add to Bookmarks"</string>
+ <!-- no translation found for bookmark_this_page (7530739804320811054) -->
+ <skip />
+ <string name="edit_bookmark" msgid="5024089053490231905">"Edit bookmark"</string>
+ <!-- outdated translation 4528337239019328891 --> <string name="create_shortcut_bookmark" msgid="1995095662095484289">"Add to Home"</string>
+ <string name="open_bookmark" msgid="8473581305759935790">"Open"</string>
+ <string name="remove_bookmark" msgid="8407495852801410891">"Delete bookmark"</string>
+ <string name="remove_from_bookmarks" msgid="4374080666576982775">"Remove from bookmarks"</string>
+ <string name="remove_history_item" msgid="5021424935726728618">"Remove from history"</string>
+ <string name="set_as_homepage" msgid="4752937379414905560">"Set as homepage"</string>
+ <string name="bookmark_saved" msgid="2766434679871317557">"Saved to bookmarks."</string>
+ <string name="bookmark_not_saved" msgid="700600955089376724">"Unable to save bookmark."</string>
+ <string name="homepage_set" msgid="8768087280310966395">"Homepage set."</string>
+ <string name="bookmark_needs_title" msgid="6245900436119218187">"Bookmark must have a name."</string>
+ <string name="bookmark_needs_url" msgid="7809876865972755158">"Bookmark must have a location."</string>
+ <string name="bookmark_url_not_valid" msgid="6719785633980202419">"URL is not valid."</string>
+ <string name="bookmark_cannot_save_url" msgid="791722768778386941">"This URL cannot be bookmarked."</string>
+ <string name="delete_bookmark" msgid="2422989994934201992">"Delete"</string>
+ <string name="bookmark_page" msgid="6845189305130307274">"Bookmark last viewed page"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
+ <string name="current_page" msgid="7510129573681663135">"from "</string>
+ <string name="delete_bookmark_warning" msgid="758043186202032205">"Bookmark \"<xliff:g id="BOOKMARK">%s</xliff:g>\" will be deleted."</string>
+ <string name="open_in_new_window" msgid="6596775546468054510">"Open in new window"</string>
+ <string name="goto_dot" msgid="3895839050522602723">"Go"</string>
+ <!-- no translation found for incognito_tab (5419458065370134289) -->
+ <skip />
+ <string name="select_dot" msgid="6299170761900561967">"Select text"</string>
+ <string name="tab_picker_title" msgid="864478399057782913">"Current windows"</string>
+ <string name="tab_picker_remove_tab" msgid="630087809802479397">"Close"</string>
+ <string name="bookmarks" msgid="1961279134885867815">"Bookmarks"</string>
+ <string name="shortcut_bookmark" msgid="3974876480401135895">"Bookmark"</string>
+ <string name="history" msgid="2451240511251410032">"History"</string>
+ <string name="menu_view_download" msgid="2124570321712995120">"Downloads"</string>
+ <string name="copy_page_url" msgid="7635062169011319208">"Copy page URL"</string>
+ <string name="share_page" msgid="593756995297268343">"Share page"</string>
+ <string name="menu_save_webarchive" msgid="3934652434001459581">"Save as Web Archive"</string>
+ <string name="webarchive_saved" msgid="7045250341467345007">"Web archive saved."</string>
+ <string name="webarchive_failed" msgid="2880998204746620260">"Failed to save web archive."</string>
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
+ <string name="contextmenu_openlink" msgid="7237961252214188935">"Open"</string>
+ <string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"Open in new window"</string>
+ <string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"Bookmark link"</string>
+ <string name="contextmenu_savelink" msgid="5508554930832538184">"Save link"</string>
+ <string name="contextmenu_sharelink" msgid="5392275392280130331">"Share link"</string>
+ <string name="contextmenu_copy" msgid="398860586635404030">"Copy"</string>
+ <string name="contextmenu_copylink" msgid="5153657160294534270">"Copy link URL"</string>
+ <string name="contextmenu_download_image" msgid="4243829645180686912">"Save image"</string>
+ <string name="contextmenu_view_image" msgid="3870625602053600905">"View image"</string>
+ <string name="contextmenu_set_wallpaper" msgid="3691902960115350686">"Set as wallpaper"</string>
+ <string name="contextmenu_dial_dot" msgid="5856550683415933806">"Dial…"</string>
+ <string name="contextmenu_add_contact" msgid="3183511922223645716">"Add contact"</string>
+ <string name="contextmenu_send_mail" msgid="1014513374828775660">"Send email"</string>
+ <string name="contextmenu_map" msgid="7471390435434034912">"Map"</string>
+ <string name="choosertitle_sharevia" msgid="4600490613341909086">"Share via"</string>
+ <string name="clear" msgid="7070043081700011461">"Clear"</string>
+ <string name="replace" msgid="4843033491070384047">"Replace"</string>
+ <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Bookmarks"</string>
+ <string name="menu_preferences" msgid="6709237687234102240">"Settings"</string>
+ <string name="pref_content_title" msgid="722227111894838633">"Page content settings"</string>
+ <string name="pref_content_load_images" msgid="2125616852957377561">"Load images"</string>
+ <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Display images on web pages"</string>
+ <string name="pref_content_block_popups" msgid="7808433807197256726">"Block pop-up windows"</string>
+ <string name="pref_content_javascript" msgid="4570972030299516843">"Enable JavaScript"</string>
+ <string name="pref_content_open_in_background" msgid="824123779725118663">"Open in background"</string>
+ <string name="pref_content_plugins" msgid="7231944644794301582">"Enable plug-ins"</string>
+ <string-array name="pref_content_plugins_choices">
+ <item msgid="6745108155096660725">"Always on"</item>
+ <item msgid="2484126708670016519">"On demand"</item>
+ <item msgid="8547442717307793863">"Off"</item>
+ </string-array>
+ <string name="pref_content_open_in_background_summary" msgid="1737664075721181678">"Open new windows behind the current one"</string>
+ <string name="pref_content_homepage" msgid="6082437160778559806">"Set homepage"</string>
+ <string name="pref_content_search_engine" msgid="1620101310821644144">"Set search engine"</string>
+ <string name="pref_content_search_engine_summary" msgid="5162667665858487316">"Select a search engine"</string>
+ <!-- no translation found for pref_set_homepage_to (7196350233061395098) -->
+ <skip />
+ <!-- outdated translation 1493179933653044553 --> <string name="pref_use_current" msgid="1778622474040406672">"Use current page"</string>
+ <!-- no translation found for pref_use_blank (8503238592551111169) -->
+ <skip />
+ <!-- no translation found for pref_use_default (192587563274735878) -->
+ <skip />
+ <string name="pref_content_autofit" msgid="8260474534053660809">"Auto-fit pages"</string>
+ <string name="pref_content_autofit_summary" msgid="4587831659894879986">"Format web pages to fit the screen"</string>
+ <!-- no translation found for pref_personal_title (1447687455755683695) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome (1695182180332194033) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome_summary (7414133931827321055) -->
+ <skip />
+ <!-- no translation found for pref_personal_google_account (952360133341490071) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks (59237515966184432) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks_summary (4791767605662205482) -->
+ <skip />
+ <!-- no translation found for pref_personal_start_syncing (6046972042512655232) -->
+ <skip />
+ <!-- no translation found for pref_personal_account_dialog_title (1390867119887955530) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled (1174197447388234595) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled_summary (422640696197018914) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor (1350709161524642663) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor_summary (6748434431641768870) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_name (8566130291459685955) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_email_address (7967585896612797173) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_company_name (2813443159949210417) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1 (836433242509243081) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1_hint (5965659598509327172) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2 (8194745202893822479) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2_hint (2048330295853546405) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_city (4193225955409148508) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_state (8549739922338171458) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_zip_code (283668573295656671) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_country (7234470301239156656) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_phone_number (4938852821413729276) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_save_profile (8349915287435262888) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_save (6834102203944938409) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_delete (2421442112954362732) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_delete_profile (7112035941146003753) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
+ <string name="pref_privacy_title" msgid="1052470980370846151">"Privacy settings"</string>
+ <string name="pref_privacy_clear_cache" msgid="3380316479925886998">"Clear cache"</string>
+ <string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"Clear locally cached content and databases"</string>
+ <string name="pref_privacy_clear_cache_dlg" msgid="5541011591300753881">"Locally cached content and databases will be deleted."</string>
+ <string name="pref_privacy_clear_cookies" msgid="3095583579133780331">"Clear all cookie data"</string>
+ <string name="pref_privacy_clear_cookies_summary" msgid="6962742063990677520">"Clear all browser cookies"</string>
+ <string name="pref_privacy_clear_cookies_dlg" msgid="552855688091432682">"All cookies will be deleted."</string>
+ <string name="pref_privacy_clear_history" msgid="8723795508825198477">"Clear history"</string>
+ <string name="pref_privacy_clear_history_summary" msgid="6868501330708940734">"Clear the browser navigation history"</string>
+ <string name="pref_privacy_clear_history_dlg" msgid="544903007914753853">"The browser navigation history will be deleted."</string>
+ <string name="pref_privacy_clear_form_data" msgid="4232668196344383987">"Clear form data"</string>
+ <string name="pref_privacy_clear_form_data_summary" msgid="1790390894719517167">"Clear all the saved form data"</string>
+ <string name="pref_privacy_clear_form_data_dlg" msgid="4443621086781197928">"All saved form data will be deleted."</string>
+ <string name="pref_privacy_clear_passwords" msgid="4750234112289277480">"Clear passwords"</string>
+ <string name="pref_privacy_clear_passwords_summary" msgid="8856782718942903335">"Clear all saved passwords"</string>
+ <string name="pref_privacy_clear_passwords_dlg" msgid="2083869328824248255">"All saved passwords will be deleted."</string>
+ <string name="pref_privacy_enable_geolocation" msgid="1395040170290765686">"Enable location"</string>
+ <string name="pref_privacy_enable_geolocation_summary" msgid="8437020934664306205">"Allow sites to request access to your location"</string>
+ <string name="pref_privacy_clear_geolocation_access" msgid="6649680770030042980">"Clear location access"</string>
+ <string name="pref_privacy_clear_geolocation_access_summary" msgid="7750143359497314679">"Clear location access for all websites"</string>
+ <string name="pref_privacy_clear_geolocation_access_dlg" msgid="7327063124488827244">"Clear location access for all websites"</string>
+ <string name="pref_security_title" msgid="5763978646932160021">"Security settings"</string>
+ <string name="pref_security_remember_passwords" msgid="6492957683454529549">"Remember passwords"</string>
+ <string name="pref_security_remember_passwords_summary" msgid="256388703356349137">"Save usernames and passwords for websites"</string>
+ <string name="pref_security_save_form_data" msgid="1213669802810198893">"Remember form data"</string>
+ <string name="pref_security_save_form_data_summary" msgid="4994074685153708026">"Remember data that I type in forms for later use"</string>
+ <string name="pref_security_show_security_warning" msgid="8901135676266754559">"Show security warnings"</string>
+ <string name="pref_security_show_security_warning_summary" msgid="8968906112720511704">"Show warning if there is a problem with a site\'s security"</string>
+ <string name="pref_security_accept_cookies" msgid="3201367661925047989">"Accept cookies"</string>
+ <string name="pref_security_accept_cookies_summary" msgid="1465118934875026920">"Allow sites to save and read \"cookie\" data"</string>
+ <string name="pref_text_size" msgid="3827031324346612208">"Text size"</string>
+ <string-array name="pref_text_size_choices">
+ <item msgid="4952686548944739548">"Tiny"</item>
+ <item msgid="1950030433642671460">"Small"</item>
+ <item msgid="4338347520133294584">"Normal"</item>
+ <item msgid="5043128215356351184">"Large"</item>
+ <item msgid="7201512237890458902">"Huge"</item>
+ </string-array>
+ <string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Text size"</string>
+ <string name="pref_default_zoom" msgid="8076142259097187395">"Default zoom"</string>
+ <string-array name="pref_default_zoom_choices">
+ <item msgid="549583171195154919">"Far"</item>
+ <item msgid="5619034257768161024">"Medium"</item>
+ <item msgid="3840999588443167001">"Close"</item>
+ </string-array>
+ <string name="pref_default_zoom_dialogtitle" msgid="6095974367125109021">"Default zoom"</string>
+ <string name="pref_content_load_page" msgid="2219810141690955452">"Open pages in overview"</string>
+ <string name="pref_content_load_page_summary" msgid="8792093504054149369">"Show overview of newly opened pages"</string>
+ <string name="pref_extras_title" msgid="3091250467679722382">"Advanced settings"</string>
+ <string name="pref_extras_website_settings" msgid="67866640052455549">"Website settings"</string>
+ <string name="pref_extras_website_settings_summary" msgid="1656771443223494406">"Advanced settings for individual websites"</string>
+ <string name="pref_extras_reset_default" msgid="8904000515846202110">"Reset to default"</string>
+ <string name="pref_extras_reset_default_summary" msgid="4247870778270414501">"Restore default settings"</string>
+ <string name="pref_extras_reset_default_dlg" msgid="6640261575874704022">"Settings will revert to default values."</string>
+ <string name="pref_extras_reset_default_dlg_title" msgid="2250334970728938936">"Reset to default"</string>
+ <string name="pref_development_title" msgid="3263854204533056480">"Debug"</string>
+ <string name="pref_default_text_encoding" msgid="5742965543955558478">"Text encoding"</string>
+ <!-- no translation found for pref_default_text_encoding_choices:7 (2193955365569270096) -->
+ <string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Text encoding"</string>
+ <string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"Data connectivity problem"</string>
+ <string name="browserFrameFileErrorLabel" msgid="8063691502792670367">"Problem with file"</string>
+ <string name="browserFrameFormResubmitLabel" msgid="2685923472682180360">"Confirm"</string>
+ <string name="browserFrameFormResubmitMessage" msgid="2752182215695632138">"The page that you are trying to view contains data that has already been submitted (\"POSTDATA\"). If you resend the data, any action that the form on the page carried out (such as a search or online purchase) will be repeated."</string>
+ <string name="loadSuspendedTitle" msgid="675991625288706944">"No network connection"</string>
+ <string name="loadSuspended" msgid="3133656588880851273">"Browser cannot load this page because there is no Internet connection."</string>
+ <string name="clear_history" msgid="5998307092715979619">"Clear history"</string>
+ <string name="browser_history" msgid="1038987118290272525">"Recently visited pages"</string>
+ <string name="empty_history" msgid="8738772352308207274">"Browser history is empty."</string>
+ <string name="add_new_bookmark" msgid="8086367791400349049">"Add bookmark…"</string>
+ <string name="add_bookmark_short" msgid="3783984330998103735">"Add"</string>
+ <string name="search_hint" msgid="4647356319916631820">"Search or type URL"</string>
+ <string name="search_button_text" msgid="5235226933877634410">"Go"</string>
+ <string name="search_settings_description" msgid="1422401062529014107">"Bookmarks and web history"</string>
+ <string name="attention" msgid="3473639060042811244">"Attention"</string>
+ <string name="popup_window_attempt" msgid="2673111696288657989">"This site is attempting to open a pop-up window."</string>
+ <string name="allow" msgid="1157313689171991335">"Allow"</string>
+ <string name="block" msgid="9172175889884707800">"Block"</string>
+ <string name="too_many_windows_dialog_title" msgid="5175503564948906442">"Window limit reached"</string>
+ <string name="too_many_windows_dialog_message" msgid="1398571800233959583">"Couldn\'t open a new window because you\'ve already opened the maximum number."</string>
+ <string name="too_many_subwindows_dialog_title" msgid="3805453941587725944">"Pop-up already open"</string>
+ <string name="too_many_subwindows_dialog_message" msgid="5827289829907966657">"Could not open a new pop-up window because only one can be open at any time."</string>
+ <string name="download_title" msgid="2122874021047565594">"Download history"</string>
+ <string name="download_unknown_filename" msgid="4013465542563652175">"<Unknown>"</string>
+ <string name="download_menu_open" msgid="4888327480367757513">"Open"</string>
+ <string name="download_menu_clear" msgid="6264454531553418124">"Clear from list"</string>
+ <string name="download_menu_delete" msgid="8815502136393894148">"Delete"</string>
+ <string name="download_menu_cancel" msgid="2545333007601851574">"Cancel download"</string>
+ <string name="download_menu_cancel_all" msgid="2136550823151999166">"Cancel all downloads"</string>
+ <string name="download_cancel_dlg_title" msgid="8909108500262799748">"Cancel downloads"</string>
+ <string name="download_cancel_dlg_msg" msgid="6285389170052357797">"All <xliff:g id="DOWNLOAD_COUNT">%d</xliff:g> downloads will be cancelled and cleared from the download history."</string>
+ <string name="download_delete_file" msgid="5330036497843073249">"File will be deleted"</string>
+ <string name="download_file_error_dlg_title" msgid="2693630283595384874">"Out of space"</string>
+ <string name="download_file_error_dlg_msg" msgid="5156405410324072471">"<xliff:g id="FILENAME">%s</xliff:g> could not be downloaded."\n"Free up some space on your phone and try again."</string>
+ <string name="download_failed_generic_dlg_title" msgid="6106781095337833391">"Download unsuccessful"</string>
+ <!-- outdated translation 605904452159416792 --> <string name="download_no_sdcard_dlg_title" product="nosdcard" msgid="56777245081568508">"No SD card"</string>
+ <string name="download_no_sdcard_dlg_title" product="default" msgid="605904452159416792">"No SD card"</string>
+ <!-- no translation found for download_no_sdcard_dlg_msg (3144652102051031721) -->
+ <skip />
+ <string name="download_no_sdcard_dlg_msg" product="default" msgid="2616399456116301518">"An SD card is required to download <xliff:g id="FILENAME">%s</xliff:g>."</string>
+ <!-- outdated translation 6877712666046917741 --> <string name="download_sdcard_busy_dlg_title" product="nosdcard" msgid="8081445664689818973">"SD card unavailable"</string>
+ <string name="download_sdcard_busy_dlg_title" product="default" msgid="6877712666046917741">"SD card unavailable"</string>
+ <!-- outdated translation 3473883538192835204 --> <string name="download_sdcard_busy_dlg_msg" product="nosdcard" msgid="3979329954835690147">"The SD card is busy. To allow downloads, select \"Turn off USB storage\" in the notification."</string>
+ <string name="download_sdcard_busy_dlg_msg" product="default" msgid="3473883538192835204">"The SD card is busy. To allow downloads, select \"Turn off USB storage\" in the notification."</string>
+ <string name="download_no_application_title" msgid="1286056729168874295">"Cannot open file"</string>
+ <string name="retry" msgid="1835923075542266721">"Retry"</string>
+ <string name="no_downloads" msgid="3947445710685021498">"Download history is empty."</string>
+ <string name="download_error" msgid="413496839831257187">"Download unsuccessful."</string>
+ <string name="download_success" msgid="2279041638155595203">"<xliff:g id="FILE">%s</xliff:g> Download complete."</string>
+ <string name="download_running" msgid="2622942231322015059">"Downloading…"</string>
+ <string name="download_pending" msgid="2599683668575349559">"Starting download…"</string>
+ <string name="download_pending_network" msgid="6548714525679461053">"Waiting for data connection…"</string>
+ <string name="download_running_paused" msgid="6418029352085656495">"Waiting for data connection…"</string>
+ <string name="download_canceled" msgid="6057083743144492515">"Download cancelled."</string>
+ <string name="download_not_acceptable" msgid="313769696131563652">"Cannot download. The content is not supported on this phone."</string>
+ <string name="download_file_error" msgid="1206648050615176113">"Cannot finish download. There is not enough space."</string>
+ <string name="download_length_required" msgid="9038605488460437406">"Cannot download. The size of the item cannot be determined."</string>
+ <string name="download_precondition_failed" msgid="8327584102874295580">"Download interrupted. It cannot be resumed."</string>
+ <string name="search_the_web" msgid="6046130189241962337">"Search the web"</string>
+ <string name="webstorage_outofspace_notification_title" msgid="1160474608059771788">"Browser storage full"</string>
+ <string name="webstorage_outofspace_notification_text" msgid="7341075135051829692">"Click to free up space."</string>
+ <string name="webstorage_clear_data_title" msgid="689484577124333977">"Clear stored data"</string>
+ <string name="webstorage_clear_data_dialog_title" msgid="345457466368974706">"Clear stored data"</string>
+ <string name="webstorage_clear_data_dialog_message" msgid="6678281256970470125">"All data stored by this website will be deleted"</string>
+ <string name="webstorage_clear_data_dialog_ok_button" msgid="2516563534211898636">"Clear all"</string>
+ <string name="webstorage_clear_data_dialog_cancel_button" msgid="2028867751958942762">"Cancel"</string>
+ <string name="webstorage_origin_summary_mb_stored" msgid="1985885826292236210">"MB stored on your phone"</string>
+ <string name="loading_video" msgid="4887871585216091096">"Loading video"</string>
+ <string name="geolocation_permissions_prompt_message" msgid="356796102004052471">"<xliff:g id="WEBSITE_ORIGIN">%s</xliff:g> wants to know your location"</string>
+ <string name="geolocation_permissions_prompt_share" msgid="9084486342048347976">"Share location"</string>
+ <string name="geolocation_permissions_prompt_dont_share" msgid="6303025160237860300">"Decline"</string>
+ <string name="geolocation_permissions_prompt_remember" msgid="3118526300707348308">"Remember preference"</string>
+ <string name="geolocation_permissions_prompt_toast_allowed" msgid="987286072035125498">"This site can access your location. Change this in Settings -> Website settings"</string>
+ <string name="geolocation_permissions_prompt_toast_disallowed" msgid="7695100950212692515">"This site cannot access your location. Change this in Settings -> Website settings"</string>
+ <string name="geolocation_settings_page_title" msgid="1745477985097536528">"Clear location access"</string>
+ <string name="geolocation_settings_page_summary_allowed" msgid="9180251524290811398">"This site can currently access your location"</string>
+ <string name="geolocation_settings_page_summary_not_allowed" msgid="4589649082203102544">"This site cannot currently access your location"</string>
+ <string name="geolocation_settings_page_dialog_title" msgid="1549842043381347668">"Clear location access"</string>
+ <string name="geolocation_settings_page_dialog_message" msgid="7586671987576403993">"Location access for this website will be cleared"</string>
+ <string name="geolocation_settings_page_dialog_ok_button" msgid="4789434178048077287">"Clear access"</string>
+ <string name="geolocation_settings_page_dialog_cancel_button" msgid="7941036504673409747">"Cancel"</string>
+ <string name="website_settings_clear_all" msgid="8739804325997655980">"Clear all"</string>
+ <string name="website_settings_clear_all_dialog_title" msgid="7791826325122461718">"Clear all website settings?"</string>
+ <string name="website_settings_clear_all_dialog_message" msgid="6150502090601476333">"All website data and location permissions will be deleted."</string>
+ <string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"Delete all data"</string>
+ <string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"Cancel"</string>
+ <string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"Setting wallpaper..."</string>
+ <!-- no translation found for defaultBookmarksUpButton (2303951020715704735) -->
+ <skip />
+ <!-- no translation found for empty_bookmarks_folder (7843361614634930942) -->
+ <skip />
+ <!-- no translation found for rlz_access_point (7165847807377650632) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_title (3325557652271172128) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_description (2187665745413495303) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_remove (8105572409059113340) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_import (6933613853573899218) -->
+ <skip />
+</resources>
diff --git a/res/values-es-rUS-xlarge/strings.xml b/res/values-es-rUS-xlarge/strings.xml
new file mode 100644
index 0000000..f52826a
--- /dev/null
+++ b/res/values-es-rUS-xlarge/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="new_tab" msgid="7275656655054293038">"Pestaña nueva"</string>
+ <string name="new_incognito_tab" msgid="5149742197322201152">"Nueva pestaña de incógnito"</string>
+ <string name="active_tabs" msgid="5324492165541331128">"Pestañas"</string>
+</resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index f759b7f..4b987a0 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -19,7 +19,8 @@
<string name="application_name" msgid="1935869255545976415">"Navegador"</string>
<string name="choose_upload" msgid="3649366287575002063">"Elegir el archivo para cargar"</string>
<string name="new_tab" msgid="4505722538297295141">"Ventana nueva"</string>
- <string name="active_tabs" msgid="3050623868203544623">"Ventanas"</string>
+ <string name="new_incognito_tab" msgid="5821404839654751753">"Nueva ventana de incógnito"</string>
+ <string name="active_tabs" msgid="3050623868203544623">"Windows"</string>
<string name="tab_bookmarks" msgid="2305793036003473653">"Marcadores"</string>
<string name="tab_most_visited" msgid="1077402532455000703">"Más visitados"</string>
<string name="tab_history" msgid="1979267558744613746">"Historial"</string>
@@ -32,12 +33,6 @@
<string name="bookmarks_search" msgid="5229596268214362873">"Navegador"</string>
<string name="cancel" msgid="3017274947407233702">"Cancelar"</string>
<string name="ok" msgid="1509280796718850364">"Aceptar"</string>
- <plurals name="matches_found">
- <item quantity="zero" msgid="6242659159545399963">"Sin coincidencias"</item>
- <item quantity="one" msgid="4352019729062956802">"1 coincidencia"</item>
- <item quantity="few" msgid="5544267486978946555">"<xliff:g id="NUMBER">%d</xliff:g> coincide"</item>
- <item quantity="other" msgid="6616125067364315405">"<xliff:g id="NUMBER">%d</xliff:g> coincide"</item>
- </plurals>
<string name="title_bar_loading" msgid="7438217780834640678">"Cargando…"</string>
<string name="page_info" msgid="4048529256302257195">"Información de la página"</string>
<string name="page_info_view" msgid="5303490449842635158">"Ver información de la página"</string>
@@ -46,6 +41,8 @@
<string name="ssl_continue" msgid="8031515015829358457">"Continuar"</string>
<string name="security_warning" msgid="6607795404322797541">"Advertencia de seguridad"</string>
<string name="view_certificate" msgid="1472768887529093862">"Ver certificado"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
<string name="ssl_untrusted" msgid="5369967226521102194">"Este certificado no proviene de una fuente confiable."</string>
<string name="ssl_mismatch" msgid="558688832420069896">"El nombre del sitio no coincide con el nombre del certificado."</string>
<string name="ssl_expired" msgid="5739349389499575559">"Este certificado ha expirado."</string>
@@ -67,12 +64,23 @@
<string name="forward" msgid="4288210890526641577">"Reenviar"</string>
<string name="save" msgid="5922311934992468496">"Aceptar"</string>
<string name="do_not_save" msgid="6777633870113477714">"Cancelar"</string>
- <string name="location" msgid="969988560160364559">"Ubicación"</string>
- <string name="name" msgid="5990326151488445481">"Nombre"</string>
+ <string name="location" msgid="3411848697912600125">"Dirección"</string>
+ <string name="containing_folder" msgid="6771180232953030479">"Agregar a"</string>
+ <string name="new_folder" msgid="7743540149088867917">"Carpeta nueva"</string>
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <string name="no_subfolders" msgid="5880411440592452802">"No hay subcarpetas"</string>
+ <string name="add_to_bookmarks_menu_option" msgid="4449323955122214389">"Marcadores"</string>
+ <string name="add_to_homescreen_menu_option" msgid="1461447829242963790">"Pantalla principal"</string>
+ <string name="add_to_other_folder_menu_option" msgid="5450890093372998187">"Otra carpeta…"</string>
+ <string name="name" msgid="5462672162695365387">"Etiqueta"</string>
<string name="http" msgid="2163722670597250102">"http://"</string>
- <string name="save_to_bookmarks" msgid="588165100024086565">"Agregar marcador"</string>
+ <string name="save_to_bookmarks" msgid="6101482434920313244">"Agregar a Favoritos"</string>
+ <string name="bookmark_this_page" msgid="7530739804320811054">"Agregar esta página a Favoritos"</string>
<string name="edit_bookmark" msgid="5024089053490231905">"Editar marcador"</string>
- <string name="create_shortcut_bookmark" msgid="9202323987633899835">"Agregar acceso directo a la página de inicio"</string>
+ <string name="create_shortcut_bookmark" msgid="1995095662095484289">"Agregar acceso directo a la página de inicio"</string>
<string name="open_bookmark" msgid="8473581305759935790">"Abrir"</string>
<string name="remove_bookmark" msgid="8407495852801410891">"Eliminar marcador"</string>
<string name="remove_from_bookmarks" msgid="4374080666576982775">"Eliminar de marcadores"</string>
@@ -87,13 +95,15 @@
<string name="bookmark_cannot_save_url" msgid="791722768778386941">"No se puede agregar esta URL a los marcadores."</string>
<string name="delete_bookmark" msgid="2422989994934201992">"Eliminar"</string>
<string name="bookmark_page" msgid="6845189305130307274">"Última página vista del marcador"</string>
- <string name="switch_to_thumbnails" msgid="5493351529609043151">"Vista en miniatura"</string>
- <string name="switch_to_list" msgid="8900531247982121055">"Vista de lista"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
<string name="current_page" msgid="7510129573681663135">"de "</string>
<string name="delete_bookmark_warning" msgid="758043186202032205">"El marcador \"<xliff:g id="BOOKMARK">%s</xliff:g>\" se eliminará."</string>
<string name="open_in_new_window" msgid="6596775546468054510">"Abrir en una ventana nueva"</string>
<string name="goto_dot" msgid="3895839050522602723">"Ir"</string>
- <string name="find_dot" msgid="6259312434696611957">"Buscar en la página"</string>
+ <string name="incognito_tab" msgid="5419458065370134289">"Abrir nueva pestaña de incógnito"</string>
<string name="select_dot" msgid="6299170761900561967">"Seleccionar texto"</string>
<string name="tab_picker_title" msgid="864478399057782913">"Ventana actual"</string>
<string name="tab_picker_remove_tab" msgid="630087809802479397">"Cerrar"</string>
@@ -103,6 +113,13 @@
<string name="menu_view_download" msgid="2124570321712995120">"Descargas"</string>
<string name="copy_page_url" msgid="7635062169011319208">"Copiar la url de la página"</string>
<string name="share_page" msgid="593756995297268343">"Compartir página"</string>
+ <string name="menu_save_webarchive" msgid="3934652434001459581">"Guardar como Archivo web"</string>
+ <string name="webarchive_saved" msgid="7045250341467345007">"Archivo web guardado."</string>
+ <string name="webarchive_failed" msgid="2880998204746620260">"Error al guardar el archivo web."</string>
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
<string name="contextmenu_openlink" msgid="7237961252214188935">"Abrir"</string>
<string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"Abrir en una ventana nueva"</string>
<string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"Enlace del marcador"</string>
@@ -138,11 +155,44 @@
<string name="pref_content_homepage" msgid="6082437160778559806">"Definir página de inicio"</string>
<string name="pref_content_search_engine" msgid="1620101310821644144">"Establecer el motor de búsqueda"</string>
<string name="pref_content_search_engine_summary" msgid="5162667665858487316">"Seleccionar un motor de búsqueda"</string>
- <string name="pref_use_current" msgid="1493179933653044553">"Utilizar la página actual"</string>
+ <string name="pref_set_homepage_to" msgid="7196350233061395098">"Configurado en"</string>
+ <string name="pref_use_current" msgid="1778622474040406672">"Página actual"</string>
+ <string name="pref_use_blank" msgid="8503238592551111169">"Página en blanco"</string>
+ <string name="pref_use_default" msgid="192587563274735878">"Página predeterminada"</string>
<string name="pref_content_autofit" msgid="8260474534053660809">"Ajuste automát. de pág."</string>
<string name="pref_content_autofit_summary" msgid="4587831659894879986">"Formatea las páginas web para que se ajusten a la pantalla"</string>
- <string name="pref_content_landscape_only" msgid="2022546812766219672">"Visualización horizontal solamente"</string>
- <string name="pref_content_landscape_only_summary" msgid="1008238895535428855">"Mostrar páginas sólo en la orientación de pantalla horizontal más ancha"</string>
+ <string name="pref_personal_title" msgid="1447687455755683695">"Configuración personal"</string>
+ <string name="pref_personal_sync_with_chrome" msgid="1695182180332194033">"Sincronización con Google Chrome"</string>
+ <string name="pref_personal_sync_with_chrome_summary" msgid="7414133931827321055">"Compartir favoritos & otros datos entre el navegador Android y Google Chrome"</string>
+ <string name="pref_personal_google_account" msgid="952360133341490071">"Cuenta de Google"</string>
+ <string name="pref_personal_sync_bookmarks" msgid="59237515966184432">"Sincronizar favoritos"</string>
+ <string name="pref_personal_sync_bookmarks_summary" msgid="4791767605662205482">"Sincronizar favoritos entre el navegador Android y Google Chrome"</string>
+ <string name="pref_personal_start_syncing" msgid="6046972042512655232">"Iniciar la sincr."</string>
+ <string name="pref_personal_account_dialog_title" msgid="1390867119887955530">"Selec cta Google p/comp"</string>
+ <string name="pref_autofill_enabled" msgid="1174197447388234595">"Formulario de autollenado"</string>
+ <string name="pref_autofill_enabled_summary" msgid="422640696197018914">"Completa formularios web con un clic"</string>
+ <string name="pref_autofill_profile_editor" msgid="1350709161524642663">"Configuración de autollenado"</string>
+ <string name="pref_autofill_profile_editor_summary" msgid="6748434431641768870">"Configurar y administrar datos para los formularios de autollenado"</string>
+ <string name="autofill_profile_editor_name" msgid="8566130291459685955">"Nombre completo:"</string>
+ <string name="autofill_profile_editor_email_address" msgid="7967585896612797173">"Correo electrónico:"</string>
+ <string name="autofill_profile_editor_company_name" msgid="2813443159949210417">"Nombre de la empresa:"</string>
+ <string name="autofill_profile_editor_address_line_1" msgid="836433242509243081">"Dirección línea 1:"</string>
+ <string name="autofill_profile_editor_address_line_1_hint" msgid="5965659598509327172">"Dirección postal, código postal, A/A"</string>
+ <string name="autofill_profile_editor_address_line_2" msgid="8194745202893822479">"Dirección línea 2:"</string>
+ <string name="autofill_profile_editor_address_line_2_hint" msgid="2048330295853546405">"Apartamento, suite, unidad, edificio, suelo, etc."</string>
+ <string name="autofill_profile_editor_city" msgid="4193225955409148508">"Ciudad/Pueblo:"</string>
+ <string name="autofill_profile_editor_state" msgid="8549739922338171458">"Estado / Provincia / Región:"</string>
+ <string name="autofill_profile_editor_zip_code" msgid="283668573295656671">"Código postal:"</string>
+ <string name="autofill_profile_editor_country" msgid="7234470301239156656">"País:"</string>
+ <string name="autofill_profile_editor_phone_number" msgid="4938852821413729276">"Teléfono:"</string>
+ <string name="autofill_profile_editor_save_profile" msgid="8349915287435262888">"Guardar perfil"</string>
+ <string name="autofill_profile_successful_save" msgid="6834102203944938409">"Perfil guardado"</string>
+ <string name="autofill_profile_successful_delete" msgid="2421442112954362732">"Perfil eliminado"</string>
+ <string name="autofill_profile_editor_delete_profile" msgid="7112035941146003753">"Eliminar datos de perfil"</string>
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
<string name="pref_privacy_title" msgid="1052470980370846151">"Configuración de privacidad"</string>
<string name="pref_privacy_clear_cache" msgid="3380316479925886998">"Borrar memoria caché"</string>
<string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"Borrar el contenido y las bases de datos de la memoria caché local"</string>
@@ -208,6 +258,7 @@
<item msgid="891615911084608570">"Japonés (ISO-2022-JP)"</item>
<item msgid="5589150448475151241">"Japonés (SHIFT_JIS)"</item>
<item msgid="7356792686950371843">"Japonés (EUC-JP)"</item>
+ <item msgid="2193955365569270096">"Coreano (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Codificación de texto"</string>
<string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"Problema de conectividad de datos"</string>
@@ -296,4 +347,11 @@
<string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"Eliminar todos los datos"</string>
<string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"Cancelar"</string>
<string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"Estableciendo fondo de pantalla..."</string>
+ <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Marcadores"</string>
+ <string name="empty_bookmarks_folder" msgid="7843361614634930942">"No hay ningún marcador"</string>
+ <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
+ <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Sincronización con cta de Google"</string>
+ <string name="import_bookmarks_dialog_description" msgid="2187665745413495303">"Tus favoritos de Android no están asociados con una cuenta de Google."</string>
+ <string name="import_bookmarks_dialog_remove" msgid="8105572409059113340">"Eliminar tus favoritos de Android"</string>
+ <string name="import_bookmarks_dialog_import" msgid="6933613853573899218">"Agrega tus favoritos de Android a tus favoritos para <xliff:g id="GOOGLE_ACCOUNT">%s</xliff:g>."</string>
</resources>
diff --git a/res/values-es-xlarge/strings.xml b/res/values-es-xlarge/strings.xml
new file mode 100644
index 0000000..1a05099
--- /dev/null
+++ b/res/values-es-xlarge/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="new_tab" msgid="7275656655054293038">"Nueva pestaña"</string>
+ <string name="new_incognito_tab" msgid="5149742197322201152">"Nueva pestaña de incógnito"</string>
+ <string name="active_tabs" msgid="5324492165541331128">"Pestañas"</string>
+</resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 457b5eb..f9e66db 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -19,6 +19,7 @@
<string name="application_name" msgid="1935869255545976415">"Navegador"</string>
<string name="choose_upload" msgid="3649366287575002063">"Seleccionar archivo para subir"</string>
<string name="new_tab" msgid="4505722538297295141">"Nueva ventana"</string>
+ <string name="new_incognito_tab" msgid="5821404839654751753">"Nueva ventana de incógnito"</string>
<string name="active_tabs" msgid="3050623868203544623">"Ventanas"</string>
<string name="tab_bookmarks" msgid="2305793036003473653">"Marcadores"</string>
<string name="tab_most_visited" msgid="1077402532455000703">"Más visitados"</string>
@@ -32,12 +33,6 @@
<string name="bookmarks_search" msgid="5229596268214362873">"Navegador"</string>
<string name="cancel" msgid="3017274947407233702">"Cancelar"</string>
<string name="ok" msgid="1509280796718850364">"Aceptar"</string>
- <plurals name="matches_found">
- <item quantity="zero" msgid="6242659159545399963">"No hay coincidencias"</item>
- <item quantity="one" msgid="4352019729062956802">"Una coincidencia"</item>
- <item quantity="few" msgid="5544267486978946555">"<xliff:g id="NUMBER">%d</xliff:g> coincidencias"</item>
- <item quantity="other" msgid="6616125067364315405">"<xliff:g id="NUMBER">%d</xliff:g> coincidencias"</item>
- </plurals>
<string name="title_bar_loading" msgid="7438217780834640678">"Cargando..."</string>
<string name="page_info" msgid="4048529256302257195">"Información de página"</string>
<string name="page_info_view" msgid="5303490449842635158">"Ver información de página"</string>
@@ -46,6 +41,8 @@
<string name="ssl_continue" msgid="8031515015829358457">"Continuar"</string>
<string name="security_warning" msgid="6607795404322797541">"Advertencia de seguridad"</string>
<string name="view_certificate" msgid="1472768887529093862">"Ver certificado"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
<string name="ssl_untrusted" msgid="5369967226521102194">"Este certificado no procede de una entidad de certificación de confianza."</string>
<string name="ssl_mismatch" msgid="558688832420069896">"El nombre del sitio no coincide con el del certificado."</string>
<string name="ssl_expired" msgid="5739349389499575559">"Este certificado ha caducado."</string>
@@ -67,12 +64,23 @@
<string name="forward" msgid="4288210890526641577">"Siguiente"</string>
<string name="save" msgid="5922311934992468496">"Aceptar"</string>
<string name="do_not_save" msgid="6777633870113477714">"Cancelar"</string>
- <string name="location" msgid="969988560160364559">"Ubicación"</string>
- <string name="name" msgid="5990326151488445481">"Nombre"</string>
+ <string name="location" msgid="3411848697912600125">"Dirección"</string>
+ <string name="containing_folder" msgid="6771180232953030479">"Añadir a"</string>
+ <string name="new_folder" msgid="7743540149088867917">"Nueva carpeta"</string>
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <string name="no_subfolders" msgid="5880411440592452802">"Sin subcarpetas"</string>
+ <string name="add_to_bookmarks_menu_option" msgid="4449323955122214389">"Marcadores"</string>
+ <string name="add_to_homescreen_menu_option" msgid="1461447829242963790">"Escritorio"</string>
+ <string name="add_to_other_folder_menu_option" msgid="5450890093372998187">"Otra carpeta…"</string>
+ <string name="name" msgid="5462672162695365387">"Etiqueta"</string>
<string name="http" msgid="2163722670597250102">"http://"</string>
- <string name="save_to_bookmarks" msgid="588165100024086565">"Añadir marcador"</string>
+ <string name="save_to_bookmarks" msgid="6101482434920313244">"Añadir a marcadores"</string>
+ <string name="bookmark_this_page" msgid="7530739804320811054">"Añadir esta página a marcadores"</string>
<string name="edit_bookmark" msgid="5024089053490231905">"Editar marcador"</string>
- <string name="create_shortcut_bookmark" msgid="9202323987633899835">"Añadir acceso directo al escritorio"</string>
+ <string name="create_shortcut_bookmark" msgid="1995095662095484289">"Añadir acceso directo al escritorio"</string>
<string name="open_bookmark" msgid="8473581305759935790">"Abrir"</string>
<string name="remove_bookmark" msgid="8407495852801410891">"Eliminar marcador"</string>
<string name="remove_from_bookmarks" msgid="4374080666576982775">"Eliminar de marcadores"</string>
@@ -87,13 +95,15 @@
<string name="bookmark_cannot_save_url" msgid="791722768778386941">"Esta URL no se puede añadir a marcadores."</string>
<string name="delete_bookmark" msgid="2422989994934201992">"Eliminar"</string>
<string name="bookmark_page" msgid="6845189305130307274">"Marcar como última página vista"</string>
- <string name="switch_to_thumbnails" msgid="5493351529609043151">"Vista de miniaturas"</string>
- <string name="switch_to_list" msgid="8900531247982121055">"Vista de lista"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
<string name="current_page" msgid="7510129573681663135">"de "</string>
<string name="delete_bookmark_warning" msgid="758043186202032205">"Se eliminará el marcador \"<xliff:g id="BOOKMARK">%s</xliff:g>\"."</string>
<string name="open_in_new_window" msgid="6596775546468054510">"Abrir en ventana nueva"</string>
<string name="goto_dot" msgid="3895839050522602723">"Ir"</string>
- <string name="find_dot" msgid="6259312434696611957">"Buscar en la página"</string>
+ <string name="incognito_tab" msgid="5419458065370134289">"Abrir nueva pestaña de incógnito"</string>
<string name="select_dot" msgid="6299170761900561967">"Seleccionar texto"</string>
<string name="tab_picker_title" msgid="864478399057782913">"Ventanas actuales"</string>
<string name="tab_picker_remove_tab" msgid="630087809802479397">"Cerrar"</string>
@@ -103,6 +113,13 @@
<string name="menu_view_download" msgid="2124570321712995120">"Descargas"</string>
<string name="copy_page_url" msgid="7635062169011319208">"Copiar URL de página"</string>
<string name="share_page" msgid="593756995297268343">"Compartir página"</string>
+ <string name="menu_save_webarchive" msgid="3934652434001459581">"Guardar como archivo web"</string>
+ <string name="webarchive_saved" msgid="7045250341467345007">"Archivo web guardado"</string>
+ <string name="webarchive_failed" msgid="2880998204746620260">"Error al guardar archivo web"</string>
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
<string name="contextmenu_openlink" msgid="7237961252214188935">"Abrir"</string>
<string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"Abrir en ventana nueva"</string>
<string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"Marcar enlace"</string>
@@ -138,11 +155,44 @@
<string name="pref_content_homepage" msgid="6082437160778559806">"Escritorio"</string>
<string name="pref_content_search_engine" msgid="1620101310821644144">"Establecer motor de búsqueda"</string>
<string name="pref_content_search_engine_summary" msgid="5162667665858487316">"Seleccionar un motor de búsqueda"</string>
- <string name="pref_use_current" msgid="1493179933653044553">"Utilizar página actual"</string>
+ <string name="pref_set_homepage_to" msgid="7196350233061395098">"Establecer como…"</string>
+ <string name="pref_use_current" msgid="1778622474040406672">"Página actual"</string>
+ <string name="pref_use_blank" msgid="8503238592551111169">"Página en blanco"</string>
+ <string name="pref_use_default" msgid="192587563274735878">"Página predeterminada"</string>
<string name="pref_content_autofit" msgid="8260474534053660809">"Ajustar páginas automát."</string>
<string name="pref_content_autofit_summary" msgid="4587831659894879986">"Configurar las páginas web para ajustarlas a la pantalla"</string>
- <string name="pref_content_landscape_only" msgid="2022546812766219672">"Vista solo horizontal"</string>
- <string name="pref_content_landscape_only_summary" msgid="1008238895535428855">"Mostrar solo las páginas con la orientación de pantalla horizontal"</string>
+ <string name="pref_personal_title" msgid="1447687455755683695">"Configuración personal"</string>
+ <string name="pref_personal_sync_with_chrome" msgid="1695182180332194033">"Sincronizar con Google Chrome"</string>
+ <string name="pref_personal_sync_with_chrome_summary" msgid="7414133931827321055">"Compartir marcadores y otros datos entre el navegador de Android y Google Chrome"</string>
+ <string name="pref_personal_google_account" msgid="952360133341490071">"Cuenta de Google"</string>
+ <string name="pref_personal_sync_bookmarks" msgid="59237515966184432">"Sincronizar marcadores"</string>
+ <string name="pref_personal_sync_bookmarks_summary" msgid="4791767605662205482">"Sincronizar marcadores entre el navegador de Android y Google Chrome"</string>
+ <string name="pref_personal_start_syncing" msgid="6046972042512655232">"Iniciar sincronización"</string>
+ <string name="pref_personal_account_dialog_title" msgid="1390867119887955530">"Elegir cuenta para compartir"</string>
+ <string name="pref_autofill_enabled" msgid="1174197447388234595">"Autocompletar formulario"</string>
+ <string name="pref_autofill_enabled_summary" msgid="422640696197018914">"Rellenar formularios web con un solo clic"</string>
+ <string name="pref_autofill_profile_editor" msgid="1350709161524642663">"Ajustes de autocompletado"</string>
+ <string name="pref_autofill_profile_editor_summary" msgid="6748434431641768870">"Configurar y administrar los datos de los formularios rellenados automáticamente"</string>
+ <string name="autofill_profile_editor_name" msgid="8566130291459685955">"Nombre completo:"</string>
+ <string name="autofill_profile_editor_email_address" msgid="7967585896612797173">"Email:"</string>
+ <string name="autofill_profile_editor_company_name" msgid="2813443159949210417">"Nombre de la empresa:"</string>
+ <string name="autofill_profile_editor_address_line_1" msgid="836433242509243081">"Línea 1 de la dirección:"</string>
+ <string name="autofill_profile_editor_address_line_1_hint" msgid="5965659598509327172">"Dirección postal, apartado postal, c/o"</string>
+ <string name="autofill_profile_editor_address_line_2" msgid="8194745202893822479">"Línea 2 de la dirección:"</string>
+ <string name="autofill_profile_editor_address_line_2_hint" msgid="2048330295853546405">"Apartamento, piso, bloque, edificio, planta, etc."</string>
+ <string name="autofill_profile_editor_city" msgid="4193225955409148508">"Ciudad/población:"</string>
+ <string name="autofill_profile_editor_state" msgid="8549739922338171458">"Estado/provincia/región:"</string>
+ <string name="autofill_profile_editor_zip_code" msgid="283668573295656671">"Código postal:"</string>
+ <string name="autofill_profile_editor_country" msgid="7234470301239156656">"País:"</string>
+ <string name="autofill_profile_editor_phone_number" msgid="4938852821413729276">"Teléfono:"</string>
+ <string name="autofill_profile_editor_save_profile" msgid="8349915287435262888">"Guardar perfil"</string>
+ <string name="autofill_profile_successful_save" msgid="6834102203944938409">"Perfil guardado"</string>
+ <string name="autofill_profile_successful_delete" msgid="2421442112954362732">"Perfil eliminado"</string>
+ <string name="autofill_profile_editor_delete_profile" msgid="7112035941146003753">"Eliminar datos perfil"</string>
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
<string name="pref_privacy_title" msgid="1052470980370846151">"Ajustes de privacidad"</string>
<string name="pref_privacy_clear_cache" msgid="3380316479925886998">"Borrar caché"</string>
<string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"Borrar bases de datos y contenido de la memoria caché local"</string>
@@ -208,6 +258,7 @@
<item msgid="891615911084608570">"Japonés (ISO-2022-JP)"</item>
<item msgid="5589150448475151241">"Japonés (SHIFT_JIS)"</item>
<item msgid="7356792686950371843">"Japonés (EUC-JP)"</item>
+ <item msgid="2193955365569270096">"Coreano (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Codificación de texto"</string>
<string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"Problema de conectividad de datos"</string>
@@ -296,4 +347,11 @@
<string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"Eliminar todos los datos"</string>
<string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"Cancelar"</string>
<string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"Estableciendo fondo de pantalla..."</string>
+ <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Marcadores"</string>
+ <string name="empty_bookmarks_folder" msgid="7843361614634930942">"No hay ningún marcador."</string>
+ <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
+ <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Sincronizar con cuenta de Google"</string>
+ <string name="import_bookmarks_dialog_description" msgid="2187665745413495303">"Tus marcadores de Android no se han asociado a una cuenta de Google."</string>
+ <string name="import_bookmarks_dialog_remove" msgid="8105572409059113340">"Eliminar los marcadores de Android"</string>
+ <string name="import_bookmarks_dialog_import" msgid="6933613853573899218">"Añadir tus marcadores de Android a marcadores de <xliff:g id="GOOGLE_ACCOUNT">%s</xliff:g>"</string>
</resources>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
new file mode 100644
index 0000000..558f715
--- /dev/null
+++ b/res/values-fa/strings.xml
@@ -0,0 +1,401 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2007 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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="application_name" msgid="1935869255545976415">"مرورگر"</string>
+ <string name="choose_upload" msgid="3649366287575002063">"انتخاب فایل برای آپلود"</string>
+ <string name="new_tab" msgid="4505722538297295141">"پنجره جدید"</string>
+ <!-- no translation found for new_incognito_tab (5821404839654751753) -->
+ <skip />
+ <string name="active_tabs" msgid="3050623868203544623">"پنجره ها"</string>
+ <string name="tab_bookmarks" msgid="2305793036003473653">"نشانک ها"</string>
+ <string name="tab_most_visited" msgid="1077402532455000703">"بیشتر بازدید شده"</string>
+ <string name="tab_history" msgid="1979267558744613746">"سابقه"</string>
+ <string name="added_to_bookmarks" msgid="1020224130695956728">"به نشانک ها اضافه شد"</string>
+ <string name="removed_from_bookmarks" msgid="6063705902028438800">"از نشانک ها حذف شد"</string>
+ <string name="sign_in_to" msgid="5939425800148759165">"ورود به سیستم <xliff:g id="HOSTNAME">%s1</xliff:g> \"<xliff:g id="REALM">%s2</xliff:g>\""</string>
+ <string name="username" msgid="5057566336518215922">"نام"</string>
+ <string name="password" msgid="1177138552305184404">"رمز ورود"</string>
+ <string name="action" msgid="183105774472071343">"ورود به سیستم"</string>
+ <string name="bookmarks_search" msgid="5229596268214362873">"مرورگر"</string>
+ <string name="cancel" msgid="3017274947407233702">"لغو"</string>
+ <string name="ok" msgid="1509280796718850364">"تأیید"</string>
+ <string name="title_bar_loading" msgid="7438217780834640678">"در حال بارگیری..."</string>
+ <string name="page_info" msgid="4048529256302257195">"اطلاعات صفحه"</string>
+ <string name="page_info_view" msgid="5303490449842635158">"مشاهده اطلاعات صفحه"</string>
+ <string name="page_info_address" msgid="2222306609532903254">"آدرس:"</string>
+ <string name="ssl_warnings_header" msgid="79744901983636370">"در گواهی امنیت این سایت مشکلاتی روی داده است."</string>
+ <string name="ssl_continue" msgid="8031515015829358457">"ادامه"</string>
+ <string name="security_warning" msgid="6607795404322797541">"اخطار امنیتی"</string>
+ <string name="view_certificate" msgid="1472768887529093862">"مشاهده گواهی"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
+ <string name="ssl_untrusted" msgid="5369967226521102194">"این گواهی از یک منبع مورد اطمینان صادر نشده است."</string>
+ <string name="ssl_mismatch" msgid="558688832420069896">"نام سایت با نام موجود در گواهی مطابقت ندارد."</string>
+ <string name="ssl_expired" msgid="5739349389499575559">"این گواهی منقضی شده است."</string>
+ <string name="ssl_not_yet_valid" msgid="2893167846212645846">"این گواهی هنوز معتبر نیست."</string>
+ <string name="ssl_certificate" msgid="5226747157992111668">"گواهی امنیتی"</string>
+ <string name="ssl_certificate_is_valid" msgid="7096160815933145579">"این گواهی معتبر است."</string>
+ <string name="issued_to" msgid="9032338008819841339">"صدور برای:"</string>
+ <string name="common_name" msgid="5745530093500062357">"نام عادی:"</string>
+ <string name="org_name" msgid="8868889052889991293">"سازمان:"</string>
+ <string name="org_unit" msgid="4489056376307768196">"واحد سازمانی:"</string>
+ <string name="issued_by" msgid="6959484326943152487">"صدور توسط:"</string>
+ <string name="validity_period" msgid="57988851973181309">"اعتبار:"</string>
+ <string name="issued_on" msgid="2082890654801808368">"صدور در:"</string>
+ <string name="expires_on" msgid="8061200430557020704">"تاریخ انقضا:"</string>
+ <string name="stopping" msgid="4839698519340302982">"در حال توقف..."</string>
+ <string name="stop" msgid="5687251076030630074">"توقف"</string>
+ <string name="reload" msgid="8585220783228408062">"تازه کردن"</string>
+ <string name="back" msgid="8414603107175713668">"برگشت"</string>
+ <string name="forward" msgid="4288210890526641577">"هدایت"</string>
+ <string name="save" msgid="5922311934992468496">"تأیید"</string>
+ <string name="do_not_save" msgid="6777633870113477714">"لغو"</string>
+ <!-- outdated translation 969988560160364559 --> <string name="location" msgid="3411848697912600125">"موقعیت مکانی"</string>
+ <!-- no translation found for containing_folder (6771180232953030479) -->
+ <skip />
+ <!-- no translation found for new_folder (7743540149088867917) -->
+ <skip />
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <!-- no translation found for no_subfolders (5880411440592452802) -->
+ <skip />
+ <!-- no translation found for add_to_bookmarks_menu_option (4449323955122214389) -->
+ <skip />
+ <!-- no translation found for add_to_homescreen_menu_option (1461447829242963790) -->
+ <skip />
+ <!-- no translation found for add_to_other_folder_menu_option (5450890093372998187) -->
+ <skip />
+ <!-- outdated translation 5990326151488445481 --> <string name="name" msgid="5462672162695365387">"نام"</string>
+ <string name="http" msgid="2163722670597250102">"http://"</string>
+ <!-- outdated translation 588165100024086565 --> <string name="save_to_bookmarks" msgid="6101482434920313244">"افزودن نشانک"</string>
+ <!-- no translation found for bookmark_this_page (7530739804320811054) -->
+ <skip />
+ <string name="edit_bookmark" msgid="5024089053490231905">"ویرایش نشانک"</string>
+ <!-- outdated translation 9202323987633899835 --> <string name="create_shortcut_bookmark" msgid="1995095662095484289">"افزودن میانبر به صفحه اصلی"</string>
+ <string name="open_bookmark" msgid="8473581305759935790">"باز کردن"</string>
+ <string name="remove_bookmark" msgid="8407495852801410891">"حذف نشانک"</string>
+ <string name="remove_from_bookmarks" msgid="4374080666576982775">"حذف از نشانک ها"</string>
+ <string name="remove_history_item" msgid="5021424935726728618">"حذف از سابقه"</string>
+ <string name="set_as_homepage" msgid="4752937379414905560">"تنظیم بعنوان صفحه اصلی"</string>
+ <string name="bookmark_saved" msgid="2766434679871317557">"ذخیره شده در نشانک ها."</string>
+ <string name="bookmark_not_saved" msgid="700600955089376724">"ذخیره نشانک امکان پذیر نیست."</string>
+ <string name="homepage_set" msgid="8768087280310966395">"تنظیم صفحه اصلی."</string>
+ <string name="bookmark_needs_title" msgid="6245900436119218187">"نشانک باید دارای یک نام باشد."</string>
+ <string name="bookmark_needs_url" msgid="7809876865972755158">"نشانک باید دارای یک مکان باشد."</string>
+ <string name="bookmark_url_not_valid" msgid="6719785633980202419">"URL معتبر نیست."</string>
+ <string name="bookmark_cannot_save_url" msgid="791722768778386941">"این URL قابل نشانک گذاری نمی باشد."</string>
+ <string name="delete_bookmark" msgid="2422989994934201992">"حذف"</string>
+ <string name="bookmark_page" msgid="6845189305130307274">"نشانک گذاری آخرین صفحه مشاهده شده"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
+ <string name="current_page" msgid="7510129573681663135">"از "</string>
+ <string name="delete_bookmark_warning" msgid="758043186202032205">"نشانک \"<xliff:g id="BOOKMARK">%s</xliff:g>\" حذف می شود."</string>
+ <string name="open_in_new_window" msgid="6596775546468054510">"باز کردن در پنجره جدید"</string>
+ <string name="goto_dot" msgid="3895839050522602723">"برو"</string>
+ <!-- no translation found for incognito_tab (5419458065370134289) -->
+ <skip />
+ <string name="select_dot" msgid="6299170761900561967">"انتخاب متن"</string>
+ <string name="tab_picker_title" msgid="864478399057782913">"پنجره های فعلی"</string>
+ <string name="tab_picker_remove_tab" msgid="630087809802479397">"بستن"</string>
+ <string name="bookmarks" msgid="1961279134885867815">"نشانک ها"</string>
+ <string name="shortcut_bookmark" msgid="3974876480401135895">"نشانک"</string>
+ <string name="history" msgid="2451240511251410032">"سابقه"</string>
+ <string name="menu_view_download" msgid="2124570321712995120">"دانلودها"</string>
+ <string name="copy_page_url" msgid="7635062169011319208">"کپی url صفحه"</string>
+ <string name="share_page" msgid="593756995297268343">"اشتراک گذاری صفحه"</string>
+ <!-- no translation found for menu_save_webarchive (3934652434001459581) -->
+ <skip />
+ <!-- no translation found for webarchive_saved (7045250341467345007) -->
+ <skip />
+ <!-- no translation found for webarchive_failed (2880998204746620260) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
+ <string name="contextmenu_openlink" msgid="7237961252214188935">"باز کردن"</string>
+ <string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"باز کردن در پنجره جدید"</string>
+ <string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"نشانک گذاری پیوند"</string>
+ <string name="contextmenu_savelink" msgid="5508554930832538184">"ذخیره پیوند"</string>
+ <string name="contextmenu_sharelink" msgid="5392275392280130331">"اشتراک گذاری پیوند"</string>
+ <string name="contextmenu_copy" msgid="398860586635404030">"کپی"</string>
+ <string name="contextmenu_copylink" msgid="5153657160294534270">"کپی URL پیوند"</string>
+ <string name="contextmenu_download_image" msgid="4243829645180686912">"ذخیره تصویر"</string>
+ <string name="contextmenu_view_image" msgid="3870625602053600905">"مشاهده تصویر"</string>
+ <string name="contextmenu_set_wallpaper" msgid="3691902960115350686">"تنظیم بعنوان تصویر زمینه"</string>
+ <string name="contextmenu_dial_dot" msgid="5856550683415933806">"شماره گیری..."</string>
+ <string name="contextmenu_add_contact" msgid="3183511922223645716">"افزودن مخاطب"</string>
+ <string name="contextmenu_send_mail" msgid="1014513374828775660">"ارسال ایمیل"</string>
+ <string name="contextmenu_map" msgid="7471390435434034912">"Map"</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>
+ <string name="menu_preferences" msgid="6709237687234102240">"تنظیمات HTML"</string>
+ <string name="pref_content_title" msgid="722227111894838633">"تنظیمات محتوای صفحه"</string>
+ <string name="pref_content_load_images" msgid="2125616852957377561">"بارگیری تصاویر"</string>
+ <string name="pref_content_load_images_summary" msgid="5055874125248398584">"نمایش تصاویر در صفحات وب"</string>
+ <string name="pref_content_block_popups" msgid="7808433807197256726">"مسدود کردن پنجره های بازشو"</string>
+ <string name="pref_content_javascript" msgid="4570972030299516843">"فعال کردن جاوا اسکریپت"</string>
+ <string name="pref_content_open_in_background" msgid="824123779725118663">"باز کردن در پس زمینه"</string>
+ <string name="pref_content_plugins" msgid="7231944644794301582">"فعال کردن افزونه ها"</string>
+ <string-array name="pref_content_plugins_choices">
+ <item msgid="6745108155096660725">"همیشه روشن"</item>
+ <item msgid="2484126708670016519">"در صورت درخواست"</item>
+ <item msgid="8547442717307793863">"خاموش"</item>
+ </string-array>
+ <string name="pref_content_open_in_background_summary" msgid="1737664075721181678">"باز کردن پنجره های جدید پشت پنجره فعلی"</string>
+ <string name="pref_content_homepage" msgid="6082437160778559806">"تنظیم صفحه اصلی"</string>
+ <!-- no translation found for pref_content_search_engine (1620101310821644144) -->
+ <skip />
+ <!-- no translation found for pref_content_search_engine_summary (5162667665858487316) -->
+ <skip />
+ <!-- no translation found for pref_set_homepage_to (7196350233061395098) -->
+ <skip />
+ <!-- outdated translation 1493179933653044553 --> <string name="pref_use_current" msgid="1778622474040406672">"استفاده از صفحه فعلی"</string>
+ <!-- no translation found for pref_use_blank (8503238592551111169) -->
+ <skip />
+ <!-- no translation found for pref_use_default (192587563274735878) -->
+ <skip />
+ <string name="pref_content_autofit" msgid="8260474534053660809">"تنظیم خودکار صفحات"</string>
+ <string name="pref_content_autofit_summary" msgid="4587831659894879986">"قالب صفحات وب متناسب با صفحه"</string>
+ <!-- no translation found for pref_personal_title (1447687455755683695) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome (1695182180332194033) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome_summary (7414133931827321055) -->
+ <skip />
+ <!-- no translation found for pref_personal_google_account (952360133341490071) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks (59237515966184432) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks_summary (4791767605662205482) -->
+ <skip />
+ <!-- no translation found for pref_personal_start_syncing (6046972042512655232) -->
+ <skip />
+ <!-- no translation found for pref_personal_account_dialog_title (1390867119887955530) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled (1174197447388234595) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled_summary (422640696197018914) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor (1350709161524642663) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor_summary (6748434431641768870) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_name (8566130291459685955) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_email_address (7967585896612797173) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_company_name (2813443159949210417) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1 (836433242509243081) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1_hint (5965659598509327172) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2 (8194745202893822479) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2_hint (2048330295853546405) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_city (4193225955409148508) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_state (8549739922338171458) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_zip_code (283668573295656671) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_country (7234470301239156656) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_phone_number (4938852821413729276) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_save_profile (8349915287435262888) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_save (6834102203944938409) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_delete (2421442112954362732) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_delete_profile (7112035941146003753) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
+ <string name="pref_privacy_title" msgid="1052470980370846151">"تنظیمات رازداری"</string>
+ <string name="pref_privacy_clear_cache" msgid="3380316479925886998">"پاک کردن حافظه پنهان"</string>
+ <string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"پاک کردن پایگاه های داده و محتوای موجود در حافظه پنهان محلی"</string>
+ <string name="pref_privacy_clear_cache_dlg" msgid="5541011591300753881">"پایگاه داده ها و محتوای موجود در حافظه پنهان محلی حذف می شوند."</string>
+ <string name="pref_privacy_clear_cookies" msgid="3095583579133780331">"پاک کردن همه داده های کوکی"</string>
+ <string name="pref_privacy_clear_cookies_summary" msgid="6962742063990677520">"پاک کردن همه کوکی های مرورگر"</string>
+ <string name="pref_privacy_clear_cookies_dlg" msgid="552855688091432682">"همه کوکی ها حذف خواهند شد."</string>
+ <string name="pref_privacy_clear_history" msgid="8723795508825198477">"پاک کردن سابقه"</string>
+ <string name="pref_privacy_clear_history_summary" msgid="6868501330708940734">"پاک کردن سابقه پیمایش مرورگر"</string>
+ <string name="pref_privacy_clear_history_dlg" msgid="544903007914753853">"سابقه پیمایش مرورگر حذف می شود."</string>
+ <string name="pref_privacy_clear_form_data" msgid="4232668196344383987">"پاک کردن داده های فرم"</string>
+ <string name="pref_privacy_clear_form_data_summary" msgid="1790390894719517167">"پاک کردن همه داده های فرم ذخیره شده"</string>
+ <string name="pref_privacy_clear_form_data_dlg" msgid="4443621086781197928">"همه داده های فرم ذخیره شده حذف خواهد شد."</string>
+ <string name="pref_privacy_clear_passwords" msgid="4750234112289277480">"پاک کردن رمزهای ورود"</string>
+ <string name="pref_privacy_clear_passwords_summary" msgid="8856782718942903335">"پاک کردن همه رمزهای ورود ذخیره شده"</string>
+ <string name="pref_privacy_clear_passwords_dlg" msgid="2083869328824248255">"همه رمزهای ورود ذخیره شده حذف می شوند."</string>
+ <string name="pref_privacy_enable_geolocation" msgid="1395040170290765686">"فعال کردن موقعیت مکانی"</string>
+ <string name="pref_privacy_enable_geolocation_summary" msgid="8437020934664306205">"اجازه به سایت ها برای درخواست دسترسی به موقعیت مکانی شما"</string>
+ <string name="pref_privacy_clear_geolocation_access" msgid="6649680770030042980">"پاک کردن دسترسی به موقعیت مکانی"</string>
+ <string name="pref_privacy_clear_geolocation_access_summary" msgid="7750143359497314679">"پاک کردن دسترسی به موقعیت مکانی برای همه وب سایت ها"</string>
+ <string name="pref_privacy_clear_geolocation_access_dlg" msgid="7327063124488827244">"پاک کردن دسترسی به موقعیت مکانی برای همه وب سایت ها"</string>
+ <string name="pref_security_title" msgid="5763978646932160021">"تظیمات امنیتی"</string>
+ <string name="pref_security_remember_passwords" msgid="6492957683454529549">"به خاطر سپردن رمزهای ورود"</string>
+ <string name="pref_security_remember_passwords_summary" msgid="256388703356349137">"ذخیره نام های کاربری و رمزهای ورود برای وب سایت ها"</string>
+ <string name="pref_security_save_form_data" msgid="1213669802810198893">"به خاطر سپردن داده های فرم"</string>
+ <string name="pref_security_save_form_data_summary" msgid="4994074685153708026">"داده هایی که در فرم ها تایپ می کنم برای استفاده بعدی به خاطر سپرده شود"</string>
+ <string name="pref_security_show_security_warning" msgid="8901135676266754559">"نمایش اخطارهای امنیتی"</string>
+ <string name="pref_security_show_security_warning_summary" msgid="8968906112720511704">"نمایش اخطار، در صورت وجود مشکل در امنیت یک سایت"</string>
+ <string name="pref_security_accept_cookies" msgid="3201367661925047989">"پذیرش کوکی ها"</string>
+ <string name="pref_security_accept_cookies_summary" msgid="1465118934875026920">"اجازه به سایت ها برای ذخیره و خواندن داده های \"کوکی\""</string>
+ <string name="pref_text_size" msgid="3827031324346612208">"اندازه متن"</string>
+ <string-array name="pref_text_size_choices">
+ <item msgid="4952686548944739548">"خیلی کوچک"</item>
+ <item msgid="1950030433642671460">"کوچک"</item>
+ <item msgid="4338347520133294584">"معمولی"</item>
+ <item msgid="5043128215356351184">"بزرگ"</item>
+ <item msgid="7201512237890458902">"بسیار بزرگ"</item>
+ </string-array>
+ <string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"اندازه متن"</string>
+ <string name="pref_default_zoom" msgid="8076142259097187395">"بزرگنمایی پیش فرض"</string>
+ <string-array name="pref_default_zoom_choices">
+ <item msgid="549583171195154919">"دور"</item>
+ <item msgid="5619034257768161024">"متوسط"</item>
+ <item msgid="3840999588443167001">"بستن"</item>
+ </string-array>
+ <string name="pref_default_zoom_dialogtitle" msgid="6095974367125109021">"بزرگنمایی پیش فرض"</string>
+ <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="3091250467679722382">"تنظیمات پیشرفته"</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" msgid="8904000515846202110">"بازنشانی به پیش فرض"</string>
+ <string name="pref_extras_reset_default_summary" msgid="4247870778270414501">"بازیابی تنظیمات پیش فرض"</string>
+ <string name="pref_extras_reset_default_dlg" msgid="6640261575874704022">"تنظیمات به مقادیر پیش فرض باز می گردند."</string>
+ <string name="pref_extras_reset_default_dlg_title" msgid="2250334970728938936">"بازنشانی به پیش فرض"</string>
+ <string name="pref_development_title" msgid="3263854204533056480">"رفع خطا"</string>
+ <string name="pref_default_text_encoding" msgid="5742965543955558478">"رمزگذاری متن"</string>
+ <!-- no translation found for pref_default_text_encoding_choices:7 (2193955365569270096) -->
+ <string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"رمزگذاری متن"</string>
+ <string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"مشکل اتصال داده"</string>
+ <string name="browserFrameFileErrorLabel" msgid="8063691502792670367">"مشکل در فایل"</string>
+ <string name="browserFrameFormResubmitLabel" msgid="2685923472682180360">"تأیید"</string>
+ <string name="browserFrameFormResubmitMessage" msgid="2752182215695632138">"صفحه ای که می خواهید مشاهده کنید حاوی داده هایی است که قبلاً ارائه شده اند (\"POSTDATA\"). در صورت ارسال مجدد داده ها، هر عملکردی که فرم در صفحه انجام داده است (مانند یک جستجو یا خرید آنلاین) تکرار خواهد شد."</string>
+ <string name="loadSuspendedTitle" msgid="675991625288706944">"اتصال شبکه ای موجود نیست"</string>
+ <string name="loadSuspended" msgid="3133656588880851273">"به دلیل عدم وجود اتصال اینترنت، مرورگر نمی تواند این صفحه را بارگیری کند."</string>
+ <string name="clear_history" msgid="5998307092715979619">"پاک کردن سابقه"</string>
+ <string name="browser_history" msgid="1038987118290272525">"صفحات بازدید شده اخیر"</string>
+ <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_button_text" msgid="5235226933877634410">"برو"</string>
+ <string name="search_settings_description" msgid="1422401062529014107">"نشاک ها و سابقه وب"</string>
+ <string name="attention" msgid="3473639060042811244">"توجه"</string>
+ <string name="popup_window_attempt" msgid="2673111696288657989">"این سایت می خواهد یک پنجره بازشو را باز کند."</string>
+ <string name="allow" msgid="1157313689171991335">"اجازه"</string>
+ <string name="block" msgid="9172175889884707800">"مسدود کردن"</string>
+ <string name="too_many_windows_dialog_title" msgid="5175503564948906442">"بیش از حداکثر مجاز پنجره"</string>
+ <string name="too_many_windows_dialog_message" msgid="1398571800233959583">"چون در حال حاضر تعداد پنجره های باز به حداکثر رسیده است، پنجره جدیدی باز نشد."</string>
+ <string name="too_many_subwindows_dialog_title" msgid="3805453941587725944">"پنجره بازشو از قبل باز است"</string>
+ <string name="too_many_subwindows_dialog_message" msgid="5827289829907966657">"پنجره بازشو جدید باز نشد زیرا هر بار فقط یک پنجره بازشو را می توانید باز کنید."</string>
+ <string name="download_title" msgid="2122874021047565594">"سابقه دانلود"</string>
+ <string name="download_unknown_filename" msgid="4013465542563652175">"<ناشناس>"</string>
+ <string name="download_menu_open" msgid="4888327480367757513">"باز کردن"</string>
+ <string name="download_menu_clear" msgid="6264454531553418124">"پاک کردن از لیست"</string>
+ <string name="download_menu_delete" msgid="8815502136393894148">"حذف"</string>
+ <string name="download_menu_cancel" msgid="2545333007601851574">"لغو دانلود"</string>
+ <string name="download_menu_cancel_all" msgid="2136550823151999166">"لغو همه موارد دانلود"</string>
+ <string name="download_cancel_dlg_title" msgid="8909108500262799748">"لغو دانلودها"</string>
+ <string name="download_cancel_dlg_msg" msgid="6285389170052357797">"همه <xliff:g id="DOWNLOAD_COUNT">%d</xliff:g> دانلود لغو می شود و از سابقه دانلود حذف می شوند."</string>
+ <string name="download_delete_file" msgid="5330036497843073249">"فایل حذف می شود"</string>
+ <string name="download_file_error_dlg_title" msgid="2693630283595384874">"بدون فضای کافی"</string>
+ <string name="download_file_error_dlg_msg" msgid="5156405410324072471">"<xliff:g id="FILENAME">%s</xliff:g> دانلود نشد."\n"مقداری از فضای گوشی خود را خالی کرده و دوباره امتحان کنید."</string>
+ <string name="download_failed_generic_dlg_title" msgid="6106781095337833391">"دانلود ناموفق"</string>
+ <!-- outdated translation 605904452159416792 --> <string name="download_no_sdcard_dlg_title" product="nosdcard" msgid="56777245081568508">"کارت SD موجود نیست"</string>
+ <string name="download_no_sdcard_dlg_title" product="default" msgid="605904452159416792">"کارت SD موجود نیست"</string>
+ <!-- no translation found for download_no_sdcard_dlg_msg (3144652102051031721) -->
+ <skip />
+ <string name="download_no_sdcard_dlg_msg" product="default" msgid="2616399456116301518">"یک کارت SD برای دانلود <xliff:g id="FILENAME">%s</xliff:g> لازم است."</string>
+ <!-- outdated translation 6877712666046917741 --> <string name="download_sdcard_busy_dlg_title" product="nosdcard" msgid="8081445664689818973">"کارت SD موجود نیست"</string>
+ <string name="download_sdcard_busy_dlg_title" product="default" msgid="6877712666046917741">"کارت SD موجود نیست"</string>
+ <!-- outdated translation 3473883538192835204 --> <string name="download_sdcard_busy_dlg_msg" product="nosdcard" msgid="3979329954835690147">"کارت SD مشغول است. برای اجازه به دانلودها، \"خاموش کردن ذخیره USB\" را در اعلان انتخاب کنید."</string>
+ <string name="download_sdcard_busy_dlg_msg" product="default" msgid="3473883538192835204">"کارت SD مشغول است. برای اجازه به دانلودها، \"خاموش کردن ذخیره USB\" را در اعلان انتخاب کنید."</string>
+ <string name="download_no_application_title" msgid="1286056729168874295">"فایل باز نمی شود"</string>
+ <string name="retry" msgid="1835923075542266721">"امتحان مجدد"</string>
+ <string name="no_downloads" msgid="3947445710685021498">"سابقه دانلود خالی است."</string>
+ <string name="download_error" msgid="413496839831257187">"دانلود ناموفق بود."</string>
+ <string name="download_success" msgid="2279041638155595203">"دانلود <xliff:g id="FILE">%s</xliff:g> انجام شد."</string>
+ <string name="download_running" msgid="2622942231322015059">"در حال دانلود..."</string>
+ <string name="download_pending" msgid="2599683668575349559">"شروع دانلود..."</string>
+ <string name="download_pending_network" msgid="6548714525679461053">"انتظار برای اتصال داده..."</string>
+ <string name="download_running_paused" msgid="6418029352085656495">"انتظار برای اتصال داده..."</string>
+ <string name="download_canceled" msgid="6057083743144492515">"دانلود لغو شد."</string>
+ <string name="download_not_acceptable" msgid="313769696131563652">"دانلود انجام نمی شود. محتوا در این گوشی پشتیبانی نمی شود."</string>
+ <string name="download_file_error" msgid="1206648050615176113">"دانلود کامل نمی شود. فضای کافی موجود نیست."</string>
+ <string name="download_length_required" msgid="9038605488460437406">"دانلود انجام نمی شود. تعیین اندازه مورد امکان پذیر نیست."</string>
+ <string name="download_precondition_failed" msgid="8327584102874295580">"دانلود قطع شد. ادامه آن امکان پذیر نیست."</string>
+ <string name="search_the_web" msgid="6046130189241962337">"جستجوی وب"</string>
+ <string name="webstorage_outofspace_notification_title" msgid="1160474608059771788">"حافظه مرورگر پر است"</string>
+ <string name="webstorage_outofspace_notification_text" msgid="7341075135051829692">"برای آزاد کردن فضا کلیک کنید."</string>
+ <string name="webstorage_clear_data_title" msgid="689484577124333977">"پاک کردن داده های ذخیره شده"</string>
+ <string name="webstorage_clear_data_dialog_title" msgid="345457466368974706">"پاک کردن داده های ذخیره شده"</string>
+ <string name="webstorage_clear_data_dialog_message" msgid="6678281256970470125">"همه داده های ذخیره شده برای این وب سایت حذف می شوند."</string>
+ <string name="webstorage_clear_data_dialog_ok_button" msgid="2516563534211898636">"پاک کردن همه"</string>
+ <string name="webstorage_clear_data_dialog_cancel_button" msgid="2028867751958942762">"لغو"</string>
+ <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_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_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>
+ <string name="geolocation_settings_page_dialog_title" msgid="1549842043381347668">"پاک کردن دسترسی به موقعیت مکانی"</string>
+ <string name="geolocation_settings_page_dialog_message" msgid="7586671987576403993">"دسترسی به موقعیت مکانی برای این وب سایت پاک خواهد شد"</string>
+ <string name="geolocation_settings_page_dialog_ok_button" msgid="4789434178048077287">"پاک کردن دسترسی"</string>
+ <string name="geolocation_settings_page_dialog_cancel_button" msgid="7941036504673409747">"لغو"</string>
+ <string name="website_settings_clear_all" msgid="8739804325997655980">"پاک کردن همه"</string>
+ <string name="website_settings_clear_all_dialog_title" msgid="7791826325122461718">"پاک کردن همه تنظیمات وب سایت؟"</string>
+ <string name="website_settings_clear_all_dialog_message" msgid="6150502090601476333">"همه داده های وب سایت و مجوزهای موقعیت مکانی حذف می شوند."</string>
+ <string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"حذف همه داده ها"</string>
+ <string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"لغو"</string>
+ <string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"تنظیم تصویر زمینه..."</string>
+ <!-- no translation found for defaultBookmarksUpButton (2303951020715704735) -->
+ <skip />
+ <!-- no translation found for empty_bookmarks_folder (7843361614634930942) -->
+ <skip />
+ <!-- no translation found for rlz_access_point (7165847807377650632) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_title (3325557652271172128) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_description (2187665745413495303) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_remove (8105572409059113340) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_import (6933613853573899218) -->
+ <skip />
+</resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
new file mode 100644
index 0000000..ca3fc1d
--- /dev/null
+++ b/res/values-fi/strings.xml
@@ -0,0 +1,399 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2007 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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="application_name" msgid="1935869255545976415">"Selain"</string>
+ <string name="choose_upload" msgid="3649366287575002063">"Valitse lähetettävä tiedosto"</string>
+ <string name="new_tab" msgid="4505722538297295141">"Uusi ikkuna"</string>
+ <!-- no translation found for new_incognito_tab (5821404839654751753) -->
+ <skip />
+ <string name="active_tabs" msgid="3050623868203544623">"Windows"</string>
+ <string name="tab_bookmarks" msgid="2305793036003473653">"Kirjanmerkit"</string>
+ <string name="tab_most_visited" msgid="1077402532455000703">"Useimmin avatut"</string>
+ <string name="tab_history" msgid="1979267558744613746">"Historia"</string>
+ <string name="added_to_bookmarks" msgid="1020224130695956728">"Lisätty kirjanmerkkeihin"</string>
+ <string name="removed_from_bookmarks" msgid="6063705902028438800">"Poistettu kirjanmerkeistä"</string>
+ <string name="sign_in_to" msgid="5939425800148759165">"Kirjaudu sisään osoitteeseen <xliff:g id="HOSTNAME">%s1</xliff:g> \"<xliff:g id="REALM">%s2</xliff:g>\""</string>
+ <string name="username" msgid="5057566336518215922">"Nimi"</string>
+ <string name="password" msgid="1177138552305184404">"Salasana"</string>
+ <string name="action" msgid="183105774472071343">"Kirjaudu sisään"</string>
+ <string name="bookmarks_search" msgid="5229596268214362873">"Selain"</string>
+ <string name="cancel" msgid="3017274947407233702">"Peruuta"</string>
+ <string name="ok" msgid="1509280796718850364">"OK"</string>
+ <string name="title_bar_loading" msgid="7438217780834640678">"Ladataan…"</string>
+ <string name="page_info" msgid="4048529256302257195">"Sivun tiedot"</string>
+ <string name="page_info_view" msgid="5303490449842635158">"Näytä sivun tiedot"</string>
+ <string name="page_info_address" msgid="2222306609532903254">"Osoite:"</string>
+ <string name="ssl_warnings_header" msgid="79744901983636370">"Sivuston suojausvarmenteessa on ongelmia."</string>
+ <string name="ssl_continue" msgid="8031515015829358457">"Jatka"</string>
+ <string name="security_warning" msgid="6607795404322797541">"Suojausvaroitus"</string>
+ <string name="view_certificate" msgid="1472768887529093862">"Näytä varmenne"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
+ <string name="ssl_untrusted" msgid="5369967226521102194">"Varmenteen myöntäjä ei ole luotettava taho."</string>
+ <string name="ssl_mismatch" msgid="558688832420069896">"Sivuston nimi ei vastaa varmenteessa olevaa nimeä."</string>
+ <string name="ssl_expired" msgid="5739349389499575559">"Varmenne ei ole enää voimassa."</string>
+ <string name="ssl_not_yet_valid" msgid="2893167846212645846">"Varmenne ei ole vielä voimassa."</string>
+ <string name="ssl_certificate" msgid="5226747157992111668">"Suojausvarmenne"</string>
+ <string name="ssl_certificate_is_valid" msgid="7096160815933145579">"Varmenne on voimassa."</string>
+ <string name="issued_to" msgid="9032338008819841339">"Varmenteen saaja:"</string>
+ <string name="common_name" msgid="5745530093500062357">"Yleinen nimi:"</string>
+ <string name="org_name" msgid="8868889052889991293">"Organisaatio:"</string>
+ <string name="org_unit" msgid="4489056376307768196">"Organisaatioyksikkö:"</string>
+ <string name="issued_by" msgid="6959484326943152487">"Myöntäjä:"</string>
+ <string name="validity_period" msgid="57988851973181309">"Voimassa:"</string>
+ <string name="issued_on" msgid="2082890654801808368">"Myönnetty:"</string>
+ <string name="expires_on" msgid="8061200430557020704">"Vanhenee:"</string>
+ <string name="stopping" msgid="4839698519340302982">"Lopetetaan…"</string>
+ <string name="stop" msgid="5687251076030630074">"Lopeta"</string>
+ <string name="reload" msgid="8585220783228408062">"Päivitä"</string>
+ <string name="back" msgid="8414603107175713668">"Takaisin"</string>
+ <string name="forward" msgid="4288210890526641577">"Seuraava"</string>
+ <string name="save" msgid="5922311934992468496">"OK"</string>
+ <string name="do_not_save" msgid="6777633870113477714">"Peruuta"</string>
+ <!-- outdated translation 969988560160364559 --> <string name="location" msgid="3411848697912600125">"Sijainti"</string>
+ <!-- no translation found for containing_folder (6771180232953030479) -->
+ <skip />
+ <!-- no translation found for new_folder (7743540149088867917) -->
+ <skip />
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <!-- no translation found for no_subfolders (5880411440592452802) -->
+ <skip />
+ <!-- no translation found for add_to_bookmarks_menu_option (4449323955122214389) -->
+ <skip />
+ <!-- no translation found for add_to_homescreen_menu_option (1461447829242963790) -->
+ <skip />
+ <!-- no translation found for add_to_other_folder_menu_option (5450890093372998187) -->
+ <skip />
+ <!-- outdated translation 5990326151488445481 --> <string name="name" msgid="5462672162695365387">"Nimi"</string>
+ <string name="http" msgid="2163722670597250102">"http://"</string>
+ <!-- outdated translation 4680844117598293907 --> <string name="save_to_bookmarks" msgid="6101482434920313244">"Kirjanmerkki"</string>
+ <!-- no translation found for bookmark_this_page (7530739804320811054) -->
+ <skip />
+ <string name="edit_bookmark" msgid="5024089053490231905">"Muokkaa kirjanmerkkiä"</string>
+ <!-- outdated translation 9202323987633899835 --> <string name="create_shortcut_bookmark" msgid="1995095662095484289">"Lisää pikakuvake etusivulle"</string>
+ <string name="open_bookmark" msgid="8473581305759935790">"Avaa"</string>
+ <string name="remove_bookmark" msgid="8407495852801410891">"Poista kirjanmerkki"</string>
+ <string name="remove_from_bookmarks" msgid="4374080666576982775">"Poista kirjanmerkeistä"</string>
+ <string name="remove_history_item" msgid="5021424935726728618">"Poista historiasta"</string>
+ <string name="set_as_homepage" msgid="4752937379414905560">"Aseta aloitussivuksi"</string>
+ <string name="bookmark_saved" msgid="2766434679871317557">"Tallennettu kirjanmerkkeihin."</string>
+ <string name="bookmark_not_saved" msgid="700600955089376724">"Kirjanmerkin tallentaminen epäonnistui."</string>
+ <string name="homepage_set" msgid="8768087280310966395">"Aloitussivu asetettu."</string>
+ <string name="bookmark_needs_title" msgid="6245900436119218187">"Kirjanmerkillä on oltava nimi."</string>
+ <string name="bookmark_needs_url" msgid="7809876865972755158">"Kirjanmerkillä on oltava sijainti."</string>
+ <string name="bookmark_url_not_valid" msgid="6719785633980202419">"Virheellinen URL-osoite."</string>
+ <string name="bookmark_cannot_save_url" msgid="791722768778386941">"Tätä URL-osoitetta ei voi lisätä kirjanmerkkeihin."</string>
+ <string name="delete_bookmark" msgid="2422989994934201992">"Poista"</string>
+ <string name="bookmark_page" msgid="6845189305130307274">"Lisää viimeksi avattu sivu kirjanmerkkeihin"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
+ <string name="current_page" msgid="7510129573681663135">"kohteesta "</string>
+ <string name="delete_bookmark_warning" msgid="758043186202032205">"Kirjanmerkki \"<xliff:g id="BOOKMARK">%s</xliff:g>\" poistetaan."</string>
+ <string name="open_in_new_window" msgid="6596775546468054510">"Avaa uudessa ikkunassa"</string>
+ <string name="goto_dot" msgid="3895839050522602723">"Siirry"</string>
+ <!-- no translation found for incognito_tab (5419458065370134289) -->
+ <skip />
+ <string name="select_dot" msgid="6299170761900561967">"Tekstin valinta"</string>
+ <string name="tab_picker_title" msgid="864478399057782913">"Nykyiset ikkunat"</string>
+ <string name="tab_picker_remove_tab" msgid="630087809802479397">"Sulje"</string>
+ <string name="bookmarks" msgid="1961279134885867815">"Kirjanmerkit"</string>
+ <string name="shortcut_bookmark" msgid="3974876480401135895">"Kirjanmerkki"</string>
+ <string name="history" msgid="2451240511251410032">"Historia"</string>
+ <string name="menu_view_download" msgid="2124570321712995120">"Lataukset"</string>
+ <string name="copy_page_url" msgid="7635062169011319208">"Kopioi sivun URL-osoite"</string>
+ <string name="share_page" msgid="593756995297268343">"Jaa sivu"</string>
+ <!-- no translation found for menu_save_webarchive (3934652434001459581) -->
+ <skip />
+ <!-- no translation found for webarchive_saved (7045250341467345007) -->
+ <skip />
+ <!-- no translation found for webarchive_failed (2880998204746620260) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
+ <string name="contextmenu_openlink" msgid="7237961252214188935">"Avaa"</string>
+ <string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"Avaa uudessa ikkunassa"</string>
+ <string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"Lisää linkki kirjanmerkkeihin"</string>
+ <string name="contextmenu_savelink" msgid="5508554930832538184">"Tallenna linkki"</string>
+ <string name="contextmenu_sharelink" msgid="5392275392280130331">"Jaa linkki"</string>
+ <string name="contextmenu_copy" msgid="398860586635404030">"Kopioi"</string>
+ <string name="contextmenu_copylink" msgid="5153657160294534270">"Kopioi linkin URL-osoite"</string>
+ <string name="contextmenu_download_image" msgid="4243829645180686912">"Tallenna kuva"</string>
+ <string name="contextmenu_view_image" msgid="3870625602053600905">"Näytä kuva"</string>
+ <string name="contextmenu_set_wallpaper" msgid="3691902960115350686">"Aseta taustakuvaksi"</string>
+ <string name="contextmenu_dial_dot" msgid="5856550683415933806">"Soita"</string>
+ <string name="contextmenu_add_contact" msgid="3183511922223645716">"Lisää yhteystieto"</string>
+ <string name="contextmenu_send_mail" msgid="1014513374828775660">"Lähetä sähköpostia"</string>
+ <string name="contextmenu_map" msgid="7471390435434034912">"Kartta"</string>
+ <string name="choosertitle_sharevia" msgid="4600490613341909086">"Jaa sovelluksessa"</string>
+ <string name="clear" msgid="7070043081700011461">"Poista"</string>
+ <string name="replace" msgid="4843033491070384047">"Korvaa"</string>
+ <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Kirjanmerkit"</string>
+ <string name="menu_preferences" msgid="6709237687234102240">"Asetukset"</string>
+ <string name="pref_content_title" msgid="722227111894838633">"Sivun sisältöasetukset"</string>
+ <string name="pref_content_load_images" msgid="2125616852957377561">"Lataa kuvat"</string>
+ <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Näytä verkkosivujen kuvat"</string>
+ <string name="pref_content_block_popups" msgid="7808433807197256726">"Ponnahdusikkunoiden esto"</string>
+ <string name="pref_content_javascript" msgid="4570972030299516843">"Ota JavaScript käyttöön"</string>
+ <string name="pref_content_open_in_background" msgid="824123779725118663">"Avaa taustalla"</string>
+ <string name="pref_content_plugins" msgid="7231944644794301582">"Ota laajennukset käyttöön"</string>
+ <string-array name="pref_content_plugins_choices">
+ <item msgid="6745108155096660725">"Aina käytössä"</item>
+ <item msgid="2484126708670016519">"Tarvittaessa"</item>
+ <item msgid="8547442717307793863">"Pois käytöstä"</item>
+ </string-array>
+ <string name="pref_content_open_in_background_summary" msgid="1737664075721181678">"Avaa uudet ikkunat nykyisen taakse"</string>
+ <string name="pref_content_homepage" msgid="6082437160778559806">"Aseta aloitussivu"</string>
+ <string name="pref_content_search_engine" msgid="1620101310821644144">"Aseta hakukone"</string>
+ <string name="pref_content_search_engine_summary" msgid="5162667665858487316">"Valitse hakukone"</string>
+ <!-- no translation found for pref_set_homepage_to (7196350233061395098) -->
+ <skip />
+ <!-- outdated translation 1493179933653044553 --> <string name="pref_use_current" msgid="1778622474040406672">"Käytä nykyistä sivua"</string>
+ <!-- no translation found for pref_use_blank (8503238592551111169) -->
+ <skip />
+ <!-- no translation found for pref_use_default (192587563274735878) -->
+ <skip />
+ <string name="pref_content_autofit" msgid="8260474534053660809">"Automaattinen sovitus"</string>
+ <string name="pref_content_autofit_summary" msgid="4587831659894879986">"Sovita verkkosivut näytölle"</string>
+ <!-- no translation found for pref_personal_title (1447687455755683695) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome (1695182180332194033) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome_summary (7414133931827321055) -->
+ <skip />
+ <!-- no translation found for pref_personal_google_account (952360133341490071) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks (59237515966184432) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks_summary (4791767605662205482) -->
+ <skip />
+ <!-- no translation found for pref_personal_start_syncing (6046972042512655232) -->
+ <skip />
+ <!-- no translation found for pref_personal_account_dialog_title (1390867119887955530) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled (1174197447388234595) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled_summary (422640696197018914) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor (1350709161524642663) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor_summary (6748434431641768870) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_name (8566130291459685955) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_email_address (7967585896612797173) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_company_name (2813443159949210417) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1 (836433242509243081) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1_hint (5965659598509327172) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2 (8194745202893822479) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2_hint (2048330295853546405) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_city (4193225955409148508) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_state (8549739922338171458) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_zip_code (283668573295656671) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_country (7234470301239156656) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_phone_number (4938852821413729276) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_save_profile (8349915287435262888) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_save (6834102203944938409) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_delete (2421442112954362732) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_delete_profile (7112035941146003753) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
+ <string name="pref_privacy_title" msgid="1052470980370846151">"Tietosuoja-asetukset"</string>
+ <string name="pref_privacy_clear_cache" msgid="3380316479925886998">"Tyhjennä välimuisti"</string>
+ <string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"Poista paikallisen välimuistin sisältö ja tietokannat"</string>
+ <string name="pref_privacy_clear_cache_dlg" msgid="5541011591300753881">"Paikallisen välimuistin sisältö ja tietokannat poistetaan."</string>
+ <string name="pref_privacy_clear_cookies" msgid="3095583579133780331">"Poista kaikki evästetiedot"</string>
+ <string name="pref_privacy_clear_cookies_summary" msgid="6962742063990677520">"Poista selaimen kaikki evästeet"</string>
+ <string name="pref_privacy_clear_cookies_dlg" msgid="552855688091432682">"Kaikki evästeet poistetaan."</string>
+ <string name="pref_privacy_clear_history" msgid="8723795508825198477">"Tyhjennä historia"</string>
+ <string name="pref_privacy_clear_history_summary" msgid="6868501330708940734">"Tyhjennä selaimen selaushistoria"</string>
+ <string name="pref_privacy_clear_history_dlg" msgid="544903007914753853">"Selaimen selaushistoria poistetaan."</string>
+ <string name="pref_privacy_clear_form_data" msgid="4232668196344383987">"Poista lomaketiedot"</string>
+ <string name="pref_privacy_clear_form_data_summary" msgid="1790390894719517167">"Poista kaikki tallennetut lomaketiedot"</string>
+ <string name="pref_privacy_clear_form_data_dlg" msgid="4443621086781197928">"Kaikki tallennetut lomaketiedot poistetaan."</string>
+ <string name="pref_privacy_clear_passwords" msgid="4750234112289277480">"Poista salasanat"</string>
+ <string name="pref_privacy_clear_passwords_summary" msgid="8856782718942903335">"Poista kaikki tallennetut salasanat"</string>
+ <string name="pref_privacy_clear_passwords_dlg" msgid="2083869328824248255">"Kaikki tallennetut salasanat poistetaan."</string>
+ <string name="pref_privacy_enable_geolocation" msgid="1395040170290765686">"Ota sijaintitiedot käyttöön"</string>
+ <string name="pref_privacy_enable_geolocation_summary" msgid="8437020934664306205">"Salli sivustojen pyytää sijaintitietojesi käyttöoikeutta"</string>
+ <string name="pref_privacy_clear_geolocation_access" msgid="6649680770030042980">"Poista sijaintitietojen käyttöoikeus"</string>
+ <string name="pref_privacy_clear_geolocation_access_summary" msgid="7750143359497314679">"Poista sijaintitietojen käyttöoikeus kaikilta sivustoilta"</string>
+ <string name="pref_privacy_clear_geolocation_access_dlg" msgid="7327063124488827244">"Poista sijaintitietojen käyttöoikeus kaikilta sivustoilta"</string>
+ <string name="pref_security_title" msgid="5763978646932160021">"Suojausasetukset"</string>
+ <string name="pref_security_remember_passwords" msgid="6492957683454529549">"Tallenna salasanat"</string>
+ <string name="pref_security_remember_passwords_summary" msgid="256388703356349137">"Tallenna sivustojen käyttäjänimet ja salasanat"</string>
+ <string name="pref_security_save_form_data" msgid="1213669802810198893">"Tallenna lomaketiedot"</string>
+ <string name="pref_security_save_form_data_summary" msgid="4994074685153708026">"Tallenna lomakkeisiin syötetyt tiedot"</string>
+ <string name="pref_security_show_security_warning" msgid="8901135676266754559">"Näytä suojausvaroitukset"</string>
+ <string name="pref_security_show_security_warning_summary" msgid="8968906112720511704">"Näytä varoitus, jos sivun suojauksessa on ongelma"</string>
+ <string name="pref_security_accept_cookies" msgid="3201367661925047989">"Salli evästeet"</string>
+ <string name="pref_security_accept_cookies_summary" msgid="1465118934875026920">"Salli sivustojen tallentaa ja lukea evästetietoja"</string>
+ <string name="pref_text_size" msgid="3827031324346612208">"Tekstin koko"</string>
+ <string-array name="pref_text_size_choices">
+ <item msgid="4952686548944739548">"Hyvin pieni"</item>
+ <item msgid="1950030433642671460">"Pieni"</item>
+ <item msgid="4338347520133294584">"Normaali"</item>
+ <item msgid="5043128215356351184">"Suuri"</item>
+ <item msgid="7201512237890458902">"Hyvin suuri"</item>
+ </string-array>
+ <string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Tekstin koko"</string>
+ <string name="pref_default_zoom" msgid="8076142259097187395">"Oletuszoomaus"</string>
+ <string-array name="pref_default_zoom_choices">
+ <item msgid="549583171195154919">"Kauas"</item>
+ <item msgid="5619034257768161024">"Keskikokoinen"</item>
+ <item msgid="3840999588443167001">"Sulje"</item>
+ </string-array>
+ <string name="pref_default_zoom_dialogtitle" msgid="6095974367125109021">"Oletuszoomaus"</string>
+ <string name="pref_content_load_page" msgid="2219810141690955452">"Avaa sivut yleiskatsauksessa"</string>
+ <string name="pref_content_load_page_summary" msgid="8792093504054149369">"Näytä äskettäin avattujen sivujen yleiskatsaus"</string>
+ <string name="pref_extras_title" msgid="3091250467679722382">"Lisäasetukset"</string>
+ <string name="pref_extras_website_settings" msgid="67866640052455549">"Sivustoasetukset"</string>
+ <string name="pref_extras_website_settings_summary" msgid="1656771443223494406">"Yksittäisten sivustojen lisäasetukset"</string>
+ <string name="pref_extras_reset_default" msgid="8904000515846202110">"Palauta oletukseksi"</string>
+ <string name="pref_extras_reset_default_summary" msgid="4247870778270414501">"Palauta oletusasetukset"</string>
+ <string name="pref_extras_reset_default_dlg" msgid="6640261575874704022">"Asetukset palautetaan oletusarvoihinsa."</string>
+ <string name="pref_extras_reset_default_dlg_title" msgid="2250334970728938936">"Palauta oletukseksi"</string>
+ <string name="pref_development_title" msgid="3263854204533056480">"Virheenjäljitys"</string>
+ <string name="pref_default_text_encoding" msgid="5742965543955558478">"Tekstin koodaus"</string>
+ <!-- no translation found for pref_default_text_encoding_choices:7 (2193955365569270096) -->
+ <string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Tekstin koodaus"</string>
+ <string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"Datayhteysongelma"</string>
+ <string name="browserFrameFileErrorLabel" msgid="8063691502792670367">"Tiedosto-ongelma"</string>
+ <string name="browserFrameFormResubmitLabel" msgid="2685923472682180360">"Vahvista"</string>
+ <string name="browserFrameFormResubmitMessage" msgid="2752182215695632138">"Sivu, jota yrität avata, sisältää jo lähetettyjä tietoja (POSTDATA). Jos lähetät tiedot uudelleen, sivulla olevan lomakkeen suorittama toimenpide (kuten haku tai verkko-ostos) toistetaan."</string>
+ <string name="loadSuspendedTitle" msgid="675991625288706944">"Ei verkkoyhteyttä"</string>
+ <string name="loadSuspended" msgid="3133656588880851273">"Selain ei voi ladata tätä sivua, sillä internetyhteyttä ei ole."</string>
+ <string name="clear_history" msgid="5998307092715979619">"Tyhjennä historia"</string>
+ <string name="browser_history" msgid="1038987118290272525">"Äskettäin avatut sivut"</string>
+ <string name="empty_history" msgid="8738772352308207274">"Selainhistoria on tyhjä."</string>
+ <string name="add_new_bookmark" msgid="8086367791400349049">"Lisää kirjanmerkki…"</string>
+ <string name="add_bookmark_short" msgid="3783984330998103735">"Lisää"</string>
+ <string name="search_hint" msgid="4647356319916631820">"Kirjoita hakusanoja tai URL-osoite"</string>
+ <string name="search_button_text" msgid="5235226933877634410">"Siirry"</string>
+ <string name="search_settings_description" msgid="1422401062529014107">"Kirjanmerkit ja verkkohistoria"</string>
+ <string name="attention" msgid="3473639060042811244">"Huomio"</string>
+ <string name="popup_window_attempt" msgid="2673111696288657989">"Sivusto yrittää avata ponnahdusikkunan."</string>
+ <string name="allow" msgid="1157313689171991335">"Salli"</string>
+ <string name="block" msgid="9172175889884707800">"Estä"</string>
+ <string name="too_many_windows_dialog_title" msgid="5175503564948906442">"Ikkunoita avattu enimmäismäärä"</string>
+ <string name="too_many_windows_dialog_message" msgid="1398571800233959583">"Uutta ikkunaa ei voi avata, koska suurin sallittu määrä ikkunoita on jo avattuna."</string>
+ <string name="too_many_subwindows_dialog_title" msgid="3805453941587725944">"Ponnahdusikkuna on jo auki"</string>
+ <string name="too_many_subwindows_dialog_message" msgid="5827289829907966657">"Uuden ponnahdusikkunan avaaminen ei onnistu, koska kerralla voi olla auki vain yksi ponnahdusikkuna."</string>
+ <string name="download_title" msgid="2122874021047565594">"Lataushistoria"</string>
+ <string name="download_unknown_filename" msgid="4013465542563652175">"<Tuntematon>"</string>
+ <string name="download_menu_open" msgid="4888327480367757513">"Avaa"</string>
+ <string name="download_menu_clear" msgid="6264454531553418124">"Poista luettelosta"</string>
+ <string name="download_menu_delete" msgid="8815502136393894148">"Poista"</string>
+ <string name="download_menu_cancel" msgid="2545333007601851574">"Peruuta lataus"</string>
+ <string name="download_menu_cancel_all" msgid="2136550823151999166">"Peruuta kaikki lataukset"</string>
+ <string name="download_cancel_dlg_title" msgid="8909108500262799748">"Peruuta lataukset"</string>
+ <string name="download_cancel_dlg_msg" msgid="6285389170052357797">"Kaikki <xliff:g id="DOWNLOAD_COUNT">%d</xliff:g> latausta peruutetaan ja poistetaan lataushistoriasta."</string>
+ <string name="download_delete_file" msgid="5330036497843073249">"Tiedosto poistetaan"</string>
+ <string name="download_file_error_dlg_title" msgid="2693630283595384874">"Tila loppu"</string>
+ <string name="download_file_error_dlg_msg" msgid="5156405410324072471">"Tiedostoa <xliff:g id="FILENAME">%s</xliff:g> ei voi ladata."\n"Vapauta puhelimessasi tilaa ja yritä uudelleen."</string>
+ <string name="download_failed_generic_dlg_title" msgid="6106781095337833391">"Lataus epäonnistui"</string>
+ <!-- outdated translation 605904452159416792 --> <string name="download_no_sdcard_dlg_title" product="nosdcard" msgid="56777245081568508">"Ei SD-korttia"</string>
+ <string name="download_no_sdcard_dlg_title" product="default" msgid="605904452159416792">"Ei SD-korttia"</string>
+ <!-- no translation found for download_no_sdcard_dlg_msg (3144652102051031721) -->
+ <skip />
+ <string name="download_no_sdcard_dlg_msg" product="default" msgid="2616399456116301518">"Tiedoston <xliff:g id="FILENAME">%s</xliff:g> lataamiseen tarvitaan SD-kortti."</string>
+ <!-- outdated translation 6877712666046917741 --> <string name="download_sdcard_busy_dlg_title" product="nosdcard" msgid="8081445664689818973">"SD-kortti ei käytettävissä"</string>
+ <string name="download_sdcard_busy_dlg_title" product="default" msgid="6877712666046917741">"SD-kortti ei käytettävissä"</string>
+ <!-- outdated translation 3473883538192835204 --> <string name="download_sdcard_busy_dlg_msg" product="nosdcard" msgid="3979329954835690147">"SD-kortti on varattu. Voit sallia lataukset valitsemalla ilmoituksessa \"Poista USB-tallennustila käytöstä\"."</string>
+ <string name="download_sdcard_busy_dlg_msg" product="default" msgid="3473883538192835204">"SD-kortti on varattu. Voit sallia lataukset valitsemalla ilmoituksessa \"Poista USB-tallennustila käytöstä\"."</string>
+ <string name="download_no_application_title" msgid="1286056729168874295">"Tiedostoa ei voi avata"</string>
+ <string name="retry" msgid="1835923075542266721">"Yritä uudelleen"</string>
+ <string name="no_downloads" msgid="3947445710685021498">"Lataushistoria on tyhjä."</string>
+ <string name="download_error" msgid="413496839831257187">"Lataus epäonnistui."</string>
+ <string name="download_success" msgid="2279041638155595203">"<xliff:g id="FILE">%s</xliff:g> Lataus valmis."</string>
+ <string name="download_running" msgid="2622942231322015059">"Ladataan…"</string>
+ <string name="download_pending" msgid="2599683668575349559">"Aloitetaan latausta…"</string>
+ <string name="download_pending_network" msgid="6548714525679461053">"Odotetaan datayhteyttä…"</string>
+ <string name="download_running_paused" msgid="6418029352085656495">"Odotetaan datayhteyttä…"</string>
+ <string name="download_canceled" msgid="6057083743144492515">"Lataus peruutettu."</string>
+ <string name="download_not_acceptable" msgid="313769696131563652">"Ei voi ladata. Puhelin ei tue kyseistä sisältöä."</string>
+ <string name="download_file_error" msgid="1206648050615176113">"Ei voi ladata kokonaan. Tila ei riitä."</string>
+ <string name="download_length_required" msgid="9038605488460437406">"Ei voi ladata. Kohteen kokoa ei voi määrittää."</string>
+ <string name="download_precondition_failed" msgid="8327584102874295580">"Lataus keskeytetty. Latausta ei voi jatkaa."</string>
+ <string name="search_the_web" msgid="6046130189241962337">"Verkkohaku"</string>
+ <string name="webstorage_outofspace_notification_title" msgid="1160474608059771788">"Selaimen tallennustila täynnä"</string>
+ <string name="webstorage_outofspace_notification_text" msgid="7341075135051829692">"Vapauta tilaa napsauttamalla."</string>
+ <string name="webstorage_clear_data_title" msgid="689484577124333977">"Poista tallennetut tiedot"</string>
+ <string name="webstorage_clear_data_dialog_title" msgid="345457466368974706">"Poista tallennetut tiedot"</string>
+ <string name="webstorage_clear_data_dialog_message" msgid="6678281256970470125">"Kaikki tämän sivuston tallentamat tiedot poistetaan"</string>
+ <string name="webstorage_clear_data_dialog_ok_button" msgid="2516563534211898636">"Poista kaikki"</string>
+ <string name="webstorage_clear_data_dialog_cancel_button" msgid="2028867751958942762">"Peruuta"</string>
+ <string name="webstorage_origin_summary_mb_stored" msgid="1985885826292236210">"Mt tallennettu puhelimeen"</string>
+ <string name="loading_video" msgid="4887871585216091096">"Ladataan videota"</string>
+ <string name="geolocation_permissions_prompt_message" msgid="356796102004052471">"<xliff:g id="WEBSITE_ORIGIN">%s</xliff:g> haluaa käyttää sijaintitietojasi"</string>
+ <string name="geolocation_permissions_prompt_share" msgid="9084486342048347976">"Jaa sijaintitiedot"</string>
+ <string name="geolocation_permissions_prompt_dont_share" msgid="6303025160237860300">"Hylkää"</string>
+ <string name="geolocation_permissions_prompt_remember" msgid="3118526300707348308">"Muista valinta"</string>
+ <string name="geolocation_permissions_prompt_toast_allowed" msgid="987286072035125498">"Tämä sivusto voi käyttää sijaintitietojasi. Valitse Asetukset -> Sivustoasetukset ja tee muutokset"</string>
+ <string name="geolocation_permissions_prompt_toast_disallowed" msgid="7695100950212692515">"Tämä sivusto ei voi käyttää sijaintitietojasi. Valitse Asetukset -> Sivustoasetukset ja tee muutokset"</string>
+ <string name="geolocation_settings_page_title" msgid="1745477985097536528">"Poista sijaintitietojen käyttöoikeus"</string>
+ <string name="geolocation_settings_page_summary_allowed" msgid="9180251524290811398">"Tämä sivusto voi käyttää sijaintitietojasi tällä hetkellä"</string>
+ <string name="geolocation_settings_page_summary_not_allowed" msgid="4589649082203102544">"Tämä sivusto ei voi käyttää sijaintitietojasi tällä hetkellä"</string>
+ <string name="geolocation_settings_page_dialog_title" msgid="1549842043381347668">"Poista sijaintitietojen käyttöoikeus"</string>
+ <string name="geolocation_settings_page_dialog_message" msgid="7586671987576403993">"Tämän sivuston oikeus käyttää sijaintitietojasi poistetaan"</string>
+ <string name="geolocation_settings_page_dialog_ok_button" msgid="4789434178048077287">"Poista käyttöoikeus"</string>
+ <string name="geolocation_settings_page_dialog_cancel_button" msgid="7941036504673409747">"Peruuta"</string>
+ <string name="website_settings_clear_all" msgid="8739804325997655980">"Poista kaikki"</string>
+ <string name="website_settings_clear_all_dialog_title" msgid="7791826325122461718">"Poistetaanko kaikki sivustoasetukset?"</string>
+ <string name="website_settings_clear_all_dialog_message" msgid="6150502090601476333">"Kaikki sivustotiedot ja sijaintitietojen käyttöoikeudet poistetaan."</string>
+ <string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"Poista kaikki tiedot"</string>
+ <string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"Peruuta"</string>
+ <string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"Asetetaan taustakuvaa…"</string>
+ <!-- no translation found for defaultBookmarksUpButton (2303951020715704735) -->
+ <skip />
+ <!-- no translation found for empty_bookmarks_folder (7843361614634930942) -->
+ <skip />
+ <!-- no translation found for rlz_access_point (7165847807377650632) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_title (3325557652271172128) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_description (2187665745413495303) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_remove (8105572409059113340) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_import (6933613853573899218) -->
+ <skip />
+</resources>
diff --git a/res/values-fr-xlarge/strings.xml b/res/values-fr-xlarge/strings.xml
new file mode 100644
index 0000000..8af3e52
--- /dev/null
+++ b/res/values-fr-xlarge/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="new_tab" msgid="7275656655054293038">"Nouvel onglet"</string>
+ <string name="new_incognito_tab" msgid="5149742197322201152">"Nouvel onglet Navigation privée"</string>
+ <string name="active_tabs" msgid="5324492165541331128">"Onglets"</string>
+</resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 6c3f3de..9290179 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -19,6 +19,7 @@
<string name="application_name" msgid="1935869255545976415">"Navigateur"</string>
<string name="choose_upload" msgid="3649366287575002063">"Choisir le fichier à importer"</string>
<string name="new_tab" msgid="4505722538297295141">"Nouvelle fenêtre"</string>
+ <string name="new_incognito_tab" msgid="5821404839654751753">"Fenêtre de navigation privée"</string>
<string name="active_tabs" msgid="3050623868203544623">"Fenêtres"</string>
<string name="tab_bookmarks" msgid="2305793036003473653">"Favoris"</string>
<string name="tab_most_visited" msgid="1077402532455000703">"Les + visités"</string>
@@ -32,12 +33,6 @@
<string name="bookmarks_search" msgid="5229596268214362873">"Navigateur"</string>
<string name="cancel" msgid="3017274947407233702">"Annuler"</string>
<string name="ok" msgid="1509280796718850364">"OK"</string>
- <plurals name="matches_found">
- <item quantity="zero" msgid="6242659159545399963">"Aucune correspondance"</item>
- <item quantity="one" msgid="4352019729062956802">"1 correspondance"</item>
- <item quantity="few" msgid="5544267486978946555">"<xliff:g id="NUMBER">%d</xliff:g> correspondances"</item>
- <item quantity="other" msgid="6616125067364315405">"<xliff:g id="NUMBER">%d</xliff:g> correspondances"</item>
- </plurals>
<string name="title_bar_loading" msgid="7438217780834640678">"Chargement…"</string>
<string name="page_info" msgid="4048529256302257195">"Infos sur la page"</string>
<string name="page_info_view" msgid="5303490449842635158">"Afficher les infos sur la page"</string>
@@ -46,6 +41,8 @@
<string name="ssl_continue" msgid="8031515015829358457">"Continuer"</string>
<string name="security_warning" msgid="6607795404322797541">"Avertissement de sécurité"</string>
<string name="view_certificate" msgid="1472768887529093862">"Afficher le certificat"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
<string name="ssl_untrusted" msgid="5369967226521102194">"Ce certificat provient d\'une autorité non approuvée."</string>
<string name="ssl_mismatch" msgid="558688832420069896">"Le nom du site ne correspond pas au nom indiqué dans le certificat."</string>
<string name="ssl_expired" msgid="5739349389499575559">"Le certificat a expiré."</string>
@@ -67,12 +64,23 @@
<string name="forward" msgid="4288210890526641577">"Suivant"</string>
<string name="save" msgid="5922311934992468496">"OK"</string>
<string name="do_not_save" msgid="6777633870113477714">"Annuler"</string>
- <string name="location" msgid="969988560160364559">"Emplacement"</string>
- <string name="name" msgid="5990326151488445481">"Nom"</string>
+ <string name="location" msgid="3411848697912600125">"Adresse"</string>
+ <string name="containing_folder" msgid="6771180232953030479">"Ajouter à"</string>
+ <string name="new_folder" msgid="7743540149088867917">"Nouveau dossier"</string>
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <string name="no_subfolders" msgid="5880411440592452802">"Aucun sous-dossier"</string>
+ <string name="add_to_bookmarks_menu_option" msgid="4449323955122214389">"Favoris"</string>
+ <string name="add_to_homescreen_menu_option" msgid="1461447829242963790">"Écran d\'accueil"</string>
+ <string name="add_to_other_folder_menu_option" msgid="5450890093372998187">"Autre dossier…"</string>
+ <string name="name" msgid="5462672162695365387">"Libellé"</string>
<string name="http" msgid="2163722670597250102">"http://"</string>
- <string name="save_to_bookmarks" msgid="588165100024086565">"Ajouter un favori"</string>
+ <string name="save_to_bookmarks" msgid="6101482434920313244">"Ajouter aux favoris"</string>
+ <string name="bookmark_this_page" msgid="7530739804320811054">"Ajouter cette page aux favoris"</string>
<string name="edit_bookmark" msgid="5024089053490231905">"Modifier le favori"</string>
- <string name="create_shortcut_bookmark" msgid="9202323987633899835">"Raccourci (page d\'accueil)"</string>
+ <string name="create_shortcut_bookmark" msgid="1995095662095484289">"Créer un raccourci sur la page d\'accueil"</string>
<string name="open_bookmark" msgid="8473581305759935790">"Ouverture"</string>
<string name="remove_bookmark" msgid="8407495852801410891">"Supprimer le favori"</string>
<string name="remove_from_bookmarks" msgid="4374080666576982775">"Supprimer des favoris"</string>
@@ -87,13 +95,15 @@
<string name="bookmark_cannot_save_url" msgid="791722768778386941">"Impossible d\'ajouter cette URL à vos favoris."</string>
<string name="delete_bookmark" msgid="2422989994934201992">"Supprimer"</string>
<string name="bookmark_page" msgid="6845189305130307274">"Ajouter la dernière page consultée"</string>
- <string name="switch_to_thumbnails" msgid="5493351529609043151">"Miniatures"</string>
- <string name="switch_to_list" msgid="8900531247982121055">"Liste"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
<string name="current_page" msgid="7510129573681663135">"de "</string>
<string name="delete_bookmark_warning" msgid="758043186202032205">"Le favori \"<xliff:g id="BOOKMARK">%s</xliff:g>\" sera supprimé."</string>
<string name="open_in_new_window" msgid="6596775546468054510">"Nouvelle fenêtre"</string>
<string name="goto_dot" msgid="3895839050522602723">"OK"</string>
- <string name="find_dot" msgid="6259312434696611957">"Rechercher sur la page"</string>
+ <string name="incognito_tab" msgid="5419458065370134289">"Ouvrir un onglet de navigation privée"</string>
<string name="select_dot" msgid="6299170761900561967">"Sélectionner le texte"</string>
<string name="tab_picker_title" msgid="864478399057782913">"Fenêtres actuelles"</string>
<string name="tab_picker_remove_tab" msgid="630087809802479397">"Fermer"</string>
@@ -103,6 +113,13 @@
<string name="menu_view_download" msgid="2124570321712995120">"Téléchargements"</string>
<string name="copy_page_url" msgid="7635062169011319208">"Copier l\'URL de la page"</string>
<string name="share_page" msgid="593756995297268343">"Partager la page"</string>
+ <string name="menu_save_webarchive" msgid="3934652434001459581">"Enregistrer comme archive Web"</string>
+ <string name="webarchive_saved" msgid="7045250341467345007">"Archive Web enregistrée"</string>
+ <string name="webarchive_failed" msgid="2880998204746620260">"Échec de l\'enregistrement de l\'archive Web"</string>
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
<string name="contextmenu_openlink" msgid="7237961252214188935">"Ouvrir"</string>
<string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"Nouvelle fenêtre"</string>
<string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"Lien du favori"</string>
@@ -138,11 +155,44 @@
<string name="pref_content_homepage" msgid="6082437160778559806">"Page d\'accueil"</string>
<string name="pref_content_search_engine" msgid="1620101310821644144">"Définir le moteur de recherche"</string>
<string name="pref_content_search_engine_summary" msgid="5162667665858487316">"Sélectionnez un moteur de recherche."</string>
- <string name="pref_use_current" msgid="1493179933653044553">"Utiliser la page actuelle"</string>
+ <string name="pref_set_homepage_to" msgid="7196350233061395098">"Définir comme..."</string>
+ <string name="pref_use_current" msgid="1778622474040406672">"Page en cours"</string>
+ <string name="pref_use_blank" msgid="8503238592551111169">"Page vierge"</string>
+ <string name="pref_use_default" msgid="192587563274735878">"Page par défaut"</string>
<string name="pref_content_autofit" msgid="8260474534053660809">"Redimensionner"</string>
<string name="pref_content_autofit_summary" msgid="4587831659894879986">"Configurer les pages Web pour qu\'elles s\'ajustent à l\'écran"</string>
- <string name="pref_content_landscape_only" msgid="2022546812766219672">"Mode Paysage"</string>
- <string name="pref_content_landscape_only_summary" msgid="1008238895535428855">"Toujours afficher les pages dans le sens de la largeur (orientation paysage)"</string>
+ <string name="pref_personal_title" msgid="1447687455755683695">"Paramètres personnels"</string>
+ <string name="pref_personal_sync_with_chrome" msgid="1695182180332194033">"Synchroniser avec Google Voice"</string>
+ <string name="pref_personal_sync_with_chrome_summary" msgid="7414133931827321055">"Partager les favoris et d\'autres données entre le navigateur Android et Google Chrome"</string>
+ <string name="pref_personal_google_account" msgid="952360133341490071">"Compte Google"</string>
+ <string name="pref_personal_sync_bookmarks" msgid="59237515966184432">"Synchroniser les favoris"</string>
+ <string name="pref_personal_sync_bookmarks_summary" msgid="4791767605662205482">"Synchroniser les favoris entre le navigateur Android et Google Chrome"</string>
+ <string name="pref_personal_start_syncing" msgid="6046972042512655232">"Démarrer la synchro"</string>
+ <string name="pref_personal_account_dialog_title" msgid="1390867119887955530">"Sélection du compte Google"</string>
+ <string name="pref_autofill_enabled" msgid="1174197447388234595">"Remplissage auto des formulaires"</string>
+ <string name="pref_autofill_enabled_summary" msgid="422640696197018914">"Remplissez les formulaires Web en un clic."</string>
+ <string name="pref_autofill_profile_editor" msgid="1350709161524642663">"Paramètres de saisie automatique"</string>
+ <string name="pref_autofill_profile_editor_summary" msgid="6748434431641768870">"Configurez et gérez les données de remplissage automatique des formulaires."</string>
+ <string name="autofill_profile_editor_name" msgid="8566130291459685955">"Nom et prénom :"</string>
+ <string name="autofill_profile_editor_email_address" msgid="7967585896612797173">"Adresse e-mail :"</string>
+ <string name="autofill_profile_editor_company_name" msgid="2813443159949210417">"Nom de la société :"</string>
+ <string name="autofill_profile_editor_address_line_1" msgid="836433242509243081">"Ligne d\'adresse 1 :"</string>
+ <string name="autofill_profile_editor_address_line_1_hint" msgid="5965659598509327172">"Adresse postale, boîte postale, \"À l\'attention de\""</string>
+ <string name="autofill_profile_editor_address_line_2" msgid="8194745202893822479">"Ligne d\'adresse 2 :"</string>
+ <string name="autofill_profile_editor_address_line_2_hint" msgid="2048330295853546405">"Résidence, bloc, bâtiment, appartement, étage, etc."</string>
+ <string name="autofill_profile_editor_city" msgid="4193225955409148508">"Ville :"</string>
+ <string name="autofill_profile_editor_state" msgid="8549739922338171458">"État/Province/Région :"</string>
+ <string name="autofill_profile_editor_zip_code" msgid="283668573295656671">"Code postal :"</string>
+ <string name="autofill_profile_editor_country" msgid="7234470301239156656">"Pays :"</string>
+ <string name="autofill_profile_editor_phone_number" msgid="4938852821413729276">"Téléphone :"</string>
+ <string name="autofill_profile_editor_save_profile" msgid="8349915287435262888">"Enregistrer le profil"</string>
+ <string name="autofill_profile_successful_save" msgid="6834102203944938409">"Profil enregistré"</string>
+ <string name="autofill_profile_successful_delete" msgid="2421442112954362732">"Profil supprimé"</string>
+ <string name="autofill_profile_editor_delete_profile" msgid="7112035941146003753">"Suppr. données profil"</string>
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
<string name="pref_privacy_title" msgid="1052470980370846151">"Paramètres de confidentialité"</string>
<string name="pref_privacy_clear_cache" msgid="3380316479925886998">"Effacer le cache"</string>
<string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"Supprimer les bases de données et le contenu localement en cache"</string>
@@ -208,6 +258,7 @@
<item msgid="891615911084608570">"Japonais (ISO-2022-JP)"</item>
<item msgid="5589150448475151241">"Japonais (SHIFT_JIS)"</item>
<item msgid="7356792686950371843">"Japonais (EUC-JP)"</item>
+ <item msgid="2193955365569270096">"Coréen (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Codage du texte"</string>
<string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"Problème de connectivité des données"</string>
@@ -296,4 +347,11 @@
<string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"Supprimer toutes les données"</string>
<string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"Annuler"</string>
<string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"Définition du fond d\'écran..."</string>
+ <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Favoris"</string>
+ <string name="empty_bookmarks_folder" msgid="7843361614634930942">"Aucun favori"</string>
+ <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
+ <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Synchronisation avec un compte Google"</string>
+ <string name="import_bookmarks_dialog_description" msgid="2187665745413495303">"Vos favoris Android ne sont associés à aucun compte Google."</string>
+ <string name="import_bookmarks_dialog_remove" msgid="8105572409059113340">"Supprimer vos favoris Android"</string>
+ <string name="import_bookmarks_dialog_import" msgid="6933613853573899218">"Ajouter vos favoris Android à ceux de <xliff:g id="GOOGLE_ACCOUNT">%s</xliff:g>"</string>
</resources>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
new file mode 100644
index 0000000..96e8a2c
--- /dev/null
+++ b/res/values-hr/strings.xml
@@ -0,0 +1,401 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2007 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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="application_name" msgid="1935869255545976415">"Preglednik"</string>
+ <string name="choose_upload" msgid="3649366287575002063">"Odaberite datoteku za prijenos"</string>
+ <string name="new_tab" msgid="4505722538297295141">"Novi prozor"</string>
+ <!-- no translation found for new_incognito_tab (5821404839654751753) -->
+ <skip />
+ <string name="active_tabs" msgid="3050623868203544623">"Windows"</string>
+ <string name="tab_bookmarks" msgid="2305793036003473653">"Oznake"</string>
+ <string name="tab_most_visited" msgid="1077402532455000703">"Najposjećenije"</string>
+ <string name="tab_history" msgid="1979267558744613746">"Povijest"</string>
+ <string name="added_to_bookmarks" msgid="1020224130695956728">"Dodano u oznake"</string>
+ <string name="removed_from_bookmarks" msgid="6063705902028438800">"Uklonjeno iz oznaka"</string>
+ <string name="sign_in_to" msgid="5939425800148759165">"Prijavite se na <xliff:g id="HOSTNAME">%s1</xliff:g> \"<xliff:g id="REALM">%s2</xliff:g>\""</string>
+ <string name="username" msgid="5057566336518215922">"Ime"</string>
+ <string name="password" msgid="1177138552305184404">"Zaporka"</string>
+ <string name="action" msgid="183105774472071343">"Prijava"</string>
+ <string name="bookmarks_search" msgid="5229596268214362873">"Preglednik"</string>
+ <string name="cancel" msgid="3017274947407233702">"Odustani"</string>
+ <string name="ok" msgid="1509280796718850364">"U redu"</string>
+ <string name="title_bar_loading" msgid="7438217780834640678">"Učitavanje…"</string>
+ <string name="page_info" msgid="4048529256302257195">"Informacije o stranici"</string>
+ <string name="page_info_view" msgid="5303490449842635158">"Prikaz informacija o stranici"</string>
+ <string name="page_info_address" msgid="2222306609532903254">"Adresa:"</string>
+ <string name="ssl_warnings_header" msgid="79744901983636370">"Postoje problemi s certifikatom o sigurnosti za ovu web-lokaciju."</string>
+ <string name="ssl_continue" msgid="8031515015829358457">"Nastavi"</string>
+ <string name="security_warning" msgid="6607795404322797541">"Upozorenje o sigurnosti"</string>
+ <string name="view_certificate" msgid="1472768887529093862">"Prikaži certifikat"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
+ <string name="ssl_untrusted" msgid="5369967226521102194">"Ovaj certifikat ne potječe iz pouzdanog izvora."</string>
+ <string name="ssl_mismatch" msgid="558688832420069896">"Naziv web-lokacije ne podudara se s nazivom na certifikatu."</string>
+ <string name="ssl_expired" msgid="5739349389499575559">"Ovaj je certifikat istekao."</string>
+ <string name="ssl_not_yet_valid" msgid="2893167846212645846">"Ovaj certifikat još nije važeći."</string>
+ <string name="ssl_certificate" msgid="5226747157992111668">"Certifikat o sigurnosti"</string>
+ <string name="ssl_certificate_is_valid" msgid="7096160815933145579">"Ovaj je certifikat valjan."</string>
+ <string name="issued_to" msgid="9032338008819841339">"Izdano do:"</string>
+ <string name="common_name" msgid="5745530093500062357">"Zajednički naziv:"</string>
+ <string name="org_name" msgid="8868889052889991293">"Tvrtka ili ustanova:"</string>
+ <string name="org_unit" msgid="4489056376307768196">"Organizacijska jedinica:"</string>
+ <string name="issued_by" msgid="6959484326943152487">"Izdao:"</string>
+ <string name="validity_period" msgid="57988851973181309">"Vrijedi do:"</string>
+ <string name="issued_on" msgid="2082890654801808368">"Izdano dana:"</string>
+ <string name="expires_on" msgid="8061200430557020704">"Ističe dana:"</string>
+ <string name="stopping" msgid="4839698519340302982">"Zaustavljanje..."</string>
+ <string name="stop" msgid="5687251076030630074">"Zaustavi"</string>
+ <string name="reload" msgid="8585220783228408062">"Osvježi"</string>
+ <string name="back" msgid="8414603107175713668">"Natrag"</string>
+ <string name="forward" msgid="4288210890526641577">"Proslijedi"</string>
+ <string name="save" msgid="5922311934992468496">"U redu"</string>
+ <string name="do_not_save" msgid="6777633870113477714">"Odustani"</string>
+ <!-- outdated translation 969988560160364559 --> <string name="location" msgid="3411848697912600125">"Lokacija"</string>
+ <!-- no translation found for containing_folder (6771180232953030479) -->
+ <skip />
+ <!-- no translation found for new_folder (7743540149088867917) -->
+ <skip />
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <!-- no translation found for no_subfolders (5880411440592452802) -->
+ <skip />
+ <!-- no translation found for add_to_bookmarks_menu_option (4449323955122214389) -->
+ <skip />
+ <!-- no translation found for add_to_homescreen_menu_option (1461447829242963790) -->
+ <skip />
+ <!-- no translation found for add_to_other_folder_menu_option (5450890093372998187) -->
+ <skip />
+ <!-- outdated translation 5990326151488445481 --> <string name="name" msgid="5462672162695365387">"Ime"</string>
+ <string name="http" msgid="2163722670597250102">"http://"</string>
+ <!-- outdated translation 588165100024086565 --> <string name="save_to_bookmarks" msgid="6101482434920313244">"Dodaj oznaku"</string>
+ <!-- no translation found for bookmark_this_page (7530739804320811054) -->
+ <skip />
+ <string name="edit_bookmark" msgid="5024089053490231905">"Uredi knjižnu oznaku"</string>
+ <!-- outdated translation 9202323987633899835 --> <string name="create_shortcut_bookmark" msgid="1995095662095484289">"Dodaj prečac Početnoj stranici"</string>
+ <string name="open_bookmark" msgid="8473581305759935790">"Otvori"</string>
+ <string name="remove_bookmark" msgid="8407495852801410891">"Izbriši oznaku"</string>
+ <string name="remove_from_bookmarks" msgid="4374080666576982775">"Ukloni iz oznaka"</string>
+ <string name="remove_history_item" msgid="5021424935726728618">"Ukloni iz povijesti"</string>
+ <string name="set_as_homepage" msgid="4752937379414905560">"Postavi kao početnu stranicu"</string>
+ <string name="bookmark_saved" msgid="2766434679871317557">"Spremljeno u oznake."</string>
+ <string name="bookmark_not_saved" msgid="700600955089376724">"Oznaka se ne može spremiti."</string>
+ <string name="homepage_set" msgid="8768087280310966395">"Početna stranica postavljena."</string>
+ <string name="bookmark_needs_title" msgid="6245900436119218187">"Oznaka mora imati ime."</string>
+ <string name="bookmark_needs_url" msgid="7809876865972755158">"Oznaka mora imati lokaciju."</string>
+ <string name="bookmark_url_not_valid" msgid="6719785633980202419">"URL nije važeći."</string>
+ <string name="bookmark_cannot_save_url" msgid="791722768778386941">"Ovaj se URL ne može zabilježiti kao knjižna oznaka."</string>
+ <string name="delete_bookmark" msgid="2422989994934201992">"Izbriši"</string>
+ <string name="bookmark_page" msgid="6845189305130307274">"Označi posljednju prikazanu stranicu"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
+ <string name="current_page" msgid="7510129573681663135">"s lokacije "</string>
+ <string name="delete_bookmark_warning" msgid="758043186202032205">"Oznaka \"<xliff:g id="BOOKMARK">%s</xliff:g>\" izbrisat će se."</string>
+ <string name="open_in_new_window" msgid="6596775546468054510">"Otvori u novom prozoru"</string>
+ <string name="goto_dot" msgid="3895839050522602723">"Idi"</string>
+ <!-- no translation found for incognito_tab (5419458065370134289) -->
+ <skip />
+ <string name="select_dot" msgid="6299170761900561967">"Odabir teksta"</string>
+ <string name="tab_picker_title" msgid="864478399057782913">"Trenutni prozori"</string>
+ <string name="tab_picker_remove_tab" msgid="630087809802479397">"Zatvori"</string>
+ <string name="bookmarks" msgid="1961279134885867815">"Oznake"</string>
+ <string name="shortcut_bookmark" msgid="3974876480401135895">"Oznaka"</string>
+ <string name="history" msgid="2451240511251410032">"Povijest"</string>
+ <string name="menu_view_download" msgid="2124570321712995120">"Preuzimanja"</string>
+ <string name="copy_page_url" msgid="7635062169011319208">"Kopiraj url stranice"</string>
+ <string name="share_page" msgid="593756995297268343">"Dijeli stranicu"</string>
+ <!-- no translation found for menu_save_webarchive (3934652434001459581) -->
+ <skip />
+ <!-- no translation found for webarchive_saved (7045250341467345007) -->
+ <skip />
+ <!-- no translation found for webarchive_failed (2880998204746620260) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
+ <string name="contextmenu_openlink" msgid="7237961252214188935">"Otvori"</string>
+ <string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"Otvori u novom prozoru"</string>
+ <string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"Veza za oznaku"</string>
+ <string name="contextmenu_savelink" msgid="5508554930832538184">"Spremi vezu"</string>
+ <string name="contextmenu_sharelink" msgid="5392275392280130331">"Dijeli vezu"</string>
+ <string name="contextmenu_copy" msgid="398860586635404030">"Kopiraj"</string>
+ <string name="contextmenu_copylink" msgid="5153657160294534270">"Kopiraj URL veze"</string>
+ <string name="contextmenu_download_image" msgid="4243829645180686912">"Spremi sliku"</string>
+ <string name="contextmenu_view_image" msgid="3870625602053600905">"Prikaz slike"</string>
+ <string name="contextmenu_set_wallpaper" msgid="3691902960115350686">"Postavi kao pozadinsku sliku"</string>
+ <string name="contextmenu_dial_dot" msgid="5856550683415933806">"Biranje..."</string>
+ <string name="contextmenu_add_contact" msgid="3183511922223645716">"Dodaj kontakt"</string>
+ <string name="contextmenu_send_mail" msgid="1014513374828775660">"Pošalji poruku e-pošte"</string>
+ <string name="contextmenu_map" msgid="7471390435434034912">"Karta"</string>
+ <string name="choosertitle_sharevia" msgid="4600490613341909086">"Dijeli putem"</string>
+ <string name="clear" msgid="7070043081700011461">"Očisti"</string>
+ <string name="replace" msgid="4843033491070384047">"Zamijeni"</string>
+ <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Oznake"</string>
+ <string name="menu_preferences" msgid="6709237687234102240">"Postavke"</string>
+ <string name="pref_content_title" msgid="722227111894838633">"Postavke sadržaja stranice"</string>
+ <string name="pref_content_load_images" msgid="2125616852957377561">"Učitaj slike"</string>
+ <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Prikaži slike na web-stranicama"</string>
+ <string name="pref_content_block_popups" msgid="7808433807197256726">"Blokiraj skočne prozore"</string>
+ <string name="pref_content_javascript" msgid="4570972030299516843">"Omogući JavaScript"</string>
+ <string name="pref_content_open_in_background" msgid="824123779725118663">"Otvori u pozadini"</string>
+ <string name="pref_content_plugins" msgid="7231944644794301582">"Omogući priključke"</string>
+ <string-array name="pref_content_plugins_choices">
+ <item msgid="6745108155096660725">"Uvijek uključeno"</item>
+ <item msgid="2484126708670016519">"Na zahtjev"</item>
+ <item msgid="8547442717307793863">"Isključeno"</item>
+ </string-array>
+ <string name="pref_content_open_in_background_summary" msgid="1737664075721181678">"Otvori nove prozore iza trenutnog"</string>
+ <string name="pref_content_homepage" msgid="6082437160778559806">"Postavi početnu stranicu"</string>
+ <!-- no translation found for pref_content_search_engine (1620101310821644144) -->
+ <skip />
+ <!-- no translation found for pref_content_search_engine_summary (5162667665858487316) -->
+ <skip />
+ <!-- no translation found for pref_set_homepage_to (7196350233061395098) -->
+ <skip />
+ <!-- outdated translation 1493179933653044553 --> <string name="pref_use_current" msgid="1778622474040406672">"Upotrijebi trenutnu stranicu"</string>
+ <!-- no translation found for pref_use_blank (8503238592551111169) -->
+ <skip />
+ <!-- no translation found for pref_use_default (192587563274735878) -->
+ <skip />
+ <string name="pref_content_autofit" msgid="8260474534053660809">"Automatsko prilagođavanje stranicama"</string>
+ <string name="pref_content_autofit_summary" msgid="4587831659894879986">"Formatirajte web-stranice kako bi odgovarale zaslonu"</string>
+ <!-- no translation found for pref_personal_title (1447687455755683695) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome (1695182180332194033) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome_summary (7414133931827321055) -->
+ <skip />
+ <!-- no translation found for pref_personal_google_account (952360133341490071) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks (59237515966184432) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks_summary (4791767605662205482) -->
+ <skip />
+ <!-- no translation found for pref_personal_start_syncing (6046972042512655232) -->
+ <skip />
+ <!-- no translation found for pref_personal_account_dialog_title (1390867119887955530) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled (1174197447388234595) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled_summary (422640696197018914) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor (1350709161524642663) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor_summary (6748434431641768870) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_name (8566130291459685955) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_email_address (7967585896612797173) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_company_name (2813443159949210417) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1 (836433242509243081) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1_hint (5965659598509327172) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2 (8194745202893822479) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2_hint (2048330295853546405) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_city (4193225955409148508) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_state (8549739922338171458) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_zip_code (283668573295656671) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_country (7234470301239156656) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_phone_number (4938852821413729276) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_save_profile (8349915287435262888) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_save (6834102203944938409) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_delete (2421442112954362732) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_delete_profile (7112035941146003753) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
+ <string name="pref_privacy_title" msgid="1052470980370846151">"Postavke privatnosti"</string>
+ <string name="pref_privacy_clear_cache" msgid="3380316479925886998">"Očisti predmemoriju"</string>
+ <string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"Izbriši sadržaj i baze podataka spremljene u lokalnu predmemoriju"</string>
+ <string name="pref_privacy_clear_cache_dlg" msgid="5541011591300753881">"Izbrisat će se sadržaj i baze podataka koji su spremljeni u lokalnu predmemoriju."</string>
+ <string name="pref_privacy_clear_cookies" msgid="3095583579133780331">"Izbriši sve podatke o kolačićima"</string>
+ <string name="pref_privacy_clear_cookies_summary" msgid="6962742063990677520">"Izbriši sve kolačiće iz preglednika"</string>
+ <string name="pref_privacy_clear_cookies_dlg" msgid="552855688091432682">"Svi će se kolačići izbrisati."</string>
+ <string name="pref_privacy_clear_history" msgid="8723795508825198477">"Izbriši povijest"</string>
+ <string name="pref_privacy_clear_history_summary" msgid="6868501330708940734">"Izbriši povijest navigacije u pregledniku"</string>
+ <string name="pref_privacy_clear_history_dlg" msgid="544903007914753853">"Izbrisat će se povijest navigacije u pregledniku."</string>
+ <string name="pref_privacy_clear_form_data" msgid="4232668196344383987">"Izbriši podatke iz obrasca"</string>
+ <string name="pref_privacy_clear_form_data_summary" msgid="1790390894719517167">"Izbriši sve spremljene podatke o obrascima"</string>
+ <string name="pref_privacy_clear_form_data_dlg" msgid="4443621086781197928">"Svi će se spremljeni podaci iz obrasca izbrisati."</string>
+ <string name="pref_privacy_clear_passwords" msgid="4750234112289277480">"Izbriši zaporke"</string>
+ <string name="pref_privacy_clear_passwords_summary" msgid="8856782718942903335">"Izbriši sve spremljene zaporke"</string>
+ <string name="pref_privacy_clear_passwords_dlg" msgid="2083869328824248255">"Sve će se spremljene zaporke izbrisati."</string>
+ <string name="pref_privacy_enable_geolocation" msgid="1395040170290765686">"Omogući lokaciju"</string>
+ <string name="pref_privacy_enable_geolocation_summary" msgid="8437020934664306205">"Dopustite web-lokacijama da zatraže pristup vašoj lokaciji"</string>
+ <string name="pref_privacy_clear_geolocation_access" msgid="6649680770030042980">"Izbriši pristup lokaciji"</string>
+ <string name="pref_privacy_clear_geolocation_access_summary" msgid="7750143359497314679">"Izbriši pristup lokaciji za sve web-lokacije"</string>
+ <string name="pref_privacy_clear_geolocation_access_dlg" msgid="7327063124488827244">"Izbriši pristup lokaciji za sve web-lokacije"</string>
+ <string name="pref_security_title" msgid="5763978646932160021">"Sigurnosne postavke"</string>
+ <string name="pref_security_remember_passwords" msgid="6492957683454529549">"Zapamti zaporke"</string>
+ <string name="pref_security_remember_passwords_summary" msgid="256388703356349137">"Spremi korisnička imena i zaporke za web-lokacije"</string>
+ <string name="pref_security_save_form_data" msgid="1213669802810198893">"Zapamti podatke o obrascu"</string>
+ <string name="pref_security_save_form_data_summary" msgid="4994074685153708026">"Zapamti podatke koje upisujem u obrasce radi kasnije upotrebe"</string>
+ <string name="pref_security_show_security_warning" msgid="8901135676266754559">"Prikaži upozorenja o sigurnosti"</string>
+ <string name="pref_security_show_security_warning_summary" msgid="8968906112720511704">"Prikaži upozorenje ako postoji problem sa sigurnošću web-lokacije"</string>
+ <string name="pref_security_accept_cookies" msgid="3201367661925047989">"Prihvati kolačiće"</string>
+ <string name="pref_security_accept_cookies_summary" msgid="1465118934875026920">"Dopusti web-lokacijama spremanje i čitanje podataka o \"kolačićima\""</string>
+ <string name="pref_text_size" msgid="3827031324346612208">"Veličina teksta"</string>
+ <string-array name="pref_text_size_choices">
+ <item msgid="4952686548944739548">"Sitan"</item>
+ <item msgid="1950030433642671460">"Mali"</item>
+ <item msgid="4338347520133294584">"Normalni"</item>
+ <item msgid="5043128215356351184">"Veliki"</item>
+ <item msgid="7201512237890458902">"Ogroman"</item>
+ </string-array>
+ <string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Veličina teksta"</string>
+ <string name="pref_default_zoom" msgid="8076142259097187395">"Zadano povećanje/smanjenje"</string>
+ <string-array name="pref_default_zoom_choices">
+ <item msgid="549583171195154919">"Daleko"</item>
+ <item msgid="5619034257768161024">"Srednji"</item>
+ <item msgid="3840999588443167001">"Zatvori"</item>
+ </string-array>
+ <string name="pref_default_zoom_dialogtitle" msgid="6095974367125109021">"Zadano povećanje/smanjenje"</string>
+ <string name="pref_content_load_page" msgid="2219810141690955452">"Otvori stranice u pregledu"</string>
+ <string name="pref_content_load_page_summary" msgid="8792093504054149369">"Pokaži pregled novootvorenih stranica"</string>
+ <string name="pref_extras_title" msgid="3091250467679722382">"Napredne postavke"</string>
+ <string name="pref_extras_website_settings" msgid="67866640052455549">"Postavke web-lokacije"</string>
+ <string name="pref_extras_website_settings_summary" msgid="1656771443223494406">"Napredne postavke za pojedinačne web-lokacije"</string>
+ <string name="pref_extras_reset_default" msgid="8904000515846202110">"Ponovo postavi na zadano"</string>
+ <string name="pref_extras_reset_default_summary" msgid="4247870778270414501">"Vrati na zadane postavke"</string>
+ <string name="pref_extras_reset_default_dlg" msgid="6640261575874704022">"Postavke će se vratiti na zadane vrijednosti."</string>
+ <string name="pref_extras_reset_default_dlg_title" msgid="2250334970728938936">"Ponovo postavi na zadano"</string>
+ <string name="pref_development_title" msgid="3263854204533056480">"Otklanjanje pogrešaka"</string>
+ <string name="pref_default_text_encoding" msgid="5742965543955558478">"Kodiranje teksta"</string>
+ <!-- no translation found for pref_default_text_encoding_choices:7 (2193955365569270096) -->
+ <string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Kodiranje teksta"</string>
+ <string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"Problem s podatkovnom povezivošću"</string>
+ <string name="browserFrameFileErrorLabel" msgid="8063691502792670367">"Problem s datotekom"</string>
+ <string name="browserFrameFormResubmitLabel" msgid="2685923472682180360">"Potvrdi"</string>
+ <string name="browserFrameFormResubmitMessage" msgid="2752182215695632138">"Stranica koju pokušavate prikazati sadrži podatke koji su već poslani (\"POSTDATA\"). Ako ponovo pošaljete podatke, ponovit će se svaka radnja koju je izvršio obrazac na stranici (poput pretraživanja ili online kupovine)."</string>
+ <string name="loadSuspendedTitle" msgid="675991625288706944">"Nema mrežnog povezivanja"</string>
+ <string name="loadSuspended" msgid="3133656588880851273">"Preglednik ne može učitati ovu stranicu jer nema internetske veze."</string>
+ <string name="clear_history" msgid="5998307092715979619">"Izbriši povijest"</string>
+ <string name="browser_history" msgid="1038987118290272525">"Nedavno posjećene stranice"</string>
+ <string name="empty_history" msgid="8738772352308207274">"Povijest preglednika prazna je."</string>
+ <string name="add_new_bookmark" msgid="8086367791400349049">"Dodavanje oznake..."</string>
+ <string name="add_bookmark_short" msgid="3783984330998103735">"Dodaj"</string>
+ <string name="search_hint" msgid="4647356319916631820">"Pretraži ili upiši URL"</string>
+ <string name="search_button_text" msgid="5235226933877634410">"Idi"</string>
+ <string name="search_settings_description" msgid="1422401062529014107">"Oznake i web-povijest"</string>
+ <string name="attention" msgid="3473639060042811244">"Pažnja"</string>
+ <string name="popup_window_attempt" msgid="2673111696288657989">"Ova web-lokacija pokušava otvoriti skočni prozor."</string>
+ <string name="allow" msgid="1157313689171991335">"Dopusti"</string>
+ <string name="block" msgid="9172175889884707800">"Blokiraj"</string>
+ <string name="too_many_windows_dialog_title" msgid="5175503564948906442">"Dosegnuto ograničenje prozora"</string>
+ <string name="too_many_windows_dialog_message" msgid="1398571800233959583">"Novi se prozor ne može otvoriti jer već imate otvoren maksimalan broj prozora."</string>
+ <string name="too_many_subwindows_dialog_title" msgid="3805453941587725944">"Skočni je prozor već otvoren"</string>
+ <string name="too_many_subwindows_dialog_message" msgid="5827289829907966657">"Novi skočni prozor ne može se otvoriti, jer istovremeno može biti otvoren samo jedan."</string>
+ <string name="download_title" msgid="2122874021047565594">"Povijest preuzimanja"</string>
+ <string name="download_unknown_filename" msgid="4013465542563652175">"<nepoznato>"</string>
+ <string name="download_menu_open" msgid="4888327480367757513">"Otvori"</string>
+ <string name="download_menu_clear" msgid="6264454531553418124">"Očisti s popisa"</string>
+ <string name="download_menu_delete" msgid="8815502136393894148">"Izbriši"</string>
+ <string name="download_menu_cancel" msgid="2545333007601851574">"Otkaži preuzimanje"</string>
+ <string name="download_menu_cancel_all" msgid="2136550823151999166">"Poništi sva preuzimanja"</string>
+ <string name="download_cancel_dlg_title" msgid="8909108500262799748">"Poništi preuzimanja"</string>
+ <string name="download_cancel_dlg_msg" msgid="6285389170052357797">"Svih <xliff:g id="DOWNLOAD_COUNT">%d</xliff:g> preuzimanja će se otkazati i izbrisati iz povijesti preuzimanja."</string>
+ <string name="download_delete_file" msgid="5330036497843073249">"Datoteka će se izbrisati"</string>
+ <string name="download_file_error_dlg_title" msgid="2693630283595384874">"Nema dovoljno mjesta"</string>
+ <string name="download_file_error_dlg_msg" msgid="5156405410324072471">"<xliff:g id="FILENAME">%s</xliff:g> se ne može preuzeti."\n"Oslobodite prostor na svom telefonu i probajte ponovo."</string>
+ <string name="download_failed_generic_dlg_title" msgid="6106781095337833391">"Preuzimanje nije uspjelo"</string>
+ <!-- outdated translation 605904452159416792 --> <string name="download_no_sdcard_dlg_title" product="nosdcard" msgid="56777245081568508">"Nema SD kartice"</string>
+ <string name="download_no_sdcard_dlg_title" product="default" msgid="605904452159416792">"Nema SD kartice"</string>
+ <!-- no translation found for download_no_sdcard_dlg_msg (3144652102051031721) -->
+ <skip />
+ <string name="download_no_sdcard_dlg_msg" product="default" msgid="2616399456116301518">"Za preuzimanje je potrebna SD kartica <xliff:g id="FILENAME">%s</xliff:g>."</string>
+ <!-- outdated translation 6877712666046917741 --> <string name="download_sdcard_busy_dlg_title" product="nosdcard" msgid="8081445664689818973">"SD kartica nije dostupna"</string>
+ <string name="download_sdcard_busy_dlg_title" product="default" msgid="6877712666046917741">"SD kartica nije dostupna"</string>
+ <!-- outdated translation 3473883538192835204 --> <string name="download_sdcard_busy_dlg_msg" product="nosdcard" msgid="3979329954835690147">"SD kartica je zauzeta. Kako biste omogućili preuzimanja, odaberite \"Isključi USB pohranjivanje\" u obavijesti."</string>
+ <string name="download_sdcard_busy_dlg_msg" product="default" msgid="3473883538192835204">"SD kartica je zauzeta. Kako biste omogućili preuzimanja, odaberite \"Isključi USB pohranjivanje\" u obavijesti."</string>
+ <string name="download_no_application_title" msgid="1286056729168874295">"Datoteka se ne može otvoriti"</string>
+ <string name="retry" msgid="1835923075542266721">"Pokušaj ponovo"</string>
+ <string name="no_downloads" msgid="3947445710685021498">"Povijest preuzimanja je prazna."</string>
+ <string name="download_error" msgid="413496839831257187">"Preuzimanje nije uspjelo."</string>
+ <string name="download_success" msgid="2279041638155595203">"<xliff:g id="FILE">%s</xliff:g>Preuzimanje dovršeno."</string>
+ <string name="download_running" msgid="2622942231322015059">"Preuzimanje..."</string>
+ <string name="download_pending" msgid="2599683668575349559">"Početak preuzimanja…"</string>
+ <string name="download_pending_network" msgid="6548714525679461053">"Čeka se podatkovno povezivanje..."</string>
+ <string name="download_running_paused" msgid="6418029352085656495">"Čeka se podatkovno povezivanje..."</string>
+ <string name="download_canceled" msgid="6057083743144492515">"Preuzimanje otkazano."</string>
+ <string name="download_not_acceptable" msgid="313769696131563652">"Preuzimanje nije moguće. Sadržaj nije podržan na ovom telefonu."</string>
+ <string name="download_file_error" msgid="1206648050615176113">"Preuzimanje se ne može dovršiti. Nema dovoljno prostora."</string>
+ <string name="download_length_required" msgid="9038605488460437406">"Preuzimanje nije moguće. Ne može se utvrditi veličina stavke."</string>
+ <string name="download_precondition_failed" msgid="8327584102874295580">"Preuzimanje prekinuto. Ne može se nastaviti."</string>
+ <string name="search_the_web" msgid="6046130189241962337">"Pretraži web"</string>
+ <string name="webstorage_outofspace_notification_title" msgid="1160474608059771788">"Pohrana preglednika puna"</string>
+ <string name="webstorage_outofspace_notification_text" msgid="7341075135051829692">"Klikni za oslobađanje prostora."</string>
+ <string name="webstorage_clear_data_title" msgid="689484577124333977">"Izbriši spremljene podatke"</string>
+ <string name="webstorage_clear_data_dialog_title" msgid="345457466368974706">"Izbriši spremljene podatke"</string>
+ <string name="webstorage_clear_data_dialog_message" msgid="6678281256970470125">"Svi će se podaci koje je spremila ova web-lokacija izbrisati"</string>
+ <string name="webstorage_clear_data_dialog_ok_button" msgid="2516563534211898636">"Izbriši sve"</string>
+ <string name="webstorage_clear_data_dialog_cancel_button" msgid="2028867751958942762">"Odustani"</string>
+ <string name="webstorage_origin_summary_mb_stored" msgid="1985885826292236210">"MB spremljeno na telefonu"</string>
+ <string name="loading_video" msgid="4887871585216091096">"Učitavanje videozapisa"</string>
+ <string name="geolocation_permissions_prompt_message" msgid="356796102004052471">"<xliff:g id="WEBSITE_ORIGIN">%s</xliff:g> želi znati vašu lokaciju"</string>
+ <string name="geolocation_permissions_prompt_share" msgid="9084486342048347976">"Dijeli lokaciju"</string>
+ <string name="geolocation_permissions_prompt_dont_share" msgid="6303025160237860300">"Odbaci"</string>
+ <string name="geolocation_permissions_prompt_remember" msgid="3118526300707348308">"Zapamti postavke"</string>
+ <string name="geolocation_permissions_prompt_toast_allowed" msgid="987286072035125498">"Ova web-lokacija može pristupiti vašoj lokaciji. Promijenite ovo u Postavkama -> Postavke web-lokacije"</string>
+ <string name="geolocation_permissions_prompt_toast_disallowed" msgid="7695100950212692515">"Ova web-lokacija ne može pristupiti vašoj lokaciji. Promijenite ovo u Postavkama -> Postavke web-lokacije"</string>
+ <string name="geolocation_settings_page_title" msgid="1745477985097536528">"Izbriši pristup lokaciji"</string>
+ <string name="geolocation_settings_page_summary_allowed" msgid="9180251524290811398">"Ova web-lokacija može trenutno pristupiti vašoj lokaciji"</string>
+ <string name="geolocation_settings_page_summary_not_allowed" msgid="4589649082203102544">"Ova web-lokacija ne može trenutno pristupiti vašoj lokaciji"</string>
+ <string name="geolocation_settings_page_dialog_title" msgid="1549842043381347668">"Izbriši pristup lokaciji"</string>
+ <string name="geolocation_settings_page_dialog_message" msgid="7586671987576403993">"Izbrisat će se pristup lokaciji za ovu web-lokaciju"</string>
+ <string name="geolocation_settings_page_dialog_ok_button" msgid="4789434178048077287">"Izbriši pristup"</string>
+ <string name="geolocation_settings_page_dialog_cancel_button" msgid="7941036504673409747">"Odustani"</string>
+ <string name="website_settings_clear_all" msgid="8739804325997655980">"Izbriši sve"</string>
+ <string name="website_settings_clear_all_dialog_title" msgid="7791826325122461718">"Izbrisati sve postavke web-lokacije?"</string>
+ <string name="website_settings_clear_all_dialog_message" msgid="6150502090601476333">"Izbrisati će se svi podaci o web-lokaciji i dozvole za lokaciju."</string>
+ <string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"Izbriši sve podatke"</string>
+ <string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"Odustani"</string>
+ <string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"Postavljanje pozadinske slike..."</string>
+ <!-- no translation found for defaultBookmarksUpButton (2303951020715704735) -->
+ <skip />
+ <!-- no translation found for empty_bookmarks_folder (7843361614634930942) -->
+ <skip />
+ <!-- no translation found for rlz_access_point (7165847807377650632) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_title (3325557652271172128) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_description (2187665745413495303) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_remove (8105572409059113340) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_import (6933613853573899218) -->
+ <skip />
+</resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
new file mode 100644
index 0000000..54ac215
--- /dev/null
+++ b/res/values-hu/strings.xml
@@ -0,0 +1,401 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2007 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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="application_name" msgid="1935869255545976415">"Böngésző"</string>
+ <string name="choose_upload" msgid="3649366287575002063">"Válassza ki a feltölteni kívánt fájlt"</string>
+ <string name="new_tab" msgid="4505722538297295141">"Új ablak"</string>
+ <!-- no translation found for new_incognito_tab (5821404839654751753) -->
+ <skip />
+ <string name="active_tabs" msgid="3050623868203544623">"Ablakok"</string>
+ <string name="tab_bookmarks" msgid="2305793036003473653">"Könyvjelzők"</string>
+ <string name="tab_most_visited" msgid="1077402532455000703">"Leggyakrabban felkeresett"</string>
+ <string name="tab_history" msgid="1979267558744613746">"Előzmények"</string>
+ <string name="added_to_bookmarks" msgid="1020224130695956728">"Hozzáadva a könyvjelzőkhöz"</string>
+ <string name="removed_from_bookmarks" msgid="6063705902028438800">"Eltávolítva a könyvjelzők közül"</string>
+ <string name="sign_in_to" msgid="5939425800148759165">"Jelentkezzen be ide: <xliff:g id="HOSTNAME">%s1</xliff:g> \"<xliff:g id="REALM">%s2</xliff:g>\""</string>
+ <string name="username" msgid="5057566336518215922">"Név"</string>
+ <string name="password" msgid="1177138552305184404">"Jelszó"</string>
+ <string name="action" msgid="183105774472071343">"Bejelentkezés"</string>
+ <string name="bookmarks_search" msgid="5229596268214362873">"Böngésző"</string>
+ <string name="cancel" msgid="3017274947407233702">"Mégse"</string>
+ <string name="ok" msgid="1509280796718850364">"OK"</string>
+ <string name="title_bar_loading" msgid="7438217780834640678">"Betöltés…"</string>
+ <string name="page_info" msgid="4048529256302257195">"Oldaladatok"</string>
+ <string name="page_info_view" msgid="5303490449842635158">"Az oldal adatainak megtekintése"</string>
+ <string name="page_info_address" msgid="2222306609532903254">"Cím:"</string>
+ <string name="ssl_warnings_header" msgid="79744901983636370">"Gondok vannak a webhely biztonsági tanúsítványával."</string>
+ <string name="ssl_continue" msgid="8031515015829358457">"Folytatás"</string>
+ <string name="security_warning" msgid="6607795404322797541">"Biztonsági figyelmeztetés"</string>
+ <string name="view_certificate" msgid="1472768887529093862">"Tanúsítvány megtekintése"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
+ <string name="ssl_untrusted" msgid="5369967226521102194">"Ez a tanúsítvány nem hiteles tanúsítványkibocsátótól származik."</string>
+ <string name="ssl_mismatch" msgid="558688832420069896">"A webhely neve nem egyezik a tanúsítványon lévő névvel."</string>
+ <string name="ssl_expired" msgid="5739349389499575559">"A tanúsítvány lejárt."</string>
+ <string name="ssl_not_yet_valid" msgid="2893167846212645846">"A tanúsítvány még nem érvényes."</string>
+ <string name="ssl_certificate" msgid="5226747157992111668">"Biztonsági tanúsítvány"</string>
+ <string name="ssl_certificate_is_valid" msgid="7096160815933145579">"A tanúsítvány érvényes."</string>
+ <string name="issued_to" msgid="9032338008819841339">"Kiállítva a következőnek:"</string>
+ <string name="common_name" msgid="5745530093500062357">"Név:"</string>
+ <string name="org_name" msgid="8868889052889991293">"Szervezet:"</string>
+ <string name="org_unit" msgid="4489056376307768196">"Szervezeti egység:"</string>
+ <string name="issued_by" msgid="6959484326943152487">"Kiállította:"</string>
+ <string name="validity_period" msgid="57988851973181309">"Érvényesség:"</string>
+ <string name="issued_on" msgid="2082890654801808368">"Kiállítva:"</string>
+ <string name="expires_on" msgid="8061200430557020704">"Lejár:"</string>
+ <string name="stopping" msgid="4839698519340302982">"Leállítás..."</string>
+ <string name="stop" msgid="5687251076030630074">"Leállítás"</string>
+ <string name="reload" msgid="8585220783228408062">"Frissítés"</string>
+ <string name="back" msgid="8414603107175713668">"Vissza"</string>
+ <string name="forward" msgid="4288210890526641577">"Előre"</string>
+ <string name="save" msgid="5922311934992468496">"OK"</string>
+ <string name="do_not_save" msgid="6777633870113477714">"Mégse"</string>
+ <!-- outdated translation 969988560160364559 --> <string name="location" msgid="3411848697912600125">"URL"</string>
+ <!-- no translation found for containing_folder (6771180232953030479) -->
+ <skip />
+ <!-- no translation found for new_folder (7743540149088867917) -->
+ <skip />
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <!-- no translation found for no_subfolders (5880411440592452802) -->
+ <skip />
+ <!-- no translation found for add_to_bookmarks_menu_option (4449323955122214389) -->
+ <skip />
+ <!-- no translation found for add_to_homescreen_menu_option (1461447829242963790) -->
+ <skip />
+ <!-- no translation found for add_to_other_folder_menu_option (5450890093372998187) -->
+ <skip />
+ <!-- outdated translation 5990326151488445481 --> <string name="name" msgid="5462672162695365387">"Név"</string>
+ <string name="http" msgid="2163722670597250102">"http://"</string>
+ <!-- outdated translation 4680844117598293907 --> <string name="save_to_bookmarks" msgid="6101482434920313244">"Megjelölés könyvjelzőként"</string>
+ <!-- no translation found for bookmark_this_page (7530739804320811054) -->
+ <skip />
+ <string name="edit_bookmark" msgid="5024089053490231905">"Könyvjelző szerkesztése"</string>
+ <!-- outdated translation 9202323987633899835 --> <string name="create_shortcut_bookmark" msgid="1995095662095484289">"Parancsikon a főoldalra"</string>
+ <string name="open_bookmark" msgid="8473581305759935790">"Megnyitás"</string>
+ <string name="remove_bookmark" msgid="8407495852801410891">"Könyvjelző törlése"</string>
+ <string name="remove_from_bookmarks" msgid="4374080666576982775">"Eltávolítás a könyvjelzők közül"</string>
+ <string name="remove_history_item" msgid="5021424935726728618">"Eltávolítás az előzmények közül"</string>
+ <string name="set_as_homepage" msgid="4752937379414905560">"Beállítás kezdőlapként"</string>
+ <string name="bookmark_saved" msgid="2766434679871317557">"Mentve a könyvjelzők közé."</string>
+ <string name="bookmark_not_saved" msgid="700600955089376724">"Nem sikerült menteni a könyvjelzőt."</string>
+ <string name="homepage_set" msgid="8768087280310966395">"A kezdőlap beállítása megtörtént."</string>
+ <string name="bookmark_needs_title" msgid="6245900436119218187">"Nevet kell adni a könyvjelzőnek."</string>
+ <string name="bookmark_needs_url" msgid="7809876865972755158">"Meg kell adni a könyvjelző helyét."</string>
+ <string name="bookmark_url_not_valid" msgid="6719785633980202419">"Az URL nem érvényes."</string>
+ <string name="bookmark_cannot_save_url" msgid="791722768778386941">"Ezt az URL-t nem lehet a könyvjelzők közé tenni."</string>
+ <string name="delete_bookmark" msgid="2422989994934201992">"Törlés"</string>
+ <string name="bookmark_page" msgid="6845189305130307274">"Az utoljára megtekintett oldal felvétele a könyvjelzők közé"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
+ <string name="current_page" msgid="7510129573681663135">"innen: "</string>
+ <string name="delete_bookmark_warning" msgid="758043186202032205">"A(z) \"<xliff:g id="BOOKMARK">%s</xliff:g>\" könyvjelző törlésre kerül."</string>
+ <string name="open_in_new_window" msgid="6596775546468054510">"Megnyitás új ablakban"</string>
+ <string name="goto_dot" msgid="3895839050522602723">"Ugrás"</string>
+ <!-- no translation found for incognito_tab (5419458065370134289) -->
+ <skip />
+ <string name="select_dot" msgid="6299170761900561967">"Szöveg kijelölése"</string>
+ <string name="tab_picker_title" msgid="864478399057782913">"Jelenlegi ablakok"</string>
+ <string name="tab_picker_remove_tab" msgid="630087809802479397">"Bezárás"</string>
+ <string name="bookmarks" msgid="1961279134885867815">"Könyvjelzők"</string>
+ <string name="shortcut_bookmark" msgid="3974876480401135895">"Könyvjelző"</string>
+ <string name="history" msgid="2451240511251410032">"Előzmények"</string>
+ <string name="menu_view_download" msgid="2124570321712995120">"Letöltések"</string>
+ <string name="copy_page_url" msgid="7635062169011319208">"Az oldal URL-jének másolása"</string>
+ <string name="share_page" msgid="593756995297268343">"Oldal megosztása"</string>
+ <!-- no translation found for menu_save_webarchive (3934652434001459581) -->
+ <skip />
+ <!-- no translation found for webarchive_saved (7045250341467345007) -->
+ <skip />
+ <!-- no translation found for webarchive_failed (2880998204746620260) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
+ <string name="contextmenu_openlink" msgid="7237961252214188935">"Megnyitás"</string>
+ <string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"Megnyitás új ablakban"</string>
+ <string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"Link felvétele a könyvjelzők közé"</string>
+ <string name="contextmenu_savelink" msgid="5508554930832538184">"Link mentése"</string>
+ <string name="contextmenu_sharelink" msgid="5392275392280130331">"Link megosztása"</string>
+ <string name="contextmenu_copy" msgid="398860586635404030">"Másolás"</string>
+ <string name="contextmenu_copylink" msgid="5153657160294534270">"Link URL-címének másolása"</string>
+ <string name="contextmenu_download_image" msgid="4243829645180686912">"Kép mentése"</string>
+ <string name="contextmenu_view_image" msgid="3870625602053600905">"Kép megtekintése"</string>
+ <string name="contextmenu_set_wallpaper" msgid="3691902960115350686">"Beállítás háttérképként"</string>
+ <string name="contextmenu_dial_dot" msgid="5856550683415933806">"Tárcsázás..."</string>
+ <string name="contextmenu_add_contact" msgid="3183511922223645716">"Névjegy hozzáadása"</string>
+ <string name="contextmenu_send_mail" msgid="1014513374828775660">"E-mail küldése"</string>
+ <string name="contextmenu_map" msgid="7471390435434034912">"Térkép"</string>
+ <string name="choosertitle_sharevia" msgid="4600490613341909086">"Megosztás itt:"</string>
+ <string name="clear" msgid="7070043081700011461">"Törlés"</string>
+ <string name="replace" msgid="4843033491070384047">"A következő cseréje:"</string>
+ <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Könyvjelzők"</string>
+ <string name="menu_preferences" msgid="6709237687234102240">"Beállítások"</string>
+ <string name="pref_content_title" msgid="722227111894838633">"Oldaltartalom-beállítások"</string>
+ <string name="pref_content_load_images" msgid="2125616852957377561">"Képek betöltése"</string>
+ <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Képek megjelenítése a weboldalakon"</string>
+ <string name="pref_content_block_popups" msgid="7808433807197256726">"Előugró ablakok letiltása"</string>
+ <string name="pref_content_javascript" msgid="4570972030299516843">"JavaScript engedélyezése"</string>
+ <string name="pref_content_open_in_background" msgid="824123779725118663">"Megnyitás a háttérben"</string>
+ <string name="pref_content_plugins" msgid="7231944644794301582">"Plug-inek engedélyezése"</string>
+ <string-array name="pref_content_plugins_choices">
+ <item msgid="6745108155096660725">"Mindig bekapcsolva"</item>
+ <item msgid="2484126708670016519">"Igény szerint"</item>
+ <item msgid="8547442717307793863">"Ki"</item>
+ </string-array>
+ <string name="pref_content_open_in_background_summary" msgid="1737664075721181678">"Új ablakok megnyitása a jelenlegi mögött"</string>
+ <string name="pref_content_homepage" msgid="6082437160778559806">"Főoldal beállítása"</string>
+ <!-- no translation found for pref_content_search_engine (1620101310821644144) -->
+ <skip />
+ <!-- no translation found for pref_content_search_engine_summary (5162667665858487316) -->
+ <skip />
+ <!-- no translation found for pref_set_homepage_to (7196350233061395098) -->
+ <skip />
+ <!-- outdated translation 1493179933653044553 --> <string name="pref_use_current" msgid="1778622474040406672">"A jelenlegi oldal használata"</string>
+ <!-- no translation found for pref_use_blank (8503238592551111169) -->
+ <skip />
+ <!-- no translation found for pref_use_default (192587563274735878) -->
+ <skip />
+ <string name="pref_content_autofit" msgid="8260474534053660809">"Oldalak automatikus igazítása"</string>
+ <string name="pref_content_autofit_summary" msgid="4587831659894879986">"A képernyőhöz igazítja a weboldalakat"</string>
+ <!-- no translation found for pref_personal_title (1447687455755683695) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome (1695182180332194033) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome_summary (7414133931827321055) -->
+ <skip />
+ <!-- no translation found for pref_personal_google_account (952360133341490071) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks (59237515966184432) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks_summary (4791767605662205482) -->
+ <skip />
+ <!-- no translation found for pref_personal_start_syncing (6046972042512655232) -->
+ <skip />
+ <!-- no translation found for pref_personal_account_dialog_title (1390867119887955530) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled (1174197447388234595) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled_summary (422640696197018914) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor (1350709161524642663) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor_summary (6748434431641768870) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_name (8566130291459685955) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_email_address (7967585896612797173) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_company_name (2813443159949210417) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1 (836433242509243081) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1_hint (5965659598509327172) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2 (8194745202893822479) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2_hint (2048330295853546405) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_city (4193225955409148508) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_state (8549739922338171458) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_zip_code (283668573295656671) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_country (7234470301239156656) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_phone_number (4938852821413729276) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_save_profile (8349915287435262888) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_save (6834102203944938409) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_delete (2421442112954362732) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_delete_profile (7112035941146003753) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
+ <string name="pref_privacy_title" msgid="1052470980370846151">"Adatvédelmi beállítások"</string>
+ <string name="pref_privacy_clear_cache" msgid="3380316479925886998">"A gyorsítótár törlése"</string>
+ <string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"A helyileg gyorsítótárazott tartalmak és adatbázisok törlése"</string>
+ <string name="pref_privacy_clear_cache_dlg" msgid="5541011591300753881">"A helyileg gyorsítótárazott tartalmak és adatbázisok törlésre kerülnek."</string>
+ <string name="pref_privacy_clear_cookies" msgid="3095583579133780331">"Az összes cookie törlése"</string>
+ <string name="pref_privacy_clear_cookies_summary" msgid="6962742063990677520">"A böngésző összes cookie-jának törlése"</string>
+ <string name="pref_privacy_clear_cookies_dlg" msgid="552855688091432682">"Minden cookie törlésre kerül."</string>
+ <string name="pref_privacy_clear_history" msgid="8723795508825198477">"Előzmények törlése"</string>
+ <string name="pref_privacy_clear_history_summary" msgid="6868501330708940734">"A böngésző navigációs előzményeinek törlése"</string>
+ <string name="pref_privacy_clear_history_dlg" msgid="544903007914753853">"A böngésző navigációs előzményei törlésre kerülnek."</string>
+ <string name="pref_privacy_clear_form_data" msgid="4232668196344383987">"Űrlapadatok törlése"</string>
+ <string name="pref_privacy_clear_form_data_summary" msgid="1790390894719517167">"Minden mentett űrlapadat törlése"</string>
+ <string name="pref_privacy_clear_form_data_dlg" msgid="4443621086781197928">"Az összes mentett űrlapadat törlésre kerül."</string>
+ <string name="pref_privacy_clear_passwords" msgid="4750234112289277480">"Jelszavak törlése"</string>
+ <string name="pref_privacy_clear_passwords_summary" msgid="8856782718942903335">"Az összes mentett jelszó törlése"</string>
+ <string name="pref_privacy_clear_passwords_dlg" msgid="2083869328824248255">"Az összes mentett jelszó törlésre kerül."</string>
+ <string name="pref_privacy_enable_geolocation" msgid="1395040170290765686">"Helyadatok engedélyezése"</string>
+ <string name="pref_privacy_enable_geolocation_summary" msgid="8437020934664306205">"A webhelyek hozzáférést kérhetnek a tartózkodási helyéhez"</string>
+ <string name="pref_privacy_clear_geolocation_access" msgid="6649680770030042980">"Helyhozzáférés letiltása"</string>
+ <string name="pref_privacy_clear_geolocation_access_summary" msgid="7750143359497314679">"Helyhozzáférés letiltása minden webhelynél"</string>
+ <string name="pref_privacy_clear_geolocation_access_dlg" msgid="7327063124488827244">"Helyhozzáférés letiltása minden webhelynél"</string>
+ <string name="pref_security_title" msgid="5763978646932160021">"Biztonsági beállítások"</string>
+ <string name="pref_security_remember_passwords" msgid="6492957683454529549">"Jelszavak megjegyzése"</string>
+ <string name="pref_security_remember_passwords_summary" msgid="256388703356349137">"Menti a webhelyekhez tartozó felhasználóneveket és jelszavakat"</string>
+ <string name="pref_security_save_form_data" msgid="1213669802810198893">"Űrlapadatok megjegyzése"</string>
+ <string name="pref_security_save_form_data_summary" msgid="4994074685153708026">"Későbbi felhasználás céljából emlékezzen az űrlapokba beírt adatokra"</string>
+ <string name="pref_security_show_security_warning" msgid="8901135676266754559">"Biztonsági figyelmeztetések megjelenítése"</string>
+ <string name="pref_security_show_security_warning_summary" msgid="8968906112720511704">"Figyelmeztetés megjelenítése, ha gond van a webhely biztonságával"</string>
+ <string name="pref_security_accept_cookies" msgid="3201367661925047989">"Cookie-k fogadása"</string>
+ <string name="pref_security_accept_cookies_summary" msgid="1465118934875026920">"A webhelyek elmenthetnek és beolvashatnak \"cookie\"-adatokat"</string>
+ <string name="pref_text_size" msgid="3827031324346612208">"Szöveg mérete"</string>
+ <string-array name="pref_text_size_choices">
+ <item msgid="4952686548944739548">"Apró"</item>
+ <item msgid="1950030433642671460">"Kicsi"</item>
+ <item msgid="4338347520133294584">"Normál"</item>
+ <item msgid="5043128215356351184">"Nagy"</item>
+ <item msgid="7201512237890458902">"Óriási"</item>
+ </string-array>
+ <string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Szöveg mérete"</string>
+ <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>
+ <item msgid="5619034257768161024">"Közepes"</item>
+ <item msgid="3840999588443167001">"Közeli"</item>
+ </string-array>
+ <string name="pref_default_zoom_dialogtitle" msgid="6095974367125109021">"Alapértelmezett nagyítás"</string>
+ <string name="pref_content_load_page" msgid="2219810141690955452">"Oldalak megnyitása áttekintő nézetben"</string>
+ <string name="pref_content_load_page_summary" msgid="8792093504054149369">"Áttekintést ad az újonnan megnyitott oldalakról"</string>
+ <string name="pref_extras_title" msgid="3091250467679722382">"Speciális beállítások"</string>
+ <string name="pref_extras_website_settings" msgid="67866640052455549">"Webhelyek beállításai"</string>
+ <string name="pref_extras_website_settings_summary" msgid="1656771443223494406">"Speciális beállítások az egyes webhelyekhez"</string>
+ <string name="pref_extras_reset_default" msgid="8904000515846202110">"Visszaállítás alaphelyzetbe"</string>
+ <string name="pref_extras_reset_default_summary" msgid="4247870778270414501">"Alapértelmezett beállítások visszaállítása"</string>
+ <string name="pref_extras_reset_default_dlg" msgid="6640261575874704022">"A beállítások visszaállnak az alapértelmezett értékekre."</string>
+ <string name="pref_extras_reset_default_dlg_title" msgid="2250334970728938936">"Visszaállítás alaphelyzetbe"</string>
+ <string name="pref_development_title" msgid="3263854204533056480">"Hibakeresés"</string>
+ <string name="pref_default_text_encoding" msgid="5742965543955558478">"Szöveg kódolása"</string>
+ <!-- no translation found for pref_default_text_encoding_choices:7 (2193955365569270096) -->
+ <string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Szöveg kódolása"</string>
+ <string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"Adatkapcsolat-probléma"</string>
+ <string name="browserFrameFileErrorLabel" msgid="8063691502792670367">"Probléma van a fájllal"</string>
+ <string name="browserFrameFormResubmitLabel" msgid="2685923472682180360">"Megerősítés"</string>
+ <string name="browserFrameFormResubmitMessage" msgid="2752182215695632138">"A megtekinteni kívánt oldal már elküldött adatokat (\"POSTDATA\") is tartalmaz. Amennyiben újraküldi az adatokat, az oldalon lévő űrlappal kapcsolatos valamennyi művelet (például a keresés vagy az online vásárlás) újra végrehajtásra kerül."</string>
+ <string name="loadSuspendedTitle" msgid="675991625288706944">"Nincs hálózati kapcsolat"</string>
+ <string name="loadSuspended" msgid="3133656588880851273">"A böngésző nem tudja betölteni ezt az oldalt, mert nincs internetkapcsolat."</string>
+ <string name="clear_history" msgid="5998307092715979619">"Előzmények törlése"</string>
+ <string name="browser_history" msgid="1038987118290272525">"A közelmúltban meglátogatott oldalak"</string>
+ <string name="empty_history" msgid="8738772352308207274">"A böngészési előzmények listája üres."</string>
+ <string name="add_new_bookmark" msgid="8086367791400349049">"Könyvjelző hozzáadása..."</string>
+ <string name="add_bookmark_short" msgid="3783984330998103735">"Hozzáadás:"</string>
+ <string name="search_hint" msgid="4647356319916631820">"Keressen vagy írjon be egy URL-t"</string>
+ <string name="search_button_text" msgid="5235226933877634410">"Ugrás"</string>
+ <string name="search_settings_description" msgid="1422401062529014107">"Könyvjelzők és internetes előzmények"</string>
+ <string name="attention" msgid="3473639060042811244">"Figyelem"</string>
+ <string name="popup_window_attempt" msgid="2673111696288657989">"A webhely egy előugró ablakot próbál megnyitni."</string>
+ <string name="allow" msgid="1157313689171991335">"Engedélyezés"</string>
+ <string name="block" msgid="9172175889884707800">"Letiltás"</string>
+ <string name="too_many_windows_dialog_title" msgid="5175503564948906442">"Elérte a maximális ablakszámot"</string>
+ <string name="too_many_windows_dialog_message" msgid="1398571800233959583">"Nem lehet új ablakot megnyitni, mert már meg van nyitva a maximális számú ablak."</string>
+ <string name="too_many_subwindows_dialog_title" msgid="3805453941587725944">"Már van egy nyitott előugró ablak"</string>
+ <string name="too_many_subwindows_dialog_message" msgid="5827289829907966657">"Nem lehet új előugró ablakot megnyitni, mert egyszerre csak egy lehet megnyitva."</string>
+ <string name="download_title" msgid="2122874021047565594">"Letöltési előzmények"</string>
+ <string name="download_unknown_filename" msgid="4013465542563652175">"<Ismeretlen>"</string>
+ <string name="download_menu_open" msgid="4888327480367757513">"Megnyitás"</string>
+ <string name="download_menu_clear" msgid="6264454531553418124">"Törlés a listáról"</string>
+ <string name="download_menu_delete" msgid="8815502136393894148">"Törlés"</string>
+ <string name="download_menu_cancel" msgid="2545333007601851574">"Letöltés megszakítása"</string>
+ <string name="download_menu_cancel_all" msgid="2136550823151999166">"Minden letöltés megszakítása"</string>
+ <string name="download_cancel_dlg_title" msgid="8909108500262799748">"Letöltések megszakítása"</string>
+ <string name="download_cancel_dlg_msg" msgid="6285389170052357797">"Mind a(z) <xliff:g id="DOWNLOAD_COUNT">%d</xliff:g> letöltés megszakad és törlésre kerül a letöltési előzményekből."</string>
+ <string name="download_delete_file" msgid="5330036497843073249">"Fájl törlése"</string>
+ <string name="download_file_error_dlg_title" msgid="2693630283595384874">"Nincs elég hely"</string>
+ <string name="download_file_error_dlg_msg" msgid="5156405410324072471">"A(z) <xliff:g id="FILENAME">%s</xliff:g> nem tölthető le."\n"Szabadítson fel valamennyi tárhelyet a telefonján, majd próbálja meg újra."</string>
+ <string name="download_failed_generic_dlg_title" msgid="6106781095337833391">"A letöltés nem sikerült"</string>
+ <!-- outdated translation 605904452159416792 --> <string name="download_no_sdcard_dlg_title" product="nosdcard" msgid="56777245081568508">"Hiányzó SD-kártya"</string>
+ <string name="download_no_sdcard_dlg_title" product="default" msgid="605904452159416792">"Hiányzó SD-kártya"</string>
+ <!-- no translation found for download_no_sdcard_dlg_msg (3144652102051031721) -->
+ <skip />
+ <string name="download_no_sdcard_dlg_msg" product="default" msgid="2616399456116301518">"A(z) <xliff:g id="FILENAME">%s</xliff:g> letöltéséhez SD-kártya szükséges."</string>
+ <!-- outdated translation 6877712666046917741 --> <string name="download_sdcard_busy_dlg_title" product="nosdcard" msgid="8081445664689818973">"Az SD-kártya nem érhető el"</string>
+ <string name="download_sdcard_busy_dlg_title" product="default" msgid="6877712666046917741">"Az SD-kártya nem érhető el"</string>
+ <!-- outdated translation 3473883538192835204 --> <string name="download_sdcard_busy_dlg_msg" product="nosdcard" msgid="3979329954835690147">"Az SD-kártya dolgozik. A letöltések engedélyezéséhez válassza az \"USB-tár kikapcsolása\" lehetőséget."</string>
+ <string name="download_sdcard_busy_dlg_msg" product="default" msgid="3473883538192835204">"Az SD-kártya dolgozik. A letöltések engedélyezéséhez válassza az \"USB-tár kikapcsolása\" lehetőséget."</string>
+ <string name="download_no_application_title" msgid="1286056729168874295">"A fájlt nem lehet megnyitni"</string>
+ <string name="retry" msgid="1835923075542266721">"Újra"</string>
+ <string name="no_downloads" msgid="3947445710685021498">"A letöltési előzmények listája üres."</string>
+ <string name="download_error" msgid="413496839831257187">"A letöltés nem sikerült."</string>
+ <string name="download_success" msgid="2279041638155595203">"<xliff:g id="FILE">%s</xliff:g> letöltése befejeződött."</string>
+ <string name="download_running" msgid="2622942231322015059">"Letöltés..."</string>
+ <string name="download_pending" msgid="2599683668575349559">"Letöltés megkezdése..."</string>
+ <string name="download_pending_network" msgid="6548714525679461053">"Várakozás adatkapcsolatra..."</string>
+ <string name="download_running_paused" msgid="6418029352085656495">"Várakozás adatkapcsolatra..."</string>
+ <string name="download_canceled" msgid="6057083743144492515">"A letöltés megszakítva."</string>
+ <string name="download_not_acceptable" msgid="313769696131563652">"Nem lehet letölteni, mert a telefon nem támogatja ezt a tartalmat."</string>
+ <string name="download_file_error" msgid="1206648050615176113">"A letöltés nem fejezhető be, mert nincs elég hely."</string>
+ <string name="download_length_required" msgid="9038605488460437406">"Nem lehet letölteni. Az elem mérete nem állapítható meg."</string>
+ <string name="download_precondition_failed" msgid="8327584102874295580">"A letöltés megszakítva, nem lehet folytatni."</string>
+ <string name="search_the_web" msgid="6046130189241962337">"Keresés az interneten"</string>
+ <string name="webstorage_outofspace_notification_title" msgid="1160474608059771788">"A böngésző tárterülete megtelt"</string>
+ <string name="webstorage_outofspace_notification_text" msgid="7341075135051829692">"Kattintson terület felszabadításához."</string>
+ <string name="webstorage_clear_data_title" msgid="689484577124333977">"Tárolt adatok törlése"</string>
+ <string name="webstorage_clear_data_dialog_title" msgid="345457466368974706">"Tárolt adatok törlése"</string>
+ <string name="webstorage_clear_data_dialog_message" msgid="6678281256970470125">"A webhely által eltárolt összes adat törlésre kerül"</string>
+ <string name="webstorage_clear_data_dialog_ok_button" msgid="2516563534211898636">"Az összes törlése"</string>
+ <string name="webstorage_clear_data_dialog_cancel_button" msgid="2028867751958942762">"Mégse"</string>
+ <string name="webstorage_origin_summary_mb_stored" msgid="1985885826292236210">"MB tárolva a telefonján"</string>
+ <string name="loading_video" msgid="4887871585216091096">"Videó betöltése"</string>
+ <string name="geolocation_permissions_prompt_message" msgid="356796102004052471">"A(z) <xliff:g id="WEBSITE_ORIGIN">%s</xliff:g> meg akarja ismerni az Ön tartózkodási helyét"</string>
+ <string name="geolocation_permissions_prompt_share" msgid="9084486342048347976">"Hely megosztása"</string>
+ <string name="geolocation_permissions_prompt_dont_share" msgid="6303025160237860300">"Elutasítás"</string>
+ <string name="geolocation_permissions_prompt_remember" msgid="3118526300707348308">"A beállítás megjegyzése"</string>
+ <string name="geolocation_permissions_prompt_toast_allowed" msgid="987286072035125498">"A webhely hozzáfér a tartózkodási helyéhez. Ezt a Beállítások -> Webhely beállításai pontban módosíthatja"</string>
+ <string name="geolocation_permissions_prompt_toast_disallowed" msgid="7695100950212692515">"A webhely nem fér hozzá a tartózkodási helyéhez. Ezt a Beállítások -> Webhely beállításai pontban módosíthatja"</string>
+ <string name="geolocation_settings_page_title" msgid="1745477985097536528">"Helyhozzáférés letiltása"</string>
+ <string name="geolocation_settings_page_summary_allowed" msgid="9180251524290811398">"A webhely jelenleg hozzáférhet a tartózkodási helyéhez"</string>
+ <string name="geolocation_settings_page_summary_not_allowed" msgid="4589649082203102544">"A webhely jelenleg nem férhet hozzá a tartózkodási helyéhez"</string>
+ <string name="geolocation_settings_page_dialog_title" msgid="1549842043381347668">"Helyhozzáférés letiltása"</string>
+ <string name="geolocation_settings_page_dialog_message" msgid="7586671987576403993">"A webhely hozzáférése a tartózkodási helyhez letiltásra kerül"</string>
+ <string name="geolocation_settings_page_dialog_ok_button" msgid="4789434178048077287">"Hozzáférés letiltása"</string>
+ <string name="geolocation_settings_page_dialog_cancel_button" msgid="7941036504673409747">"Mégse"</string>
+ <string name="website_settings_clear_all" msgid="8739804325997655980">"Az összes törlése"</string>
+ <string name="website_settings_clear_all_dialog_title" msgid="7791826325122461718">"Törli az összes webhely beállítását?"</string>
+ <string name="website_settings_clear_all_dialog_message" msgid="6150502090601476333">"Minden webhelyadat és tartózkodási hellyel kapcsolatos engedély törlésre kerül."</string>
+ <string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"Minden adat törlése"</string>
+ <string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"Mégse"</string>
+ <string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"Háttérkép beállítása..."</string>
+ <!-- no translation found for defaultBookmarksUpButton (2303951020715704735) -->
+ <skip />
+ <!-- no translation found for empty_bookmarks_folder (7843361614634930942) -->
+ <skip />
+ <!-- no translation found for rlz_access_point (7165847807377650632) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_title (3325557652271172128) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_description (2187665745413495303) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_remove (8105572409059113340) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_import (6933613853573899218) -->
+ <skip />
+</resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
new file mode 100644
index 0000000..b8b8fd7
--- /dev/null
+++ b/res/values-in/strings.xml
@@ -0,0 +1,401 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2007 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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="application_name" msgid="1935869255545976415">"Peramban"</string>
+ <string name="choose_upload" msgid="3649366287575002063">"Pilih berkas untuk diunggah"</string>
+ <string name="new_tab" msgid="4505722538297295141">"Jendela baru"</string>
+ <!-- no translation found for new_incognito_tab (5821404839654751753) -->
+ <skip />
+ <string name="active_tabs" msgid="3050623868203544623">"Windows"</string>
+ <string name="tab_bookmarks" msgid="2305793036003473653">"Bookmark"</string>
+ <string name="tab_most_visited" msgid="1077402532455000703">"Paling sering dikunjungi"</string>
+ <string name="tab_history" msgid="1979267558744613746">"Riwayat"</string>
+ <string name="added_to_bookmarks" msgid="1020224130695956728">"Ditambahkan ke bookmark"</string>
+ <string name="removed_from_bookmarks" msgid="6063705902028438800">"Dihapus dari bookmark"</string>
+ <string name="sign_in_to" msgid="5939425800148759165">"Masuk ke <xliff:g id="HOSTNAME">%s1</xliff:g> \"<xliff:g id="REALM">%s2</xliff:g>\""</string>
+ <string name="username" msgid="5057566336518215922">"Nama"</string>
+ <string name="password" msgid="1177138552305184404">"Sandi"</string>
+ <string name="action" msgid="183105774472071343">"Masuk"</string>
+ <string name="bookmarks_search" msgid="5229596268214362873">"Peramban"</string>
+ <string name="cancel" msgid="3017274947407233702">"Batal"</string>
+ <string name="ok" msgid="1509280796718850364">"OK"</string>
+ <string name="title_bar_loading" msgid="7438217780834640678">"Memuat…"</string>
+ <string name="page_info" msgid="4048529256302257195">"Info laman"</string>
+ <string name="page_info_view" msgid="5303490449842635158">"Lihat info laman"</string>
+ <string name="page_info_address" msgid="2222306609532903254">"Alamat:"</string>
+ <string name="ssl_warnings_header" msgid="79744901983636370">"Ada masalah dengan sertifikat keamanan untuk situs ini."</string>
+ <string name="ssl_continue" msgid="8031515015829358457">"Lanjutkan"</string>
+ <string name="security_warning" msgid="6607795404322797541">"Peringatan sertifikat"</string>
+ <string name="view_certificate" msgid="1472768887529093862">"Lihat sertifikat"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
+ <string name="ssl_untrusted" msgid="5369967226521102194">"Sertifikat ini dari otoritas yang tidak dipercaya."</string>
+ <string name="ssl_mismatch" msgid="558688832420069896">"Nama situs tidak cocok dengan nama pada sertifikat."</string>
+ <string name="ssl_expired" msgid="5739349389499575559">"Sertifikat ini telah kedaluwarsa."</string>
+ <string name="ssl_not_yet_valid" msgid="2893167846212645846">"Sertifikat ini belum valid."</string>
+ <string name="ssl_certificate" msgid="5226747157992111668">"Sertifikat keamanan"</string>
+ <string name="ssl_certificate_is_valid" msgid="7096160815933145579">"Sertifikat ini valid."</string>
+ <string name="issued_to" msgid="9032338008819841339">"Diterbitkan ke:"</string>
+ <string name="common_name" msgid="5745530093500062357">"Nama umum:"</string>
+ <string name="org_name" msgid="8868889052889991293">"Organisasi:"</string>
+ <string name="org_unit" msgid="4489056376307768196">"Unit organisasi:"</string>
+ <string name="issued_by" msgid="6959484326943152487">"Diterbitkan oleh:"</string>
+ <string name="validity_period" msgid="57988851973181309">"Validitas:"</string>
+ <string name="issued_on" msgid="2082890654801808368">"Diterbitkan pada:"</string>
+ <string name="expires_on" msgid="8061200430557020704">"Kedaluwarsa pada:"</string>
+ <string name="stopping" msgid="4839698519340302982">"Menghentikan"</string>
+ <string name="stop" msgid="5687251076030630074">"Berhenti"</string>
+ <string name="reload" msgid="8585220783228408062">"Segarkan"</string>
+ <string name="back" msgid="8414603107175713668">"Kembali"</string>
+ <string name="forward" msgid="4288210890526641577">"Teruskan"</string>
+ <string name="save" msgid="5922311934992468496">"OK"</string>
+ <string name="do_not_save" msgid="6777633870113477714">"Batal"</string>
+ <!-- outdated translation 969988560160364559 --> <string name="location" msgid="3411848697912600125">"Lokasi"</string>
+ <!-- no translation found for containing_folder (6771180232953030479) -->
+ <skip />
+ <!-- no translation found for new_folder (7743540149088867917) -->
+ <skip />
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <!-- no translation found for no_subfolders (5880411440592452802) -->
+ <skip />
+ <!-- no translation found for add_to_bookmarks_menu_option (4449323955122214389) -->
+ <skip />
+ <!-- no translation found for add_to_homescreen_menu_option (1461447829242963790) -->
+ <skip />
+ <!-- no translation found for add_to_other_folder_menu_option (5450890093372998187) -->
+ <skip />
+ <!-- outdated translation 5990326151488445481 --> <string name="name" msgid="5462672162695365387">"Nama"</string>
+ <string name="http" msgid="2163722670597250102">"http://"</string>
+ <!-- outdated translation 588165100024086565 --> <string name="save_to_bookmarks" msgid="6101482434920313244">"Tambahkan bookmark"</string>
+ <!-- no translation found for bookmark_this_page (7530739804320811054) -->
+ <skip />
+ <string name="edit_bookmark" msgid="5024089053490231905">"Edit bookmark"</string>
+ <!-- outdated translation 9202323987633899835 --> <string name="create_shortcut_bookmark" msgid="1995095662095484289">"Tambahkan pintasan ke Beranda"</string>
+ <string name="open_bookmark" msgid="8473581305759935790">"Buka"</string>
+ <string name="remove_bookmark" msgid="8407495852801410891">"Hapus bookmark"</string>
+ <string name="remove_from_bookmarks" msgid="4374080666576982775">"Hapus dari bookmark"</string>
+ <string name="remove_history_item" msgid="5021424935726728618">"Hapus dari riwayat"</string>
+ <string name="set_as_homepage" msgid="4752937379414905560">"Setel sebagai beranda"</string>
+ <string name="bookmark_saved" msgid="2766434679871317557">"Telah disimpan ke bookmark."</string>
+ <string name="bookmark_not_saved" msgid="700600955089376724">"Tidak dapat menyimpan bookmark"</string>
+ <string name="homepage_set" msgid="8768087280310966395">"Beranda telah ditetapkan."</string>
+ <string name="bookmark_needs_title" msgid="6245900436119218187">"Bookmark harus memiliki nama."</string>
+ <string name="bookmark_needs_url" msgid="7809876865972755158">"Bookmark harus memiliki lokasi."</string>
+ <string name="bookmark_url_not_valid" msgid="6719785633980202419">"URL tidak valid."</string>
+ <string name="bookmark_cannot_save_url" msgid="791722768778386941">"URL ini tidak dapat di-bookmark."</string>
+ <string name="delete_bookmark" msgid="2422989994934201992">"Hapus"</string>
+ <string name="bookmark_page" msgid="6845189305130307274">"Bookmark laman yang terakhir dilihat."</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
+ <string name="current_page" msgid="7510129573681663135">"dari "</string>
+ <string name="delete_bookmark_warning" msgid="758043186202032205">"Bookmark \"<xliff:g id="BOOKMARK">%s</xliff:g>\" akan dihapus."</string>
+ <string name="open_in_new_window" msgid="6596775546468054510">"Buka di jendela baru"</string>
+ <string name="goto_dot" msgid="3895839050522602723">"Buka"</string>
+ <!-- no translation found for incognito_tab (5419458065370134289) -->
+ <skip />
+ <string name="select_dot" msgid="6299170761900561967">"Pilih teks"</string>
+ <string name="tab_picker_title" msgid="864478399057782913">"Jendela saat ini"</string>
+ <string name="tab_picker_remove_tab" msgid="630087809802479397">"Tutup"</string>
+ <string name="bookmarks" msgid="1961279134885867815">"Bookmark"</string>
+ <string name="shortcut_bookmark" msgid="3974876480401135895">"Bookmark"</string>
+ <string name="history" msgid="2451240511251410032">"Riwayat"</string>
+ <string name="menu_view_download" msgid="2124570321712995120">"Unduhan"</string>
+ <string name="copy_page_url" msgid="7635062169011319208">"Salin URL laman"</string>
+ <string name="share_page" msgid="593756995297268343">"Bagikan lama"</string>
+ <!-- no translation found for menu_save_webarchive (3934652434001459581) -->
+ <skip />
+ <!-- no translation found for webarchive_saved (7045250341467345007) -->
+ <skip />
+ <!-- no translation found for webarchive_failed (2880998204746620260) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
+ <string name="contextmenu_openlink" msgid="7237961252214188935">"Buka"</string>
+ <string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"Buka di jendela baru"</string>
+ <string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"Bookmark tautan"</string>
+ <string name="contextmenu_savelink" msgid="5508554930832538184">"Simpan tautan"</string>
+ <string name="contextmenu_sharelink" msgid="5392275392280130331">"Bagikan tautan"</string>
+ <string name="contextmenu_copy" msgid="398860586635404030">"Salin"</string>
+ <string name="contextmenu_copylink" msgid="5153657160294534270">"Salin URL tautan"</string>
+ <string name="contextmenu_download_image" msgid="4243829645180686912">"Simpan gambar"</string>
+ <string name="contextmenu_view_image" msgid="3870625602053600905">"Lihat gambar"</string>
+ <string name="contextmenu_set_wallpaper" msgid="3691902960115350686">"Setel sebagai wallpaper"</string>
+ <string name="contextmenu_dial_dot" msgid="5856550683415933806">"Panggil..."</string>
+ <string name="contextmenu_add_contact" msgid="3183511922223645716">"Tambahkan kenalan"</string>
+ <string name="contextmenu_send_mail" msgid="1014513374828775660">"Kirim email"</string>
+ <string name="contextmenu_map" msgid="7471390435434034912">"Peta"</string>
+ <string name="choosertitle_sharevia" msgid="4600490613341909086">"Bagikan melalui"</string>
+ <string name="clear" msgid="7070043081700011461">"Bersihkan"</string>
+ <string name="replace" msgid="4843033491070384047">"Ganti"</string>
+ <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Bookmark"</string>
+ <string name="menu_preferences" msgid="6709237687234102240">"Setelan"</string>
+ <string name="pref_content_title" msgid="722227111894838633">"Setelan konten laman"</string>
+ <string name="pref_content_load_images" msgid="2125616852957377561">"Muat gambar"</string>
+ <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Tampilkan gambar pada laman web"</string>
+ <string name="pref_content_block_popups" msgid="7808433807197256726">"Cekal jendela munculan"</string>
+ <string name="pref_content_javascript" msgid="4570972030299516843">"Aktifkan JavaScript"</string>
+ <string name="pref_content_open_in_background" msgid="824123779725118663">"Buka di latar belakang"</string>
+ <string name="pref_content_plugins" msgid="7231944644794301582">"Aktifkan pengaya"</string>
+ <string-array name="pref_content_plugins_choices">
+ <item msgid="6745108155096660725">"Selalu hidup"</item>
+ <item msgid="2484126708670016519">"Sesuai permintaan"</item>
+ <item msgid="8547442717307793863">"Mati"</item>
+ </string-array>
+ <string name="pref_content_open_in_background_summary" msgid="1737664075721181678">"Buka jendela baru di belakang jendela ini"</string>
+ <string name="pref_content_homepage" msgid="6082437160778559806">"Setel beranda"</string>
+ <!-- no translation found for pref_content_search_engine (1620101310821644144) -->
+ <skip />
+ <!-- no translation found for pref_content_search_engine_summary (5162667665858487316) -->
+ <skip />
+ <!-- no translation found for pref_set_homepage_to (7196350233061395098) -->
+ <skip />
+ <!-- outdated translation 1493179933653044553 --> <string name="pref_use_current" msgid="1778622474040406672">"Gunakan laman ini"</string>
+ <!-- no translation found for pref_use_blank (8503238592551111169) -->
+ <skip />
+ <!-- no translation found for pref_use_default (192587563274735878) -->
+ <skip />
+ <string name="pref_content_autofit" msgid="8260474534053660809">"Sesuaikan dengan laman secara otomatis"</string>
+ <string name="pref_content_autofit_summary" msgid="4587831659894879986">"Format laman web agar sesuai dengan layar"</string>
+ <!-- no translation found for pref_personal_title (1447687455755683695) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome (1695182180332194033) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome_summary (7414133931827321055) -->
+ <skip />
+ <!-- no translation found for pref_personal_google_account (952360133341490071) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks (59237515966184432) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks_summary (4791767605662205482) -->
+ <skip />
+ <!-- no translation found for pref_personal_start_syncing (6046972042512655232) -->
+ <skip />
+ <!-- no translation found for pref_personal_account_dialog_title (1390867119887955530) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled (1174197447388234595) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled_summary (422640696197018914) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor (1350709161524642663) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor_summary (6748434431641768870) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_name (8566130291459685955) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_email_address (7967585896612797173) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_company_name (2813443159949210417) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1 (836433242509243081) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1_hint (5965659598509327172) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2 (8194745202893822479) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2_hint (2048330295853546405) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_city (4193225955409148508) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_state (8549739922338171458) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_zip_code (283668573295656671) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_country (7234470301239156656) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_phone_number (4938852821413729276) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_save_profile (8349915287435262888) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_save (6834102203944938409) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_delete (2421442112954362732) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_delete_profile (7112035941146003753) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
+ <string name="pref_privacy_title" msgid="1052470980370846151">"Setelan privasi"</string>
+ <string name="pref_privacy_clear_cache" msgid="3380316479925886998">"Hapus tembolok"</string>
+ <string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"Hapus konten dan database yang disimpan dalam tembolok secara lokal"</string>
+ <string name="pref_privacy_clear_cache_dlg" msgid="5541011591300753881">"Konten dan database yang disimpan dalam tembolok secara lokal akan dihapus."</string>
+ <string name="pref_privacy_clear_cookies" msgid="3095583579133780331">"Hapus semua data kuki"</string>
+ <string name="pref_privacy_clear_cookies_summary" msgid="6962742063990677520">"Hapus semua kuki peramban"</string>
+ <string name="pref_privacy_clear_cookies_dlg" msgid="552855688091432682">"Semua kuki akan dihapus."</string>
+ <string name="pref_privacy_clear_history" msgid="8723795508825198477">"Hapus riwayat"</string>
+ <string name="pref_privacy_clear_history_summary" msgid="6868501330708940734">"Hapus riwayat navigasi peramban"</string>
+ <string name="pref_privacy_clear_history_dlg" msgid="544903007914753853">"Riwayat navigasi peramban akan dihapus."</string>
+ <string name="pref_privacy_clear_form_data" msgid="4232668196344383987">"Hapus data formulir"</string>
+ <string name="pref_privacy_clear_form_data_summary" msgid="1790390894719517167">"Hapus semua data formulir tersimpan"</string>
+ <string name="pref_privacy_clear_form_data_dlg" msgid="4443621086781197928">"Semua data formulir yang tersimpan akan dihapus."</string>
+ <string name="pref_privacy_clear_passwords" msgid="4750234112289277480">"Hapus sandi"</string>
+ <string name="pref_privacy_clear_passwords_summary" msgid="8856782718942903335">"Hapus semua sandi tersimpan"</string>
+ <string name="pref_privacy_clear_passwords_dlg" msgid="2083869328824248255">"Semua data sandi yang tersimpan akan dihapus."</string>
+ <string name="pref_privacy_enable_geolocation" msgid="1395040170290765686">"Aktifkan lokasi"</string>
+ <string name="pref_privacy_enable_geolocation_summary" msgid="8437020934664306205">"Izinkan situs meminta akses ke lokasi Anda"</string>
+ <string name="pref_privacy_clear_geolocation_access" msgid="6649680770030042980">"Hapus akses lokasi"</string>
+ <string name="pref_privacy_clear_geolocation_access_summary" msgid="7750143359497314679">"Hapus akses lokasi untuk semua situs web"</string>
+ <string name="pref_privacy_clear_geolocation_access_dlg" msgid="7327063124488827244">"Hapus akses lokasi untuk semua situs web"</string>
+ <string name="pref_security_title" msgid="5763978646932160021">"Setelan sertifikat"</string>
+ <string name="pref_security_remember_passwords" msgid="6492957683454529549">"Ingat sandi"</string>
+ <string name="pref_security_remember_passwords_summary" msgid="256388703356349137">"Simpan nama pengguna dan sandi untuk situs web"</string>
+ <string name="pref_security_save_form_data" msgid="1213669802810198893">"Ingat data formulir"</string>
+ <string name="pref_security_save_form_data_summary" msgid="4994074685153708026">"Ingat data yang saya ketik untuk digunakan lagi nanti"</string>
+ <string name="pref_security_show_security_warning" msgid="8901135676266754559">"Tampilkan peringatan keamanan"</string>
+ <string name="pref_security_show_security_warning_summary" msgid="8968906112720511704">"Tampilkan peringatan jika ada masalah dengan keamanan situs"</string>
+ <string name="pref_security_accept_cookies" msgid="3201367661925047989">"Terima kuki"</string>
+ <string name="pref_security_accept_cookies_summary" msgid="1465118934875026920">"Izinkan situs menyimpan dan membaca data \"kuki\""</string>
+ <string name="pref_text_size" msgid="3827031324346612208">"Ukuran teks"</string>
+ <string-array name="pref_text_size_choices">
+ <item msgid="4952686548944739548">"Kecil"</item>
+ <item msgid="1950030433642671460">"Kecil"</item>
+ <item msgid="4338347520133294584">"Normal"</item>
+ <item msgid="5043128215356351184">"Besar"</item>
+ <item msgid="7201512237890458902">"Sangat besar"</item>
+ </string-array>
+ <string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Ukuran teks"</string>
+ <string name="pref_default_zoom" msgid="8076142259097187395">"Zoom bawaan"</string>
+ <string-array name="pref_default_zoom_choices">
+ <item msgid="549583171195154919">"Jauh"</item>
+ <item msgid="5619034257768161024">"Sedang"</item>
+ <item msgid="3840999588443167001">"Tutup"</item>
+ </string-array>
+ <string name="pref_default_zoom_dialogtitle" msgid="6095974367125109021">"Zoom bawaan"</string>
+ <string name="pref_content_load_page" msgid="2219810141690955452">"Buka laman di ikhtisar"</string>
+ <string name="pref_content_load_page_summary" msgid="8792093504054149369">"Tampilkan ikhtisar laman yang baru dibuka"</string>
+ <string name="pref_extras_title" msgid="3091250467679722382">"Setelan lanjutan"</string>
+ <string name="pref_extras_website_settings" msgid="67866640052455549">"Setelan situs web"</string>
+ <string name="pref_extras_website_settings_summary" msgid="1656771443223494406">"Setelan lanjutan untuk masing-masing situs web"</string>
+ <string name="pref_extras_reset_default" msgid="8904000515846202110">"Setel ulang ke bawaan"</string>
+ <string name="pref_extras_reset_default_summary" msgid="4247870778270414501">"Pulihkan setelan bawaan"</string>
+ <string name="pref_extras_reset_default_dlg" msgid="6640261575874704022">"Setelan akan kembali ke nilai bawaan."</string>
+ <string name="pref_extras_reset_default_dlg_title" msgid="2250334970728938936">"Setel ulang ke bawaan"</string>
+ <string name="pref_development_title" msgid="3263854204533056480">"Debug"</string>
+ <string name="pref_default_text_encoding" msgid="5742965543955558478">"Penyandiaksaraan teks"</string>
+ <!-- no translation found for pref_default_text_encoding_choices:7 (2193955365569270096) -->
+ <string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Penyandiaksaraan teks"</string>
+ <string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"Masalah konektivitas data"</string>
+ <string name="browserFrameFileErrorLabel" msgid="8063691502792670367">"Masalah dengan berkas"</string>
+ <string name="browserFrameFormResubmitLabel" msgid="2685923472682180360">"Konfirmasi"</string>
+ <string name="browserFrameFormResubmitMessage" msgid="2752182215695632138">"Laman yang Anda coba lihat berisi data yang telah dikirimkan (\"POSTDATA\"). Jika Anda mengirimkan ulang data, tindakan apa pun berupa pengisian formulir pada laman (seperti penelusuran atau pembelian daring) akan diulangi."</string>
+ <string name="loadSuspendedTitle" msgid="675991625288706944">"Tidak ada sambungan"</string>
+ <string name="loadSuspended" msgid="3133656588880851273">"Peramban tidak dapat memuat laman ini karena tidak ada sambungan internet."</string>
+ <string name="clear_history" msgid="5998307092715979619">"Hapus riwayat"</string>
+ <string name="browser_history" msgid="1038987118290272525">"Laman yang baru dikunjungi"</string>
+ <string name="empty_history" msgid="8738772352308207274">"Riwayat peramban kosong."</string>
+ <string name="add_new_bookmark" msgid="8086367791400349049">"Tambahkan bookmark..."</string>
+ <string name="add_bookmark_short" msgid="3783984330998103735">"Tambahkan"</string>
+ <string name="search_hint" msgid="4647356319916631820">"Telusuri atau ketik URL"</string>
+ <string name="search_button_text" msgid="5235226933877634410">"Buka"</string>
+ <string name="search_settings_description" msgid="1422401062529014107">"Bookmark dan riwayat web"</string>
+ <string name="attention" msgid="3473639060042811244">"Perhatian"</string>
+ <string name="popup_window_attempt" msgid="2673111696288657989">"Situs ini mencoba membuka jendela munculan."</string>
+ <string name="allow" msgid="1157313689171991335">"Izinkan"</string>
+ <string name="block" msgid="9172175889884707800">"Cekal"</string>
+ <string name="too_many_windows_dialog_title" msgid="5175503564948906442">"Batas jendela tercapai"</string>
+ <string name="too_many_windows_dialog_message" msgid="1398571800233959583">"Tidak dapat membuka jendela baru karena Anda sudah membuka jendela hingga jumlah maksimum."</string>
+ <string name="too_many_subwindows_dialog_title" msgid="3805453941587725944">"Munculan sudah terbuka"</string>
+ <string name="too_many_subwindows_dialog_message" msgid="5827289829907966657">"Tidak dapat membuka jendela munculan baru karena hanya satu yang dapat dibuka kapan saja."</string>
+ <string name="download_title" msgid="2122874021047565594">"Riwayat unduhan"</string>
+ <string name="download_unknown_filename" msgid="4013465542563652175">"<Tidak diketahui>"</string>
+ <string name="download_menu_open" msgid="4888327480367757513">"Buka"</string>
+ <string name="download_menu_clear" msgid="6264454531553418124">"Hapus dari daftar"</string>
+ <string name="download_menu_delete" msgid="8815502136393894148">"Hapus"</string>
+ <string name="download_menu_cancel" msgid="2545333007601851574">"Batalkan unduhan"</string>
+ <string name="download_menu_cancel_all" msgid="2136550823151999166">"Batalkan semua unduhan"</string>
+ <string name="download_cancel_dlg_title" msgid="8909108500262799748">"Batalkan unduhan"</string>
+ <string name="download_cancel_dlg_msg" msgid="6285389170052357797">"Semua <xliff:g id="DOWNLOAD_COUNT">%d</xliff:g> unduhan akan dibatalkan dan dihapus dari riwayat unduhan."</string>
+ <string name="download_delete_file" msgid="5330036497843073249">"Berkas akan dihapus"</string>
+ <string name="download_file_error_dlg_title" msgid="2693630283595384874">"Kehabisan ruang penyimpanan"</string>
+ <string name="download_file_error_dlg_msg" msgid="5156405410324072471">"<xliff:g id="FILENAME">%s</xliff:g> tidak dapat diunduh."\n"Kosongkan sebagian ruangan pada ponsel dan coba lagi."</string>
+ <string name="download_failed_generic_dlg_title" msgid="6106781095337833391">"Unduh gagal"</string>
+ <!-- outdated translation 605904452159416792 --> <string name="download_no_sdcard_dlg_title" product="nosdcard" msgid="56777245081568508">"Tidak ada kartu SD"</string>
+ <string name="download_no_sdcard_dlg_title" product="default" msgid="605904452159416792">"Tidak ada kartu SD"</string>
+ <!-- no translation found for download_no_sdcard_dlg_msg (3144652102051031721) -->
+ <skip />
+ <string name="download_no_sdcard_dlg_msg" product="default" msgid="2616399456116301518">"Kartu SD diperlukan untuk mengunduh <xliff:g id="FILENAME">%s</xliff:g>."</string>
+ <!-- outdated translation 6877712666046917741 --> <string name="download_sdcard_busy_dlg_title" product="nosdcard" msgid="8081445664689818973">"Kartu SD tidak tersedia"</string>
+ <string name="download_sdcard_busy_dlg_title" product="default" msgid="6877712666046917741">"Kartu SD tidak tersedia"</string>
+ <!-- outdated translation 3473883538192835204 --> <string name="download_sdcard_busy_dlg_msg" product="nosdcard" msgid="3979329954835690147">"Kartu SD sibuk. Untuk mengizinkan unduhan, pilih \"Matikan penyimpanan USB\" pada pemberitahuan."</string>
+ <string name="download_sdcard_busy_dlg_msg" product="default" msgid="3473883538192835204">"Kartu SD sibuk. Untuk mengizinkan unduhan, pilih \"Matikan penyimpanan USB\" pada pemberitahuan."</string>
+ <string name="download_no_application_title" msgid="1286056729168874295">"Tidak dapat membuka berkas"</string>
+ <string name="retry" msgid="1835923075542266721">"Coba Lagi"</string>
+ <string name="no_downloads" msgid="3947445710685021498">"Riwayat unduhan kosong."</string>
+ <string name="download_error" msgid="413496839831257187">"Unduhan gagal."</string>
+ <string name="download_success" msgid="2279041638155595203">"Unduhan <xliff:g id="FILE">%s</xliff:g> selesai"</string>
+ <string name="download_running" msgid="2622942231322015059">"Mengunduh..."</string>
+ <string name="download_pending" msgid="2599683668575349559">"Memulai unduhan..."</string>
+ <string name="download_pending_network" msgid="6548714525679461053">"Menunggu sambungan data..."</string>
+ <string name="download_running_paused" msgid="6418029352085656495">"Menunggu sambungan data..."</string>
+ <string name="download_canceled" msgid="6057083743144492515">"Unduhan dibatalkan."</string>
+ <string name="download_not_acceptable" msgid="313769696131563652">"Tidak dapat mengunduh. Konten tidak didukung pada ponsel ini."</string>
+ <string name="download_file_error" msgid="1206648050615176113">"Tidak dapat menyelesaikan unduhan. Ruang penyimpanan tidak cukup."</string>
+ <string name="download_length_required" msgid="9038605488460437406">"Tidak dapat mengunduh. Ukuran item tidak dapat ditentukan."</string>
+ <string name="download_precondition_failed" msgid="8327584102874295580">"Unduhan terputus. Tidak dapat dilanjutkan."</string>
+ <string name="search_the_web" msgid="6046130189241962337">"Telusuri web"</string>
+ <string name="webstorage_outofspace_notification_title" msgid="1160474608059771788">"Penyimpanan peramban penuh"</string>
+ <string name="webstorage_outofspace_notification_text" msgid="7341075135051829692">"Klik untuk mengosongkan ruang penyimpanan."</string>
+ <string name="webstorage_clear_data_title" msgid="689484577124333977">"Hapus data tersimpan"</string>
+ <string name="webstorage_clear_data_dialog_title" msgid="345457466368974706">"Hapus data tersimpan"</string>
+ <string name="webstorage_clear_data_dialog_message" msgid="6678281256970470125">"Semua data yang disimpan oleh situs web ini akan dihapus"</string>
+ <string name="webstorage_clear_data_dialog_ok_button" msgid="2516563534211898636">"Hapus semua"</string>
+ <string name="webstorage_clear_data_dialog_cancel_button" msgid="2028867751958942762">"Batal"</string>
+ <string name="webstorage_origin_summary_mb_stored" msgid="1985885826292236210">"MB yang disimpan pada ponsel Anda"</string>
+ <string name="loading_video" msgid="4887871585216091096">"Memuat video"</string>
+ <string name="geolocation_permissions_prompt_message" msgid="356796102004052471">"<xliff:g id="WEBSITE_ORIGIN">%s</xliff:g> ingin tahu lokasi Anda"</string>
+ <string name="geolocation_permissions_prompt_share" msgid="9084486342048347976">"Bagikan lokasi"</string>
+ <string name="geolocation_permissions_prompt_dont_share" msgid="6303025160237860300">"Tolak"</string>
+ <string name="geolocation_permissions_prompt_remember" msgid="3118526300707348308">"Ingat preferensi"</string>
+ <string name="geolocation_permissions_prompt_toast_allowed" msgid="987286072035125498">"Situs ini dapat mengakses lokasi Anda. Ubah ini pada Setelan -> Setelan situs web"</string>
+ <string name="geolocation_permissions_prompt_toast_disallowed" msgid="7695100950212692515">"Situs ini tidak dapat mengakses lokasi Anda. Ubah ini pada Setelan -> Setelan situs web"</string>
+ <string name="geolocation_settings_page_title" msgid="1745477985097536528">"Hapus akses lokasi"</string>
+ <string name="geolocation_settings_page_summary_allowed" msgid="9180251524290811398">"Saat ini situs ini dapat mengakses lokasi Anda"</string>
+ <string name="geolocation_settings_page_summary_not_allowed" msgid="4589649082203102544">"Saat ini situs ini tidak dapat mengakses lokasi Anda"</string>
+ <string name="geolocation_settings_page_dialog_title" msgid="1549842043381347668">"Hapus akses lokasi"</string>
+ <string name="geolocation_settings_page_dialog_message" msgid="7586671987576403993">"Akses lokasi untuk situs web ini akan dihapus"</string>
+ <string name="geolocation_settings_page_dialog_ok_button" msgid="4789434178048077287">"Hapus akses"</string>
+ <string name="geolocation_settings_page_dialog_cancel_button" msgid="7941036504673409747">"Batal"</string>
+ <string name="website_settings_clear_all" msgid="8739804325997655980">"Hapus semua"</string>
+ <string name="website_settings_clear_all_dialog_title" msgid="7791826325122461718">"Hapus semua setelan situs web?"</string>
+ <string name="website_settings_clear_all_dialog_message" msgid="6150502090601476333">"Semua data situs web dan izin lokasi akan dihapus."</string>
+ <string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"Hapus semua data"</string>
+ <string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"Batal"</string>
+ <string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"Menyetel wallpaper..."</string>
+ <!-- no translation found for defaultBookmarksUpButton (2303951020715704735) -->
+ <skip />
+ <!-- no translation found for empty_bookmarks_folder (7843361614634930942) -->
+ <skip />
+ <!-- no translation found for rlz_access_point (7165847807377650632) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_title (3325557652271172128) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_description (2187665745413495303) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_remove (8105572409059113340) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_import (6933613853573899218) -->
+ <skip />
+</resources>
diff --git a/res/values-it-xlarge/strings.xml b/res/values-it-xlarge/strings.xml
new file mode 100644
index 0000000..c626430
--- /dev/null
+++ b/res/values-it-xlarge/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="new_tab" msgid="7275656655054293038">"Nuova scheda"</string>
+ <string name="new_incognito_tab" msgid="5149742197322201152">"Nuova scheda in incognito"</string>
+ <string name="active_tabs" msgid="5324492165541331128">"Schede"</string>
+</resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index dfd2327..9ade179 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -19,6 +19,7 @@
<string name="application_name" msgid="1935869255545976415">"Browser"</string>
<string name="choose_upload" msgid="3649366287575002063">"Scegli il file per il caricamento"</string>
<string name="new_tab" msgid="4505722538297295141">"Nuova finestra"</string>
+ <string name="new_incognito_tab" msgid="5821404839654751753">"Nuova finestra in incognito"</string>
<string name="active_tabs" msgid="3050623868203544623">"Finestre"</string>
<string name="tab_bookmarks" msgid="2305793036003473653">"Segnalibri"</string>
<string name="tab_most_visited" msgid="1077402532455000703">"I più visitati"</string>
@@ -32,12 +33,6 @@
<string name="bookmarks_search" msgid="5229596268214362873">"Browser"</string>
<string name="cancel" msgid="3017274947407233702">"Annulla"</string>
<string name="ok" msgid="1509280796718850364">"OK"</string>
- <plurals name="matches_found">
- <item quantity="zero" msgid="6242659159545399963">"Nessuna corrispondenza"</item>
- <item quantity="one" msgid="4352019729062956802">"1 corrispondenza"</item>
- <item quantity="few" msgid="5544267486978946555">"<xliff:g id="NUMBER">%d</xliff:g> corrispondenze"</item>
- <item quantity="other" msgid="6616125067364315405">"<xliff:g id="NUMBER">%d</xliff:g> corrispondenze"</item>
- </plurals>
<string name="title_bar_loading" msgid="7438217780834640678">"Caricamento..."</string>
<string name="page_info" msgid="4048529256302257195">"Info pagina"</string>
<string name="page_info_view" msgid="5303490449842635158">"Visualizza info pagina"</string>
@@ -46,6 +41,8 @@
<string name="ssl_continue" msgid="8031515015829358457">"Continua"</string>
<string name="security_warning" msgid="6607795404322797541">"Avviso di protezione"</string>
<string name="view_certificate" msgid="1472768887529093862">"Visualizza certificato"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
<string name="ssl_untrusted" msgid="5369967226521102194">"Questo certificato non proviene da un\'autorità attendibile."</string>
<string name="ssl_mismatch" msgid="558688832420069896">"Il nome del sito non corrisponde al nome nel certificato."</string>
<string name="ssl_expired" msgid="5739349389499575559">"Il certificato è scaduto."</string>
@@ -67,12 +64,23 @@
<string name="forward" msgid="4288210890526641577">"Avanti"</string>
<string name="save" msgid="5922311934992468496">"OK"</string>
<string name="do_not_save" msgid="6777633870113477714">"Annulla"</string>
- <string name="location" msgid="969988560160364559">"URL"</string>
- <string name="name" msgid="5990326151488445481">"Nome"</string>
+ <string name="location" msgid="3411848697912600125">"Indirizzo"</string>
+ <string name="containing_folder" msgid="6771180232953030479">"Aggiungi a"</string>
+ <string name="new_folder" msgid="7743540149088867917">"Nuova cartella"</string>
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <string name="no_subfolders" msgid="5880411440592452802">"Nessuna sottocartella"</string>
+ <string name="add_to_bookmarks_menu_option" msgid="4449323955122214389">"Segnalibri"</string>
+ <string name="add_to_homescreen_menu_option" msgid="1461447829242963790">"Schermata Home"</string>
+ <string name="add_to_other_folder_menu_option" msgid="5450890093372998187">"Altra cartella…"</string>
+ <string name="name" msgid="5462672162695365387">"Etichetta"</string>
<string name="http" msgid="2163722670597250102">"http://"</string>
- <string name="save_to_bookmarks" msgid="588165100024086565">"Aggiungi segnalibro"</string>
+ <string name="save_to_bookmarks" msgid="6101482434920313244">"Aggiungi ai segnalibri"</string>
+ <string name="bookmark_this_page" msgid="7530739804320811054">"Aggiungi pagina ai segnalibri"</string>
<string name="edit_bookmark" msgid="5024089053490231905">"Modifica segnalibro"</string>
- <string name="create_shortcut_bookmark" msgid="9202323987633899835">"Aggiungi scorciatoia su Home"</string>
+ <string name="create_shortcut_bookmark" msgid="1995095662095484289">"Aggiungi scorciatoia a Home"</string>
<string name="open_bookmark" msgid="8473581305759935790">"Apri"</string>
<string name="remove_bookmark" msgid="8407495852801410891">"Elimina segnalibro"</string>
<string name="remove_from_bookmarks" msgid="4374080666576982775">"Rimuovi dai segnalibri"</string>
@@ -87,13 +95,15 @@
<string name="bookmark_cannot_save_url" msgid="791722768778386941">"L\'URL non può essere aggiunto ai segnalibri."</string>
<string name="delete_bookmark" msgid="2422989994934201992">"Elimina"</string>
<string name="bookmark_page" msgid="6845189305130307274">"Aggiungi ultima pagina visualizzata ai segnalibri"</string>
- <string name="switch_to_thumbnails" msgid="5493351529609043151">"Visualizzazione miniatura"</string>
- <string name="switch_to_list" msgid="8900531247982121055">"Visualizzazione elenco"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
<string name="current_page" msgid="7510129573681663135">"da "</string>
<string name="delete_bookmark_warning" msgid="758043186202032205">"Il segnalibro \"<xliff:g id="BOOKMARK">%s</xliff:g>\" verrà eliminato."</string>
<string name="open_in_new_window" msgid="6596775546468054510">"Apri in nuova finestra"</string>
<string name="goto_dot" msgid="3895839050522602723">"Vai"</string>
- <string name="find_dot" msgid="6259312434696611957">"Trova nella pagina"</string>
+ <string name="incognito_tab" msgid="5419458065370134289">"Apri nuova scheda in incognito"</string>
<string name="select_dot" msgid="6299170761900561967">"Seleziona testo"</string>
<string name="tab_picker_title" msgid="864478399057782913">"Finestre correnti"</string>
<string name="tab_picker_remove_tab" msgid="630087809802479397">"Chiudi"</string>
@@ -103,6 +113,13 @@
<string name="menu_view_download" msgid="2124570321712995120">"Download"</string>
<string name="copy_page_url" msgid="7635062169011319208">"Copia URL della pagina"</string>
<string name="share_page" msgid="593756995297268343">"Condividi pagina"</string>
+ <string name="menu_save_webarchive" msgid="3934652434001459581">"Salva come archivio web"</string>
+ <string name="webarchive_saved" msgid="7045250341467345007">"Archivio web salvato"</string>
+ <string name="webarchive_failed" msgid="2880998204746620260">"Salvataggio archivio web non riuscito."</string>
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
<string name="contextmenu_openlink" msgid="7237961252214188935">"Apri"</string>
<string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"Apri in nuova finestra"</string>
<string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"Aggiungi link in segnalibri"</string>
@@ -138,11 +155,44 @@
<string name="pref_content_homepage" msgid="6082437160778559806">"Imposta home page"</string>
<string name="pref_content_search_engine" msgid="1620101310821644144">"Imposta motore di ricerca"</string>
<string name="pref_content_search_engine_summary" msgid="5162667665858487316">"Seleziona un motore di ricerca"</string>
- <string name="pref_use_current" msgid="1493179933653044553">"Utilizza pagina corrente"</string>
+ <string name="pref_set_homepage_to" msgid="7196350233061395098">"Imposta su..."</string>
+ <string name="pref_use_current" msgid="1778622474040406672">"Pagina corrente"</string>
+ <string name="pref_use_blank" msgid="8503238592551111169">"Pagina vuota"</string>
+ <string name="pref_use_default" msgid="192587563274735878">"Pagina predefinita"</string>
<string name="pref_content_autofit" msgid="8260474534053660809">"Adatta autom. pagine"</string>
<string name="pref_content_autofit_summary" msgid="4587831659894879986">"Adatta le pagine web allo schermo"</string>
- <string name="pref_content_landscape_only" msgid="2022546812766219672">"Visual. solo orizzontale"</string>
- <string name="pref_content_landscape_only_summary" msgid="1008238895535428855">"Visualizza le pagine solo con l\'orientamento dello schermo orizzontale più largo"</string>
+ <string name="pref_personal_title" msgid="1447687455755683695">"Impostazioni personali"</string>
+ <string name="pref_personal_sync_with_chrome" msgid="1695182180332194033">"Sincronizza con Google Chrome"</string>
+ <string name="pref_personal_sync_with_chrome_summary" msgid="7414133931827321055">"Condividi Segnalibri e altri dati tra il Browser di Android e Google Chrome"</string>
+ <string name="pref_personal_google_account" msgid="952360133341490071">"Account Google"</string>
+ <string name="pref_personal_sync_bookmarks" msgid="59237515966184432">"Sincronizza Segnalibri"</string>
+ <string name="pref_personal_sync_bookmarks_summary" msgid="4791767605662205482">"Sincronizza Segnalibri tra il Browser di Android e Google Chrome"</string>
+ <string name="pref_personal_start_syncing" msgid="6046972042512655232">"Avvia sincronizzazione"</string>
+ <string name="pref_personal_account_dialog_title" msgid="1390867119887955530">"Seleziona account Google"</string>
+ <string name="pref_autofill_enabled" msgid="1174197447388234595">"Compilazione automatica moduli"</string>
+ <string name="pref_autofill_enabled_summary" msgid="422640696197018914">"Compila i moduli web con un clic"</string>
+ <string name="pref_autofill_profile_editor" msgid="1350709161524642663">"Impost. Compilazione automatica"</string>
+ <string name="pref_autofill_profile_editor_summary" msgid="6748434431641768870">"Imposta e gestisci i dati per i moduli compilati automaticamente"</string>
+ <string name="autofill_profile_editor_name" msgid="8566130291459685955">"Nome e cognome:"</string>
+ <string name="autofill_profile_editor_email_address" msgid="7967585896612797173">"Email:"</string>
+ <string name="autofill_profile_editor_company_name" msgid="2813443159949210417">"Nome azienda:"</string>
+ <string name="autofill_profile_editor_address_line_1" msgid="836433242509243081">"Riga indirizzo 1:"</string>
+ <string name="autofill_profile_editor_address_line_1_hint" msgid="5965659598509327172">"Indirizzo, casella postale, c/o"</string>
+ <string name="autofill_profile_editor_address_line_2" msgid="8194745202893822479">"Riga indirizzo 2:"</string>
+ <string name="autofill_profile_editor_address_line_2_hint" msgid="2048330295853546405">"Appartamento, suite, unità, edificio, piano ecc."</string>
+ <string name="autofill_profile_editor_city" msgid="4193225955409148508">"Città:"</string>
+ <string name="autofill_profile_editor_state" msgid="8549739922338171458">"Stato/Provincia/Regione:"</string>
+ <string name="autofill_profile_editor_zip_code" msgid="283668573295656671">"Codice postale:"</string>
+ <string name="autofill_profile_editor_country" msgid="7234470301239156656">"Paese:"</string>
+ <string name="autofill_profile_editor_phone_number" msgid="4938852821413729276">"Telefono:"</string>
+ <string name="autofill_profile_editor_save_profile" msgid="8349915287435262888">"Salva profilo"</string>
+ <string name="autofill_profile_successful_save" msgid="6834102203944938409">"Profilo salvato"</string>
+ <string name="autofill_profile_successful_delete" msgid="2421442112954362732">"Profilo eliminato"</string>
+ <string name="autofill_profile_editor_delete_profile" msgid="7112035941146003753">"Elimina dati profilo"</string>
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
<string name="pref_privacy_title" msgid="1052470980370846151">"Impostazioni privacy"</string>
<string name="pref_privacy_clear_cache" msgid="3380316479925886998">"Cancella cache"</string>
<string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"Cancella i contenuti e i database memorizzati localmente nella cache"</string>
@@ -208,6 +258,7 @@
<item msgid="891615911084608570">"Giapponese (ISO-2022-JP)"</item>
<item msgid="5589150448475151241">"Giapponese (SHIFT_JIS)"</item>
<item msgid="7356792686950371843">"Giapponese (EUC-JP)"</item>
+ <item msgid="2193955365569270096">"Coreano (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Codifica testo"</string>
<string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"Problema di connettività dati"</string>
@@ -296,4 +347,11 @@
<string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"Elimina tutti i dati"</string>
<string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"Annulla"</string>
<string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"Impostazione sfondo in corso..."</string>
+ <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Segnalibri"</string>
+ <string name="empty_bookmarks_folder" msgid="7843361614634930942">"Nessun segnalibro disponibile"</string>
+ <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
+ <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Sincronizza con l\'account Google"</string>
+ <string name="import_bookmarks_dialog_description" msgid="2187665745413495303">"I tuoi Segnalibri Android non sono associati a un account Google"</string>
+ <string name="import_bookmarks_dialog_remove" msgid="8105572409059113340">"Rimuovi i tuoi Segnalibri Android"</string>
+ <string name="import_bookmarks_dialog_import" msgid="6933613853573899218">"Aggiungi i tuoi Segnalibri Android a quelli per <xliff:g id="GOOGLE_ACCOUNT">%s</xliff:g>"</string>
</resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
new file mode 100644
index 0000000..2ccaa0b
--- /dev/null
+++ b/res/values-iw/strings.xml
@@ -0,0 +1,401 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2007 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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="application_name" msgid="1935869255545976415">"דפדפן"</string>
+ <string name="choose_upload" msgid="3649366287575002063">"בחר קובץ להעלאה"</string>
+ <string name="new_tab" msgid="4505722538297295141">"חלון חדש"</string>
+ <!-- no translation found for new_incognito_tab (5821404839654751753) -->
+ <skip />
+ <string name="active_tabs" msgid="3050623868203544623">"חלונות"</string>
+ <string name="tab_bookmarks" msgid="2305793036003473653">"סימניות"</string>
+ <string name="tab_most_visited" msgid="1077402532455000703">"אתרים שבהם אתה מבקר בתדירות הגבוהה ביותר"</string>
+ <string name="tab_history" msgid="1979267558744613746">"היסטוריה"</string>
+ <string name="added_to_bookmarks" msgid="1020224130695956728">"נוסף לסימניות"</string>
+ <string name="removed_from_bookmarks" msgid="6063705902028438800">"הוסר מסימניות"</string>
+ <string name="sign_in_to" msgid="5939425800148759165">"היכנס אל <xliff:g id="HOSTNAME">%s1</xliff:g> \"<xliff:g id="REALM">%s2</xliff:g>\""</string>
+ <string name="username" msgid="5057566336518215922">"שם"</string>
+ <string name="password" msgid="1177138552305184404">"סיסמה"</string>
+ <string name="action" msgid="183105774472071343">"כניסה"</string>
+ <string name="bookmarks_search" msgid="5229596268214362873">"דפדפן"</string>
+ <string name="cancel" msgid="3017274947407233702">"ביטול"</string>
+ <string name="ok" msgid="1509280796718850364">"אישור"</string>
+ <string name="title_bar_loading" msgid="7438217780834640678">"טוען…"</string>
+ <string name="page_info" msgid="4048529256302257195">"פרטי דף"</string>
+ <string name="page_info_view" msgid="5303490449842635158">"הצג את פרטי הדף"</string>
+ <string name="page_info_address" msgid="2222306609532903254">"כתובת:"</string>
+ <string name="ssl_warnings_header" msgid="79744901983636370">"יש בעיות באישור האבטחה של אתר זה."</string>
+ <string name="ssl_continue" msgid="8031515015829358457">"המשך"</string>
+ <string name="security_warning" msgid="6607795404322797541">"אזהרת אבטחה"</string>
+ <string name="view_certificate" msgid="1472768887529093862">"הצג אישור"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
+ <string name="ssl_untrusted" msgid="5369967226521102194">"אישור זה אינו מרשות אמינה."</string>
+ <string name="ssl_mismatch" msgid="558688832420069896">"שם האתר לא תואם לשם באישור."</string>
+ <string name="ssl_expired" msgid="5739349389499575559">"פג תוקפו של אישור זה."</string>
+ <string name="ssl_not_yet_valid" msgid="2893167846212645846">"אישור זה אינו חוקי עדיין."</string>
+ <string name="ssl_certificate" msgid="5226747157992111668">"אישור אבטחה"</string>
+ <string name="ssl_certificate_is_valid" msgid="7096160815933145579">"אישור זה תקף."</string>
+ <string name="issued_to" msgid="9032338008819841339">"הופק עבור:"</string>
+ <string name="common_name" msgid="5745530093500062357">"שם משותף:"</string>
+ <string name="org_name" msgid="8868889052889991293">"ארגון:"</string>
+ <string name="org_unit" msgid="4489056376307768196">"יחידה ארגונית:"</string>
+ <string name="issued_by" msgid="6959484326943152487">"הופק על ידי:"</string>
+ <string name="validity_period" msgid="57988851973181309">"חוקיות:"</string>
+ <string name="issued_on" msgid="2082890654801808368">"הונפק בתאריך:"</string>
+ <string name="expires_on" msgid="8061200430557020704">"פג תוקף ב:"</string>
+ <string name="stopping" msgid="4839698519340302982">"נעצרת."</string>
+ <string name="stop" msgid="5687251076030630074">"עצור"</string>
+ <string name="reload" msgid="8585220783228408062">"רענן"</string>
+ <string name="back" msgid="8414603107175713668">"הקודם"</string>
+ <string name="forward" msgid="4288210890526641577">"העבר"</string>
+ <string name="save" msgid="5922311934992468496">"אישור"</string>
+ <string name="do_not_save" msgid="6777633870113477714">"ביטול"</string>
+ <!-- outdated translation 969988560160364559 --> <string name="location" msgid="3411848697912600125">"מיקום"</string>
+ <!-- no translation found for containing_folder (6771180232953030479) -->
+ <skip />
+ <!-- no translation found for new_folder (7743540149088867917) -->
+ <skip />
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <!-- no translation found for no_subfolders (5880411440592452802) -->
+ <skip />
+ <!-- no translation found for add_to_bookmarks_menu_option (4449323955122214389) -->
+ <skip />
+ <!-- no translation found for add_to_homescreen_menu_option (1461447829242963790) -->
+ <skip />
+ <!-- no translation found for add_to_other_folder_menu_option (5450890093372998187) -->
+ <skip />
+ <!-- outdated translation 5990326151488445481 --> <string name="name" msgid="5462672162695365387">"שם"</string>
+ <string name="http" msgid="2163722670597250102">"http://"</string>
+ <!-- outdated translation 4680844117598293907 --> <string name="save_to_bookmarks" msgid="6101482434920313244">"סימניה"</string>
+ <!-- no translation found for bookmark_this_page (7530739804320811054) -->
+ <skip />
+ <string name="edit_bookmark" msgid="5024089053490231905">"ערוך סימניה"</string>
+ <!-- outdated translation 9202323987633899835 --> <string name="create_shortcut_bookmark" msgid="1995095662095484289">"הוסף קיצור דרך לדף הבית"</string>
+ <string name="open_bookmark" msgid="8473581305759935790">"פתח"</string>
+ <string name="remove_bookmark" msgid="8407495852801410891">"מחק סימניה"</string>
+ <string name="remove_from_bookmarks" msgid="4374080666576982775">"הסר מסימניות"</string>
+ <string name="remove_history_item" msgid="5021424935726728618">"הסר מהיסטוריה"</string>
+ <string name="set_as_homepage" msgid="4752937379414905560">"הגדר כדף הבית"</string>
+ <string name="bookmark_saved" msgid="2766434679871317557">"נשמר בסימניות."</string>
+ <string name="bookmark_not_saved" msgid="700600955089376724">"אין אפשרות לשמור את הסימניה."</string>
+ <string name="homepage_set" msgid="8768087280310966395">"דף הבית הוגדר."</string>
+ <string name="bookmark_needs_title" msgid="6245900436119218187">"לסימניה חייב להיות שם."</string>
+ <string name="bookmark_needs_url" msgid="7809876865972755158">"לסימניה חייב להיות מיקום."</string>
+ <string name="bookmark_url_not_valid" msgid="6719785633980202419">"כתובת האתר אינה חוקית."</string>
+ <string name="bookmark_cannot_save_url" msgid="791722768778386941">"לא ניתן להפוך כתובת אתר זו לסימניה."</string>
+ <string name="delete_bookmark" msgid="2422989994934201992">"מחק"</string>
+ <string name="bookmark_page" msgid="6845189305130307274">"סמן בסימניה את הדף האחרון שהוצג"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
+ <string name="current_page" msgid="7510129573681663135">"מ "</string>
+ <string name="delete_bookmark_warning" msgid="758043186202032205">"הסימניה \"<xliff:g id="BOOKMARK">%s</xliff:g>\" תימחק."</string>
+ <string name="open_in_new_window" msgid="6596775546468054510">"פתח בחלון חדש"</string>
+ <string name="goto_dot" msgid="3895839050522602723">"בצע"</string>
+ <!-- no translation found for incognito_tab (5419458065370134289) -->
+ <skip />
+ <string name="select_dot" msgid="6299170761900561967">"בחר טקסט"</string>
+ <string name="tab_picker_title" msgid="864478399057782913">"חלונות נוכחיים"</string>
+ <string name="tab_picker_remove_tab" msgid="630087809802479397">"סגור"</string>
+ <string name="bookmarks" msgid="1961279134885867815">"סימניות"</string>
+ <string name="shortcut_bookmark" msgid="3974876480401135895">"צור סימניה"</string>
+ <string name="history" msgid="2451240511251410032">"היסטוריה"</string>
+ <string name="menu_view_download" msgid="2124570321712995120">"הורדות"</string>
+ <string name="copy_page_url" msgid="7635062169011319208">"העתק כתובת אתר של דף"</string>
+ <string name="share_page" msgid="593756995297268343">"שתף דף"</string>
+ <!-- no translation found for menu_save_webarchive (3934652434001459581) -->
+ <skip />
+ <!-- no translation found for webarchive_saved (7045250341467345007) -->
+ <skip />
+ <!-- no translation found for webarchive_failed (2880998204746620260) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
+ <string name="contextmenu_openlink" msgid="7237961252214188935">"פתח"</string>
+ <string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"פתח בחלון חדש"</string>
+ <string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"קישור סימניה"</string>
+ <string name="contextmenu_savelink" msgid="5508554930832538184">"שמור קישור"</string>
+ <string name="contextmenu_sharelink" msgid="5392275392280130331">"שתף קישור"</string>
+ <string name="contextmenu_copy" msgid="398860586635404030">"העתק"</string>
+ <string name="contextmenu_copylink" msgid="5153657160294534270">"העתק את כתובת האתר של הקישור"</string>
+ <string name="contextmenu_download_image" msgid="4243829645180686912">"שמור תמונה"</string>
+ <string name="contextmenu_view_image" msgid="3870625602053600905">"הצג תמונה"</string>
+ <string name="contextmenu_set_wallpaper" msgid="3691902960115350686">"הגדר כטפט"</string>
+ <string name="contextmenu_dial_dot" msgid="5856550683415933806">"חייג..."</string>
+ <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="clear" msgid="7070043081700011461">"נקה"</string>
+ <string name="replace" msgid="4843033491070384047">"החלף"</string>
+ <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"סימניות"</string>
+ <string name="menu_preferences" msgid="6709237687234102240">"הגדרות"</string>
+ <string name="pref_content_title" msgid="722227111894838633">"הגדרות תוכן דף"</string>
+ <string name="pref_content_load_images" msgid="2125616852957377561">"טען תמונות"</string>
+ <string name="pref_content_load_images_summary" msgid="5055874125248398584">"הצג תמונות בדפי אינטרנט"</string>
+ <string name="pref_content_block_popups" msgid="7808433807197256726">"חסום חלונות קופצים"</string>
+ <string name="pref_content_javascript" msgid="4570972030299516843">"הפוך JavaScript לפעיל"</string>
+ <string name="pref_content_open_in_background" msgid="824123779725118663">"פתוח ברקע"</string>
+ <string name="pref_content_plugins" msgid="7231944644794301582">"הפוך רכיבי פלאג אין לפעילים"</string>
+ <string-array name="pref_content_plugins_choices">
+ <item msgid="6745108155096660725">"פועל תמיד"</item>
+ <item msgid="2484126708670016519">"לפי דרישה"</item>
+ <item msgid="8547442717307793863">"כבוי"</item>
+ </string-array>
+ <string name="pref_content_open_in_background_summary" msgid="1737664075721181678">"פתח חלונות חדשים מאחורי החלון הנוכחי"</string>
+ <string name="pref_content_homepage" msgid="6082437160778559806">"הגדר דף בית"</string>
+ <!-- no translation found for pref_content_search_engine (1620101310821644144) -->
+ <skip />
+ <!-- no translation found for pref_content_search_engine_summary (5162667665858487316) -->
+ <skip />
+ <!-- no translation found for pref_set_homepage_to (7196350233061395098) -->
+ <skip />
+ <!-- outdated translation 1493179933653044553 --> <string name="pref_use_current" msgid="1778622474040406672">"השתמש בדף הנוכחי"</string>
+ <!-- no translation found for pref_use_blank (8503238592551111169) -->
+ <skip />
+ <!-- no translation found for pref_use_default (192587563274735878) -->
+ <skip />
+ <string name="pref_content_autofit" msgid="8260474534053660809">"התאם דפים באופן אוטומטי"</string>
+ <string name="pref_content_autofit_summary" msgid="4587831659894879986">"עצב דפי אינטרנט כך שיתאימו למסך"</string>
+ <!-- no translation found for pref_personal_title (1447687455755683695) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome (1695182180332194033) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome_summary (7414133931827321055) -->
+ <skip />
+ <!-- no translation found for pref_personal_google_account (952360133341490071) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks (59237515966184432) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks_summary (4791767605662205482) -->
+ <skip />
+ <!-- no translation found for pref_personal_start_syncing (6046972042512655232) -->
+ <skip />
+ <!-- no translation found for pref_personal_account_dialog_title (1390867119887955530) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled (1174197447388234595) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled_summary (422640696197018914) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor (1350709161524642663) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor_summary (6748434431641768870) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_name (8566130291459685955) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_email_address (7967585896612797173) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_company_name (2813443159949210417) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1 (836433242509243081) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1_hint (5965659598509327172) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2 (8194745202893822479) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2_hint (2048330295853546405) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_city (4193225955409148508) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_state (8549739922338171458) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_zip_code (283668573295656671) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_country (7234470301239156656) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_phone_number (4938852821413729276) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_save_profile (8349915287435262888) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_save (6834102203944938409) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_delete (2421442112954362732) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_delete_profile (7112035941146003753) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
+ <string name="pref_privacy_title" msgid="1052470980370846151">"הגדרות פרטיות"</string>
+ <string name="pref_privacy_clear_cache" msgid="3380316479925886998">"נקה קובץ שמור"</string>
+ <string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"נקה תוכן ומסדי נתונים בקובץ השמור המקומי"</string>
+ <string name="pref_privacy_clear_cache_dlg" msgid="5541011591300753881">"תוכן ומסדי נתונים בקובץ השמור המקומי יימחקו."</string>
+ <string name="pref_privacy_clear_cookies" msgid="3095583579133780331">"נקה את כל הנתונים של קובצי cookie"</string>
+ <string name="pref_privacy_clear_cookies_summary" msgid="6962742063990677520">"נקה את כל קובצי ה-cookies של הדפדפן"</string>
+ <string name="pref_privacy_clear_cookies_dlg" msgid="552855688091432682">"כל קובצי ה-cookies יימחקו."</string>
+ <string name="pref_privacy_clear_history" msgid="8723795508825198477">"נקה היסטוריה"</string>
+ <string name="pref_privacy_clear_history_summary" msgid="6868501330708940734">"נקה את היסטוריית הניווט של הדפדפן"</string>
+ <string name="pref_privacy_clear_history_dlg" msgid="544903007914753853">"היסטוריית הניווט של הדפדפן תימחק."</string>
+ <string name="pref_privacy_clear_form_data" msgid="4232668196344383987">"נקה נתוני טופס"</string>
+ <string name="pref_privacy_clear_form_data_summary" msgid="1790390894719517167">"נקה את כל נתוני הטפסים שנשמרו"</string>
+ <string name="pref_privacy_clear_form_data_dlg" msgid="4443621086781197928">"כל נתוני הטפסים השמורים יימחקו."</string>
+ <string name="pref_privacy_clear_passwords" msgid="4750234112289277480">"נקה סיסמאות"</string>
+ <string name="pref_privacy_clear_passwords_summary" msgid="8856782718942903335">"נקה את כל הסיסמאות השמורות"</string>
+ <string name="pref_privacy_clear_passwords_dlg" msgid="2083869328824248255">"כל הסיסמאות השמורות יימחקו."</string>
+ <string name="pref_privacy_enable_geolocation" msgid="1395040170290765686">"הפוך מיקום לפעיל"</string>
+ <string name="pref_privacy_enable_geolocation_summary" msgid="8437020934664306205">"אפשר לאתרים לבקש גישה למיקומך"</string>
+ <string name="pref_privacy_clear_geolocation_access" msgid="6649680770030042980">"נקה גישה למיקום"</string>
+ <string name="pref_privacy_clear_geolocation_access_summary" msgid="7750143359497314679">"נקה גישה למיקום לכל אתרי האינטרנט"</string>
+ <string name="pref_privacy_clear_geolocation_access_dlg" msgid="7327063124488827244">"נקה גישה למיקום לכל אתרי האינטרנט"</string>
+ <string name="pref_security_title" msgid="5763978646932160021">"הגדרות אבטחה"</string>
+ <string name="pref_security_remember_passwords" msgid="6492957683454529549">"זכור סיסמאות"</string>
+ <string name="pref_security_remember_passwords_summary" msgid="256388703356349137">"שמור שמות משתמש וסיסמאות של אתרים"</string>
+ <string name="pref_security_save_form_data" msgid="1213669802810198893">"זכור את נתוני הטופס"</string>
+ <string name="pref_security_save_form_data_summary" msgid="4994074685153708026">"זכור נתונים שאני מקליד בטפסים לשימוש בעתיד"</string>
+ <string name="pref_security_show_security_warning" msgid="8901135676266754559">"הצג אזהרות אבטחה"</string>
+ <string name="pref_security_show_security_warning_summary" msgid="8968906112720511704">"הצג אזהרה אם יש בעיה באבטחת אתר"</string>
+ <string name="pref_security_accept_cookies" msgid="3201367661925047989">"קבל קובצי cookies"</string>
+ <string name="pref_security_accept_cookies_summary" msgid="1465118934875026920">"אפר לאתרים לשמור ולקרוא נתוני cookie"</string>
+ <string name="pref_text_size" msgid="3827031324346612208">"גודל טקסט"</string>
+ <string-array name="pref_text_size_choices">
+ <item msgid="4952686548944739548">"זעיר"</item>
+ <item msgid="1950030433642671460">"קטן"</item>
+ <item msgid="4338347520133294584">"רגיל"</item>
+ <item msgid="5043128215356351184">"גדול"</item>
+ <item msgid="7201512237890458902">"ענק"</item>
+ </string-array>
+ <string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"גודל טקסט"</string>
+ <string name="pref_default_zoom" msgid="8076142259097187395">"ברירת מחדל של מרחק מתצוגה"</string>
+ <string-array name="pref_default_zoom_choices">
+ <item msgid="549583171195154919">"רחוק"</item>
+ <item msgid="5619034257768161024">"בינוני"</item>
+ <item msgid="3840999588443167001">"סגור"</item>
+ </string-array>
+ <string name="pref_default_zoom_dialogtitle" msgid="6095974367125109021">"ברירת מחדל של מרחק מתצוגה"</string>
+ <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="3091250467679722382">"הגדרות מתקדמות"</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" msgid="8904000515846202110">"אפס לברירת מחדל"</string>
+ <string name="pref_extras_reset_default_summary" msgid="4247870778270414501">"שחזר הגדרות ברירת מחדל"</string>
+ <string name="pref_extras_reset_default_dlg" msgid="6640261575874704022">"ההגדרות יוחזרו לערכי ברירת המחדל."</string>
+ <string name="pref_extras_reset_default_dlg_title" msgid="2250334970728938936">"אפס לברירת מחדל"</string>
+ <string name="pref_development_title" msgid="3263854204533056480">"ניקוי באגים"</string>
+ <string name="pref_default_text_encoding" msgid="5742965543955558478">"קידוד טקסט"</string>
+ <!-- no translation found for pref_default_text_encoding_choices:7 (2193955365569270096) -->
+ <string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"קידוד טקסט"</string>
+ <string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"בעיה בקישוריות נתונים"</string>
+ <string name="browserFrameFileErrorLabel" msgid="8063691502792670367">"בעיה בקובץ"</string>
+ <string name="browserFrameFormResubmitLabel" msgid="2685923472682180360">"אשר"</string>
+ <string name="browserFrameFormResubmitMessage" msgid="2752182215695632138">"הדף שאתה מנסה להציג מכיל נתונים שכבר נשלחו (POSTDATA). אם תשלח שוב את הנתונים, פעולות שהטופס בדף ביצע (כגון חיפוש או רכישה מקוונת) יבוצעו שוב."</string>
+ <string name="loadSuspendedTitle" msgid="675991625288706944">"אין חיבור רשת"</string>
+ <string name="loadSuspended" msgid="3133656588880851273">"לדפדפן אין אפשרות לטעון דף זה כיוון שאין חיבור לאינטרנט."</string>
+ <string name="clear_history" msgid="5998307092715979619">"נקה היסטוריה"</string>
+ <string name="browser_history" msgid="1038987118290272525">"דפים שביקרת בהם לאחרונה"</string>
+ <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">"חפש או הקלד כתובת אתר"</string>
+ <string name="search_button_text" msgid="5235226933877634410">"בצע"</string>
+ <string name="search_settings_description" msgid="1422401062529014107">"סימניות והיסטוריית אתרים"</string>
+ <string name="attention" msgid="3473639060042811244">"לידיעתך"</string>
+ <string name="popup_window_attempt" msgid="2673111696288657989">"אתר זה מנסה לפתוח חלון קופץ."</string>
+ <string name="allow" msgid="1157313689171991335">"אפשר"</string>
+ <string name="block" msgid="9172175889884707800">"חסום"</string>
+ <string name="too_many_windows_dialog_title" msgid="5175503564948906442">"הגעת למגבלת החלון"</string>
+ <string name="too_many_windows_dialog_message" msgid="1398571800233959583">"אין אפשרות לפתוח חלון חדש כיוון שכבר פתחת את מספר החלונות המקסימלי."</string>
+ <string name="too_many_subwindows_dialog_title" msgid="3805453941587725944">"חלון קופץ כבר פתוח"</string>
+ <string name="too_many_subwindows_dialog_message" msgid="5827289829907966657">"אין אפשרות לפתוח חלון קופץ כיוון שניתן לפתוח חלון אחד בלבד בכל פעם."</string>
+ <string name="download_title" msgid="2122874021047565594">"היסטוריית הורדות"</string>
+ <string name="download_unknown_filename" msgid="4013465542563652175">"<לא ידוע>"</string>
+ <string name="download_menu_open" msgid="4888327480367757513">"פתח"</string>
+ <string name="download_menu_clear" msgid="6264454531553418124">"נקה מהרשימה"</string>
+ <string name="download_menu_delete" msgid="8815502136393894148">"מחק"</string>
+ <string name="download_menu_cancel" msgid="2545333007601851574">"בטל הורדה"</string>
+ <string name="download_menu_cancel_all" msgid="2136550823151999166">"בטל את כל ההורדות"</string>
+ <string name="download_cancel_dlg_title" msgid="8909108500262799748">"בטל הורדות"</string>
+ <string name="download_cancel_dlg_msg" msgid="6285389170052357797">"כל <xliff:g id="DOWNLOAD_COUNT">%d</xliff:g> ההורדות יבוטלו וינוקו מהיסטוריית ההורדות."</string>
+ <string name="download_delete_file" msgid="5330036497843073249">"הקובץ יימחק"</string>
+ <string name="download_file_error_dlg_title" msgid="2693630283595384874">"אין מקום לאחסון"</string>
+ <string name="download_file_error_dlg_msg" msgid="5156405410324072471">"אין אפשרות להוריד את <xliff:g id="FILENAME">%s</xliff:g>."\n"פנה שטח בטלפון ונסה שוב."</string>
+ <string name="download_failed_generic_dlg_title" msgid="6106781095337833391">"ההורדה נכשלה"</string>
+ <!-- outdated translation 605904452159416792 --> <string name="download_no_sdcard_dlg_title" product="nosdcard" msgid="56777245081568508">"אין כרטיס SD"</string>
+ <string name="download_no_sdcard_dlg_title" product="default" msgid="605904452159416792">"אין כרטיס SD"</string>
+ <!-- no translation found for download_no_sdcard_dlg_msg (3144652102051031721) -->
+ <skip />
+ <string name="download_no_sdcard_dlg_msg" product="default" msgid="2616399456116301518">"דרוש כרטיס SD כדי להוריד את <xliff:g id="FILENAME">%s</xliff:g>."</string>
+ <!-- outdated translation 6877712666046917741 --> <string name="download_sdcard_busy_dlg_title" product="nosdcard" msgid="8081445664689818973">"כרטיס SD לא זמין"</string>
+ <string name="download_sdcard_busy_dlg_title" product="default" msgid="6877712666046917741">"כרטיס SD לא זמין"</string>
+ <!-- outdated translation 3473883538192835204 --> <string name="download_sdcard_busy_dlg_msg" product="nosdcard" msgid="3979329954835690147">"כרטיס ה-SD אינו פנוי. כדי לאפשר הורדות, בחר \"כבה אחסון USB\" בהתראה."</string>
+ <string name="download_sdcard_busy_dlg_msg" product="default" msgid="3473883538192835204">"כרטיס ה-SD אינו פנוי. כדי לאפשר הורדות, בחר \"כבה אחסון USB\" בהתראה."</string>
+ <string name="download_no_application_title" msgid="1286056729168874295">"אין אפשרות לפתוח את הקובץ"</string>
+ <string name="retry" msgid="1835923075542266721">"נסה שוב"</string>
+ <string name="no_downloads" msgid="3947445710685021498">"היסטוריית ההורדות ריקה."</string>
+ <string name="download_error" msgid="413496839831257187">"ההורדה נכשלה."</string>
+ <string name="download_success" msgid="2279041638155595203">"<xliff:g id="FILE">%s</xliff:g> ההורדה הושלמה."</string>
+ <string name="download_running" msgid="2622942231322015059">"מוריד..."</string>
+ <string name="download_pending" msgid="2599683668575349559">"מתחיל בהורדה..."</string>
+ <string name="download_pending_network" msgid="6548714525679461053">"ממתין לחיבור נתונים..."</string>
+ <string name="download_running_paused" msgid="6418029352085656495">"ממתין לחיבור נתונים..."</string>
+ <string name="download_canceled" msgid="6057083743144492515">"ההורדה בוטלה."</string>
+ <string name="download_not_acceptable" msgid="313769696131563652">"אין אפשרות להוריד. התוכן אינו נתמך בטלפון זה."</string>
+ <string name="download_file_error" msgid="1206648050615176113">"אין אפשרות לסיים את ההורדה. אין מספיק שטח."</string>
+ <string name="download_length_required" msgid="9038605488460437406">"אין אפשרות להוריד. אין אפשרות לקבוע את גודל הפריט."</string>
+ <string name="download_precondition_failed" msgid="8327584102874295580">"אירעה הפרעה בהורדה. לא ניתן להמשיך אותה."</string>
+ <string name="search_the_web" msgid="6046130189241962337">"חפש באינטרנט"</string>
+ <string name="webstorage_outofspace_notification_title" msgid="1160474608059771788">"אחסון הדפדפן מלא"</string>
+ <string name="webstorage_outofspace_notification_text" msgid="7341075135051829692">"לחץ כדי לפנות שטח."</string>
+ <string name="webstorage_clear_data_title" msgid="689484577124333977">"נקה נתונים מאוחסנים"</string>
+ <string name="webstorage_clear_data_dialog_title" msgid="345457466368974706">"נקה נתונים מאוחסנים"</string>
+ <string name="webstorage_clear_data_dialog_message" msgid="6678281256970470125">"כל הנתונים המאוחסנים על ידי אתר זה יימחקו"</string>
+ <string name="webstorage_clear_data_dialog_ok_button" msgid="2516563534211898636">"נקה הכל"</string>
+ <string name="webstorage_clear_data_dialog_cancel_button" msgid="2028867751958942762">"ביטול"</string>
+ <string name="webstorage_origin_summary_mb_stored" msgid="1985885826292236210">"MB מאוחסנים בטלפון"</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_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_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>
+ <string name="geolocation_settings_page_dialog_title" msgid="1549842043381347668">"נקה גישה למיקום"</string>
+ <string name="geolocation_settings_page_dialog_message" msgid="7586671987576403993">"גישת מיקום לאתר זה תנוקה"</string>
+ <string name="geolocation_settings_page_dialog_ok_button" msgid="4789434178048077287">"נקה גישה"</string>
+ <string name="geolocation_settings_page_dialog_cancel_button" msgid="7941036504673409747">"ביטול"</string>
+ <string name="website_settings_clear_all" msgid="8739804325997655980">"נקה הכל"</string>
+ <string name="website_settings_clear_all_dialog_title" msgid="7791826325122461718">"לנקות את כל הגדרות האתר?"</string>
+ <string name="website_settings_clear_all_dialog_message" msgid="6150502090601476333">"כל הנתונים והרשאות מיקומים של אתרים יימחקו."</string>
+ <string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"מחק את כל הנתונים"</string>
+ <string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"ביטול"</string>
+ <string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"מגדיר טפט..."</string>
+ <!-- no translation found for defaultBookmarksUpButton (2303951020715704735) -->
+ <skip />
+ <!-- no translation found for empty_bookmarks_folder (7843361614634930942) -->
+ <skip />
+ <!-- no translation found for rlz_access_point (7165847807377650632) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_title (3325557652271172128) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_description (2187665745413495303) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_remove (8105572409059113340) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_import (6933613853573899218) -->
+ <skip />
+</resources>
diff --git a/res/values-ja-xlarge/strings.xml b/res/values-ja-xlarge/strings.xml
new file mode 100644
index 0000000..6786c84
--- /dev/null
+++ b/res/values-ja-xlarge/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="new_tab" msgid="7275656655054293038">"新しいタブ"</string>
+ <string name="new_incognito_tab" msgid="5149742197322201152">"新しいシークレットタブ"</string>
+ <string name="active_tabs" msgid="5324492165541331128">"タブ"</string>
+</resources>
diff --git a/res/values-ja/donottranslate_strings.xml b/res/values-ja/donottranslate_strings.xml
index cbda8f2..026d57a 100644
--- a/res/values-ja/donottranslate_strings.xml
+++ b/res/values-ja/donottranslate_strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="pref_default_text_encoding_default">SHIFT_JIS</string>
+ <string name="pref_default_text_encoding_default" translatable="false">SHIFT_JIS</string>
</resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 870aac4..acbe72b 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -19,6 +19,7 @@
<string name="application_name" msgid="1935869255545976415">"ブラウザ"</string>
<string name="choose_upload" msgid="3649366287575002063">"アップロードするファイルを選択"</string>
<string name="new_tab" msgid="4505722538297295141">"新しいウィンドウ"</string>
+ <string name="new_incognito_tab" msgid="5821404839654751753">"新しいシークレットウインドウ"</string>
<string name="active_tabs" msgid="3050623868203544623">"ウィンドウ"</string>
<string name="tab_bookmarks" msgid="2305793036003473653">"ブックマーク"</string>
<string name="tab_most_visited" msgid="1077402532455000703">"よく使用"</string>
@@ -32,12 +33,6 @@
<string name="bookmarks_search" msgid="5229596268214362873">"ブラウザ"</string>
<string name="cancel" msgid="3017274947407233702">"キャンセル"</string>
<string name="ok" msgid="1509280796718850364">"OK"</string>
- <plurals name="matches_found">
- <item quantity="zero" msgid="6242659159545399963">"該当なし"</item>
- <item quantity="one" msgid="4352019729062956802">"1件一致"</item>
- <item quantity="few" msgid="5544267486978946555">"<xliff:g id="NUMBER">%d</xliff:g>件一致"</item>
- <item quantity="other" msgid="6616125067364315405">"<xliff:g id="NUMBER">%d</xliff:g>件一致"</item>
- </plurals>
<string name="title_bar_loading" msgid="7438217780834640678">"読み込み中..."</string>
<string name="page_info" msgid="4048529256302257195">"ページ情報"</string>
<string name="page_info_view" msgid="5303490449842635158">"ページ情報を表示"</string>
@@ -46,6 +41,8 @@
<string name="ssl_continue" msgid="8031515015829358457">"続行"</string>
<string name="security_warning" msgid="6607795404322797541">"セキュリティ警告"</string>
<string name="view_certificate" msgid="1472768887529093862">"証明書を表示"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
<string name="ssl_untrusted" msgid="5369967226521102194">"この証明書は信頼できる認証機関のものではありません。"</string>
<string name="ssl_mismatch" msgid="558688832420069896">"サイト名と証明書上の名前が一致しません。"</string>
<string name="ssl_expired" msgid="5739349389499575559">"この証明書は有効期限切れです。"</string>
@@ -67,12 +64,23 @@
<string name="forward" msgid="4288210890526641577">"進む"</string>
<string name="save" msgid="5922311934992468496">"OK"</string>
<string name="do_not_save" msgid="6777633870113477714">"キャンセル"</string>
- <string name="location" msgid="969988560160364559">"場所"</string>
- <string name="name" msgid="5990326151488445481">"名前"</string>
+ <string name="location" msgid="3411848697912600125">"アドレス"</string>
+ <string name="containing_folder" msgid="6771180232953030479">"追加先"</string>
+ <string name="new_folder" msgid="7743540149088867917">"新しいフォルダ"</string>
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <string name="no_subfolders" msgid="5880411440592452802">"サブフォルダなし"</string>
+ <string name="add_to_bookmarks_menu_option" msgid="4449323955122214389">"ブックマーク"</string>
+ <string name="add_to_homescreen_menu_option" msgid="1461447829242963790">"ホーム画面"</string>
+ <string name="add_to_other_folder_menu_option" msgid="5450890093372998187">"その他のフォルダ..."</string>
+ <string name="name" msgid="5462672162695365387">"ラベル"</string>
<string name="http" msgid="2163722670597250102">"http://"</string>
- <string name="save_to_bookmarks" msgid="588165100024086565">"ブックマークを追加"</string>
+ <string name="save_to_bookmarks" msgid="6101482434920313244">"ブックマークに追加"</string>
+ <string name="bookmark_this_page" msgid="7530739804320811054">"このページをブックマークに追加"</string>
<string name="edit_bookmark" msgid="5024089053490231905">"編集"</string>
- <string name="create_shortcut_bookmark" msgid="9202323987633899835">"ショートカットを作成"</string>
+ <string name="create_shortcut_bookmark" msgid="1995095662095484289">"ホームにショートカットを追加"</string>
<string name="open_bookmark" msgid="8473581305759935790">"開く"</string>
<string name="remove_bookmark" msgid="8407495852801410891">"削除"</string>
<string name="remove_from_bookmarks" msgid="4374080666576982775">"ブックマークから削除"</string>
@@ -87,13 +95,15 @@
<string name="bookmark_cannot_save_url" msgid="791722768778386941">"このURLはブックマークに追加できません。"</string>
<string name="delete_bookmark" msgid="2422989994934201992">"削除"</string>
<string name="bookmark_page" msgid="6845189305130307274">"最後に表示したページをブックマークする"</string>
- <string name="switch_to_thumbnails" msgid="5493351529609043151">"サムネイル表示"</string>
- <string name="switch_to_list" msgid="8900531247982121055">"リスト表示"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
<string name="current_page" msgid="7510129573681663135">"URL "</string>
<string name="delete_bookmark_warning" msgid="758043186202032205">"ブックマーク「<xliff:g id="BOOKMARK">%s</xliff:g>」を削除します。"</string>
<string name="open_in_new_window" msgid="6596775546468054510">"新しいウィンドウで開く"</string>
<string name="goto_dot" msgid="3895839050522602723">"移動"</string>
- <string name="find_dot" msgid="6259312434696611957">"ページ内検索"</string>
+ <string name="incognito_tab" msgid="5419458065370134289">"新しいシークレットタブを開く"</string>
<string name="select_dot" msgid="6299170761900561967">"テキストを選択してコピー"</string>
<string name="tab_picker_title" msgid="864478399057782913">"現在のウィンドウ"</string>
<string name="tab_picker_remove_tab" msgid="630087809802479397">"閉じる"</string>
@@ -103,6 +113,13 @@
<string name="menu_view_download" msgid="2124570321712995120">"ダウンロード履歴"</string>
<string name="copy_page_url" msgid="7635062169011319208">"ページのURLをコピー"</string>
<string name="share_page" msgid="593756995297268343">"ページを共有"</string>
+ <string name="menu_save_webarchive" msgid="3934652434001459581">"ウェブアーカイブとして保存"</string>
+ <string name="webarchive_saved" msgid="7045250341467345007">"ウェブアーカイブを保存しました。"</string>
+ <string name="webarchive_failed" msgid="2880998204746620260">"ウェブアーカイブを保存できませんでした。"</string>
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
<string name="contextmenu_openlink" msgid="7237961252214188935">"開く"</string>
<string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"新しいウィンドウで開く"</string>
<string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"リンクをブックマーク"</string>
@@ -138,11 +155,44 @@
<string name="pref_content_homepage" msgid="6082437160778559806">"ホームページ設定"</string>
<string name="pref_content_search_engine" msgid="1620101310821644144">"検索エンジンの設定"</string>
<string name="pref_content_search_engine_summary" msgid="5162667665858487316">"検索エンジンを選択します"</string>
- <string name="pref_use_current" msgid="1493179933653044553">"現在のページを使用"</string>
+ <string name="pref_set_homepage_to" msgid="7196350233061395098">"設定先..."</string>
+ <string name="pref_use_current" msgid="1778622474040406672">"現在のページ"</string>
+ <string name="pref_use_blank" msgid="8503238592551111169">"空白ページ"</string>
+ <string name="pref_use_default" msgid="192587563274735878">"デフォルトページ"</string>
<string name="pref_content_autofit" msgid="8260474534053660809">"ページの自動調整"</string>
<string name="pref_content_autofit_summary" msgid="4587831659894879986">"画面に合わせてウェブページをフォーマットする"</string>
- <string name="pref_content_landscape_only" msgid="2022546812766219672">"常に横向きに表示"</string>
- <string name="pref_content_landscape_only_summary" msgid="1008238895535428855">"ページを常に横向きに表示する"</string>
+ <string name="pref_personal_title" msgid="1447687455755683695">"個人設定"</string>
+ <string name="pref_personal_sync_with_chrome" msgid="1695182180332194033">"Google Chromeと同期する"</string>
+ <string name="pref_personal_sync_with_chrome_summary" msgid="7414133931827321055">"AndroidブラウザとGoogle Chromeの間でブックマークなどのデータを共有する"</string>
+ <string name="pref_personal_google_account" msgid="952360133341490071">"Googleアカウント"</string>
+ <string name="pref_personal_sync_bookmarks" msgid="59237515966184432">"ブックマークを同期する"</string>
+ <string name="pref_personal_sync_bookmarks_summary" msgid="4791767605662205482">"AndroidブラウザとGoogle Chromeの間でブックマークを同期"</string>
+ <string name="pref_personal_start_syncing" msgid="6046972042512655232">"同期を開始"</string>
+ <string name="pref_personal_account_dialog_title" msgid="1390867119887955530">"Googleアカウントを選択"</string>
+ <string name="pref_autofill_enabled" msgid="1174197447388234595">"フォームの自動入力"</string>
+ <string name="pref_autofill_enabled_summary" msgid="422640696197018914">"1回タップするだけでウェブフォームに入力できます"</string>
+ <string name="pref_autofill_profile_editor" msgid="1350709161524642663">"自動入力設定"</string>
+ <string name="pref_autofill_profile_editor_summary" msgid="6748434431641768870">"自動入力フォーム用のデータの設定と管理"</string>
+ <string name="autofill_profile_editor_name" msgid="8566130291459685955">"氏名:"</string>
+ <string name="autofill_profile_editor_email_address" msgid="7967585896612797173">"メール:"</string>
+ <string name="autofill_profile_editor_company_name" msgid="2813443159949210417">"会社名:"</string>
+ <string name="autofill_profile_editor_address_line_1" msgid="836433242509243081">"住所1:"</string>
+ <string name="autofill_profile_editor_address_line_1_hint" msgid="5965659598509327172">"番地、私書箱、気付など"</string>
+ <string name="autofill_profile_editor_address_line_2" msgid="8194745202893822479">"住所2:"</string>
+ <string name="autofill_profile_editor_address_line_2_hint" msgid="2048330295853546405">"建物名、アパート/マンション名、部屋番号など"</string>
+ <string name="autofill_profile_editor_city" msgid="4193225955409148508">"市区町村:"</string>
+ <string name="autofill_profile_editor_state" msgid="8549739922338171458">"都道府県:"</string>
+ <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_save_profile" msgid="8349915287435262888">"プロフィールを保存"</string>
+ <string name="autofill_profile_successful_save" msgid="6834102203944938409">"プロフィールが保存されました"</string>
+ <string name="autofill_profile_successful_delete" msgid="2421442112954362732">"プロフィールを削除しました"</string>
+ <string name="autofill_profile_editor_delete_profile" msgid="7112035941146003753">"プロフィールを削除"</string>
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
<string name="pref_privacy_title" msgid="1052470980370846151">"プライバシー設定"</string>
<string name="pref_privacy_clear_cache" msgid="3380316479925886998">"キャッシュを消去"</string>
<string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"ローカルにキャッシュしたコンテンツとデータベースを消去する"</string>
@@ -208,6 +258,7 @@
<item msgid="891615911084608570">"日本語(ISO-2022-JP)"</item>
<item msgid="5589150448475151241">"日本語(SHIFT_JIS)"</item>
<item msgid="7356792686950371843">"日本語(EUC-JP)"</item>
+ <item msgid="2193955365569270096">"韓国語(EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"テキストエンコード"</string>
<string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"データアクセスエラー"</string>
@@ -296,4 +347,11 @@
<string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"すべてのデータを削除"</string>
<string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"キャンセル"</string>
<string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"壁紙を設定中..."</string>
+ <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"ブックマーク"</string>
+ <string name="empty_bookmarks_folder" msgid="7843361614634930942">"ブックマークはありません"</string>
+ <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
+ <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Googleアカウントと同期"</string>
+ <string name="import_bookmarks_dialog_description" msgid="2187665745413495303">"AndroidのブックマークはGoogleアカウントに関連付けられていません"</string>
+ <string name="import_bookmarks_dialog_remove" msgid="8105572409059113340">"Androidのブックマークを削除"</string>
+ <string name="import_bookmarks_dialog_import" msgid="6933613853573899218">"Androidのブックマークを<xliff:g id="GOOGLE_ACCOUNT">%s</xliff:g>のブックマークに追加"</string>
</resources>
diff --git a/res/values-ko-xlarge/strings.xml b/res/values-ko-xlarge/strings.xml
new file mode 100644
index 0000000..228be47
--- /dev/null
+++ b/res/values-ko-xlarge/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="new_tab" msgid="7275656655054293038">"새 탭"</string>
+ <string name="new_incognito_tab" msgid="5149742197322201152">"새 시크릿 창"</string>
+ <string name="active_tabs" msgid="5324492165541331128">"탭"</string>
+</resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 5082815..c5b2944 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -19,6 +19,7 @@
<string name="application_name" msgid="1935869255545976415">"인터넷"</string>
<string name="choose_upload" msgid="3649366287575002063">"업로드할 파일 선택"</string>
<string name="new_tab" msgid="4505722538297295141">"새 창"</string>
+ <string name="new_incognito_tab" msgid="5821404839654751753">"새 시크릿 창"</string>
<string name="active_tabs" msgid="3050623868203544623">"창"</string>
<string name="tab_bookmarks" msgid="2305793036003473653">"북마크"</string>
<string name="tab_most_visited" msgid="1077402532455000703">"자주 방문한 페이지"</string>
@@ -32,12 +33,6 @@
<string name="bookmarks_search" msgid="5229596268214362873">"브라우저"</string>
<string name="cancel" msgid="3017274947407233702">"취소"</string>
<string name="ok" msgid="1509280796718850364">"확인"</string>
- <plurals name="matches_found">
- <item quantity="zero" msgid="6242659159545399963">"검색결과 없음"</item>
- <item quantity="one" msgid="4352019729062956802">"검색결과 1개"</item>
- <item quantity="few" msgid="5544267486978946555">"검색결과 <xliff:g id="NUMBER">%d</xliff:g>개"</item>
- <item quantity="other" msgid="6616125067364315405">"검색결과 <xliff:g id="NUMBER">%d</xliff:g>개"</item>
- </plurals>
<string name="title_bar_loading" msgid="7438217780834640678">"로드 중..."</string>
<string name="page_info" msgid="4048529256302257195">"페이지 정보"</string>
<string name="page_info_view" msgid="5303490449842635158">"페이지 정보 보기"</string>
@@ -46,6 +41,8 @@
<string name="ssl_continue" msgid="8031515015829358457">"계속"</string>
<string name="security_warning" msgid="6607795404322797541">"보안 경고"</string>
<string name="view_certificate" msgid="1472768887529093862">"인증서 보기"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
<string name="ssl_untrusted" msgid="5369967226521102194">"신뢰할 수 있는 인증 기관에서 발급한 인증서가 아닙니다."</string>
<string name="ssl_mismatch" msgid="558688832420069896">"사이트 이름이 인증서에 있는 것과 일치하지 않습니다."</string>
<string name="ssl_expired" msgid="5739349389499575559">"인증서가 만료되었습니다."</string>
@@ -67,12 +64,23 @@
<string name="forward" msgid="4288210890526641577">"앞으로"</string>
<string name="save" msgid="5922311934992468496">"확인"</string>
<string name="do_not_save" msgid="6777633870113477714">"취소"</string>
- <string name="location" msgid="969988560160364559">"URL"</string>
- <string name="name" msgid="5990326151488445481">"이름"</string>
+ <string name="location" msgid="3411848697912600125">"주소"</string>
+ <string name="containing_folder" msgid="6771180232953030479">"추가할 위치"</string>
+ <string name="new_folder" msgid="7743540149088867917">"새 폴더"</string>
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <string name="no_subfolders" msgid="5880411440592452802">"하위 폴더 없음"</string>
+ <string name="add_to_bookmarks_menu_option" msgid="4449323955122214389">"북마크"</string>
+ <string name="add_to_homescreen_menu_option" msgid="1461447829242963790">"홈 화면"</string>
+ <string name="add_to_other_folder_menu_option" msgid="5450890093372998187">"기타 폴더…"</string>
+ <string name="name" msgid="5462672162695365387">"라벨"</string>
<string name="http" msgid="2163722670597250102">"http://"</string>
- <string name="save_to_bookmarks" msgid="588165100024086565">"북마크에 추가"</string>
+ <string name="save_to_bookmarks" msgid="6101482434920313244">"북마크에 추가"</string>
+ <string name="bookmark_this_page" msgid="7530739804320811054">"페이지 북마크"</string>
<string name="edit_bookmark" msgid="5024089053490231905">"북마크 수정"</string>
- <string name="create_shortcut_bookmark" msgid="9202323987633899835">"홈에 바로가기 추가"</string>
+ <string name="create_shortcut_bookmark" msgid="1995095662095484289">"홈에 바로가기 추가"</string>
<string name="open_bookmark" msgid="8473581305759935790">"열기"</string>
<string name="remove_bookmark" msgid="8407495852801410891">"북마크 삭제"</string>
<string name="remove_from_bookmarks" msgid="4374080666576982775">"북마크에서 삭제"</string>
@@ -87,13 +95,15 @@
<string name="bookmark_cannot_save_url" msgid="791722768778386941">"URL을 북마크에 추가할 수 없습니다."</string>
<string name="delete_bookmark" msgid="2422989994934201992">"삭제"</string>
<string name="bookmark_page" msgid="6845189305130307274">"마지막으로 본 페이지를 북마크 설정"</string>
- <string name="switch_to_thumbnails" msgid="5493351529609043151">"미리보기 이미지 보기"</string>
- <string name="switch_to_list" msgid="8900531247982121055">"목록 보기"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
<string name="current_page" msgid="7510129573681663135">"북마크할 페이지 "</string>
<string name="delete_bookmark_warning" msgid="758043186202032205">"\'<xliff:g id="BOOKMARK">%s</xliff:g>\' 북마크가 삭제됩니다."</string>
<string name="open_in_new_window" msgid="6596775546468054510">"새 창에서 열기"</string>
<string name="goto_dot" msgid="3895839050522602723">"이동"</string>
- <string name="find_dot" msgid="6259312434696611957">"페이지에서 찾기"</string>
+ <string name="incognito_tab" msgid="5419458065370134289">"새 시크릿 탭 열기"</string>
<string name="select_dot" msgid="6299170761900561967">"텍스트 선택"</string>
<string name="tab_picker_title" msgid="864478399057782913">"현재 창"</string>
<string name="tab_picker_remove_tab" msgid="630087809802479397">"닫기"</string>
@@ -103,6 +113,13 @@
<string name="menu_view_download" msgid="2124570321712995120">"다운로드"</string>
<string name="copy_page_url" msgid="7635062169011319208">"페이지 URL 복사"</string>
<string name="share_page" msgid="593756995297268343">"페이지 공유"</string>
+ <string name="menu_save_webarchive" msgid="3934652434001459581">"웹 아카이브로 저장"</string>
+ <string name="webarchive_saved" msgid="7045250341467345007">"웹 아카이브를 저장했습니다."</string>
+ <string name="webarchive_failed" msgid="2880998204746620260">"웹 아카이브를 저장하지 못했습니다."</string>
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
<string name="contextmenu_openlink" msgid="7237961252214188935">"열기"</string>
<string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"새 창에서 열기"</string>
<string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"링크를 북마크에 추가"</string>
@@ -138,11 +155,44 @@
<string name="pref_content_homepage" msgid="6082437160778559806">"홈페이지 설정"</string>
<string name="pref_content_search_engine" msgid="1620101310821644144">"검색 엔진 설정"</string>
<string name="pref_content_search_engine_summary" msgid="5162667665858487316">"검색 엔진 선택"</string>
- <string name="pref_use_current" msgid="1493179933653044553">"현재 페이지 사용"</string>
+ <string name="pref_set_homepage_to" msgid="7196350233061395098">"다음으로 설정:"</string>
+ <string name="pref_use_current" msgid="1778622474040406672">"현재 페이지"</string>
+ <string name="pref_use_blank" msgid="8503238592551111169">"빈 페이지"</string>
+ <string name="pref_use_default" msgid="192587563274735878">"기본 페이지"</string>
<string name="pref_content_autofit" msgid="8260474534053660809">"페이지 자동 맞춤"</string>
<string name="pref_content_autofit_summary" msgid="4587831659894879986">"화면에 맞게 웹페이지 형식 지정"</string>
- <string name="pref_content_landscape_only" msgid="2022546812766219672">"가로 표시 전용"</string>
- <string name="pref_content_landscape_only_summary" msgid="1008238895535428855">"넓은 가로 방향 화면으로만 페이지 표시"</string>
+ <string name="pref_personal_title" msgid="1447687455755683695">"개인 설정"</string>
+ <string name="pref_personal_sync_with_chrome" msgid="1695182180332194033">"Google 크롬과 동기화"</string>
+ <string name="pref_personal_sync_with_chrome_summary" msgid="7414133931827321055">"Android 브라우저와 Google 크롬 간에 북마크 및 기타 데이터 공유"</string>
+ <string name="pref_personal_google_account" msgid="952360133341490071">"Google 계정"</string>
+ <string name="pref_personal_sync_bookmarks" msgid="59237515966184432">"북마크 동기화"</string>
+ <string name="pref_personal_sync_bookmarks_summary" msgid="4791767605662205482">"Android 브라우저와 Google 크롬 간의 북마크 동기화"</string>
+ <string name="pref_personal_start_syncing" msgid="6046972042512655232">"동기화 시작"</string>
+ <string name="pref_personal_account_dialog_title" msgid="1390867119887955530">"공유할 Google 계정 선택"</string>
+ <string name="pref_autofill_enabled" msgid="1174197447388234595">"양식 자동완성"</string>
+ <string name="pref_autofill_enabled_summary" msgid="422640696197018914">"클릭 한 번으로 웹 양식 작성"</string>
+ <string name="pref_autofill_profile_editor" msgid="1350709161524642663">"자동완성 설정"</string>
+ <string name="pref_autofill_profile_editor_summary" msgid="6748434431641768870">"자동완성된 양식의 데이터 설정 및 관리"</string>
+ <string name="autofill_profile_editor_name" msgid="8566130291459685955">"이름:"</string>
+ <string name="autofill_profile_editor_email_address" msgid="7967585896612797173">"이메일:"</string>
+ <string name="autofill_profile_editor_company_name" msgid="2813443159949210417">"회사 이름:"</string>
+ <string name="autofill_profile_editor_address_line_1" msgid="836433242509243081">"주소 입력란 1:"</string>
+ <string name="autofill_profile_editor_address_line_1_hint" msgid="5965659598509327172">"번지, 사서함, c/o"</string>
+ <string name="autofill_profile_editor_address_line_2" msgid="8194745202893822479">"주소 입력란 2:"</string>
+ <string name="autofill_profile_editor_address_line_2_hint" msgid="2048330295853546405">"아파트, 빌딩, 층 등"</string>
+ <string name="autofill_profile_editor_city" msgid="4193225955409148508">"도시:"</string>
+ <string name="autofill_profile_editor_state" msgid="8549739922338171458">"시/도/지역:"</string>
+ <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_save_profile" msgid="8349915287435262888">"프로필 저장"</string>
+ <string name="autofill_profile_successful_save" msgid="6834102203944938409">"프로필 저장됨"</string>
+ <string name="autofill_profile_successful_delete" msgid="2421442112954362732">"프로필이 삭제되었습니다."</string>
+ <string name="autofill_profile_editor_delete_profile" msgid="7112035941146003753">"프로필 데이터 삭제"</string>
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
<string name="pref_privacy_title" msgid="1052470980370846151">"개인정보 설정"</string>
<string name="pref_privacy_clear_cache" msgid="3380316479925886998">"캐시 지우기"</string>
<string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"로컬로 캐시된 콘텐츠 및 데이터베이스 삭제"</string>
@@ -208,6 +258,7 @@
<item msgid="891615911084608570">"일본어(ISO-2022-JP)"</item>
<item msgid="5589150448475151241">"일본어(SHIFT_JIS)"</item>
<item msgid="7356792686950371843">"일본어(EUC-JP)"</item>
+ <item msgid="2193955365569270096">"한국어(EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"텍스트 인코딩"</string>
<string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"데이터 연결에 문제 발생"</string>
@@ -296,4 +347,11 @@
<string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"모든 데이터 삭제"</string>
<string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"취소"</string>
<string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"배경화면을 설정하는 중..."</string>
+ <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"북마크"</string>
+ <string name="empty_bookmarks_folder" msgid="7843361614634930942">"북마크가 없습니다."</string>
+ <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
+ <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Google 계정과 동기화"</string>
+ <string name="import_bookmarks_dialog_description" msgid="2187665745413495303">"사용자의 Android 북마크는 Google 계정과 연결되지 않았습니다."</string>
+ <string name="import_bookmarks_dialog_remove" msgid="8105572409059113340">"Android 북마크 삭제"</string>
+ <string name="import_bookmarks_dialog_import" msgid="6933613853573899218">"<xliff:g id="GOOGLE_ACCOUNT">%s</xliff:g>에 대한 북마크에 Android 북마크 추가"</string>
</resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
new file mode 100644
index 0000000..905da6b
--- /dev/null
+++ b/res/values-lt/strings.xml
@@ -0,0 +1,401 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2007 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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="application_name" msgid="1935869255545976415">"Naršyklė"</string>
+ <string name="choose_upload" msgid="3649366287575002063">"Pasirinkti failą, kurį norite įkelti"</string>
+ <string name="new_tab" msgid="4505722538297295141">"Naujas langas"</string>
+ <!-- no translation found for new_incognito_tab (5821404839654751753) -->
+ <skip />
+ <string name="active_tabs" msgid="3050623868203544623">"Windows"</string>
+ <string name="tab_bookmarks" msgid="2305793036003473653">"Žymės"</string>
+ <string name="tab_most_visited" msgid="1077402532455000703">"Dažniausiai lankomos"</string>
+ <string name="tab_history" msgid="1979267558744613746">"Istorija"</string>
+ <string name="added_to_bookmarks" msgid="1020224130695956728">"Pridėta prie žymių"</string>
+ <string name="removed_from_bookmarks" msgid="6063705902028438800">"Pašalinta iš žymių"</string>
+ <string name="sign_in_to" msgid="5939425800148759165">"Prisijungti prie <xliff:g id="HOSTNAME">%s1</xliff:g> „<xliff:g id="REALM">%s2</xliff:g>“"</string>
+ <string name="username" msgid="5057566336518215922">"Pavadinimas"</string>
+ <string name="password" msgid="1177138552305184404">"Slaptažodis"</string>
+ <string name="action" msgid="183105774472071343">"Prisijungti"</string>
+ <string name="bookmarks_search" msgid="5229596268214362873">"Naršyklė"</string>
+ <string name="cancel" msgid="3017274947407233702">"Atšaukti"</string>
+ <string name="ok" msgid="1509280796718850364">"Gerai"</string>
+ <string name="title_bar_loading" msgid="7438217780834640678">"Įkeliama…"</string>
+ <string name="page_info" msgid="4048529256302257195">"Puslapio informacija"</string>
+ <string name="page_info_view" msgid="5303490449842635158">"Žiūrėti puslapio informaciją"</string>
+ <string name="page_info_address" msgid="2222306609532903254">"Adresas:"</string>
+ <string name="ssl_warnings_header" msgid="79744901983636370">"Šioje svetainėje yra su saugos sertifikatu susijusių problemų."</string>
+ <string name="ssl_continue" msgid="8031515015829358457">"Tęsti"</string>
+ <string name="security_warning" msgid="6607795404322797541">"Saugos įspėjimas"</string>
+ <string name="view_certificate" msgid="1472768887529093862">"Žiūrėti sertifikatą"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
+ <string name="ssl_untrusted" msgid="5369967226521102194">"Šį sertifikatą išdavė nepatikima įstaiga."</string>
+ <string name="ssl_mismatch" msgid="558688832420069896">"Svetainės pavadinimas neatitinka sertifikate nurodyto pavadinimo."</string>
+ <string name="ssl_expired" msgid="5739349389499575559">"Šio sertifikato galiojimo laikas baigėsi."</string>
+ <string name="ssl_not_yet_valid" msgid="2893167846212645846">"Šis sertifikatas dar negalioja."</string>
+ <string name="ssl_certificate" msgid="5226747157992111668">"Saugos sertifikatas"</string>
+ <string name="ssl_certificate_is_valid" msgid="7096160815933145579">"Šis sertifikatas galioja."</string>
+ <string name="issued_to" msgid="9032338008819841339">"Išduota:"</string>
+ <string name="common_name" msgid="5745530093500062357">"Bendras pavadinimas:"</string>
+ <string name="org_name" msgid="8868889052889991293">"Organizacija:"</string>
+ <string name="org_unit" msgid="4489056376307768196">"Organizacinis vienetas:"</string>
+ <string name="issued_by" msgid="6959484326943152487">"Išdavė:"</string>
+ <string name="validity_period" msgid="57988851973181309">"Galiojimas:"</string>
+ <string name="issued_on" msgid="2082890654801808368">"Išduota:"</string>
+ <string name="expires_on" msgid="8061200430557020704">"Galiojimas baigiasi:"</string>
+ <string name="stopping" msgid="4839698519340302982">"Sustabdoma..."</string>
+ <string name="stop" msgid="5687251076030630074">"Sustabdyti"</string>
+ <string name="reload" msgid="8585220783228408062">"Atnaujinti"</string>
+ <string name="back" msgid="8414603107175713668">"Atgal"</string>
+ <string name="forward" msgid="4288210890526641577">"Persiųsti"</string>
+ <string name="save" msgid="5922311934992468496">"Gerai"</string>
+ <string name="do_not_save" msgid="6777633870113477714">"Atšaukti"</string>
+ <!-- outdated translation 969988560160364559 --> <string name="location" msgid="3411848697912600125">"Vieta"</string>
+ <!-- no translation found for containing_folder (6771180232953030479) -->
+ <skip />
+ <!-- no translation found for new_folder (7743540149088867917) -->
+ <skip />
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <!-- no translation found for no_subfolders (5880411440592452802) -->
+ <skip />
+ <!-- no translation found for add_to_bookmarks_menu_option (4449323955122214389) -->
+ <skip />
+ <!-- no translation found for add_to_homescreen_menu_option (1461447829242963790) -->
+ <skip />
+ <!-- no translation found for add_to_other_folder_menu_option (5450890093372998187) -->
+ <skip />
+ <!-- outdated translation 5990326151488445481 --> <string name="name" msgid="5462672162695365387">"Pavadinimas"</string>
+ <string name="http" msgid="2163722670597250102">"http://"</string>
+ <!-- outdated translation 588165100024086565 --> <string name="save_to_bookmarks" msgid="6101482434920313244">"Pridėti žymę"</string>
+ <!-- no translation found for bookmark_this_page (7530739804320811054) -->
+ <skip />
+ <string name="edit_bookmark" msgid="5024089053490231905">"Redaguoti žymę"</string>
+ <!-- outdated translation 9202323987633899835 --> <string name="create_shortcut_bookmark" msgid="1995095662095484289">"Prie pagrindinio puslapio pridėti spartųjį klavišą"</string>
+ <string name="open_bookmark" msgid="8473581305759935790">"Atidaryti"</string>
+ <string name="remove_bookmark" msgid="8407495852801410891">"Ištrinti žymę"</string>
+ <string name="remove_from_bookmarks" msgid="4374080666576982775">"Pašalinti iš žymių"</string>
+ <string name="remove_history_item" msgid="5021424935726728618">"Pašalinti iš istorijos"</string>
+ <string name="set_as_homepage" msgid="4752937379414905560">"Nustatyti kaip pagrindinį puslapį"</string>
+ <string name="bookmark_saved" msgid="2766434679871317557">"Išsaugota žymėse."</string>
+ <string name="bookmark_not_saved" msgid="700600955089376724">"Neįmanoma išsaugoti žymės."</string>
+ <string name="homepage_set" msgid="8768087280310966395">"Pagrindinis puslapis nustatytas."</string>
+ <string name="bookmark_needs_title" msgid="6245900436119218187">"Žymė turi būti pavadinta."</string>
+ <string name="bookmark_needs_url" msgid="7809876865972755158">"Žymė turi turėti vietą."</string>
+ <string name="bookmark_url_not_valid" msgid="6719785633980202419">"Neteisingas URL."</string>
+ <string name="bookmark_cannot_save_url" msgid="791722768778386941">"Negalima žymėti URL."</string>
+ <string name="delete_bookmark" msgid="2422989994934201992">"Ištrinti"</string>
+ <string name="bookmark_page" msgid="6845189305130307274">"Žymėti paskutinį peržiūrėtą puslapį"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
+ <string name="current_page" msgid="7510129573681663135">"nuo "</string>
+ <string name="delete_bookmark_warning" msgid="758043186202032205">"Žymė „<xliff:g id="BOOKMARK">%s</xliff:g>“ bus ištrinta."</string>
+ <string name="open_in_new_window" msgid="6596775546468054510">"Atidaryti naujame lange"</string>
+ <string name="goto_dot" msgid="3895839050522602723">"Pradėti"</string>
+ <!-- no translation found for incognito_tab (5419458065370134289) -->
+ <skip />
+ <string name="select_dot" msgid="6299170761900561967">"Pasirinkti tekstą"</string>
+ <string name="tab_picker_title" msgid="864478399057782913">"Dabartiniai langai"</string>
+ <string name="tab_picker_remove_tab" msgid="630087809802479397">"Uždaryti"</string>
+ <string name="bookmarks" msgid="1961279134885867815">"Žymės"</string>
+ <string name="shortcut_bookmark" msgid="3974876480401135895">"Žymė"</string>
+ <string name="history" msgid="2451240511251410032">"Istorija"</string>
+ <string name="menu_view_download" msgid="2124570321712995120">"Atsisiuntimai"</string>
+ <string name="copy_page_url" msgid="7635062169011319208">"Kopijuoti puslapio URL"</string>
+ <string name="share_page" msgid="593756995297268343">"Bendrinti puslapį"</string>
+ <!-- no translation found for menu_save_webarchive (3934652434001459581) -->
+ <skip />
+ <!-- no translation found for webarchive_saved (7045250341467345007) -->
+ <skip />
+ <!-- no translation found for webarchive_failed (2880998204746620260) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
+ <string name="contextmenu_openlink" msgid="7237961252214188935">"Atidaryti"</string>
+ <string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"Atidaryti naujame lange"</string>
+ <string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"Žymėti nuorodą"</string>
+ <string name="contextmenu_savelink" msgid="5508554930832538184">"Išsaugoti nuorodą"</string>
+ <string name="contextmenu_sharelink" msgid="5392275392280130331">"Bendrinti nuorodą"</string>
+ <string name="contextmenu_copy" msgid="398860586635404030">"Kopijuoti"</string>
+ <string name="contextmenu_copylink" msgid="5153657160294534270">"Kopijuoti nuorodos URL"</string>
+ <string name="contextmenu_download_image" msgid="4243829645180686912">"Išsaugoti vaizdą"</string>
+ <string name="contextmenu_view_image" msgid="3870625602053600905">"Žiūrėti vaizdą"</string>
+ <string name="contextmenu_set_wallpaper" msgid="3691902960115350686">"Nustatyti kaip darbalaukio foną"</string>
+ <string name="contextmenu_dial_dot" msgid="5856550683415933806">"Rinkti..."</string>
+ <string name="contextmenu_add_contact" msgid="3183511922223645716">"Pridėti adresatą"</string>
+ <string name="contextmenu_send_mail" msgid="1014513374828775660">"Siųsti el. laišką"</string>
+ <string name="contextmenu_map" msgid="7471390435434034912">"Žemėlapis"</string>
+ <string name="choosertitle_sharevia" msgid="4600490613341909086">"Bendrinti naudojant"</string>
+ <string name="clear" msgid="7070043081700011461">"Išvalyti"</string>
+ <string name="replace" msgid="4843033491070384047">"Pakeisti"</string>
+ <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Žymės"</string>
+ <string name="menu_preferences" msgid="6709237687234102240">"Nustatymai"</string>
+ <string name="pref_content_title" msgid="722227111894838633">"Puslapio turinio nustatymai"</string>
+ <string name="pref_content_load_images" msgid="2125616852957377561">"Įkelti vaizdus"</string>
+ <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Pateikti vaizdus tinklalapiuose"</string>
+ <string name="pref_content_block_popups" msgid="7808433807197256726">"Blokuoti iššokančiuosius langus"</string>
+ <string name="pref_content_javascript" msgid="4570972030299516843">"Įgalinti „JavaScript“"</string>
+ <string name="pref_content_open_in_background" msgid="824123779725118663">"Atidaryti fone"</string>
+ <string name="pref_content_plugins" msgid="7231944644794301582">"Įgalinti papildinius"</string>
+ <string-array name="pref_content_plugins_choices">
+ <item msgid="6745108155096660725">"Visada įjungta"</item>
+ <item msgid="2484126708670016519">"Pareikalavus"</item>
+ <item msgid="8547442717307793863">"Išjungta"</item>
+ </string-array>
+ <string name="pref_content_open_in_background_summary" msgid="1737664075721181678">"Atidaryti naujus langus už dabartinio lango"</string>
+ <string name="pref_content_homepage" msgid="6082437160778559806">"Nustatyti pagrindinį puslapį"</string>
+ <!-- no translation found for pref_content_search_engine (1620101310821644144) -->
+ <skip />
+ <!-- no translation found for pref_content_search_engine_summary (5162667665858487316) -->
+ <skip />
+ <!-- no translation found for pref_set_homepage_to (7196350233061395098) -->
+ <skip />
+ <!-- outdated translation 1493179933653044553 --> <string name="pref_use_current" msgid="1778622474040406672">"Naudoti dabartinį puslapį"</string>
+ <!-- no translation found for pref_use_blank (8503238592551111169) -->
+ <skip />
+ <!-- no translation found for pref_use_default (192587563274735878) -->
+ <skip />
+ <string name="pref_content_autofit" msgid="8260474534053660809">"Automatiškai talpinti puslapius"</string>
+ <string name="pref_content_autofit_summary" msgid="4587831659894879986">"Formatuoti tinklalapius, kad tilptų ekrane"</string>
+ <!-- no translation found for pref_personal_title (1447687455755683695) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome (1695182180332194033) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome_summary (7414133931827321055) -->
+ <skip />
+ <!-- no translation found for pref_personal_google_account (952360133341490071) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks (59237515966184432) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks_summary (4791767605662205482) -->
+ <skip />
+ <!-- no translation found for pref_personal_start_syncing (6046972042512655232) -->
+ <skip />
+ <!-- no translation found for pref_personal_account_dialog_title (1390867119887955530) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled (1174197447388234595) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled_summary (422640696197018914) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor (1350709161524642663) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor_summary (6748434431641768870) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_name (8566130291459685955) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_email_address (7967585896612797173) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_company_name (2813443159949210417) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1 (836433242509243081) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1_hint (5965659598509327172) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2 (8194745202893822479) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2_hint (2048330295853546405) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_city (4193225955409148508) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_state (8549739922338171458) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_zip_code (283668573295656671) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_country (7234470301239156656) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_phone_number (4938852821413729276) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_save_profile (8349915287435262888) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_save (6834102203944938409) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_delete (2421442112954362732) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_delete_profile (7112035941146003753) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
+ <string name="pref_privacy_title" msgid="1052470980370846151">"Privatumo nustatymai"</string>
+ <string name="pref_privacy_clear_cache" msgid="3380316479925886998">"Išvalyti talpyklą"</string>
+ <string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"Išvalyti vietinėje talpykloje saugomą turinį ir duomenis"</string>
+ <string name="pref_privacy_clear_cache_dlg" msgid="5541011591300753881">"Vietinėje talpykloje saugomas turinys ir duomenys bus ištrinti."</string>
+ <string name="pref_privacy_clear_cookies" msgid="3095583579133780331">"Išvalyti visus slapukų duomenis"</string>
+ <string name="pref_privacy_clear_cookies_summary" msgid="6962742063990677520">"Išvalyti visus naršyklės slapukus"</string>
+ <string name="pref_privacy_clear_cookies_dlg" msgid="552855688091432682">"Bus ištrinti visi slapukai."</string>
+ <string name="pref_privacy_clear_history" msgid="8723795508825198477">"Išvalyti istoriją"</string>
+ <string name="pref_privacy_clear_history_summary" msgid="6868501330708940734">"Išvalyti naršyklės naršymo istoriją"</string>
+ <string name="pref_privacy_clear_history_dlg" msgid="544903007914753853">"Bus ištrinta naršyklės navigacijos istorija."</string>
+ <string name="pref_privacy_clear_form_data" msgid="4232668196344383987">"Išvalyti formos duomenis"</string>
+ <string name="pref_privacy_clear_form_data_summary" msgid="1790390894719517167">"Išvalyti visus išsaugotus formos duomenis"</string>
+ <string name="pref_privacy_clear_form_data_dlg" msgid="4443621086781197928">"Bus ištrinti visi išsaugoti formos duomenys."</string>
+ <string name="pref_privacy_clear_passwords" msgid="4750234112289277480">"Išvalyti slaptažodžius"</string>
+ <string name="pref_privacy_clear_passwords_summary" msgid="8856782718942903335">"Išvalyti visus išsaugotus slaptažodžius"</string>
+ <string name="pref_privacy_clear_passwords_dlg" msgid="2083869328824248255">"Visi išsaugoti slaptažodžiai bus ištrinti."</string>
+ <string name="pref_privacy_enable_geolocation" msgid="1395040170290765686">"Įgalinti vietą"</string>
+ <string name="pref_privacy_enable_geolocation_summary" msgid="8437020934664306205">"Leisti svetainėms teikti užklausas dėl prieigos prie jūsų vietovės"</string>
+ <string name="pref_privacy_clear_geolocation_access" msgid="6649680770030042980">"Išvalyti prieigą prie vietos"</string>
+ <string name="pref_privacy_clear_geolocation_access_summary" msgid="7750143359497314679">"Išvalyti visų svetainių vietų prieigą"</string>
+ <string name="pref_privacy_clear_geolocation_access_dlg" msgid="7327063124488827244">"Išvalyti visų svetainių vietų prieigą"</string>
+ <string name="pref_security_title" msgid="5763978646932160021">"Saugos nustatymai"</string>
+ <string name="pref_security_remember_passwords" msgid="6492957683454529549">"Atsiminti slaptažodžius"</string>
+ <string name="pref_security_remember_passwords_summary" msgid="256388703356349137">"Išsaugoti svetainių naudotojų vardus ir slaptažodžius"</string>
+ <string name="pref_security_save_form_data" msgid="1213669802810198893">"Atsiminti formos duomenis"</string>
+ <string name="pref_security_save_form_data_summary" msgid="4994074685153708026">"Atsiminti duomenis, kuriuos įvedu į formas, kad vėliau būtų galima jas naudoti"</string>
+ <string name="pref_security_show_security_warning" msgid="8901135676266754559">"Rodyti saugos įspėjimus"</string>
+ <string name="pref_security_show_security_warning_summary" msgid="8968906112720511704">"Rodyti įspėjimą, jei kyla problemų dėl svetainės saugos"</string>
+ <string name="pref_security_accept_cookies" msgid="3201367661925047989">"Priimti slapukus"</string>
+ <string name="pref_security_accept_cookies_summary" msgid="1465118934875026920">"Leisti svetainėms išsaugoti ir skaityti „slapukų“ duomenis"</string>
+ <string name="pref_text_size" msgid="3827031324346612208">"Teksto dydis"</string>
+ <string-array name="pref_text_size_choices">
+ <item msgid="4952686548944739548">"Labai nedidelis"</item>
+ <item msgid="1950030433642671460">"Mažas"</item>
+ <item msgid="4338347520133294584">"Įprastas"</item>
+ <item msgid="5043128215356351184">"Didelis"</item>
+ <item msgid="7201512237890458902">"Didžiulis"</item>
+ </string-array>
+ <string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Teksto dydis"</string>
+ <string name="pref_default_zoom" msgid="8076142259097187395">"Numatytasis mastelio keitimas"</string>
+ <string-array name="pref_default_zoom_choices">
+ <item msgid="549583171195154919">"Toli"</item>
+ <item msgid="5619034257768161024">"Vidutinis"</item>
+ <item msgid="3840999588443167001">"Uždaryti"</item>
+ </string-array>
+ <string name="pref_default_zoom_dialogtitle" msgid="6095974367125109021">"Numatytasis mastelio keitimas"</string>
+ <string name="pref_content_load_page" msgid="2219810141690955452">"Atidaryti puslapius apžvalgai"</string>
+ <string name="pref_content_load_page_summary" msgid="8792093504054149369">"Rodyti naujai atidarytų puslapių apžvalgas"</string>
+ <string name="pref_extras_title" msgid="3091250467679722382">"Išplėstiniai nustatymai"</string>
+ <string name="pref_extras_website_settings" msgid="67866640052455549">"Svetainės nustatymai"</string>
+ <string name="pref_extras_website_settings_summary" msgid="1656771443223494406">"Išplėstiniai atskirų svetainių nustatymai"</string>
+ <string name="pref_extras_reset_default" msgid="8904000515846202110">"Nustatyti iš naujo į numatytuosius nustatymus"</string>
+ <string name="pref_extras_reset_default_summary" msgid="4247870778270414501">"Atkurti numatytuosius nustatymus"</string>
+ <string name="pref_extras_reset_default_dlg" msgid="6640261575874704022">"Nustatymai bus grąžinti į numatytąsias vertes."</string>
+ <string name="pref_extras_reset_default_dlg_title" msgid="2250334970728938936">"Nustatyti iš naujo į numatytuosius nustatymus"</string>
+ <string name="pref_development_title" msgid="3263854204533056480">"Derinti"</string>
+ <string name="pref_default_text_encoding" msgid="5742965543955558478">"Teksto koduotė"</string>
+ <!-- no translation found for pref_default_text_encoding_choices:7 (2193955365569270096) -->
+ <string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Teksto koduotė"</string>
+ <string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"Duomenų jungiamumo problema"</string>
+ <string name="browserFrameFileErrorLabel" msgid="8063691502792670367">"Failo problema"</string>
+ <string name="browserFrameFormResubmitLabel" msgid="2685923472682180360">"Patvirtinti"</string>
+ <string name="browserFrameFormResubmitMessage" msgid="2752182215695632138">"Puslapyje, kurį bandote peržiūrėti, yra duomenų, kurie jau pateikti (POSTDATA). Jei duomenis siųsite iš naujo, bus pakartoti visi puslapyje esančioje formoje nurodyti veiksmai (pvz., paieška ar pirkimas internetu)."</string>
+ <string name="loadSuspendedTitle" msgid="675991625288706944">"Nėra tinklo ryšio"</string>
+ <string name="loadSuspended" msgid="3133656588880851273">"Naršyklė negali įkelti šio puslapio, nes nėra interneto ryšio."</string>
+ <string name="clear_history" msgid="5998307092715979619">"Išvalyti istoriją"</string>
+ <string name="browser_history" msgid="1038987118290272525">"Paskutiniai lankyti puslapiai"</string>
+ <string name="empty_history" msgid="8738772352308207274">"Naršyklės istorija tuščia."</string>
+ <string name="add_new_bookmark" msgid="8086367791400349049">"Pridėti žymę..."</string>
+ <string name="add_bookmark_short" msgid="3783984330998103735">"Pridėti"</string>
+ <string name="search_hint" msgid="4647356319916631820">"Ieškokite ar įveskite URL"</string>
+ <string name="search_button_text" msgid="5235226933877634410">"Pradėti"</string>
+ <string name="search_settings_description" msgid="1422401062529014107">"Žymės ir žiniatinklio istorija"</string>
+ <string name="attention" msgid="3473639060042811244">"Dėmesio"</string>
+ <string name="popup_window_attempt" msgid="2673111696288657989">"Ši svetainė bando atidaryti iššokantįjį langą."</string>
+ <string name="allow" msgid="1157313689171991335">"Leisti"</string>
+ <string name="block" msgid="9172175889884707800">"Blokuoti"</string>
+ <string name="too_many_windows_dialog_title" msgid="5175503564948906442">"Pasiekta langų riba"</string>
+ <string name="too_many_windows_dialog_message" msgid="1398571800233959583">"Nepavyko atidaryti naujo lango, nes jau atidarėte maksimalų langų skaičių."</string>
+ <string name="too_many_subwindows_dialog_title" msgid="3805453941587725944">"Iššokantysis langas jau atidarytas"</string>
+ <string name="too_many_subwindows_dialog_message" msgid="5827289829907966657">"Nepavyko atidaryti naujo iššokančiojo lango, nes vienu metu gali būti atidarytas tik vienas langas."</string>
+ <string name="download_title" msgid="2122874021047565594">"Atsisiuntimo istorija"</string>
+ <string name="download_unknown_filename" msgid="4013465542563652175">"<Nežinomas>"</string>
+ <string name="download_menu_open" msgid="4888327480367757513">"Atidaryti"</string>
+ <string name="download_menu_clear" msgid="6264454531553418124">"Išvalyti iš sąrašo"</string>
+ <string name="download_menu_delete" msgid="8815502136393894148">"Ištrinti"</string>
+ <string name="download_menu_cancel" msgid="2545333007601851574">"Atšaukti atsisiuntimą"</string>
+ <string name="download_menu_cancel_all" msgid="2136550823151999166">"Atšaukti visus atsisiuntimus"</string>
+ <string name="download_cancel_dlg_title" msgid="8909108500262799748">"Atšaukti atsisiuntimus"</string>
+ <string name="download_cancel_dlg_msg" msgid="6285389170052357797">"Visi <xliff:g id="DOWNLOAD_COUNT">%d</xliff:g> atsisiuntimai (-ų) bus atšaukti (-a) ir išvalyti (-a) iš atsisiuntimo istorijos."</string>
+ <string name="download_delete_file" msgid="5330036497843073249">"Failas bus ištrintas"</string>
+ <string name="download_file_error_dlg_title" msgid="2693630283595384874">"Nėra vietos"</string>
+ <string name="download_file_error_dlg_msg" msgid="5156405410324072471">"Nepavyko atsisiųsti <xliff:g id="FILENAME">%s</xliff:g>."\n"Atlaisvinkite vietos telefone ir bandykite dar kartą."</string>
+ <string name="download_failed_generic_dlg_title" msgid="6106781095337833391">"Atsisiuntimas nesėkmingas"</string>
+ <!-- outdated translation 605904452159416792 --> <string name="download_no_sdcard_dlg_title" product="nosdcard" msgid="56777245081568508">"Nėra SD kortelės"</string>
+ <string name="download_no_sdcard_dlg_title" product="default" msgid="605904452159416792">"Nėra SD kortelės"</string>
+ <!-- no translation found for download_no_sdcard_dlg_msg (3144652102051031721) -->
+ <skip />
+ <string name="download_no_sdcard_dlg_msg" product="default" msgid="2616399456116301518">"Norint atsisiųsti <xliff:g id="FILENAME">%s</xliff:g>, reikalinga SD kortelė."</string>
+ <!-- outdated translation 6877712666046917741 --> <string name="download_sdcard_busy_dlg_title" product="nosdcard" msgid="8081445664689818973">"SD kortelė negalima"</string>
+ <string name="download_sdcard_busy_dlg_title" product="default" msgid="6877712666046917741">"SD kortelė negalima"</string>
+ <!-- outdated translation 3473883538192835204 --> <string name="download_sdcard_busy_dlg_msg" product="nosdcard" msgid="3979329954835690147">"SD kortelė užimta. Jei norite leisti atsisiuntimus, pranešime pasirinkite „Išjungti USB saugyklą“."</string>
+ <string name="download_sdcard_busy_dlg_msg" product="default" msgid="3473883538192835204">"SD kortelė užimta. Jei norite leisti atsisiuntimus, pranešime pasirinkite „Išjungti USB saugyklą“."</string>
+ <string name="download_no_application_title" msgid="1286056729168874295">"Nepavyksta atidaryti failo"</string>
+ <string name="retry" msgid="1835923075542266721">"Bandyti dar kartą"</string>
+ <string name="no_downloads" msgid="3947445710685021498">"Atsisiuntimo istorija tuščia."</string>
+ <string name="download_error" msgid="413496839831257187">"Atsisiuntimas nesėkmingas."</string>
+ <string name="download_success" msgid="2279041638155595203">"<xliff:g id="FILE">%s</xliff:g> atsisiuntimas baigtas."</string>
+ <string name="download_running" msgid="2622942231322015059">"Atsisiunčiama..."</string>
+ <string name="download_pending" msgid="2599683668575349559">"Pradedamas atsisiuntimas..."</string>
+ <string name="download_pending_network" msgid="6548714525679461053">"Laukiama duomenų ryšio..."</string>
+ <string name="download_running_paused" msgid="6418029352085656495">"Laukiama duomenų ryšio..."</string>
+ <string name="download_canceled" msgid="6057083743144492515">"Atsisiuntimas atšauktas."</string>
+ <string name="download_not_acceptable" msgid="313769696131563652">"Negalima atsisiųsti. Turinys šiame telefone nepalaikomas."</string>
+ <string name="download_file_error" msgid="1206648050615176113">"Nepavyko užbaigti atsisiuntimo. Nepakanka vietos."</string>
+ <string name="download_length_required" msgid="9038605488460437406">"Nepavyksta atsisiųsti. Negalima nustatyti elemento dydžio."</string>
+ <string name="download_precondition_failed" msgid="8327584102874295580">"Atsisiuntimas pertrauktas. Jo atnaujinti negalima."</string>
+ <string name="search_the_web" msgid="6046130189241962337">"Ieškoti žiniatinklyje"</string>
+ <string name="webstorage_outofspace_notification_title" msgid="1160474608059771788">"Naršyklės saugykla pilna"</string>
+ <string name="webstorage_outofspace_notification_text" msgid="7341075135051829692">"Spustelėkite, jei norite atlaisvinti vietos."</string>
+ <string name="webstorage_clear_data_title" msgid="689484577124333977">"Išvalyti išsaugotus duomenis"</string>
+ <string name="webstorage_clear_data_dialog_title" msgid="345457466368974706">"Išvalyti išsaugotus duomenis"</string>
+ <string name="webstorage_clear_data_dialog_message" msgid="6678281256970470125">"Visi šioje svetainėje saugomi duomenys bus ištrinti"</string>
+ <string name="webstorage_clear_data_dialog_ok_button" msgid="2516563534211898636">"Išvalyti viską"</string>
+ <string name="webstorage_clear_data_dialog_cancel_button" msgid="2028867751958942762">"Atšaukti"</string>
+ <string name="webstorage_origin_summary_mb_stored" msgid="1985885826292236210">"Jūsų telefone išsaugota MB"</string>
+ <string name="loading_video" msgid="4887871585216091096">"Įkeliamas vaizdo įrašas"</string>
+ <string name="geolocation_permissions_prompt_message" msgid="356796102004052471">"<xliff:g id="WEBSITE_ORIGIN">%s</xliff:g> nori žinoti jūsų vietą"</string>
+ <string name="geolocation_permissions_prompt_share" msgid="9084486342048347976">"Bendrinti vietą"</string>
+ <string name="geolocation_permissions_prompt_dont_share" msgid="6303025160237860300">"Atmesti"</string>
+ <string name="geolocation_permissions_prompt_remember" msgid="3118526300707348308">"Atsiminti nuostatą"</string>
+ <string name="geolocation_permissions_prompt_toast_allowed" msgid="987286072035125498">"Ši svetainė gali pasiekti jūsų vietos. Pakeiskite tai apsilankę „Nustatymai“ -> „Svetainės nustatymai“"</string>
+ <string name="geolocation_permissions_prompt_toast_disallowed" msgid="7695100950212692515">"Ši svetainė negali pasiekti jūsų vietos. Pakeiskite tai apsilankę „Nustatymai“ -> „Svetainės nustatymai“"</string>
+ <string name="geolocation_settings_page_title" msgid="1745477985097536528">"Išvalyti prieigą prie vietos"</string>
+ <string name="geolocation_settings_page_summary_allowed" msgid="9180251524290811398">"Šiuo metu ši svetainė gali pasiekti jūsų vietą"</string>
+ <string name="geolocation_settings_page_summary_not_allowed" msgid="4589649082203102544">"Ši svetainė dabar negali pasiekti jūsų vietos"</string>
+ <string name="geolocation_settings_page_dialog_title" msgid="1549842043381347668">"Išvalyti prieigą prie vietos"</string>
+ <string name="geolocation_settings_page_dialog_message" msgid="7586671987576403993">"Vietos prieiga šiai svetainei bus ištrinta"</string>
+ <string name="geolocation_settings_page_dialog_ok_button" msgid="4789434178048077287">"Išvalyti prieigą"</string>
+ <string name="geolocation_settings_page_dialog_cancel_button" msgid="7941036504673409747">"Atšaukti"</string>
+ <string name="website_settings_clear_all" msgid="8739804325997655980">"Išvalyti viską"</string>
+ <string name="website_settings_clear_all_dialog_title" msgid="7791826325122461718">"Išvalyti visus svetainės nustatymus?"</string>
+ <string name="website_settings_clear_all_dialog_message" msgid="6150502090601476333">"Bus ištrinti visi svetainės duomenys ir vietų leidimai."</string>
+ <string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"Ištrinti visus duomenis"</string>
+ <string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"Atšaukti"</string>
+ <string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"Nustatomas darbalaukio fonas..."</string>
+ <!-- no translation found for defaultBookmarksUpButton (2303951020715704735) -->
+ <skip />
+ <!-- no translation found for empty_bookmarks_folder (7843361614634930942) -->
+ <skip />
+ <!-- no translation found for rlz_access_point (7165847807377650632) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_title (3325557652271172128) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_description (2187665745413495303) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_remove (8105572409059113340) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_import (6933613853573899218) -->
+ <skip />
+</resources>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
new file mode 100644
index 0000000..5ab0449
--- /dev/null
+++ b/res/values-lv/strings.xml
@@ -0,0 +1,401 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2007 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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="application_name" msgid="1935869255545976415">"Pārlūkprogramma"</string>
+ <string name="choose_upload" msgid="3649366287575002063">"Izvēlieties augšupielādējamo failu"</string>
+ <string name="new_tab" msgid="4505722538297295141">"Jauns logs"</string>
+ <!-- no translation found for new_incognito_tab (5821404839654751753) -->
+ <skip />
+ <string name="active_tabs" msgid="3050623868203544623">"Logi"</string>
+ <string name="tab_bookmarks" msgid="2305793036003473653">"Grāmatzīmes"</string>
+ <string name="tab_most_visited" msgid="1077402532455000703">"Visvairāk apmeklētās"</string>
+ <string name="tab_history" msgid="1979267558744613746">"Vēsture"</string>
+ <string name="added_to_bookmarks" msgid="1020224130695956728">"Pievienots grāmatzīmēm"</string>
+ <string name="removed_from_bookmarks" msgid="6063705902028438800">"Noņemts no grāmatzīmēm"</string>
+ <string name="sign_in_to" msgid="5939425800148759165">"Pierakstīšanās domēnā <xliff:g id="HOSTNAME">%s1</xliff:g> “<xliff:g id="REALM">%s2</xliff:g>”"</string>
+ <string name="username" msgid="5057566336518215922">"Pieteikumvārds"</string>
+ <string name="password" msgid="1177138552305184404">"Parole"</string>
+ <string name="action" msgid="183105774472071343">"Pierakstīties"</string>
+ <string name="bookmarks_search" msgid="5229596268214362873">"Pārlūkprogramma"</string>
+ <string name="cancel" msgid="3017274947407233702">"Atcelt"</string>
+ <string name="ok" msgid="1509280796718850364">"Labi"</string>
+ <string name="title_bar_loading" msgid="7438217780834640678">"Notiek ielāde…"</string>
+ <string name="page_info" msgid="4048529256302257195">"Lapas informācija"</string>
+ <string name="page_info_view" msgid="5303490449842635158">"Skatīt lapas informāciju"</string>
+ <string name="page_info_address" msgid="2222306609532903254">"Adrese:"</string>
+ <string name="ssl_warnings_header" msgid="79744901983636370">"Radušās problēmas ar šīs vietnes drošības sertifikātu."</string>
+ <string name="ssl_continue" msgid="8031515015829358457">"Turpināt"</string>
+ <string name="security_warning" msgid="6607795404322797541">"Drošības brīdinājums"</string>
+ <string name="view_certificate" msgid="1472768887529093862">"Skatīt sertifikātu"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
+ <string name="ssl_untrusted" msgid="5369967226521102194">"Šo sertifikātu nav izsniegusi uzticama iestāde."</string>
+ <string name="ssl_mismatch" msgid="558688832420069896">"Vietnes nosaukums neatbilst nosaukumam sertifikātā."</string>
+ <string name="ssl_expired" msgid="5739349389499575559">"Šī sertifikāta derīguma termiņš ir beidzies."</string>
+ <string name="ssl_not_yet_valid" msgid="2893167846212645846">"Šis sertifikāts vēl nav derīgs."</string>
+ <string name="ssl_certificate" msgid="5226747157992111668">"Drošības sertifikāts"</string>
+ <string name="ssl_certificate_is_valid" msgid="7096160815933145579">"Sertifikāts ir derīgs."</string>
+ <string name="issued_to" msgid="9032338008819841339">"Izdots:"</string>
+ <string name="common_name" msgid="5745530093500062357">"Kopējais nosaukums:"</string>
+ <string name="org_name" msgid="8868889052889991293">"Organizācija:"</string>
+ <string name="org_unit" msgid="4489056376307768196">"Organizācijas vienība:"</string>
+ <string name="issued_by" msgid="6959484326943152487">"Izsniedzējs:"</string>
+ <string name="validity_period" msgid="57988851973181309">"Derīgums:"</string>
+ <string name="issued_on" msgid="2082890654801808368">"Izsniegšanas datums:"</string>
+ <string name="expires_on" msgid="8061200430557020704">"Derīguma termiņš:"</string>
+ <string name="stopping" msgid="4839698519340302982">"Notiek apturēšana..."</string>
+ <string name="stop" msgid="5687251076030630074">"Apturēt"</string>
+ <string name="reload" msgid="8585220783228408062">"Atsvaidzināt"</string>
+ <string name="back" msgid="8414603107175713668">"Atpakaļ"</string>
+ <string name="forward" msgid="4288210890526641577">"Tālāk"</string>
+ <string name="save" msgid="5922311934992468496">"Labi"</string>
+ <string name="do_not_save" msgid="6777633870113477714">"Atcelt"</string>
+ <!-- outdated translation 969988560160364559 --> <string name="location" msgid="3411848697912600125">"Atrašanās vieta"</string>
+ <!-- no translation found for containing_folder (6771180232953030479) -->
+ <skip />
+ <!-- no translation found for new_folder (7743540149088867917) -->
+ <skip />
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <!-- no translation found for no_subfolders (5880411440592452802) -->
+ <skip />
+ <!-- no translation found for add_to_bookmarks_menu_option (4449323955122214389) -->
+ <skip />
+ <!-- no translation found for add_to_homescreen_menu_option (1461447829242963790) -->
+ <skip />
+ <!-- no translation found for add_to_other_folder_menu_option (5450890093372998187) -->
+ <skip />
+ <!-- outdated translation 5990326151488445481 --> <string name="name" msgid="5462672162695365387">"Nosaukums"</string>
+ <string name="http" msgid="2163722670597250102">"http://"</string>
+ <!-- outdated translation 588165100024086565 --> <string name="save_to_bookmarks" msgid="6101482434920313244">"Pievienot grāmatzīmi"</string>
+ <!-- no translation found for bookmark_this_page (7530739804320811054) -->
+ <skip />
+ <string name="edit_bookmark" msgid="5024089053490231905">"Rediģēt grāmatzīmi"</string>
+ <!-- outdated translation 9202323987633899835 --> <string name="create_shortcut_bookmark" msgid="1995095662095484289">"Pievienot saīsni uz sākuma ekrānu"</string>
+ <string name="open_bookmark" msgid="8473581305759935790">"Atvērt"</string>
+ <string name="remove_bookmark" msgid="8407495852801410891">"Dzēst grāmatzīmi"</string>
+ <string name="remove_from_bookmarks" msgid="4374080666576982775">"Noņemt no grāmatzīmēm"</string>
+ <string name="remove_history_item" msgid="5021424935726728618">"Noņemt no vēstures"</string>
+ <string name="set_as_homepage" msgid="4752937379414905560">"Iestatīt kā mājaslapu"</string>
+ <string name="bookmark_saved" msgid="2766434679871317557">"Grāmatzīme ir saglabāta."</string>
+ <string name="bookmark_not_saved" msgid="700600955089376724">"Nevar saglabāt grāmatzīmi."</string>
+ <string name="homepage_set" msgid="8768087280310966395">"Mājaslapa ir iestatīta."</string>
+ <string name="bookmark_needs_title" msgid="6245900436119218187">"Jānorāda grāmatzīmes nosaukums."</string>
+ <string name="bookmark_needs_url" msgid="7809876865972755158">"Jānorāda grāmatzīmes atrašanās vieta."</string>
+ <string name="bookmark_url_not_valid" msgid="6719785633980202419">"URL nav derīgs."</string>
+ <string name="bookmark_cannot_save_url" msgid="791722768778386941">"Šo URL nevar atzīmēt ar grāmatzīmi."</string>
+ <string name="delete_bookmark" msgid="2422989994934201992">"Dzēst"</string>
+ <string name="bookmark_page" msgid="6845189305130307274">"Atzīmēt ar grāmatzīmi pēdējo skatīto lapu"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
+ <string name="current_page" msgid="7510129573681663135">"no "</string>
+ <string name="delete_bookmark_warning" msgid="758043186202032205">"Grāmatzīme “<xliff:g id="BOOKMARK">%s</xliff:g>” tiks dzēsta."</string>
+ <string name="open_in_new_window" msgid="6596775546468054510">"Atvērt jaunā logā"</string>
+ <string name="goto_dot" msgid="3895839050522602723">"Sākt"</string>
+ <!-- no translation found for incognito_tab (5419458065370134289) -->
+ <skip />
+ <string name="select_dot" msgid="6299170761900561967">"Atlasīt tekstu"</string>
+ <string name="tab_picker_title" msgid="864478399057782913">"Pašreizējie logi"</string>
+ <string name="tab_picker_remove_tab" msgid="630087809802479397">"Aizvērt"</string>
+ <string name="bookmarks" msgid="1961279134885867815">"Grāmatzīmes"</string>
+ <string name="shortcut_bookmark" msgid="3974876480401135895">"Atzīmēt ar grāmatzīmi"</string>
+ <string name="history" msgid="2451240511251410032">"Vēsture"</string>
+ <string name="menu_view_download" msgid="2124570321712995120">"Lejupielādes"</string>
+ <string name="copy_page_url" msgid="7635062169011319208">"Kopēt lapas URL"</string>
+ <string name="share_page" msgid="593756995297268343">"Kopīgot lapu"</string>
+ <!-- no translation found for menu_save_webarchive (3934652434001459581) -->
+ <skip />
+ <!-- no translation found for webarchive_saved (7045250341467345007) -->
+ <skip />
+ <!-- no translation found for webarchive_failed (2880998204746620260) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
+ <string name="contextmenu_openlink" msgid="7237961252214188935">"Atvērt"</string>
+ <string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"Atvērt jaunā logā"</string>
+ <string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"Atzīmēt saiti ar grāmatzīmi"</string>
+ <string name="contextmenu_savelink" msgid="5508554930832538184">"Saglabāt saiti"</string>
+ <string name="contextmenu_sharelink" msgid="5392275392280130331">"Kopīgot saiti"</string>
+ <string name="contextmenu_copy" msgid="398860586635404030">"Kopēt"</string>
+ <string name="contextmenu_copylink" msgid="5153657160294534270">"Kopēt saites URL"</string>
+ <string name="contextmenu_download_image" msgid="4243829645180686912">"Saglabāt attēlu"</string>
+ <string name="contextmenu_view_image" msgid="3870625602053600905">"Skatīt attēlu"</string>
+ <string name="contextmenu_set_wallpaper" msgid="3691902960115350686">"Iestatīt kā tapeti"</string>
+ <string name="contextmenu_dial_dot" msgid="5856550683415933806">"Sastādīt numuru..."</string>
+ <string name="contextmenu_add_contact" msgid="3183511922223645716">"Pievienot kontaktpersonu"</string>
+ <string name="contextmenu_send_mail" msgid="1014513374828775660">"Sūtīt e-pasta ziņojumu"</string>
+ <string name="contextmenu_map" msgid="7471390435434034912">"Kartēt"</string>
+ <string name="choosertitle_sharevia" msgid="4600490613341909086">"Kopīgot, izmantojot"</string>
+ <string name="clear" msgid="7070043081700011461">"Notīrīšana"</string>
+ <string name="replace" msgid="4843033491070384047">"Aizstāt"</string>
+ <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Grāmatzīmes"</string>
+ <string name="menu_preferences" msgid="6709237687234102240">"Iestatījumi"</string>
+ <string name="pref_content_title" msgid="722227111894838633">"Lapas satura iestatījumi"</string>
+ <string name="pref_content_load_images" msgid="2125616852957377561">"Ielādēt attēlus"</string>
+ <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Rādīt attēlus tīmekļa lapās"</string>
+ <string name="pref_content_block_popups" msgid="7808433807197256726">"Bloķēt uznirstošos logus"</string>
+ <string name="pref_content_javascript" msgid="4570972030299516843">"Iespējot JavaScript"</string>
+ <string name="pref_content_open_in_background" msgid="824123779725118663">"Atvērt fonā"</string>
+ <string name="pref_content_plugins" msgid="7231944644794301582">"Iespējot spraudņus"</string>
+ <string-array name="pref_content_plugins_choices">
+ <item msgid="6745108155096660725">"Vienmēr ieslēgts"</item>
+ <item msgid="2484126708670016519">"Pēc pieprasījuma"</item>
+ <item msgid="8547442717307793863">"Izslēgt"</item>
+ </string-array>
+ <string name="pref_content_open_in_background_summary" msgid="1737664075721181678">"Atvērt jaunus logus aiz pašreizējā loga"</string>
+ <string name="pref_content_homepage" msgid="6082437160778559806">"Iestatīt mājaslapu"</string>
+ <!-- no translation found for pref_content_search_engine (1620101310821644144) -->
+ <skip />
+ <!-- no translation found for pref_content_search_engine_summary (5162667665858487316) -->
+ <skip />
+ <!-- no translation found for pref_set_homepage_to (7196350233061395098) -->
+ <skip />
+ <!-- outdated translation 1493179933653044553 --> <string name="pref_use_current" msgid="1778622474040406672">"Izmantot pašreizējo lapu"</string>
+ <!-- no translation found for pref_use_blank (8503238592551111169) -->
+ <skip />
+ <!-- no translation found for pref_use_default (192587563274735878) -->
+ <skip />
+ <string name="pref_content_autofit" msgid="8260474534053660809">"Automātiski pielāgot lapas"</string>
+ <string name="pref_content_autofit_summary" msgid="4587831659894879986">"Formatēt tīmekļa lapas, lai tās ietilptu ekrānā"</string>
+ <!-- no translation found for pref_personal_title (1447687455755683695) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome (1695182180332194033) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome_summary (7414133931827321055) -->
+ <skip />
+ <!-- no translation found for pref_personal_google_account (952360133341490071) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks (59237515966184432) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks_summary (4791767605662205482) -->
+ <skip />
+ <!-- no translation found for pref_personal_start_syncing (6046972042512655232) -->
+ <skip />
+ <!-- no translation found for pref_personal_account_dialog_title (1390867119887955530) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled (1174197447388234595) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled_summary (422640696197018914) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor (1350709161524642663) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor_summary (6748434431641768870) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_name (8566130291459685955) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_email_address (7967585896612797173) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_company_name (2813443159949210417) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1 (836433242509243081) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1_hint (5965659598509327172) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2 (8194745202893822479) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2_hint (2048330295853546405) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_city (4193225955409148508) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_state (8549739922338171458) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_zip_code (283668573295656671) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_country (7234470301239156656) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_phone_number (4938852821413729276) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_save_profile (8349915287435262888) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_save (6834102203944938409) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_delete (2421442112954362732) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_delete_profile (7112035941146003753) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
+ <string name="pref_privacy_title" msgid="1052470980370846151">"Konfidencialitātes iestatījumi"</string>
+ <string name="pref_privacy_clear_cache" msgid="3380316479925886998">"Notīrīt kešatmiņu"</string>
+ <string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"Notīrīt lokālajā kešatmiņā saglabāto saturu un datu bāzes"</string>
+ <string name="pref_privacy_clear_cache_dlg" msgid="5541011591300753881">"Lokālajā kešatmiņā ievietots saturs un datu bāzes tiks dzēstas."</string>
+ <string name="pref_privacy_clear_cookies" msgid="3095583579133780331">"Notīrīt visus sīkfailu datus"</string>
+ <string name="pref_privacy_clear_cookies_summary" msgid="6962742063990677520">"Notīrīt visus pārlūkprogrammas sīkfailus"</string>
+ <string name="pref_privacy_clear_cookies_dlg" msgid="552855688091432682">"Visi sīkfaili tiks dzēsti."</string>
+ <string name="pref_privacy_clear_history" msgid="8723795508825198477">"Notīrīt vēsturi"</string>
+ <string name="pref_privacy_clear_history_summary" msgid="6868501330708940734">"Notīrīt pārlūkprogrammas navigācijas vēsturi"</string>
+ <string name="pref_privacy_clear_history_dlg" msgid="544903007914753853">"Pārlūkprogrammas navigācijas vēsture tiks dzēsta."</string>
+ <string name="pref_privacy_clear_form_data" msgid="4232668196344383987">"Notīrīt veidlapu datus"</string>
+ <string name="pref_privacy_clear_form_data_summary" msgid="1790390894719517167">"Notīrīt visus saglabātos veidlapu datus"</string>
+ <string name="pref_privacy_clear_form_data_dlg" msgid="4443621086781197928">"Visi saglabātie veidlapu dati tiks dzēsti."</string>
+ <string name="pref_privacy_clear_passwords" msgid="4750234112289277480">"Notīrīt paroles"</string>
+ <string name="pref_privacy_clear_passwords_summary" msgid="8856782718942903335">"Notīrīt visas saglabātās paroles"</string>
+ <string name="pref_privacy_clear_passwords_dlg" msgid="2083869328824248255">"Visas saglabātās paroles tiks dzēstas."</string>
+ <string name="pref_privacy_enable_geolocation" msgid="1395040170290765686">"Iespējot atrašanās vietu"</string>
+ <string name="pref_privacy_enable_geolocation_summary" msgid="8437020934664306205">"Atļaut vietnēm pieprasīt piekļuvi jūsu atrašanās vietai"</string>
+ <string name="pref_privacy_clear_geolocation_access" msgid="6649680770030042980">"Atrašanās vietas piekļuves atļaujas notīrīšana"</string>
+ <string name="pref_privacy_clear_geolocation_access_summary" msgid="7750143359497314679">"Notīrīt atrašanās vietas piekļuves atļauju visām vietnēm"</string>
+ <string name="pref_privacy_clear_geolocation_access_dlg" msgid="7327063124488827244">"Notīrīt atrašanās vietas piekļuves atļauju visām vietnēm"</string>
+ <string name="pref_security_title" msgid="5763978646932160021">"Drošības iestatījumi"</string>
+ <string name="pref_security_remember_passwords" msgid="6492957683454529549">"Atcerēties paroles"</string>
+ <string name="pref_security_remember_passwords_summary" msgid="256388703356349137">"Saglabāt vietņu lietotājvārdus un paroles"</string>
+ <string name="pref_security_save_form_data" msgid="1213669802810198893">"Atcerēties veidlapu datus"</string>
+ <string name="pref_security_save_form_data_summary" msgid="4994074685153708026">"Atcerēties veidlapās ievadītos datus, lai tos vēlāk izmantotu"</string>
+ <string name="pref_security_show_security_warning" msgid="8901135676266754559">"Rādīt drošības brīdinājumus"</string>
+ <string name="pref_security_show_security_warning_summary" msgid="8968906112720511704">"Rādīt brīdinājumu, ja radusies problēma ar vietnes drošību"</string>
+ <string name="pref_security_accept_cookies" msgid="3201367661925047989">"Pieņemt sīkfailus"</string>
+ <string name="pref_security_accept_cookies_summary" msgid="1465118934875026920">"Atļaut vietnēm saglabāt un nolasīt sīkfailu datus"</string>
+ <string name="pref_text_size" msgid="3827031324346612208">"Teksta lielums"</string>
+ <string-array name="pref_text_size_choices">
+ <item msgid="4952686548944739548">"Sīks"</item>
+ <item msgid="1950030433642671460">"Mazs"</item>
+ <item msgid="4338347520133294584">"Normāls"</item>
+ <item msgid="5043128215356351184">"Liels"</item>
+ <item msgid="7201512237890458902">"Milzīgs"</item>
+ </string-array>
+ <string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Teksta lielums"</string>
+ <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>
+ <item msgid="5619034257768161024">"Vidējs"</item>
+ <item msgid="3840999588443167001">"Aizvērt"</item>
+ </string-array>
+ <string name="pref_default_zoom_dialogtitle" msgid="6095974367125109021">"Noklusējuma tālummaiņa"</string>
+ <string name="pref_content_load_page" msgid="2219810141690955452">"Atvērt lapas kā pārskatus"</string>
+ <string name="pref_content_load_page_summary" msgid="8792093504054149369">"Rādīt tikko atvērtu lapu pārskatu"</string>
+ <string name="pref_extras_title" msgid="3091250467679722382">"Papildu iestatījumi"</string>
+ <string name="pref_extras_website_settings" msgid="67866640052455549">"Vietnes iestatījumi"</string>
+ <string name="pref_extras_website_settings_summary" msgid="1656771443223494406">"Atsevišķām vietnēm paredzēti papildu iestatījumi"</string>
+ <string name="pref_extras_reset_default" msgid="8904000515846202110">"Atiestatīt noklusējuma vērtības"</string>
+ <string name="pref_extras_reset_default_summary" msgid="4247870778270414501">"Atjaunot noklusējuma iestatījumus"</string>
+ <string name="pref_extras_reset_default_dlg" msgid="6640261575874704022">"Tiks atjaunotas iestatījumu noklusējuma vērtības."</string>
+ <string name="pref_extras_reset_default_dlg_title" msgid="2250334970728938936">"Noklusējuma vērtību atiestatīšana"</string>
+ <string name="pref_development_title" msgid="3263854204533056480">"Atkļūdot"</string>
+ <string name="pref_default_text_encoding" msgid="5742965543955558478">"Teksta kodējums"</string>
+ <!-- no translation found for pref_default_text_encoding_choices:7 (2193955365569270096) -->
+ <string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Teksta kodējums"</string>
+ <string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"Datu savienojamības problēma"</string>
+ <string name="browserFrameFileErrorLabel" msgid="8063691502792670367">"Faila problēma"</string>
+ <string name="browserFrameFormResubmitLabel" msgid="2685923472682180360">"Apstiprināt"</string>
+ <string name="browserFrameFormResubmitMessage" msgid="2752182215695632138">"Lapā, kuru mēģināt skatīt, ietverti jau iesniegti dati (“POSTDATA”). Ja sūtīsiet datus vēlreiz, tiks atkārtota arī katra darbība, ko lapā veica veidlapa (piemēram, meklēšana vai pirkums)."</string>
+ <string name="loadSuspendedTitle" msgid="675991625288706944">"Nav tīkla savienojuma."</string>
+ <string name="loadSuspended" msgid="3133656588880851273">"Pārlūkprogramma nevar ielādēt šo lapu, jo interneta savienojums nav pieejams."</string>
+ <string name="clear_history" msgid="5998307092715979619">"Notīrīt vēsturi"</string>
+ <string name="browser_history" msgid="1038987118290272525">"Nesen apmeklētās lapas"</string>
+ <string name="empty_history" msgid="8738772352308207274">"Pārlūkprogrammas vēsture ir tukša."</string>
+ <string name="add_new_bookmark" msgid="8086367791400349049">"Pievienot grāmatzīmi..."</string>
+ <string name="add_bookmark_short" msgid="3783984330998103735">"Pievienot"</string>
+ <string name="search_hint" msgid="4647356319916631820">"Meklējiet vai ievadiet URL"</string>
+ <string name="search_button_text" msgid="5235226933877634410">"Doties uz"</string>
+ <string name="search_settings_description" msgid="1422401062529014107">"Grāmatzīmes un tīmekļa vēsture"</string>
+ <string name="attention" msgid="3473639060042811244">"Uzmanību!"</string>
+ <string name="popup_window_attempt" msgid="2673111696288657989">"Vietne mēģina atvērt uznirstošo logu."</string>
+ <string name="allow" msgid="1157313689171991335">"Atļaut"</string>
+ <string name="block" msgid="9172175889884707800">"Bloķēt"</string>
+ <string name="too_many_windows_dialog_title" msgid="5175503564948906442">"Sasniegts maksimālais logu skaits"</string>
+ <string name="too_many_windows_dialog_message" msgid="1398571800233959583">"Nevarēja atvērt jaunu logu, jo jau atvērts maksimālais logu skaits."</string>
+ <string name="too_many_subwindows_dialog_title" msgid="3805453941587725944">"Uznirstošais logs jau ir atvērts."</string>
+ <string name="too_many_subwindows_dialog_message" msgid="5827289829907966657">"Nevarēja atvērt jaunu uznirstošo logu, jo vienlaicīgi var būt atvērts tikai viens šāds logs."</string>
+ <string name="download_title" msgid="2122874021047565594">"Lejupielāžu vēsture"</string>
+ <string name="download_unknown_filename" msgid="4013465542563652175">"<Nezināms>"</string>
+ <string name="download_menu_open" msgid="4888327480367757513">"Atvērt"</string>
+ <string name="download_menu_clear" msgid="6264454531553418124">"Notīrīt no saraksta"</string>
+ <string name="download_menu_delete" msgid="8815502136393894148">"Dzēst"</string>
+ <string name="download_menu_cancel" msgid="2545333007601851574">"Atcelt lejupielādi"</string>
+ <string name="download_menu_cancel_all" msgid="2136550823151999166">"Atcelt visas lejupielādes"</string>
+ <string name="download_cancel_dlg_title" msgid="8909108500262799748">"Atcelt lejupielādes"</string>
+ <string name="download_cancel_dlg_msg" msgid="6285389170052357797">"Visas lejupielādes (<xliff:g id="DOWNLOAD_COUNT">%d</xliff:g>) tiks atceltas un notīrītas no lejupielāžu vēstures."</string>
+ <string name="download_delete_file" msgid="5330036497843073249">"Fails tiks dzēsts."</string>
+ <string name="download_file_error_dlg_title" msgid="2693630283595384874">"Nav brīvas vietas"</string>
+ <string name="download_file_error_dlg_msg" msgid="5156405410324072471">"Failu <xliff:g id="FILENAME">%s</xliff:g> nevarēja lejupielādēt."\n"Atbrīvojiet vietu tālrunī un mēģiniet vēlreiz."</string>
+ <string name="download_failed_generic_dlg_title" msgid="6106781095337833391">"Lejupielāde nebija veiksmīga."</string>
+ <!-- outdated translation 605904452159416792 --> <string name="download_no_sdcard_dlg_title" product="nosdcard" msgid="56777245081568508">"Nav SD kartes"</string>
+ <string name="download_no_sdcard_dlg_title" product="default" msgid="605904452159416792">"Nav SD kartes"</string>
+ <!-- no translation found for download_no_sdcard_dlg_msg (3144652102051031721) -->
+ <skip />
+ <string name="download_no_sdcard_dlg_msg" product="default" msgid="2616399456116301518">"Lai lejupielādētu failu <xliff:g id="FILENAME">%s</xliff:g>, nepieciešama SD karte."</string>
+ <!-- outdated translation 6877712666046917741 --> <string name="download_sdcard_busy_dlg_title" product="nosdcard" msgid="8081445664689818973">"SD karte nav pieejama"</string>
+ <string name="download_sdcard_busy_dlg_title" product="default" msgid="6877712666046917741">"SD karte nav pieejama"</string>
+ <!-- outdated translation 3473883538192835204 --> <string name="download_sdcard_busy_dlg_msg" product="nosdcard" msgid="3979329954835690147">"SD karte ir aizņemta. Lai atļautu lejupielādes, paziņojumā atlasiet “Izslēgt USB krātuvi”."</string>
+ <string name="download_sdcard_busy_dlg_msg" product="default" msgid="3473883538192835204">"SD karte ir aizņemta. Lai atļautu lejupielādes, paziņojumā atlasiet “Izslēgt USB krātuvi”."</string>
+ <string name="download_no_application_title" msgid="1286056729168874295">"Nevar atvērt failu"</string>
+ <string name="retry" msgid="1835923075542266721">"Mēģināt vēlreiz"</string>
+ <string name="no_downloads" msgid="3947445710685021498">"Lejupielāžu vēsture ir tukša."</string>
+ <string name="download_error" msgid="413496839831257187">"Lejupielāde nebija veiksmīga."</string>
+ <string name="download_success" msgid="2279041638155595203">"Faila <xliff:g id="FILE">%s</xliff:g> lejupielāde ir pabeigta."</string>
+ <string name="download_running" msgid="2622942231322015059">"Notiek lejupielāde..."</string>
+ <string name="download_pending" msgid="2599683668575349559">"Notiek lejupielādes sākšana..."</string>
+ <string name="download_pending_network" msgid="6548714525679461053">"Notiek datu savienojuma gaidīšana..."</string>
+ <string name="download_running_paused" msgid="6418029352085656495">"Notiek datu savienojuma gaidīšana..."</string>
+ <string name="download_canceled" msgid="6057083743144492515">"Lejupielāde tika atcelta."</string>
+ <string name="download_not_acceptable" msgid="313769696131563652">"Nevar veikt lejupielādi. Saturs šajā tālrunī netiek atbalstīts."</string>
+ <string name="download_file_error" msgid="1206648050615176113">"Nevar pabeigt lejupielādi, jo nepietiek vietas."</string>
+ <string name="download_length_required" msgid="9038605488460437406">"Nevar veikt lejupielādi. Nav iespējams noteikt vienuma lielumu."</string>
+ <string name="download_precondition_failed" msgid="8327584102874295580">"Lejupielāde tika pārtraukta. To nevar atsākt."</string>
+ <string name="search_the_web" msgid="6046130189241962337">"Meklēšana tīmeklī"</string>
+ <string name="webstorage_outofspace_notification_title" msgid="1160474608059771788">"Pārlūkprogrammas krātuve ir pilna."</string>
+ <string name="webstorage_outofspace_notification_text" msgid="7341075135051829692">"Noklikšķiniet, lai atbrīvotu vietu."</string>
+ <string name="webstorage_clear_data_title" msgid="689484577124333977">"Notīrīt saglabātos datus"</string>
+ <string name="webstorage_clear_data_dialog_title" msgid="345457466368974706">"Saglabāto datu notīrīšana"</string>
+ <string name="webstorage_clear_data_dialog_message" msgid="6678281256970470125">"Visi vietnes saglabātie dati tiks dzēsti."</string>
+ <string name="webstorage_clear_data_dialog_ok_button" msgid="2516563534211898636">"Notīrīt visu"</string>
+ <string name="webstorage_clear_data_dialog_cancel_button" msgid="2028867751958942762">"Atcelt"</string>
+ <string name="webstorage_origin_summary_mb_stored" msgid="1985885826292236210">"Tālrunī saglabāto datu apjoms (MB)"</string>
+ <string name="loading_video" msgid="4887871585216091096">"Notiek video ielāde"</string>
+ <string name="geolocation_permissions_prompt_message" msgid="356796102004052471">"Vietne <xliff:g id="WEBSITE_ORIGIN">%s</xliff:g> vēlas uzzināt jūsu atrašanās vietu."</string>
+ <string name="geolocation_permissions_prompt_share" msgid="9084486342048347976">"Kopīgot atrašanās vietu"</string>
+ <string name="geolocation_permissions_prompt_dont_share" msgid="6303025160237860300">"Noraidīt"</string>
+ <string name="geolocation_permissions_prompt_remember" msgid="3118526300707348308">"Atcerēties preferenci"</string>
+ <string name="geolocation_permissions_prompt_toast_allowed" msgid="987286072035125498">"Vietne var piekļūt jūsu atrašanās vietai. Iestatījumu varat mainīt šeit: Iestatījumi -> Vietnes iestatījumi."</string>
+ <string name="geolocation_permissions_prompt_toast_disallowed" msgid="7695100950212692515">"Vietne nevar piekļūt jūsu atrašanās vietai. Iestatījumu varat mainīt šeit: Iestatījumi -> Vietnes iestatījumi."</string>
+ <string name="geolocation_settings_page_title" msgid="1745477985097536528">"Atrašanās vietas piekļuves atļaujas notīrīšana"</string>
+ <string name="geolocation_settings_page_summary_allowed" msgid="9180251524290811398">"Vietne pašlaik var piekļūt jūsu atrašanās vietai."</string>
+ <string name="geolocation_settings_page_summary_not_allowed" msgid="4589649082203102544">"Vietne pašlaik nevar piekļūt jūsu atrašanās vietai."</string>
+ <string name="geolocation_settings_page_dialog_title" msgid="1549842043381347668">"Atrašanās vietas piekļuves atļaujas notīrīšana"</string>
+ <string name="geolocation_settings_page_dialog_message" msgid="7586671987576403993">"Šīs vietnes atrašanās vietas piekļuves atļauja tiks notīrīta."</string>
+ <string name="geolocation_settings_page_dialog_ok_button" msgid="4789434178048077287">"Notīrīt piekļuvi"</string>
+ <string name="geolocation_settings_page_dialog_cancel_button" msgid="7941036504673409747">"Atcelt"</string>
+ <string name="website_settings_clear_all" msgid="8739804325997655980">"Notīrīt visu"</string>
+ <string name="website_settings_clear_all_dialog_title" msgid="7791826325122461718">"Vai notīrīt visus vietnes iestatījumus?"</string>
+ <string name="website_settings_clear_all_dialog_message" msgid="6150502090601476333">"Visi vietņu dati un atrašanās vietas piekļuves atļaujas tiks dzēstas."</string>
+ <string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"Dzēst visus datus"</string>
+ <string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"Atcelt"</string>
+ <string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"Notiek tapetes iestatīšana..."</string>
+ <!-- no translation found for defaultBookmarksUpButton (2303951020715704735) -->
+ <skip />
+ <!-- no translation found for empty_bookmarks_folder (7843361614634930942) -->
+ <skip />
+ <!-- no translation found for rlz_access_point (7165847807377650632) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_title (3325557652271172128) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_description (2187665745413495303) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_remove (8105572409059113340) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_import (6933613853573899218) -->
+ <skip />
+</resources>
diff --git a/res/values-nb-xlarge/strings.xml b/res/values-nb-xlarge/strings.xml
new file mode 100644
index 0000000..6505d89
--- /dev/null
+++ b/res/values-nb-xlarge/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="new_tab" msgid="7275656655054293038">"Ny fane"</string>
+ <string name="new_incognito_tab" msgid="5149742197322201152">"Ny inkognitofane"</string>
+ <string name="active_tabs" msgid="5324492165541331128">"Faner"</string>
+</resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 34947fe..06246df 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -19,6 +19,7 @@
<string name="application_name" msgid="1935869255545976415">"Nettleser"</string>
<string name="choose_upload" msgid="3649366287575002063">"Velg fil for opplasting"</string>
<string name="new_tab" msgid="4505722538297295141">"Ny fane"</string>
+ <string name="new_incognito_tab" msgid="5821404839654751753">"Nytt inkognitovindu"</string>
<string name="active_tabs" msgid="3050623868203544623">"Vinduer"</string>
<string name="tab_bookmarks" msgid="2305793036003473653">"Bokmerker"</string>
<string name="tab_most_visited" msgid="1077402532455000703">"Mest besøkt"</string>
@@ -32,12 +33,6 @@
<string name="bookmarks_search" msgid="5229596268214362873">"Nettleser"</string>
<string name="cancel" msgid="3017274947407233702">"Avbryt"</string>
<string name="ok" msgid="1509280796718850364">"OK"</string>
- <plurals name="matches_found">
- <item quantity="zero" msgid="6242659159545399963">"Ingen treff"</item>
- <item quantity="one" msgid="4352019729062956802">"Ett treff"</item>
- <item quantity="few" msgid="5544267486978946555">"<xliff:g id="NUMBER">%d</xliff:g> treff"</item>
- <item quantity="other" msgid="6616125067364315405">"<xliff:g id="NUMBER">%d</xliff:g> treff"</item>
- </plurals>
<string name="title_bar_loading" msgid="7438217780834640678">"Laster inn ..."</string>
<string name="page_info" msgid="4048529256302257195">"Sideinfo"</string>
<string name="page_info_view" msgid="5303490449842635158">"Vis sideinformasjon"</string>
@@ -46,6 +41,8 @@
<string name="ssl_continue" msgid="8031515015829358457">"Fortsett"</string>
<string name="security_warning" msgid="6607795404322797541">"Sikkerhetsadvarsel"</string>
<string name="view_certificate" msgid="1472768887529093862">"Vis sertifikat"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
<string name="ssl_untrusted" msgid="5369967226521102194">"Dette sertifikatet er ikke fra en autoritet du stoler på."</string>
<string name="ssl_mismatch" msgid="558688832420069896">"Navnet på siden stemmer ikke med navnet på sertifikatet."</string>
<string name="ssl_expired" msgid="5739349389499575559">"Sertifikatet er utløpt."</string>
@@ -67,12 +64,23 @@
<string name="forward" msgid="4288210890526641577">"Fremover"</string>
<string name="save" msgid="5922311934992468496">"OK"</string>
<string name="do_not_save" msgid="6777633870113477714">"Avbryt"</string>
- <string name="location" msgid="969988560160364559">"Adresse"</string>
- <string name="name" msgid="5990326151488445481">"Navn"</string>
+ <string name="location" msgid="3411848697912600125">"Adresse"</string>
+ <string name="containing_folder" msgid="6771180232953030479">"Legg til i"</string>
+ <string name="new_folder" msgid="7743540149088867917">"Ny mappe"</string>
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <string name="no_subfolders" msgid="5880411440592452802">"Ingen undermapper"</string>
+ <string name="add_to_bookmarks_menu_option" msgid="4449323955122214389">"Bokmerker"</string>
+ <string name="add_to_homescreen_menu_option" msgid="1461447829242963790">"Startside"</string>
+ <string name="add_to_other_folder_menu_option" msgid="5450890093372998187">"Annen mappe"</string>
+ <string name="name" msgid="5462672162695365387">"Etikett"</string>
<string name="http" msgid="2163722670597250102">"http://"</string>
- <string name="save_to_bookmarks" msgid="588165100024086565">"Legg til bokmerke"</string>
+ <string name="save_to_bookmarks" msgid="6101482434920313244">"Legg til i bokmerker"</string>
+ <string name="bookmark_this_page" msgid="7530739804320811054">"Bokmerk denne siden"</string>
<string name="edit_bookmark" msgid="5024089053490231905">"Rediger bokmerke"</string>
- <string name="create_shortcut_bookmark" msgid="9202323987633899835">"Lag snarvei på skrivebordet"</string>
+ <string name="create_shortcut_bookmark" msgid="1995095662095484289">"Legg til snarvei til startside"</string>
<string name="open_bookmark" msgid="8473581305759935790">"Åpne"</string>
<string name="remove_bookmark" msgid="8407495852801410891">"Slett bokmerke"</string>
<string name="remove_from_bookmarks" msgid="4374080666576982775">"Fjern fra bokmerker"</string>
@@ -87,13 +95,15 @@
<string name="bookmark_cannot_save_url" msgid="791722768778386941">"Kan ikke legge til et bokmerke for denne nettadressen."</string>
<string name="delete_bookmark" msgid="2422989994934201992">"Slett"</string>
<string name="bookmark_page" msgid="6845189305130307274">"Bokmerk sist viste side"</string>
- <string name="switch_to_thumbnails" msgid="5493351529609043151">"Miniatyrbildevisning"</string>
- <string name="switch_to_list" msgid="8900531247982121055">"Listevisning"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
<string name="current_page" msgid="7510129573681663135">"fra "</string>
<string name="delete_bookmark_warning" msgid="758043186202032205">"Bokmerket \"<xliff:g id="BOOKMARK">%s</xliff:g>\" vil bli slettet."</string>
<string name="open_in_new_window" msgid="6596775546468054510">"Åpne i nytt vindu"</string>
<string name="goto_dot" msgid="3895839050522602723">"Gå til"</string>
- <string name="find_dot" msgid="6259312434696611957">"Finn på siden"</string>
+ <string name="incognito_tab" msgid="5419458065370134289">"Åpne ny inkognitofane"</string>
<string name="select_dot" msgid="6299170761900561967">"Velg tekst"</string>
<string name="tab_picker_title" msgid="864478399057782913">"Gjeldende vinduer"</string>
<string name="tab_picker_remove_tab" msgid="630087809802479397">"Lukk"</string>
@@ -103,6 +113,13 @@
<string name="menu_view_download" msgid="2124570321712995120">"Nedlastinger"</string>
<string name="copy_page_url" msgid="7635062169011319208">"Kopier nettstedsadresse"</string>
<string name="share_page" msgid="593756995297268343">"Del side"</string>
+ <string name="menu_save_webarchive" msgid="3934652434001459581">"Lagre som nettarkiv"</string>
+ <string name="webarchive_saved" msgid="7045250341467345007">"Nettarkiv lagret."</string>
+ <string name="webarchive_failed" msgid="2880998204746620260">"Kunne ikke lagre nettarkivet."</string>
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
<string name="contextmenu_openlink" msgid="7237961252214188935">"Åpne"</string>
<string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"Åpne i nytt vindu"</string>
<string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"Bokmerk kobling"</string>
@@ -138,11 +155,44 @@
<string name="pref_content_homepage" msgid="6082437160778559806">"Angi startside"</string>
<string name="pref_content_search_engine" msgid="1620101310821644144">"Angi søkemotor"</string>
<string name="pref_content_search_engine_summary" msgid="5162667665858487316">"Velg en søkemotor"</string>
- <string name="pref_use_current" msgid="1493179933653044553">"Bruk nåværende side"</string>
+ <string name="pref_set_homepage_to" msgid="7196350233061395098">"Satt til"</string>
+ <string name="pref_use_current" msgid="1778622474040406672">"Gjeldende side"</string>
+ <string name="pref_use_blank" msgid="8503238592551111169">"Tom side"</string>
+ <string name="pref_use_default" msgid="192587563274735878">"Standardside"</string>
<string name="pref_content_autofit" msgid="8260474534053660809">"Tilpass sider automatisk"</string>
<string name="pref_content_autofit_summary" msgid="4587831659894879986">"Tilpass nettsteder til skjermen"</string>
- <string name="pref_content_landscape_only" msgid="2022546812766219672">"Bare liggende visning"</string>
- <string name="pref_content_landscape_only_summary" msgid="1008238895535428855">"Les alltid sider i bred, liggende skjermretning"</string>
+ <string name="pref_personal_title" msgid="1447687455755683695">"Personlige innstillinger"</string>
+ <string name="pref_personal_sync_with_chrome" msgid="1695182180332194033">"Synkroniser med Google Chrome"</string>
+ <string name="pref_personal_sync_with_chrome_summary" msgid="7414133931827321055">"Lagre bokmerker og andre data mellom Android-nettleseren og Google Chrome"</string>
+ <string name="pref_personal_google_account" msgid="952360133341490071">"Google-konto"</string>
+ <string name="pref_personal_sync_bookmarks" msgid="59237515966184432">"Synkroniser bokmerker"</string>
+ <string name="pref_personal_sync_bookmarks_summary" msgid="4791767605662205482">"Synkroniser bokmerker mellom Android-nettleseren og Google Chrome"</string>
+ <string name="pref_personal_start_syncing" msgid="6046972042512655232">"Start synkronisering"</string>
+ <string name="pref_personal_account_dialog_title" msgid="1390867119887955530">"Velg kto. å dele med"</string>
+ <string name="pref_autofill_enabled" msgid="1174197447388234595">"Autoutfylling av skjemaer"</string>
+ <string name="pref_autofill_enabled_summary" msgid="422640696197018914">"Fyll ut nettskjemaer med ett enkelt klikk"</string>
+ <string name="pref_autofill_profile_editor" msgid="1350709161524642663">"Innstillinger for autofyll"</string>
+ <string name="pref_autofill_profile_editor_summary" msgid="6748434431641768870">"Konfigurer og vedlikehold data for automatisk utfylte skjemaer"</string>
+ <string name="autofill_profile_editor_name" msgid="8566130291459685955">"Fullt navn:"</string>
+ <string name="autofill_profile_editor_email_address" msgid="7967585896612797173">"E-post:"</string>
+ <string name="autofill_profile_editor_company_name" msgid="2813443159949210417">"Firmanavn:"</string>
+ <string name="autofill_profile_editor_address_line_1" msgid="836433242509243081">"Adresselinje 1:"</string>
+ <string name="autofill_profile_editor_address_line_1_hint" msgid="5965659598509327172">"Gateadresse, postboksadresse, c/o-adresse"</string>
+ <string name="autofill_profile_editor_address_line_2" msgid="8194745202893822479">"Adresselinje 2:"</string>
+ <string name="autofill_profile_editor_address_line_2_hint" msgid="2048330295853546405">"Leilighet, suite, enhet, bygning, etasje osv."</string>
+ <string name="autofill_profile_editor_city" msgid="4193225955409148508">"Poststed:"</string>
+ <string name="autofill_profile_editor_state" msgid="8549739922338171458">"Delstat/provins/område:"</string>
+ <string name="autofill_profile_editor_zip_code" msgid="283668573295656671">"Postnummer:"</string>
+ <string name="autofill_profile_editor_country" msgid="7234470301239156656">"Land:"</string>
+ <string name="autofill_profile_editor_phone_number" msgid="4938852821413729276">"Telefon:"</string>
+ <string name="autofill_profile_editor_save_profile" msgid="8349915287435262888">"Lagre profil"</string>
+ <string name="autofill_profile_successful_save" msgid="6834102203944938409">"Profilen er lagret"</string>
+ <string name="autofill_profile_successful_delete" msgid="2421442112954362732">"Profilen ble slettet"</string>
+ <string name="autofill_profile_editor_delete_profile" msgid="7112035941146003753">"Slett profildata"</string>
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
<string name="pref_privacy_title" msgid="1052470980370846151">"Personvernsinnstillinger"</string>
<string name="pref_privacy_clear_cache" msgid="3380316479925886998">"Fjern hurtiglager"</string>
<string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"Fjern lokalt bufret innhold og databaser"</string>
@@ -208,6 +258,7 @@
<item msgid="891615911084608570">"Japansk (ISO-2022-JP)"</item>
<item msgid="5589150448475151241">"Japansk (SHIFT_JIS)"</item>
<item msgid="7356792686950371843">"Japansk (EUC-JP)"</item>
+ <item msgid="2193955365569270096">"Koreansk (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Tekstkoding"</string>
<string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"Datatilkoblingsproblem"</string>
@@ -296,4 +347,11 @@
<string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"Slett alle data"</string>
<string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"Avbryt"</string>
<string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"Angir bakgrunn ..."</string>
+ <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Bokmerker"</string>
+ <string name="empty_bookmarks_folder" msgid="7843361614634930942">"Det er ingen bokmerker"</string>
+ <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
+ <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Synkroniser med Google-konto"</string>
+ <string name="import_bookmarks_dialog_description" msgid="2187665745413495303">"Dine Android-bokmerker er ikke tilknyttet en Google-konto"</string>
+ <string name="import_bookmarks_dialog_remove" msgid="8105572409059113340">"Fjern Android-bokmerkene"</string>
+ <string name="import_bookmarks_dialog_import" msgid="6933613853573899218">"Legg til Android-bokmerker i bokmerker for <xliff:g id="GOOGLE_ACCOUNT">%s</xliff:g>"</string>
</resources>
diff --git a/res/values-nl-xlarge/strings.xml b/res/values-nl-xlarge/strings.xml
new file mode 100644
index 0000000..e1b8f0b
--- /dev/null
+++ b/res/values-nl-xlarge/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="new_tab" msgid="7275656655054293038">"Nieuw tabblad"</string>
+ <string name="new_incognito_tab" msgid="5149742197322201152">"Nieuw incognitotabblad"</string>
+ <string name="active_tabs" msgid="5324492165541331128">"Tabbladen"</string>
+</resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index a3b0034..7454b1f 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -19,6 +19,7 @@
<string name="application_name" msgid="1935869255545976415">"Browser"</string>
<string name="choose_upload" msgid="3649366287575002063">"Bestand selecteren voor uploaden"</string>
<string name="new_tab" msgid="4505722538297295141">"Nieuw venster"</string>
+ <string name="new_incognito_tab" msgid="5821404839654751753">"Nieuw incognitovenster"</string>
<string name="active_tabs" msgid="3050623868203544623">"Vensters"</string>
<string name="tab_bookmarks" msgid="2305793036003473653">"Bladwijzers"</string>
<string name="tab_most_visited" msgid="1077402532455000703">"Meest bezocht"</string>
@@ -32,12 +33,6 @@
<string name="bookmarks_search" msgid="5229596268214362873">"Browser"</string>
<string name="cancel" msgid="3017274947407233702">"Annuleren"</string>
<string name="ok" msgid="1509280796718850364">"OK"</string>
- <plurals name="matches_found">
- <item quantity="zero" msgid="6242659159545399963">"Geen overeenkomsten"</item>
- <item quantity="one" msgid="4352019729062956802">"1 overeenkomst"</item>
- <item quantity="few" msgid="5544267486978946555">"<xliff:g id="NUMBER">%d</xliff:g> overeenkomsten"</item>
- <item quantity="other" msgid="6616125067364315405">"<xliff:g id="NUMBER">%d</xliff:g> overeenkomsten"</item>
- </plurals>
<string name="title_bar_loading" msgid="7438217780834640678">"Laden..."</string>
<string name="page_info" msgid="4048529256302257195">"Pagina-informatie"</string>
<string name="page_info_view" msgid="5303490449842635158">"Pagina-informatie weergeven"</string>
@@ -46,6 +41,8 @@
<string name="ssl_continue" msgid="8031515015829358457">"Doorgaan"</string>
<string name="security_warning" msgid="6607795404322797541">"Beveiligingsmelding"</string>
<string name="view_certificate" msgid="1472768887529093862">"Certificaat weergeven"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
<string name="ssl_untrusted" msgid="5369967226521102194">"Dit is geen certificaat van een vertrouwde autoriteit."</string>
<string name="ssl_mismatch" msgid="558688832420069896">"De naam van deze site komt niet overeen met de naam op het certificaat."</string>
<string name="ssl_expired" msgid="5739349389499575559">"Dit certificaat is verlopen."</string>
@@ -67,12 +64,23 @@
<string name="forward" msgid="4288210890526641577">"Volgende"</string>
<string name="save" msgid="5922311934992468496">"OK"</string>
<string name="do_not_save" msgid="6777633870113477714">"Annuleren"</string>
- <string name="location" msgid="969988560160364559">"Locatie"</string>
- <string name="name" msgid="5990326151488445481">"Naam"</string>
+ <string name="location" msgid="3411848697912600125">"Adres"</string>
+ <string name="containing_folder" msgid="6771180232953030479">"Toevoegen aan"</string>
+ <string name="new_folder" msgid="7743540149088867917">"Nieuwe map"</string>
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <string name="no_subfolders" msgid="5880411440592452802">"Geen submappen"</string>
+ <string name="add_to_bookmarks_menu_option" msgid="4449323955122214389">"Bladwijzers"</string>
+ <string name="add_to_homescreen_menu_option" msgid="1461447829242963790">"Startscherm"</string>
+ <string name="add_to_other_folder_menu_option" msgid="5450890093372998187">"Andere map..."</string>
+ <string name="name" msgid="5462672162695365387">"Label"</string>
<string name="http" msgid="2163722670597250102">"http://"</string>
- <string name="save_to_bookmarks" msgid="588165100024086565">"Bladwijzer toevoegen"</string>
+ <string name="save_to_bookmarks" msgid="6101482434920313244">"Toevoegen aan bladwijzers"</string>
+ <string name="bookmark_this_page" msgid="7530739804320811054">"Bladwijzer instellen voor deze pagina"</string>
<string name="edit_bookmark" msgid="5024089053490231905">"Bladwijzer bewerken"</string>
- <string name="create_shortcut_bookmark" msgid="9202323987633899835">"Snelkoppeling naar startpagina toevoegen"</string>
+ <string name="create_shortcut_bookmark" msgid="1995095662095484289">"Snelkoppeling naar startpagina toevoegen"</string>
<string name="open_bookmark" msgid="8473581305759935790">"Openen"</string>
<string name="remove_bookmark" msgid="8407495852801410891">"Bladwijzer verwijderen"</string>
<string name="remove_from_bookmarks" msgid="4374080666576982775">"Verwijderen uit bladwijzers"</string>
@@ -87,13 +95,15 @@
<string name="bookmark_cannot_save_url" msgid="791722768778386941">"U kunt geen bladwijzer instellen voor deze URL."</string>
<string name="delete_bookmark" msgid="2422989994934201992">"Verwijderen"</string>
<string name="bookmark_page" msgid="6845189305130307274">"Bladwijzer voor laatst weergegeven pagina"</string>
- <string name="switch_to_thumbnails" msgid="5493351529609043151">"Miniatuurweergave"</string>
- <string name="switch_to_list" msgid="8900531247982121055">"Lijstweergave"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
<string name="current_page" msgid="7510129573681663135">"van "</string>
<string name="delete_bookmark_warning" msgid="758043186202032205">"Bladwijzer \'<xliff:g id="BOOKMARK">%s</xliff:g>\' wordt verwijderd."</string>
<string name="open_in_new_window" msgid="6596775546468054510">"Openen in een nieuw venster"</string>
<string name="goto_dot" msgid="3895839050522602723">"Ga"</string>
- <string name="find_dot" msgid="6259312434696611957">"Zoeken op pagina"</string>
+ <string name="incognito_tab" msgid="5419458065370134289">"Nieuw incognitotabblad openen"</string>
<string name="select_dot" msgid="6299170761900561967">"Tekst selecteren"</string>
<string name="tab_picker_title" msgid="864478399057782913">"Huidige vensters"</string>
<string name="tab_picker_remove_tab" msgid="630087809802479397">"Sluiten"</string>
@@ -103,6 +113,13 @@
<string name="menu_view_download" msgid="2124570321712995120">"Downloads"</string>
<string name="copy_page_url" msgid="7635062169011319208">"Pagina-URL kopiëren"</string>
<string name="share_page" msgid="593756995297268343">"Pagina delen"</string>
+ <string name="menu_save_webarchive" msgid="3934652434001459581">"Opslaan als webarchief"</string>
+ <string name="webarchive_saved" msgid="7045250341467345007">"Webarchief opgeslagen."</string>
+ <string name="webarchive_failed" msgid="2880998204746620260">"Opslaan van webarchief is mislukt."</string>
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
<string name="contextmenu_openlink" msgid="7237961252214188935">"Openen"</string>
<string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"Openen in een nieuw venster"</string>
<string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"Bladwijzer maken van link"</string>
@@ -138,11 +155,44 @@
<string name="pref_content_homepage" msgid="6082437160778559806">"Startpagina instellen"</string>
<string name="pref_content_search_engine" msgid="1620101310821644144">"Zoekmachine instellen"</string>
<string name="pref_content_search_engine_summary" msgid="5162667665858487316">"Selecteer een zoekmachine"</string>
- <string name="pref_use_current" msgid="1493179933653044553">"Huidige pagina gebruiken"</string>
+ <string name="pref_set_homepage_to" msgid="7196350233061395098">"Ingesteld op..."</string>
+ <string name="pref_use_current" msgid="1778622474040406672">"Huidige pagina"</string>
+ <string name="pref_use_blank" msgid="8503238592551111169">"Lege pagina"</string>
+ <string name="pref_use_default" msgid="192587563274735878">"Standaardpagina"</string>
<string name="pref_content_autofit" msgid="8260474534053660809">"Pagina\'s passend maken"</string>
<string name="pref_content_autofit_summary" msgid="4587831659894879986">"Webpagina\'s zo indelen dat deze op het scherm passen"</string>
- <string name="pref_content_landscape_only" msgid="2022546812766219672">"Altijd liggende weergave"</string>
- <string name="pref_content_landscape_only_summary" msgid="1008238895535428855">"Pagina\'s alleen liggend weergeven"</string>
+ <string name="pref_personal_title" msgid="1447687455755683695">"Persoonlijke instellingen"</string>
+ <string name="pref_personal_sync_with_chrome" msgid="1695182180332194033">"Synchroniseren met Google Chrome"</string>
+ <string name="pref_personal_sync_with_chrome_summary" msgid="7414133931827321055">"Bladwijzers en andere gegevens delen tussen Android Browser en Google Chrome"</string>
+ <string name="pref_personal_google_account" msgid="952360133341490071">"Google-account"</string>
+ <string name="pref_personal_sync_bookmarks" msgid="59237515966184432">"Bladwijzers synchroniseren"</string>
+ <string name="pref_personal_sync_bookmarks_summary" msgid="4791767605662205482">"Bladwijzers synchroniseren tussen Android Browser en Google Chrome"</string>
+ <string name="pref_personal_start_syncing" msgid="6046972042512655232">"Synchr. starten"</string>
+ <string name="pref_personal_account_dialog_title" msgid="1390867119887955530">"Selecteer Google-account voor delen"</string>
+ <string name="pref_autofill_enabled" msgid="1174197447388234595">"Formulieren autom. aanvullen"</string>
+ <string name="pref_autofill_enabled_summary" msgid="422640696197018914">"Webformulier invullen met één klik"</string>
+ <string name="pref_autofill_profile_editor" msgid="1350709161524642663">"Instellingen voor auto-aanvullen"</string>
+ <string name="pref_autofill_profile_editor_summary" msgid="6748434431641768870">"Gegevens instellen en beheren voor automatisch ingevulde formulieren"</string>
+ <string name="autofill_profile_editor_name" msgid="8566130291459685955">"Volledige naam:"</string>
+ <string name="autofill_profile_editor_email_address" msgid="7967585896612797173">"E-mail:"</string>
+ <string name="autofill_profile_editor_company_name" msgid="2813443159949210417">"Bedrijfsnaam:"</string>
+ <string name="autofill_profile_editor_address_line_1" msgid="836433242509243081">"Adresregel 1:"</string>
+ <string name="autofill_profile_editor_address_line_1_hint" msgid="5965659598509327172">"Adres, postbus, t.a.v."</string>
+ <string name="autofill_profile_editor_address_line_2" msgid="8194745202893822479">"Adresregel 2:"</string>
+ <string name="autofill_profile_editor_address_line_2_hint" msgid="2048330295853546405">"Appartement, suite, afdeling, gebouw, etage, enz."</string>
+ <string name="autofill_profile_editor_city" msgid="4193225955409148508">"Plaats:"</string>
+ <string name="autofill_profile_editor_state" msgid="8549739922338171458">"Provincie/staat/regio:"</string>
+ <string name="autofill_profile_editor_zip_code" msgid="283668573295656671">"Postcode:"</string>
+ <string name="autofill_profile_editor_country" msgid="7234470301239156656">"Land:"</string>
+ <string name="autofill_profile_editor_phone_number" msgid="4938852821413729276">"Telefoon:"</string>
+ <string name="autofill_profile_editor_save_profile" msgid="8349915287435262888">"Profiel opslaan"</string>
+ <string name="autofill_profile_successful_save" msgid="6834102203944938409">"Profiel opgeslagen"</string>
+ <string name="autofill_profile_successful_delete" msgid="2421442112954362732">"Profiel verwijderd"</string>
+ <string name="autofill_profile_editor_delete_profile" msgid="7112035941146003753">"Profielinfo verw."</string>
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
<string name="pref_privacy_title" msgid="1052470980370846151">"Privacyinstellingen"</string>
<string name="pref_privacy_clear_cache" msgid="3380316479925886998">"Cache wissen"</string>
<string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"Lokaal opgeslagen inhoud en databases wissen"</string>
@@ -208,6 +258,7 @@
<item msgid="891615911084608570">"Japans (ISO-2022-JP)"</item>
<item msgid="5589150448475151241">"Japans (SHIFT_JIS)"</item>
<item msgid="7356792686950371843">"Japans (EUC-JP)"</item>
+ <item msgid="2193955365569270096">"Koreaans (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Tekstcodering"</string>
<string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"Probleem met gegevensverbinding"</string>
@@ -296,4 +347,11 @@
<string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"Alle gegevens wissen"</string>
<string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"Annuleren"</string>
<string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"Achtergrond instellen..."</string>
+ <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Bladwijzers"</string>
+ <string name="empty_bookmarks_folder" msgid="7843361614634930942">"Er zijn geen bladwijzers"</string>
+ <string name="rlz_access_point" msgid="7165847807377650632">"J1"</string>
+ <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Synchroniseren met Google-account"</string>
+ <string name="import_bookmarks_dialog_description" msgid="2187665745413495303">"Uw Android-bladwijzers zijn niet gekoppeld aan een Google-account"</string>
+ <string name="import_bookmarks_dialog_remove" msgid="8105572409059113340">"Uw Android-bladwijzers verwijderen"</string>
+ <string name="import_bookmarks_dialog_import" msgid="6933613853573899218">"Uw Android-bladwijzers toevoegen aan bladwijzers voor <xliff:g id="GOOGLE_ACCOUNT">%s</xliff:g>"</string>
</resources>
diff --git a/res/values-pl-xlarge/strings.xml b/res/values-pl-xlarge/strings.xml
new file mode 100644
index 0000000..10f0199
--- /dev/null
+++ b/res/values-pl-xlarge/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="new_tab" msgid="7275656655054293038">"Nowa karta"</string>
+ <string name="new_incognito_tab" msgid="5149742197322201152">"Nowa karta incognito"</string>
+ <string name="active_tabs" msgid="5324492165541331128">"Karty"</string>
+</resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 1b93072..4010686 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -19,6 +19,7 @@
<string name="application_name" msgid="1935869255545976415">"Internet"</string>
<string name="choose_upload" msgid="3649366287575002063">"Wybierz plik do przesłania"</string>
<string name="new_tab" msgid="4505722538297295141">"Nowe okno"</string>
+ <string name="new_incognito_tab" msgid="5821404839654751753">"Nowe okno incognito"</string>
<string name="active_tabs" msgid="3050623868203544623">"Okna"</string>
<string name="tab_bookmarks" msgid="2305793036003473653">"Zakładki"</string>
<string name="tab_most_visited" msgid="1077402532455000703">"Popularne"</string>
@@ -32,12 +33,6 @@
<string name="bookmarks_search" msgid="5229596268214362873">"Przeglądarka"</string>
<string name="cancel" msgid="3017274947407233702">"Anuluj"</string>
<string name="ok" msgid="1509280796718850364">"OK"</string>
- <plurals name="matches_found">
- <item quantity="zero" msgid="6242659159545399963">"Brak wyników"</item>
- <item quantity="one" msgid="4352019729062956802">"1 wynik"</item>
- <item quantity="few" msgid="5544267486978946555">"Wyników: <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item quantity="other" msgid="6616125067364315405">"Wyników: <xliff:g id="NUMBER">%d</xliff:g>"</item>
- </plurals>
<string name="title_bar_loading" msgid="7438217780834640678">"Trwa wczytywanie..."</string>
<string name="page_info" msgid="4048529256302257195">"Informacje o stronie"</string>
<string name="page_info_view" msgid="5303490449842635158">"Informacje o stronie"</string>
@@ -46,6 +41,8 @@
<string name="ssl_continue" msgid="8031515015829358457">"Dalej"</string>
<string name="security_warning" msgid="6607795404322797541">"Ostrzeżenie zabezpieczeń"</string>
<string name="view_certificate" msgid="1472768887529093862">"Wyświetl certyfikat"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
<string name="ssl_untrusted" msgid="5369967226521102194">"Ten certyfikat nie pochodzi od zaufanego urzędu."</string>
<string name="ssl_mismatch" msgid="558688832420069896">"Nazwa witryny nie odpowiada nazwie podanej w certyfikacie."</string>
<string name="ssl_expired" msgid="5739349389499575559">"Ten certyfikat wygasł."</string>
@@ -67,12 +64,23 @@
<string name="forward" msgid="4288210890526641577">"Dalej"</string>
<string name="save" msgid="5922311934992468496">"OK"</string>
<string name="do_not_save" msgid="6777633870113477714">"Anuluj"</string>
- <string name="location" msgid="969988560160364559">"Adres"</string>
- <string name="name" msgid="5990326151488445481">"Nazwa"</string>
+ <string name="location" msgid="3411848697912600125">"Adres"</string>
+ <string name="containing_folder" msgid="6771180232953030479">"Dodaj do"</string>
+ <string name="new_folder" msgid="7743540149088867917">"Nowy folder"</string>
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <string name="no_subfolders" msgid="5880411440592452802">"Brak podfolderów"</string>
+ <string name="add_to_bookmarks_menu_option" msgid="4449323955122214389">"Zakładki"</string>
+ <string name="add_to_homescreen_menu_option" msgid="1461447829242963790">"Ekran główny"</string>
+ <string name="add_to_other_folder_menu_option" msgid="5450890093372998187">"Inny folder…"</string>
+ <string name="name" msgid="5462672162695365387">"Etykieta"</string>
<string name="http" msgid="2163722670597250102">"http://"</string>
- <string name="save_to_bookmarks" msgid="588165100024086565">"Dodaj zakładkę"</string>
+ <string name="save_to_bookmarks" msgid="6101482434920313244">"Dodaj do Zakładek"</string>
+ <string name="bookmark_this_page" msgid="7530739804320811054">"Dodaj tę stronę do zakładek"</string>
<string name="edit_bookmark" msgid="5024089053490231905">"Edytuj zakładkę"</string>
- <string name="create_shortcut_bookmark" msgid="9202323987633899835">"Dodaj skrót do strony głównej"</string>
+ <string name="create_shortcut_bookmark" msgid="1995095662095484289">"Dodaj skrót do ekranu głównego"</string>
<string name="open_bookmark" msgid="8473581305759935790">"Otwórz"</string>
<string name="remove_bookmark" msgid="8407495852801410891">"Usuń zakładkę"</string>
<string name="remove_from_bookmarks" msgid="4374080666576982775">"Usuń z zakładek"</string>
@@ -87,13 +95,15 @@
<string name="bookmark_cannot_save_url" msgid="791722768778386941">"Nie można dodać tego adresu URL do zakładek."</string>
<string name="delete_bookmark" msgid="2422989994934201992">"Usuń"</string>
<string name="bookmark_page" msgid="6845189305130307274">"Dodaj do zakładek ostatnio wyświetlaną stronę"</string>
- <string name="switch_to_thumbnails" msgid="5493351529609043151">"Widok miniatur"</string>
- <string name="switch_to_list" msgid="8900531247982121055">"Widok listy"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
<string name="current_page" msgid="7510129573681663135">"z "</string>
<string name="delete_bookmark_warning" msgid="758043186202032205">"Zakładka „<xliff:g id="BOOKMARK">%s</xliff:g>” zostanie usunięta."</string>
<string name="open_in_new_window" msgid="6596775546468054510">"Otwórz w nowym oknie"</string>
<string name="goto_dot" msgid="3895839050522602723">"Przejdź"</string>
- <string name="find_dot" msgid="6259312434696611957">"Znajdź na stronie"</string>
+ <string name="incognito_tab" msgid="5419458065370134289">"Otwórz nową kartę incognito"</string>
<string name="select_dot" msgid="6299170761900561967">"Zaznacz tekst"</string>
<string name="tab_picker_title" msgid="864478399057782913">"Bieżące okna"</string>
<string name="tab_picker_remove_tab" msgid="630087809802479397">"Zamknij"</string>
@@ -103,6 +113,13 @@
<string name="menu_view_download" msgid="2124570321712995120">"Pobrane"</string>
<string name="copy_page_url" msgid="7635062169011319208">"Kopiuj adres URL strony"</string>
<string name="share_page" msgid="593756995297268343">"Udostępnij stronę"</string>
+ <string name="menu_save_webarchive" msgid="3934652434001459581">"Zapisz jako archiwum internetowe"</string>
+ <string name="webarchive_saved" msgid="7045250341467345007">"Archiwum internetowe zostało zapisane."</string>
+ <string name="webarchive_failed" msgid="2880998204746620260">"Nie można zapisać archiwum internetowego."</string>
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
<string name="contextmenu_openlink" msgid="7237961252214188935">"Otwórz"</string>
<string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"Otwórz w nowym oknie"</string>
<string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"Dodaj link do zakładek"</string>
@@ -138,11 +155,44 @@
<string name="pref_content_homepage" msgid="6082437160778559806">"Ustaw stronę główną"</string>
<string name="pref_content_search_engine" msgid="1620101310821644144">"Ustaw wyszukiwarkę"</string>
<string name="pref_content_search_engine_summary" msgid="5162667665858487316">"Wybierz wyszukiwarkę"</string>
- <string name="pref_use_current" msgid="1493179933653044553">"Użyj bieżącej strony"</string>
+ <string name="pref_set_homepage_to" msgid="7196350233061395098">"Ustaw"</string>
+ <string name="pref_use_current" msgid="1778622474040406672">"Bieżąca strona"</string>
+ <string name="pref_use_blank" msgid="8503238592551111169">"Pusta strona"</string>
+ <string name="pref_use_default" msgid="192587563274735878">"Domyślna strona"</string>
<string name="pref_content_autofit" msgid="8260474534053660809">"Autodopasowanie stron"</string>
<string name="pref_content_autofit_summary" msgid="4587831659894879986">"Formatuj strony internetowe w celu dopasowania do ekranu"</string>
- <string name="pref_content_landscape_only" msgid="2022546812766219672">"Zawsze w poziomie"</string>
- <string name="pref_content_landscape_only_summary" msgid="1008238895535428855">"Wyświetlaj strony tylko w szerszej, poziomej orientacji ekranu"</string>
+ <string name="pref_personal_title" msgid="1447687455755683695">"Ustawienia osobiste"</string>
+ <string name="pref_personal_sync_with_chrome" msgid="1695182180332194033">"Synchronizuj z przeglądarką Google Chrome"</string>
+ <string name="pref_personal_sync_with_chrome_summary" msgid="7414133931827321055">"Udostępniaj zakładki i inne dane między przeglądarką w systemie Android i przeglądarką Google Chrome"</string>
+ <string name="pref_personal_google_account" msgid="952360133341490071">"Konto Google"</string>
+ <string name="pref_personal_sync_bookmarks" msgid="59237515966184432">"Synchronizuj zakładki"</string>
+ <string name="pref_personal_sync_bookmarks_summary" msgid="4791767605662205482">"Synchronizuj zakładki między przeglądarką w systemie Android i przeglądarką Google Chrome"</string>
+ <string name="pref_personal_start_syncing" msgid="6046972042512655232">"Synchronizuj"</string>
+ <string name="pref_personal_account_dialog_title" msgid="1390867119887955530">"Wybierz konto Google dla udostępniania"</string>
+ <string name="pref_autofill_enabled" msgid="1174197447388234595">"Autouzupełnianie formularzy"</string>
+ <string name="pref_autofill_enabled_summary" msgid="422640696197018914">"Wypełniaj formularze internetowe za pomocą jednego kliknięcia"</string>
+ <string name="pref_autofill_profile_editor" msgid="1350709161524642663">"Ustawienia autouzupełniania"</string>
+ <string name="pref_autofill_profile_editor_summary" msgid="6748434431641768870">"Skonfiguruj dane dla automatycznie uzupełnianych formularzy i zarządzaj nimi"</string>
+ <string name="autofill_profile_editor_name" msgid="8566130291459685955">"Imię i nazwisko:"</string>
+ <string name="autofill_profile_editor_email_address" msgid="7967585896612797173">"E-mail:"</string>
+ <string name="autofill_profile_editor_company_name" msgid="2813443159949210417">"Nazwa firmy:"</string>
+ <string name="autofill_profile_editor_address_line_1" msgid="836433242509243081">"Adres, wiersz 1:"</string>
+ <string name="autofill_profile_editor_address_line_1_hint" msgid="5965659598509327172">"Adres, skrzynka pocztowa, adres korespondencyjny"</string>
+ <string name="autofill_profile_editor_address_line_2" msgid="8194745202893822479">"Adres, wiersz 2:"</string>
+ <string name="autofill_profile_editor_address_line_2_hint" msgid="2048330295853546405">"Mieszkanie, apartament, wydział, budynek, piętro itp."</string>
+ <string name="autofill_profile_editor_city" msgid="4193225955409148508">"Miasto / miejscowość:"</string>
+ <string name="autofill_profile_editor_state" msgid="8549739922338171458">"Województwo / region:"</string>
+ <string name="autofill_profile_editor_zip_code" msgid="283668573295656671">"Kod pocztowy:"</string>
+ <string name="autofill_profile_editor_country" msgid="7234470301239156656">"Kraj:"</string>
+ <string name="autofill_profile_editor_phone_number" msgid="4938852821413729276">"Telefon:"</string>
+ <string name="autofill_profile_editor_save_profile" msgid="8349915287435262888">"Zapisz profil"</string>
+ <string name="autofill_profile_successful_save" msgid="6834102203944938409">"Profil został zapisany"</string>
+ <string name="autofill_profile_successful_delete" msgid="2421442112954362732">"Profil usunięto"</string>
+ <string name="autofill_profile_editor_delete_profile" msgid="7112035941146003753">"Usuń dane profilu"</string>
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
<string name="pref_privacy_title" msgid="1052470980370846151">"Ustawienia prywatności"</string>
<string name="pref_privacy_clear_cache" msgid="3380316479925886998">"Wyczyść pamięć podręczną"</string>
<string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"Wyczyść zawartość lokalnej pamięci podręcznej i baz danych"</string>
@@ -208,6 +258,7 @@
<item msgid="891615911084608570">"japoński (ISO-2022-JP)"</item>
<item msgid="5589150448475151241">"japoński (SHIFT_JIS)"</item>
<item msgid="7356792686950371843">"japoński (EUC-JP)"</item>
+ <item msgid="2193955365569270096">"koreański (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Kodowanie tekstu"</string>
<string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"Problem z łącznością danych"</string>
@@ -296,4 +347,11 @@
<string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"Usuń wszystkie dane"</string>
<string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"Anuluj"</string>
<string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"Trwa ustawianie tapety..."</string>
+ <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Zakładki"</string>
+ <string name="empty_bookmarks_folder" msgid="7843361614634930942">"Brak zakładek"</string>
+ <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
+ <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Synchronizuj z kontem Google"</string>
+ <string name="import_bookmarks_dialog_description" msgid="2187665745413495303">"Zakładki w systemie Android nie są powiązane z kontem Google"</string>
+ <string name="import_bookmarks_dialog_remove" msgid="8105572409059113340">"Usuń zakładki w systemie Android"</string>
+ <string name="import_bookmarks_dialog_import" msgid="6933613853573899218">"Dodaj zakładki z systemu Android do zakładek na koncie <xliff:g id="GOOGLE_ACCOUNT">%s</xliff:g>"</string>
</resources>
diff --git a/res/values-pt-rPT-xlarge/strings.xml b/res/values-pt-rPT-xlarge/strings.xml
new file mode 100644
index 0000000..7db3453
--- /dev/null
+++ b/res/values-pt-rPT-xlarge/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="new_tab" msgid="7275656655054293038">"Novo separador"</string>
+ <string name="new_incognito_tab" msgid="5149742197322201152">"Novo sep. de navegação anónima"</string>
+ <string name="active_tabs" msgid="5324492165541331128">"Separadores"</string>
+</resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index e63c7ef..040a607 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -19,6 +19,7 @@
<string name="application_name" msgid="1935869255545976415">"Navegad."</string>
<string name="choose_upload" msgid="3649366287575002063">"Escolher ficheiro a carregar"</string>
<string name="new_tab" msgid="4505722538297295141">"Nova janela"</string>
+ <string name="new_incognito_tab" msgid="5821404839654751753">"Nova janela de naveg. anónima"</string>
<string name="active_tabs" msgid="3050623868203544623">"Janelas"</string>
<string name="tab_bookmarks" msgid="2305793036003473653">"Marcadores"</string>
<string name="tab_most_visited" msgid="1077402532455000703">"Os mais visitados"</string>
@@ -32,12 +33,6 @@
<string name="bookmarks_search" msgid="5229596268214362873">"Navegad."</string>
<string name="cancel" msgid="3017274947407233702">"Cancelar"</string>
<string name="ok" msgid="1509280796718850364">"OK"</string>
- <plurals name="matches_found">
- <item quantity="zero" msgid="6242659159545399963">"Sem correspondência"</item>
- <item quantity="one" msgid="4352019729062956802">"1 correspondência"</item>
- <item quantity="few" msgid="5544267486978946555">"<xliff:g id="NUMBER">%d</xliff:g> correspondências"</item>
- <item quantity="other" msgid="6616125067364315405">"<xliff:g id="NUMBER">%d</xliff:g> correspondências"</item>
- </plurals>
<string name="title_bar_loading" msgid="7438217780834640678">"A carregar..."</string>
<string name="page_info" msgid="4048529256302257195">"Informações da página"</string>
<string name="page_info_view" msgid="5303490449842635158">"Ver informações da página"</string>
@@ -46,6 +41,8 @@
<string name="ssl_continue" msgid="8031515015829358457">"Continuar"</string>
<string name="security_warning" msgid="6607795404322797541">"Aviso de segurança"</string>
<string name="view_certificate" msgid="1472768887529093862">"Ver certificado"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
<string name="ssl_untrusted" msgid="5369967226521102194">"Este certificado não pertence a uma autoridade fidedigna."</string>
<string name="ssl_mismatch" msgid="558688832420069896">"O nome do site não corresponde ao nome constante no certificado."</string>
<string name="ssl_expired" msgid="5739349389499575559">"Este certificado expirou."</string>
@@ -67,12 +64,23 @@
<string name="forward" msgid="4288210890526641577">"Avançar"</string>
<string name="save" msgid="5922311934992468496">"OK"</string>
<string name="do_not_save" msgid="6777633870113477714">"Cancelar"</string>
- <string name="location" msgid="969988560160364559">"Local"</string>
- <string name="name" msgid="5990326151488445481">"Nome"</string>
+ <string name="location" msgid="3411848697912600125">"Endereço"</string>
+ <string name="containing_folder" msgid="6771180232953030479">"Adicionar a"</string>
+ <string name="new_folder" msgid="7743540149088867917">"Nova pasta"</string>
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <string name="no_subfolders" msgid="5880411440592452802">"Não há subpastas"</string>
+ <string name="add_to_bookmarks_menu_option" msgid="4449323955122214389">"Marcadores"</string>
+ <string name="add_to_homescreen_menu_option" msgid="1461447829242963790">"Ecrã principal"</string>
+ <string name="add_to_other_folder_menu_option" msgid="5450890093372998187">"Outra pasta…"</string>
+ <string name="name" msgid="5462672162695365387">"Etiqueta"</string>
<string name="http" msgid="2163722670597250102">"http://"</string>
- <string name="save_to_bookmarks" msgid="588165100024086565">"Adicionar marcador"</string>
+ <string name="save_to_bookmarks" msgid="6101482434920313244">"Adicionar aos marcadores"</string>
+ <string name="bookmark_this_page" msgid="7530739804320811054">"Adicionar esta página aos marcadores"</string>
<string name="edit_bookmark" msgid="5024089053490231905">"Editar marcador"</string>
- <string name="create_shortcut_bookmark" msgid="9202323987633899835">"Adicionar atalho à página inicial"</string>
+ <string name="create_shortcut_bookmark" msgid="1995095662095484289">"Adicionar atalho à página inicial"</string>
<string name="open_bookmark" msgid="8473581305759935790">"Abrir"</string>
<string name="remove_bookmark" msgid="8407495852801410891">"Eliminar marcador"</string>
<string name="remove_from_bookmarks" msgid="4374080666576982775">"Remover dos marcadores"</string>
@@ -87,13 +95,15 @@
<string name="bookmark_cannot_save_url" msgid="791722768778386941">"Este URL não pode ser adicionado aos marcadores."</string>
<string name="delete_bookmark" msgid="2422989994934201992">"Eliminar"</string>
<string name="bookmark_page" msgid="6845189305130307274">"Adicionar aos marcadores a última página visualizada"</string>
- <string name="switch_to_thumbnails" msgid="5493351529609043151">"Vista de miniatura"</string>
- <string name="switch_to_list" msgid="8900531247982121055">"Vista de lista"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
<string name="current_page" msgid="7510129573681663135">"de "</string>
<string name="delete_bookmark_warning" msgid="758043186202032205">"O marcador \"<xliff:g id="BOOKMARK">%s</xliff:g>\" será eliminado."</string>
<string name="open_in_new_window" msgid="6596775546468054510">"Abrir numa janela nova"</string>
<string name="goto_dot" msgid="3895839050522602723">"Ir"</string>
- <string name="find_dot" msgid="6259312434696611957">"Encontrar na página"</string>
+ <string name="incognito_tab" msgid="5419458065370134289">"Abrir novo separador de navegação anónima"</string>
<string name="select_dot" msgid="6299170761900561967">"Seleccionar texto"</string>
<string name="tab_picker_title" msgid="864478399057782913">"Janelas actuais"</string>
<string name="tab_picker_remove_tab" msgid="630087809802479397">"Fechar"</string>
@@ -103,6 +113,13 @@
<string name="menu_view_download" msgid="2124570321712995120">"Transferências"</string>
<string name="copy_page_url" msgid="7635062169011319208">"Copiar URL da página"</string>
<string name="share_page" msgid="593756995297268343">"Partilhar página"</string>
+ <string name="menu_save_webarchive" msgid="3934652434001459581">"Guardar como arquivo Web"</string>
+ <string name="webarchive_saved" msgid="7045250341467345007">"Arquivo Web guardado."</string>
+ <string name="webarchive_failed" msgid="2880998204746620260">"Não foi possível guardar o arquivo Web."</string>
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
<string name="contextmenu_openlink" msgid="7237961252214188935">"Abrir"</string>
<string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"Abrir numa janela nova"</string>
<string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"Adicionar link aos marcadores"</string>
@@ -138,11 +155,44 @@
<string name="pref_content_homepage" msgid="6082437160778559806">"Definir página inicial"</string>
<string name="pref_content_search_engine" msgid="1620101310821644144">"Definir motor de pesquisa"</string>
<string name="pref_content_search_engine_summary" msgid="5162667665858487316">"Seleccionar um motor de pesquisa"</string>
- <string name="pref_use_current" msgid="1493179933653044553">"Utilizar página actual"</string>
+ <string name="pref_set_homepage_to" msgid="7196350233061395098">"Definido para..."</string>
+ <string name="pref_use_current" msgid="1778622474040406672">"Página actual"</string>
+ <string name="pref_use_blank" msgid="8503238592551111169">"Página em branco"</string>
+ <string name="pref_use_default" msgid="192587563274735878">"Página predefinida"</string>
<string name="pref_content_autofit" msgid="8260474534053660809">"Ajuste auto de páginas"</string>
<string name="pref_content_autofit_summary" msgid="4587831659894879986">"Formatar páginas Web para se ajustarem ao ecrã"</string>
- <string name="pref_content_landscape_only" msgid="2022546812766219672">"Apresentação apenas na horizontal"</string>
- <string name="pref_content_landscape_only_summary" msgid="1008238895535428855">"Mostrar páginas só na orientação horizontal do ecrã (mais larga)"</string>
+ <string name="pref_personal_title" msgid="1447687455755683695">"Definições pessoais"</string>
+ <string name="pref_personal_sync_with_chrome" msgid="1695182180332194033">"Sincronizar com o Google Chrome"</string>
+ <string name="pref_personal_sync_with_chrome_summary" msgid="7414133931827321055">"Partilhar marcadores e outros dados entre o navegador do Android e o Google Chrome"</string>
+ <string name="pref_personal_google_account" msgid="952360133341490071">"Conta Google"</string>
+ <string name="pref_personal_sync_bookmarks" msgid="59237515966184432">"Sincronizar marcadores"</string>
+ <string name="pref_personal_sync_bookmarks_summary" msgid="4791767605662205482">"Sincronizar marcadores entre o navegador do Android e o Google Chrome"</string>
+ <string name="pref_personal_start_syncing" msgid="6046972042512655232">"Inic. sincronização"</string>
+ <string name="pref_personal_account_dialog_title" msgid="1390867119887955530">"Selec. conta Google p/ partilhar c/"</string>
+ <string name="pref_autofill_enabled" msgid="1174197447388234595">"Preench. autom. do formulário"</string>
+ <string name="pref_autofill_enabled_summary" msgid="422640696197018914">"Preencher formulários Web com um único clique"</string>
+ <string name="pref_autofill_profile_editor" msgid="1350709161524642663">"Def. do preenchimento automático"</string>
+ <string name="pref_autofill_profile_editor_summary" msgid="6748434431641768870">"Configurar e gerir dados para formulários preenchidos automaticamente"</string>
+ <string name="autofill_profile_editor_name" msgid="8566130291459685955">"Nome completo:"</string>
+ <string name="autofill_profile_editor_email_address" msgid="7967585896612797173">"E-mail:"</string>
+ <string name="autofill_profile_editor_company_name" msgid="2813443159949210417">"Nome da empresa:"</string>
+ <string name="autofill_profile_editor_address_line_1" msgid="836433242509243081">"Linha de endereço 1"</string>
+ <string name="autofill_profile_editor_address_line_1_hint" msgid="5965659598509327172">"Endereço, caixa postal, c/o"</string>
+ <string name="autofill_profile_editor_address_line_2" msgid="8194745202893822479">"Linha de endereço 2:"</string>
+ <string name="autofill_profile_editor_address_line_2_hint" msgid="2048330295853546405">"Apartamento, suite, unidade, edifício, piso, etc."</string>
+ <string name="autofill_profile_editor_city" msgid="4193225955409148508">"Cidade/Vila:"</string>
+ <string name="autofill_profile_editor_state" msgid="8549739922338171458">"Estado / Província / Região:"</string>
+ <string name="autofill_profile_editor_zip_code" msgid="283668573295656671">"Código postal:"</string>
+ <string name="autofill_profile_editor_country" msgid="7234470301239156656">"País:"</string>
+ <string name="autofill_profile_editor_phone_number" msgid="4938852821413729276">"Telefone:"</string>
+ <string name="autofill_profile_editor_save_profile" msgid="8349915287435262888">"Guardar perfil"</string>
+ <string name="autofill_profile_successful_save" msgid="6834102203944938409">"Perfil guardado"</string>
+ <string name="autofill_profile_successful_delete" msgid="2421442112954362732">"Perfil eliminado"</string>
+ <string name="autofill_profile_editor_delete_profile" msgid="7112035941146003753">"El. dados do perfil"</string>
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
<string name="pref_privacy_title" msgid="1052470980370846151">"Definições de privacidade"</string>
<string name="pref_privacy_clear_cache" msgid="3380316479925886998">"Limpar cache"</string>
<string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"Limpar bases de dados e conteúdos colocados em cache localmente"</string>
@@ -208,6 +258,7 @@
<item msgid="891615911084608570">"Japonês (ISO-2022-JP)"</item>
<item msgid="5589150448475151241">"Japonês (SHIFT_JIS)"</item>
<item msgid="7356792686950371843">"Japonês (EUC-JP)"</item>
+ <item msgid="2193955365569270096">"Coreano (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Codificação do texto"</string>
<string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"Problema de conectividade de dados"</string>
@@ -296,4 +347,11 @@
<string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"Eliminar todos os dados"</string>
<string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"Cancelar"</string>
<string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"A definir imagem de fundo..."</string>
+ <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Marcadores"</string>
+ <string name="empty_bookmarks_folder" msgid="7843361614634930942">"Não existem marcadores"</string>
+ <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
+ <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Sincronizar com conta Google"</string>
+ <string name="import_bookmarks_dialog_description" msgid="2187665745413495303">"Os seus marcadores do Android não estão associados a uma conta Google"</string>
+ <string name="import_bookmarks_dialog_remove" msgid="8105572409059113340">"Remover marcadores do Android"</string>
+ <string name="import_bookmarks_dialog_import" msgid="6933613853573899218">"Adicionar os seus marcadores do Android aos marcadores da <xliff:g id="GOOGLE_ACCOUNT">%s</xliff:g>"</string>
</resources>
diff --git a/res/values-pt-xlarge/strings.xml b/res/values-pt-xlarge/strings.xml
new file mode 100644
index 0000000..4ed9cd0
--- /dev/null
+++ b/res/values-pt-xlarge/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="new_tab" msgid="7275656655054293038">"Nova guia"</string>
+ <string name="new_incognito_tab" msgid="5149742197322201152">"Nova guia anônima"</string>
+ <string name="active_tabs" msgid="5324492165541331128">"Guias"</string>
+</resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index c25e758..4377943 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -19,6 +19,7 @@
<string name="application_name" msgid="1935869255545976415">"Navegador"</string>
<string name="choose_upload" msgid="3649366287575002063">"Escolha o arquivo para envio"</string>
<string name="new_tab" msgid="4505722538297295141">"Nova janela"</string>
+ <string name="new_incognito_tab" msgid="5821404839654751753">"Nova janela anônima"</string>
<string name="active_tabs" msgid="3050623868203544623">"Janelas"</string>
<string name="tab_bookmarks" msgid="2305793036003473653">"Favoritos"</string>
<string name="tab_most_visited" msgid="1077402532455000703">"Mais visitados"</string>
@@ -32,12 +33,6 @@
<string name="bookmarks_search" msgid="5229596268214362873">"Navegador"</string>
<string name="cancel" msgid="3017274947407233702">"Cancelar"</string>
<string name="ok" msgid="1509280796718850364">"OK"</string>
- <plurals name="matches_found">
- <item quantity="zero" msgid="6242659159545399963">"Sem correspondências"</item>
- <item quantity="one" msgid="4352019729062956802">"1 correspondência"</item>
- <item quantity="few" msgid="5544267486978946555">"<xliff:g id="NUMBER">%d</xliff:g> correspondências"</item>
- <item quantity="other" msgid="6616125067364315405">"<xliff:g id="NUMBER">%d</xliff:g> correspondências"</item>
- </plurals>
<string name="title_bar_loading" msgid="7438217780834640678">"Carregando..."</string>
<string name="page_info" msgid="4048529256302257195">"Informações da página"</string>
<string name="page_info_view" msgid="5303490449842635158">"Visualizar informações da página"</string>
@@ -46,6 +41,8 @@
<string name="ssl_continue" msgid="8031515015829358457">"Continuar"</string>
<string name="security_warning" msgid="6607795404322797541">"Aviso de segurança"</string>
<string name="view_certificate" msgid="1472768887529093862">"Visualizar certificado"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
<string name="ssl_untrusted" msgid="5369967226521102194">"Este certificado não é de uma autoridade confiável."</string>
<string name="ssl_mismatch" msgid="558688832420069896">"O nome do site não corresponde ao nome no certificado."</string>
<string name="ssl_expired" msgid="5739349389499575559">"Este certificado expirou."</string>
@@ -67,12 +64,23 @@
<string name="forward" msgid="4288210890526641577">"Avançar"</string>
<string name="save" msgid="5922311934992468496">"OK"</string>
<string name="do_not_save" msgid="6777633870113477714">"Cancelar"</string>
- <string name="location" msgid="969988560160364559">"Local"</string>
- <string name="name" msgid="5990326151488445481">"Nome"</string>
+ <string name="location" msgid="3411848697912600125">"Endereço"</string>
+ <string name="containing_folder" msgid="6771180232953030479">"Adicionar a"</string>
+ <string name="new_folder" msgid="7743540149088867917">"Nova pasta"</string>
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <string name="no_subfolders" msgid="5880411440592452802">"Nenhuma subpasta"</string>
+ <string name="add_to_bookmarks_menu_option" msgid="4449323955122214389">"Favoritos"</string>
+ <string name="add_to_homescreen_menu_option" msgid="1461447829242963790">"Tela inicial"</string>
+ <string name="add_to_other_folder_menu_option" msgid="5450890093372998187">"Outra pasta…"</string>
+ <string name="name" msgid="5462672162695365387">"Marcador"</string>
<string name="http" msgid="2163722670597250102">"http://"</string>
- <string name="save_to_bookmarks" msgid="588165100024086565">"Adicionar favorito"</string>
+ <string name="save_to_bookmarks" msgid="6101482434920313244">"Adicionar aos favoritos"</string>
+ <string name="bookmark_this_page" msgid="7530739804320811054">"Adicionar esta página aos favoritos"</string>
<string name="edit_bookmark" msgid="5024089053490231905">"Editar favorito"</string>
- <string name="create_shortcut_bookmark" msgid="9202323987633899835">"Adicionar atalho à Página inicial"</string>
+ <string name="create_shortcut_bookmark" msgid="1995095662095484289">"Adicionar atalho à página inicial"</string>
<string name="open_bookmark" msgid="8473581305759935790">"Abrir"</string>
<string name="remove_bookmark" msgid="8407495852801410891">"Excluir favorito"</string>
<string name="remove_from_bookmarks" msgid="4374080666576982775">"Remover dos favoritos"</string>
@@ -87,13 +95,15 @@
<string name="bookmark_cannot_save_url" msgid="791722768778386941">"Este URL não pode ser adicionado como favorito."</string>
<string name="delete_bookmark" msgid="2422989994934201992">"Excluir"</string>
<string name="bookmark_page" msgid="6845189305130307274">"Adicionar última página visualizada aos favoritos"</string>
- <string name="switch_to_thumbnails" msgid="5493351529609043151">"Visualização em miniatura"</string>
- <string name="switch_to_list" msgid="8900531247982121055">"Visualização em lista"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
<string name="current_page" msgid="7510129573681663135">"de "</string>
<string name="delete_bookmark_warning" msgid="758043186202032205">"O favorito \"<xliff:g id="BOOKMARK">%s</xliff:g>\" será excluído."</string>
<string name="open_in_new_window" msgid="6596775546468054510">"Abrir em uma nova janela"</string>
<string name="goto_dot" msgid="3895839050522602723">"Ir"</string>
- <string name="find_dot" msgid="6259312434696611957">"Localizar na página"</string>
+ <string name="incognito_tab" msgid="5419458065370134289">"Abrir nova guia anônima"</string>
<string name="select_dot" msgid="6299170761900561967">"Selecionar texto"</string>
<string name="tab_picker_title" msgid="864478399057782913">"Janelas atuais"</string>
<string name="tab_picker_remove_tab" msgid="630087809802479397">"Fechar"</string>
@@ -103,6 +113,13 @@
<string name="menu_view_download" msgid="2124570321712995120">"Downloads"</string>
<string name="copy_page_url" msgid="7635062169011319208">"Copiar URL da página"</string>
<string name="share_page" msgid="593756995297268343">"Compartilhar página"</string>
+ <string name="menu_save_webarchive" msgid="3934652434001459581">"Salvar como arquivo da web"</string>
+ <string name="webarchive_saved" msgid="7045250341467345007">"Arquivo da web salvo."</string>
+ <string name="webarchive_failed" msgid="2880998204746620260">"Falha ao salvar arquivo da web."</string>
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
<string name="contextmenu_openlink" msgid="7237961252214188935">"Abrir"</string>
<string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"Abrir em uma nova janela"</string>
<string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"Link do favorito"</string>
@@ -138,11 +155,44 @@
<string name="pref_content_homepage" msgid="6082437160778559806">"Definir a página inicial"</string>
<string name="pref_content_search_engine" msgid="1620101310821644144">"Definir mecanismo de pesquisa"</string>
<string name="pref_content_search_engine_summary" msgid="5162667665858487316">"Selecionar um mecanismo de pesquisa"</string>
- <string name="pref_use_current" msgid="1493179933653044553">"Usar a página atual"</string>
+ <string name="pref_set_homepage_to" msgid="7196350233061395098">"Definir para..."</string>
+ <string name="pref_use_current" msgid="1778622474040406672">"Página atual"</string>
+ <string name="pref_use_blank" msgid="8503238592551111169">"Página em branco"</string>
+ <string name="pref_use_default" msgid="192587563274735878">"Página padrão"</string>
<string name="pref_content_autofit" msgid="8260474534053660809">"Ajustar automaticamente"</string>
<string name="pref_content_autofit_summary" msgid="4587831659894879986">"Formatar páginas da web para se ajustarem à tela"</string>
- <string name="pref_content_landscape_only" msgid="2022546812766219672">"Apenas modo paisagem"</string>
- <string name="pref_content_landscape_only_summary" msgid="1008238895535428855">"Exibir páginas apenas na orientação mais larga, com a tela no modo paisagem"</string>
+ <string name="pref_personal_title" msgid="1447687455755683695">"Configurações pessoais"</string>
+ <string name="pref_personal_sync_with_chrome" msgid="1695182180332194033">"Sincronizar com o Google Chrome"</string>
+ <string name="pref_personal_sync_with_chrome_summary" msgid="7414133931827321055">"Compartilhar favoritos e outros dados entre o navegador do Android e o Google Chrome"</string>
+ <string name="pref_personal_google_account" msgid="952360133341490071">"Conta do Google"</string>
+ <string name="pref_personal_sync_bookmarks" msgid="59237515966184432">"Sincronizar favoritos"</string>
+ <string name="pref_personal_sync_bookmarks_summary" msgid="4791767605662205482">"Sincronizar favoritos entre o navegador do Android e o Google Chrome"</string>
+ <string name="pref_personal_start_syncing" msgid="6046972042512655232">"Iniciar sincroniz."</string>
+ <string name="pref_personal_account_dialog_title" msgid="1390867119887955530">"Sel. conta p/ comp."</string>
+ <string name="pref_autofill_enabled" msgid="1174197447388234595">"Preench. autom. de formulários"</string>
+ <string name="pref_autofill_enabled_summary" msgid="422640696197018914">"Preencher formulários da web com apenas um clique"</string>
+ <string name="pref_autofill_profile_editor" msgid="1350709161524642663">"Config. de Preench. automático"</string>
+ <string name="pref_autofill_profile_editor_summary" msgid="6748434431641768870">"Configurar e gerenciar os dados de formulários preenchidos automaticamente"</string>
+ <string name="autofill_profile_editor_name" msgid="8566130291459685955">"Nome completo:"</string>
+ <string name="autofill_profile_editor_email_address" msgid="7967585896612797173">"E-mail:"</string>
+ <string name="autofill_profile_editor_company_name" msgid="2813443159949210417">"Nome da empresa:"</string>
+ <string name="autofill_profile_editor_address_line_1" msgid="836433242509243081">"Linha de endereço 1:"</string>
+ <string name="autofill_profile_editor_address_line_1_hint" msgid="5965659598509327172">"Endereço, caixa postal, \"aos cuidados de\""</string>
+ <string name="autofill_profile_editor_address_line_2" msgid="8194745202893822479">"Linha de endereço 2:"</string>
+ <string name="autofill_profile_editor_address_line_2_hint" msgid="2048330295853546405">"Apartamento, suíte, unidade, edifício, andar etc."</string>
+ <string name="autofill_profile_editor_city" msgid="4193225955409148508">"Cidade:"</string>
+ <string name="autofill_profile_editor_state" msgid="8549739922338171458">"Estado/província/região:"</string>
+ <string name="autofill_profile_editor_zip_code" msgid="283668573295656671">"CEP:"</string>
+ <string name="autofill_profile_editor_country" msgid="7234470301239156656">"País:"</string>
+ <string name="autofill_profile_editor_phone_number" msgid="4938852821413729276">"Telefone:"</string>
+ <string name="autofill_profile_editor_save_profile" msgid="8349915287435262888">"Salvar perfil"</string>
+ <string name="autofill_profile_successful_save" msgid="6834102203944938409">"Perfil salvo"</string>
+ <string name="autofill_profile_successful_delete" msgid="2421442112954362732">"Perfil excluído"</string>
+ <string name="autofill_profile_editor_delete_profile" msgid="7112035941146003753">"Excluir dados perfil"</string>
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
<string name="pref_privacy_title" msgid="1052470980370846151">"Configurações de privacidade"</string>
<string name="pref_privacy_clear_cache" msgid="3380316479925886998">"Limpar cache"</string>
<string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"Limpar conteúdo e bancos de dados armazenados localmente em cache"</string>
@@ -208,6 +258,7 @@
<item msgid="891615911084608570">"Japonês (ISO-2022-JP)"</item>
<item msgid="5589150448475151241">"Japonês (SHIFT_JIS)"</item>
<item msgid="7356792686950371843">"Japonês (EUC-JP)"</item>
+ <item msgid="2193955365569270096">"Coreano (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Codificação de texto"</string>
<string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"Problema de conectividade de dados"</string>
@@ -296,4 +347,11 @@
<string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"Excluir todos os dados"</string>
<string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"Cancelar"</string>
<string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"Definindo o plano de fundo..."</string>
+ <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Favoritos"</string>
+ <string name="empty_bookmarks_folder" msgid="7843361614634930942">"Não há nenhum favorito"</string>
+ <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
+ <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Sincronizar com Conta do Google"</string>
+ <string name="import_bookmarks_dialog_description" msgid="2187665745413495303">"Seus favoritos do Android não estão associados a uma Conta do Google"</string>
+ <string name="import_bookmarks_dialog_remove" msgid="8105572409059113340">"Remover os favoritos do Android"</string>
+ <string name="import_bookmarks_dialog_import" msgid="6933613853573899218">"Adicionar favoritos do Android aos favoritos de <xliff:g id="GOOGLE_ACCOUNT">%s</xliff:g>"</string>
</resources>
diff --git a/res/values-rm/strings.xml b/res/values-rm/strings.xml
new file mode 100644
index 0000000..42ebc68
--- /dev/null
+++ b/res/values-rm/strings.xml
@@ -0,0 +1,403 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2007 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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="application_name" msgid="1935869255545976415">"Navigatur"</string>
+ <string name="choose_upload" msgid="3649366287575002063">"Tscherner ina datoteca per importar"</string>
+ <string name="new_tab" msgid="4505722538297295141">"Nova fanestra"</string>
+ <string name="new_incognito_tab" msgid="5821404839654751753">"Nova fanestra incognito"</string>
+ <string name="active_tabs" msgid="3050623868203544623">"Fanestra"</string>
+ <string name="tab_bookmarks" msgid="2305793036003473653">"Segnapaginas"</string>
+ <string name="tab_most_visited" msgid="1077402532455000703">"Visità il pli savens"</string>
+ <string name="tab_history" msgid="1979267558744613746">"Cronologia"</string>
+ <string name="added_to_bookmarks" msgid="1020224130695956728">"Agiuntà als segnapaginas"</string>
+ <string name="removed_from_bookmarks" msgid="6063705902028438800">"Allontanà dals segnapaginas"</string>
+ <string name="sign_in_to" msgid="5939425800148759165">"S\'annunziar tar <xliff:g id="HOSTNAME">%s1</xliff:g> «<xliff:g id="REALM">%s2</xliff:g>»"</string>
+ <string name="username" msgid="5057566336518215922">"Num"</string>
+ <string name="password" msgid="1177138552305184404">"Pled-clav"</string>
+ <string name="action" msgid="183105774472071343">"S\'annunziar"</string>
+ <string name="bookmarks_search" msgid="5229596268214362873">"Navigatur"</string>
+ <string name="cancel" msgid="3017274947407233702">"Interrumper"</string>
+ <string name="ok" msgid="1509280796718850364">"OK"</string>
+ <string name="title_bar_loading" msgid="7438217780834640678">"Chargiar…"</string>
+ <string name="page_info" msgid="4048529256302257195">"Infos davart la pagina"</string>
+ <string name="page_info_view" msgid="5303490449842635158">"Mussar las infurmaziuns da la pagina"</string>
+ <string name="page_info_address" msgid="2222306609532903254">"Adressa:"</string>
+ <string name="ssl_warnings_header" msgid="79744901983636370">"I ha dà in problem cun il certificat da segirezza per questa pagina."</string>
+ <string name="ssl_continue" msgid="8031515015829358457">"Cuntinuar"</string>
+ <string name="security_warning" msgid="6607795404322797541">"Avertiment da segirezza"</string>
+ <string name="view_certificate" msgid="1472768887529093862">"Mussar il certificat"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
+ <string name="ssl_untrusted" msgid="5369967226521102194">"Quest certificat n\'è betg vegnì emess dad in post da certificaziun fidà."</string>
+ <string name="ssl_mismatch" msgid="558688832420069896">"Il num da la website na correspunda betg al num sin il certificat."</string>
+ <string name="ssl_expired" msgid="5739349389499575559">"Quest certificat è scrudà."</string>
+ <string name="ssl_not_yet_valid" msgid="2893167846212645846">"Quest certificat n\'è anc betg valid."</string>
+ <string name="ssl_certificate" msgid="5226747157992111668">"Certificat da segirezza"</string>
+ <string name="ssl_certificate_is_valid" msgid="7096160815933145579">"Quest certificat è valid."</string>
+ <string name="issued_to" msgid="9032338008819841339">"Emess a:"</string>
+ <string name="common_name" msgid="5745530093500062357">"Num general:"</string>
+ <string name="org_name" msgid="8868889052889991293">"Organisaziun:"</string>
+ <string name="org_unit" msgid="4489056376307768196">"Unitad d\'organisaziun:"</string>
+ <string name="issued_by" msgid="6959484326943152487">"Emess da:"</string>
+ <string name="validity_period" msgid="57988851973181309">"Validitad:"</string>
+ <string name="issued_on" msgid="2082890654801808368">"Emess ils:"</string>
+ <string name="expires_on" msgid="8061200430557020704">"Scroda ils:"</string>
+ <string name="stopping" msgid="4839698519340302982">"Fermar…"</string>
+ <string name="stop" msgid="5687251076030630074">"Fermar"</string>
+ <string name="reload" msgid="8585220783228408062">"Actualisar"</string>
+ <string name="back" msgid="8414603107175713668">"Enavos"</string>
+ <string name="forward" msgid="4288210890526641577">"Vinavant"</string>
+ <string name="save" msgid="5922311934992468496">"OK"</string>
+ <string name="do_not_save" msgid="6777633870113477714">"Interrumper"</string>
+ <!-- outdated translation 969988560160364559 --> <string name="location" msgid="3411848697912600125">"Adressa"</string>
+ <!-- no translation found for containing_folder (6771180232953030479) -->
+ <skip />
+ <!-- no translation found for new_folder (7743540149088867917) -->
+ <skip />
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <!-- no translation found for no_subfolders (5880411440592452802) -->
+ <skip />
+ <!-- no translation found for add_to_bookmarks_menu_option (4449323955122214389) -->
+ <skip />
+ <!-- no translation found for add_to_homescreen_menu_option (1461447829242963790) -->
+ <skip />
+ <!-- no translation found for add_to_other_folder_menu_option (5450890093372998187) -->
+ <skip />
+ <!-- outdated translation 5990326151488445481 --> <string name="name" msgid="5462672162695365387">"Num"</string>
+ <string name="http" msgid="2163722670597250102">"http://"</string>
+ <string name="save_to_bookmarks" msgid="6101482434920313244">"Agiuntar als segnapaginas"</string>
+ <!-- no translation found for bookmark_this_page (7530739804320811054) -->
+ <skip />
+ <string name="edit_bookmark" msgid="5024089053490231905">"Modifitgar il segnapagina"</string>
+ <!-- outdated translation 4528337239019328891 --> <string name="create_shortcut_bookmark" msgid="1995095662095484289">"Agiuntar a la pagina da partenza"</string>
+ <string name="open_bookmark" msgid="8473581305759935790">"Avrir"</string>
+ <string name="remove_bookmark" msgid="8407495852801410891">"Stizzar il segnapagina"</string>
+ <string name="remove_from_bookmarks" msgid="4374080666576982775">"Stizzar dals segnapaginas"</string>
+ <string name="remove_history_item" msgid="5021424935726728618">"Stizzar da la cronologia"</string>
+ <string name="set_as_homepage" msgid="4752937379414905560">"Definir sco pagina da partenza"</string>
+ <string name="bookmark_saved" msgid="2766434679871317557">"Memorisà en ils segnapaginas."</string>
+ <string name="bookmark_not_saved" msgid="700600955089376724">"Impussibel da memorisar il segnapagina."</string>
+ <string name="homepage_set" msgid="8768087280310966395">"Definì ina pagina da partenza."</string>
+ <string name="bookmark_needs_title" msgid="6245900436119218187">"Il segnapagina sto avair in num."</string>
+ <string name="bookmark_needs_url" msgid="7809876865972755158">"Il segnapagina sto avair in lieu da memorisaziun."</string>
+ <string name="bookmark_url_not_valid" msgid="6719785633980202419">"La URL è nuncorrecta."</string>
+ <string name="bookmark_cannot_save_url" msgid="791722768778386941">"Impussibel d\'agiuntar questa URL a Voss segnapaginas."</string>
+ <string name="delete_bookmark" msgid="2422989994934201992">"Stizzar"</string>
+ <string name="bookmark_page" msgid="6845189305130307274">"Segnapagina per l\'ultima pagina visitada"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
+ <string name="current_page" msgid="7510129573681663135">"da "</string>
+ <string name="delete_bookmark_warning" msgid="758043186202032205">"\"Il segnapagina \"\"<xliff:g id="BOOKMARK">%s</xliff:g>\"\" vegn stizzà.\""</string>
+ <string name="open_in_new_window" msgid="6596775546468054510">"Avrir en ina nova fanestra"</string>
+ <string name="goto_dot" msgid="3895839050522602723">"Dai"</string>
+ <string name="incognito_tab" msgid="5419458065370134289">"Avrir in nov tab incognito"</string>
+ <string name="select_dot" msgid="6299170761900561967">"Selecziunar text"</string>
+ <string name="tab_picker_title" msgid="864478399057782913">"Fanestras actualas"</string>
+ <string name="tab_picker_remove_tab" msgid="630087809802479397">"Serrar"</string>
+ <string name="bookmarks" msgid="1961279134885867815">"Segnapaginas"</string>
+ <string name="shortcut_bookmark" msgid="3974876480401135895">"Segnapagina"</string>
+ <string name="history" msgid="2451240511251410032">"Cronologia"</string>
+ <string name="menu_view_download" msgid="2124570321712995120">"Telechargiadas"</string>
+ <string name="copy_page_url" msgid="7635062169011319208">"Copiar la URL da la pagina"</string>
+ <string name="share_page" msgid="593756995297268343">"Barattar la pagina"</string>
+ <string name="menu_save_webarchive" msgid="3934652434001459581">"Memorisar sco archiv web"</string>
+ <string name="webarchive_saved" msgid="7045250341467345007">"Memorisà archiv da web"</string>
+ <string name="webarchive_failed" msgid="2880998204746620260">"Betg reussì da memorisar l\'archiv da web."</string>
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
+ <string name="contextmenu_openlink" msgid="7237961252214188935">"Avrir"</string>
+ <string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"Avrir en ina nova fanestra"</string>
+ <string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"Agiuntar la colliaziun als segnapaginas"</string>
+ <string name="contextmenu_savelink" msgid="5508554930832538184">"Memorisar la colliaziun"</string>
+ <string name="contextmenu_sharelink" msgid="5392275392280130331">"Barattar la colliaziun"</string>
+ <string name="contextmenu_copy" msgid="398860586635404030">"Copiar"</string>
+ <string name="contextmenu_copylink" msgid="5153657160294534270">"Copiar la URL da la colliaziun"</string>
+ <string name="contextmenu_download_image" msgid="4243829645180686912">"Memorisar il maletg"</string>
+ <string name="contextmenu_view_image" msgid="3870625602053600905">"Mussar il maletg"</string>
+ <string name="contextmenu_set_wallpaper" msgid="3691902960115350686">"Definir sco fund davos"</string>
+ <string name="contextmenu_dial_dot" msgid="5856550683415933806">"Cumponer..."</string>
+ <string name="contextmenu_add_contact" msgid="3183511922223645716">"Agiuntar in contact"</string>
+ <string name="contextmenu_send_mail" msgid="1014513374828775660">"Trametter in e-mail"</string>
+ <string name="contextmenu_map" msgid="7471390435434034912">"Charta"</string>
+ <string name="choosertitle_sharevia" msgid="4600490613341909086">"Cundivider cun agid da"</string>
+ <string name="clear" msgid="7070043081700011461">"Stizzar"</string>
+ <string name="replace" msgid="4843033491070384047">"Remplazzar"</string>
+ <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Segnapaginas"</string>
+ <string name="menu_preferences" msgid="6709237687234102240">"Parameters"</string>
+ <string name="pref_content_title" msgid="722227111894838633">"Parameters dal cuntegn da la pagina"</string>
+ <string name="pref_content_load_images" msgid="2125616852957377561">"Chargiar ils maletgs"</string>
+ <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Mussar ils maletgs da las paginas web"</string>
+ <string name="pref_content_block_popups" msgid="7808433807197256726">"Bloccar las fanestras pop-up"</string>
+ <string name="pref_content_javascript" msgid="4570972030299516843">"Activar JavaScript"</string>
+ <string name="pref_content_open_in_background" msgid="824123779725118663">"Avrir davos las culissas"</string>
+ <string name="pref_content_plugins" msgid="7231944644794301582">"Activar ils plug-ins"</string>
+ <string-array name="pref_content_plugins_choices">
+ <item msgid="6745108155096660725">"Adina activ"</item>
+ <item msgid="2484126708670016519">"Sin dumonda"</item>
+ <item msgid="8547442717307793863">"Deactivà"</item>
+ </string-array>
+ <string name="pref_content_open_in_background_summary" msgid="1737664075721181678">"Avrir las novas fanestras davos la fanestra actuala"</string>
+ <string name="pref_content_homepage" msgid="6082437160778559806">"Definir la pagina da partenza"</string>
+ <!-- no translation found for pref_content_search_engine (1620101310821644144) -->
+ <skip />
+ <!-- no translation found for pref_content_search_engine_summary (5162667665858487316) -->
+ <skip />
+ <!-- no translation found for pref_set_homepage_to (7196350233061395098) -->
+ <skip />
+ <!-- outdated translation 1493179933653044553 --> <string name="pref_use_current" msgid="1778622474040406672">"Utilisar la pagina actuala"</string>
+ <!-- no translation found for pref_use_blank (8503238592551111169) -->
+ <skip />
+ <!-- no translation found for pref_use_default (192587563274735878) -->
+ <skip />
+ <string name="pref_content_autofit" msgid="8260474534053660809">"Adattar las paginas auto."</string>
+ <string name="pref_content_autofit_summary" msgid="4587831659894879986">"Adattar las paginas web al visur"</string>
+ <!-- no translation found for pref_personal_title (1447687455755683695) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome (1695182180332194033) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome_summary (7414133931827321055) -->
+ <skip />
+ <!-- no translation found for pref_personal_google_account (952360133341490071) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks (59237515966184432) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks_summary (4791767605662205482) -->
+ <skip />
+ <!-- no translation found for pref_personal_start_syncing (6046972042512655232) -->
+ <skip />
+ <!-- no translation found for pref_personal_account_dialog_title (1390867119887955530) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled (1174197447388234595) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled_summary (422640696197018914) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor (1350709161524642663) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor_summary (6748434431641768870) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_name (8566130291459685955) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_email_address (7967585896612797173) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_company_name (2813443159949210417) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1 (836433242509243081) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1_hint (5965659598509327172) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2 (8194745202893822479) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2_hint (2048330295853546405) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_city (4193225955409148508) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_state (8549739922338171458) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_zip_code (283668573295656671) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_country (7234470301239156656) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_phone_number (4938852821413729276) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_save_profile (8349915287435262888) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_save (6834102203944938409) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_delete (2421442112954362732) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_delete_profile (7112035941146003753) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
+ <string name="pref_privacy_title" msgid="1052470980370846151">"Parameters da la protecziun da datas"</string>
+ <string name="pref_privacy_clear_cache" msgid="3380316479925886998">"Stizzar il cache"</string>
+ <string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"Stizzar las bancas da datas ed il cuntegn ord il cache local"</string>
+ <string name="pref_privacy_clear_cache_dlg" msgid="5541011591300753881">"Las bancas da datas ed ils cuntegns en il cache local vegnan stizzads."</string>
+ <string name="pref_privacy_clear_cookies" msgid="3095583579133780331">"Stizzar tut ils cookies"</string>
+ <string name="pref_privacy_clear_cookies_summary" msgid="6962742063990677520">"Stizzar tut ils cookies dal navigatur"</string>
+ <string name="pref_privacy_clear_cookies_dlg" msgid="552855688091432682">"Tut ils cookies vegnan stizzads."</string>
+ <string name="pref_privacy_clear_history" msgid="8723795508825198477">"Stizzar la cronologia"</string>
+ <string name="pref_privacy_clear_history_summary" msgid="6868501330708940734">"Stizzar la cronologia dal navigatur"</string>
+ <string name="pref_privacy_clear_history_dlg" msgid="544903007914753853">"La cronologia dal navigatur vegn stizzada."</string>
+ <string name="pref_privacy_clear_form_data" msgid="4232668196344383987">"Stizzar datas da formular"</string>
+ <string name="pref_privacy_clear_form_data_summary" msgid="1790390894719517167">"Stizzar tut las datas da formular memorisadas"</string>
+ <string name="pref_privacy_clear_form_data_dlg" msgid="4443621086781197928">"Tut las datas da formulars memorisadas vegnan stizzadas."</string>
+ <string name="pref_privacy_clear_passwords" msgid="4750234112289277480">"Stizzar ils pleds-clav"</string>
+ <string name="pref_privacy_clear_passwords_summary" msgid="8856782718942903335">"Stizzar tut ils pleds-clav memorisads"</string>
+ <string name="pref_privacy_clear_passwords_dlg" msgid="2083869328824248255">"Tut ils pleds-clav memorisads vegnan stizzads."</string>
+ <string name="pref_privacy_enable_geolocation" msgid="1395040170290765686">"Activar la posiziun"</string>
+ <string name="pref_privacy_enable_geolocation_summary" msgid="8437020934664306205">"Autorisar las websites da dumandar l\'access a Vossa posiziun"</string>
+ <string name="pref_privacy_clear_geolocation_access" msgid="6649680770030042980">"Stizzar l\'access a datas da posiziun"</string>
+ <string name="pref_privacy_clear_geolocation_access_summary" msgid="7750143359497314679">"Stizzar l\'access a datas da posiziun per tut las websites."</string>
+ <string name="pref_privacy_clear_geolocation_access_dlg" msgid="7327063124488827244">"Stizzar l\'access a datas da posiziun per tut las websites"</string>
+ <string name="pref_security_title" msgid="5763978646932160021">"Parameters da segirezza"</string>
+ <string name="pref_security_remember_passwords" msgid="6492957683454529549">"Memorisar ils pleds-clav"</string>
+ <string name="pref_security_remember_passwords_summary" msgid="256388703356349137">"Memorisar ils nums d\'utilisader ed ils pleds-clav per las websites"</string>
+ <string name="pref_security_save_form_data" msgid="1213669802810198893">"Memorisar las datas da formular"</string>
+ <string name="pref_security_save_form_data_summary" msgid="4994074685153708026">"Memorisar las datas endatadas en formulars per reutilisar ellas"</string>
+ <string name="pref_security_show_security_warning" msgid="8901135676266754559">"Avertiments da segirezza"</string>
+ <string name="pref_security_show_security_warning_summary" msgid="8968906112720511704">"Mussar in avertiment en cas da problems da segirezza cun ina website"</string>
+ <string name="pref_security_accept_cookies" msgid="3201367661925047989">"Acceptar cookies"</string>
+ <string name="pref_security_accept_cookies_summary" msgid="1465118934875026920">"Permetter a las websites da memorisar e leger cookies"</string>
+ <string name="pref_text_size" msgid="3827031324346612208">"Grondezza dal text"</string>
+ <string-array name="pref_text_size_choices">
+ <item msgid="4952686548944739548">"Fitg pitschna"</item>
+ <item msgid="1950030433642671460">"Pitschna"</item>
+ <item msgid="4338347520133294584">"Normala"</item>
+ <item msgid="5043128215356351184">"Gronda"</item>
+ <item msgid="7201512237890458902">"Fitg grond"</item>
+ </string-array>
+ <string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Grondezza dal text"</string>
+ <string name="pref_default_zoom" msgid="8076142259097187395">"Zoom predefinì"</string>
+ <string-array name="pref_default_zoom_choices">
+ <item msgid="549583171195154919">"Lontan"</item>
+ <item msgid="5619034257768161024">"Mesauna"</item>
+ <item msgid="3840999588443167001">"Damanaivel"</item>
+ </string-array>
+ <string name="pref_default_zoom_dialogtitle" msgid="6095974367125109021">"Zoom predefinì"</string>
+ <string name="pref_content_load_page" msgid="2219810141690955452">"Avrir las paginas en la survista"</string>
+ <string name="pref_content_load_page_summary" msgid="8792093504054149369">"Mussar ina survista da las paginas novas"</string>
+ <string name="pref_extras_title" msgid="3091250467679722382">"Parameters avanzads"</string>
+ <string name="pref_extras_website_settings" msgid="67866640052455549">"Parameters per websites"</string>
+ <string name="pref_extras_website_settings_summary" msgid="1656771443223494406">"Parameters avanzads per singulas websites"</string>
+ <string name="pref_extras_reset_default" msgid="8904000515846202110">"Reinizialisar il standard"</string>
+ <string name="pref_extras_reset_default_summary" msgid="4247870778270414501">"Restaurar ils parameters predefinids"</string>
+ <string name="pref_extras_reset_default_dlg" msgid="6640261575874704022">"Ils parameters da standard vegnan restituids."</string>
+ <string name="pref_extras_reset_default_dlg_title" msgid="2250334970728938936">"Restituir las valurs predefinidas"</string>
+ <string name="pref_development_title" msgid="3263854204533056480">"Debugar"</string>
+ <string name="pref_default_text_encoding" msgid="5742965543955558478">"Codaziun dal text"</string>
+ <string-array name="pref_default_text_encoding_choices">
+ <item msgid="7275223955790513818">"Latin-1 (ISO-8859-1)"</item>
+ <item msgid="2456597866837587140">"Unicode (UTF-8)"</item>
+ <item msgid="6122474363777211732">"Chinais (GBK)"</item>
+ <item msgid="373372275931607040">"Chinais (Big5)"</item>
+ <item msgid="891615911084608570">"Giapunais (ISO-2022-JP)"</item>
+ <item msgid="5589150448475151241">"Giapunais (SHIFT_JIS)"</item>
+ <item msgid="7356792686950371843">"Giapunais (EUC-JP)"</item>
+ <item msgid="2193955365569270096">"Corean (EUC-KR)"</item>
+ </string-array>
+ <string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Codaziun dal text"</string>
+ <string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"Problem da connectivitad da datas"</string>
+ <string name="browserFrameFileErrorLabel" msgid="8063691502792670367">"Problem da datoteca"</string>
+ <string name="browserFrameFormResubmitLabel" msgid="2685923472682180360">"Confermar"</string>
+ <string name="browserFrameFormResubmitMessage" msgid="2752182215695632138">"La pagina che Vus vulais laschar mussar cuntegna datas ch\'èn gia vegnidas tramessas («POSTDATA»). Sche Vus tramettais danovamain las datas vegn mintga acziun ch\'il formular da la pagina ha exequì repetida (sco per exempel ina tschertga u ina cumpra online)."</string>
+ <string name="loadSuspendedTitle" msgid="675991625288706944">"Nagina connexiun da rait"</string>
+ <string name="loadSuspended" msgid="3133656588880851273">"Impussibel da chargiar questa pagina en il navigatur senza connexiun a l\'internet."</string>
+ <string name="clear_history" msgid="5998307092715979619">"Stizzar la cronologia"</string>
+ <string name="browser_history" msgid="1038987118290272525">"Paginas visitadas dacurt"</string>
+ <string name="empty_history" msgid="8738772352308207274">"La cronologia è vida."</string>
+ <string name="add_new_bookmark" msgid="8086367791400349049">"Agiuntar in segnapagina…"</string>
+ <string name="add_bookmark_short" msgid="3783984330998103735">"Agiuntar"</string>
+ <string name="search_hint" msgid="4647356319916631820">"Tschertgar u endatar ina URL"</string>
+ <string name="search_button_text" msgid="5235226933877634410">"Dai"</string>
+ <string name="search_settings_description" msgid="1422401062529014107">"Segnapaginas e cronologia web"</string>
+ <string name="attention" msgid="3473639060042811244">"Attenziun"</string>
+ <string name="popup_window_attempt" msgid="2673111696288657989">"Questa website emprova dad avrir ina fanestra pop-up."</string>
+ <string name="allow" msgid="1157313689171991335">"Permetter"</string>
+ <string name="block" msgid="9172175889884707800">"Bloccar"</string>
+ <string name="too_many_windows_dialog_title" msgid="5175503564948906442">"Cuntanschì la limita da fanestras"</string>
+ <string name="too_many_windows_dialog_message" msgid="1398571800233959583">"Impussibel dad avrir ina nova fanestra. Il dumber maximal da fanestras avertas è cuntanschì."</string>
+ <string name="too_many_subwindows_dialog_title" msgid="3805453941587725944">"La fanestra pop-up è gia averta"</string>
+ <string name="too_many_subwindows_dialog_message" msgid="5827289829907966657">"Impussibel d\'avrir ina nova fanestra. Ina unica fanestra po esser averta a la giada."</string>
+ <string name="download_title" msgid="2122874021047565594">"Cronologia da telechargiadas"</string>
+ <string name="download_unknown_filename" msgid="4013465542563652175">"<Nunenconuschent>"</string>
+ <string name="download_menu_open" msgid="4888327480367757513">"Avrir"</string>
+ <string name="download_menu_clear" msgid="6264454531553418124">"Stizzar da la glista"</string>
+ <string name="download_menu_delete" msgid="8815502136393894148">"Stizzar"</string>
+ <string name="download_menu_cancel" msgid="2545333007601851574">"Interrumper la telechargiada"</string>
+ <string name="download_menu_cancel_all" msgid="2136550823151999166">"Interrumper tut las telechargiadas"</string>
+ <string name="download_cancel_dlg_title" msgid="8909108500262799748">"Interrumper las telechargiadas"</string>
+ <string name="download_cancel_dlg_msg" msgid="6285389170052357797">"Las <xliff:g id="DOWNLOAD_COUNT">%d</xliff:g> telechargiadas vegnan annulladas e stizzadas da la cronologia da telechargiadas."</string>
+ <string name="download_delete_file" msgid="5330036497843073249">"La datoteca vegn stizzada."</string>
+ <string name="download_file_error_dlg_title" msgid="2693630283595384874">"Capacitad da memorisar nunsuffizienta"</string>
+ <string name="download_file_error_dlg_msg" msgid="5156405410324072471">"Impussibel da telechargiar <xliff:g id="FILENAME">%s</xliff:g>."\n"Rumi la memoria da Voss telefon ed empruvai anc ina giada."</string>
+ <string name="download_failed_generic_dlg_title" msgid="6106781095337833391">"Telechargiada betg reussida"</string>
+ <!-- outdated translation 605904452159416792 --> <string name="download_no_sdcard_dlg_title" product="nosdcard" msgid="56777245081568508">"Nagina carta SD"</string>
+ <string name="download_no_sdcard_dlg_title" product="default" msgid="605904452159416792">"Nagina carta SD"</string>
+ <!-- no translation found for download_no_sdcard_dlg_msg (3144652102051031721) -->
+ <skip />
+ <string name="download_no_sdcard_dlg_msg" product="default" msgid="2616399456116301518">"Per telechargiar <xliff:g id="FILENAME">%s</xliff:g> è necessaria ina carta SD."</string>
+ <!-- outdated translation 6877712666046917741 --> <string name="download_sdcard_busy_dlg_title" product="nosdcard" msgid="8081445664689818973">"Carta SD betg disponibla"</string>
+ <string name="download_sdcard_busy_dlg_title" product="default" msgid="6877712666046917741">"Carta SD betg disponibla"</string>
+ <!-- outdated translation 3473883538192835204 --> <string name="download_sdcard_busy_dlg_msg" product="nosdcard" msgid="3979329954835690147">"La carta SD è occupada. Tscherni «Deactivar la memoria USB» en l\'avis per permetter telechargiadas."</string>
+ <string name="download_sdcard_busy_dlg_msg" product="default" msgid="3473883538192835204">"La carta SD è occupada. Tscherni «Deactivar la memoria USB» en l\'avis per permetter telechargiadas."</string>
+ <string name="download_no_application_title" msgid="1286056729168874295">"Impussibel dad avrir la datoteca"</string>
+ <string name="retry" msgid="1835923075542266721">"Repeter"</string>
+ <string name="no_downloads" msgid="3947445710685021498">"La cronologia da telechargiadas è vida."</string>
+ <string name="download_error" msgid="413496839831257187">"La telechargiada n\'è betg reussida."</string>
+ <string name="download_success" msgid="2279041638155595203">"Terminà la telechargiada da <xliff:g id="FILE">%s</xliff:g>."</string>
+ <string name="download_running" msgid="2622942231322015059">"Telechargiada en process…"</string>
+ <string name="download_pending" msgid="2599683668575349559">"Cumenzar la telechargiada…"</string>
+ <string name="download_pending_network" msgid="6548714525679461053">"Spetgar ina connexiun da datas…"</string>
+ <string name="download_running_paused" msgid="6418029352085656495">"Spetgar la connexiun da datas…"</string>
+ <string name="download_canceled" msgid="6057083743144492515">"Telechargiada interrutta."</string>
+ <string name="download_not_acceptable" msgid="313769696131563652">"Impussibel da telechargiar. Il cuntegn na vegn betg sustegnì da quest telefon."</string>
+ <string name="download_file_error" msgid="1206648050615176113">"Impussibel da terminar la telechargiada. La capacitad da memorisar è nunsuffizienta."</string>
+ <string name="download_length_required" msgid="9038605488460437406">"Impussibel da cumenzar a telechargiar. La grondezza da l\'element na po betg vegnir distinguida."</string>
+ <string name="download_precondition_failed" msgid="8327584102874295580">"La telechargiada è vegnida interrutta e na po betg vegnir cuntinuada."</string>
+ <string name="search_the_web" msgid="6046130189241962337">"Tschertgar en il web"</string>
+ <string name="webstorage_outofspace_notification_title" msgid="1160474608059771788">"Memoria dal navigatur plaina"</string>
+ <string name="webstorage_outofspace_notification_text" msgid="7341075135051829692">"Cliccai qua per gudagnar capacitad da memorisar."</string>
+ <string name="webstorage_clear_data_title" msgid="689484577124333977">"Stizzar las datas memorisadas"</string>
+ <string name="webstorage_clear_data_dialog_title" msgid="345457466368974706">"Stizzar las datas memorisadas"</string>
+ <string name="webstorage_clear_data_dialog_message" msgid="6678281256970470125">"Tut las datas memorisadas da questa website vegnan stizzadas."</string>
+ <string name="webstorage_clear_data_dialog_ok_button" msgid="2516563534211898636">"Stizzar tut"</string>
+ <string name="webstorage_clear_data_dialog_cancel_button" msgid="2028867751958942762">"Interrumper"</string>
+ <string name="webstorage_origin_summary_mb_stored" msgid="1985885826292236210">"MB memorisads sin Voss telefon"</string>
+ <string name="loading_video" msgid="4887871585216091096">"Chargiar il video"</string>
+ <string name="geolocation_permissions_prompt_message" msgid="356796102004052471">"<xliff:g id="WEBSITE_ORIGIN">%s</xliff:g> vul savair Vossa posiziun geografica."</string>
+ <string name="geolocation_permissions_prompt_share" msgid="9084486342048347976">"Tradir mia posiziun"</string>
+ <string name="geolocation_permissions_prompt_dont_share" msgid="6303025160237860300">"Refusar"</string>
+ <string name="geolocation_permissions_prompt_remember" msgid="3118526300707348308">"Memorisar las preferenzas"</string>
+ <string name="geolocation_permissions_prompt_toast_allowed" msgid="987286072035125498">"Questa website ha access a Vossa posiziun. Modifitgai questa opziun en Parameters -> Parameters da la website"</string>
+ <string name="geolocation_permissions_prompt_toast_disallowed" msgid="7695100950212692515">"Questa pagina n\'ha betg access a Vossa posiziun. Midai questa opziun en Parameters -> Parameters da la website"</string>
+ <string name="geolocation_settings_page_title" msgid="1745477985097536528">"Stizzar l\'access a la posiziun"</string>
+ <string name="geolocation_settings_page_summary_allowed" msgid="9180251524290811398">"Questa website ha actualmain access a Vossa posiziun"</string>
+ <string name="geolocation_settings_page_summary_not_allowed" msgid="4589649082203102544">"Questa website n\'ha per il mument betg access a Vossa posiziun."</string>
+ <string name="geolocation_settings_page_dialog_title" msgid="1549842043381347668">"Stizzar l\'access a datas da posiziun"</string>
+ <string name="geolocation_settings_page_dialog_message" msgid="7586671987576403993">"L\'access da questa website a datas da posiziun vegn stizzà."</string>
+ <string name="geolocation_settings_page_dialog_ok_button" msgid="4789434178048077287">"Stizzar l\'access"</string>
+ <string name="geolocation_settings_page_dialog_cancel_button" msgid="7941036504673409747">"Interrumper"</string>
+ <string name="website_settings_clear_all" msgid="8739804325997655980">"Stizzar tut"</string>
+ <string name="website_settings_clear_all_dialog_title" msgid="7791826325122461718">"Stizzar tut ils parameters da la website?"</string>
+ <string name="website_settings_clear_all_dialog_message" msgid="6150502090601476333">"Tut las datas da la website e las autorisaziuns da posiziun vegnan stizzadas."</string>
+ <string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"Stizzar tut las datas"</string>
+ <string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"Interrumper"</string>
+ <string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"Il maletg dal fund davos vegn endrizzà…"</string>
+ <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Segnapaginas"</string>
+ <!-- no translation found for empty_bookmarks_folder (7843361614634930942) -->
+ <skip />
+ <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
+ <!-- no translation found for import_bookmarks_dialog_title (3325557652271172128) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_description (2187665745413495303) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_remove (8105572409059113340) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_import (6933613853573899218) -->
+ <skip />
+</resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
new file mode 100644
index 0000000..25f0640
--- /dev/null
+++ b/res/values-ro/strings.xml
@@ -0,0 +1,401 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2007 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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="application_name" msgid="1935869255545976415">"Browser"</string>
+ <string name="choose_upload" msgid="3649366287575002063">"Alegeţi fişierul pentru a fi încărcat"</string>
+ <string name="new_tab" msgid="4505722538297295141">"Fereastră nouă"</string>
+ <!-- no translation found for new_incognito_tab (5821404839654751753) -->
+ <skip />
+ <string name="active_tabs" msgid="3050623868203544623">"Windows"</string>
+ <string name="tab_bookmarks" msgid="2305793036003473653">"Marcaje"</string>
+ <string name="tab_most_visited" msgid="1077402532455000703">"Cele mai vizitate"</string>
+ <string name="tab_history" msgid="1979267558744613746">"Istoric"</string>
+ <string name="added_to_bookmarks" msgid="1020224130695956728">"Adăugat la marcaje"</string>
+ <string name="removed_from_bookmarks" msgid="6063705902028438800">"Eliminat din marcaje"</string>
+ <string name="sign_in_to" msgid="5939425800148759165">"Conectaţi-vă la <xliff:g id="HOSTNAME">%s1</xliff:g> „<xliff:g id="REALM">%s2</xliff:g>”"</string>
+ <string name="username" msgid="5057566336518215922">"Nume"</string>
+ <string name="password" msgid="1177138552305184404">"Parolă"</string>
+ <string name="action" msgid="183105774472071343">"Conectaţi-vă"</string>
+ <string name="bookmarks_search" msgid="5229596268214362873">"Browser"</string>
+ <string name="cancel" msgid="3017274947407233702">"Anulaţi"</string>
+ <string name="ok" msgid="1509280796718850364">"OK"</string>
+ <string name="title_bar_loading" msgid="7438217780834640678">"Se încarcă…"</string>
+ <string name="page_info" msgid="4048529256302257195">"Informaţii pagină"</string>
+ <string name="page_info_view" msgid="5303490449842635158">"Vizualizaţi informaţiile paginii"</string>
+ <string name="page_info_address" msgid="2222306609532903254">"Adresă:"</string>
+ <string name="ssl_warnings_header" msgid="79744901983636370">"Există unele probleme legate de certificatul de securitate al acestui site."</string>
+ <string name="ssl_continue" msgid="8031515015829358457">"Continuaţi"</string>
+ <string name="security_warning" msgid="6607795404322797541">"Avertisment de securitate"</string>
+ <string name="view_certificate" msgid="1472768887529093862">"Vizualizaţi certificatul"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
+ <string name="ssl_untrusted" msgid="5369967226521102194">"Acest certificat nu provine de la o autoritate de încredere."</string>
+ <string name="ssl_mismatch" msgid="558688832420069896">"Numele acestui site nu se potriveşte cu numele de pe certificat."</string>
+ <string name="ssl_expired" msgid="5739349389499575559">"Acest certificat a expirat."</string>
+ <string name="ssl_not_yet_valid" msgid="2893167846212645846">"Acest certificat nu este încă valid."</string>
+ <string name="ssl_certificate" msgid="5226747157992111668">"Certificat de securitate"</string>
+ <string name="ssl_certificate_is_valid" msgid="7096160815933145579">"Certificatul este valid."</string>
+ <string name="issued_to" msgid="9032338008819841339">"Emis de:"</string>
+ <string name="common_name" msgid="5745530093500062357">"Nume comun:"</string>
+ <string name="org_name" msgid="8868889052889991293">"Organizaţie:"</string>
+ <string name="org_unit" msgid="4489056376307768196">"Organizaţie:"</string>
+ <string name="issued_by" msgid="6959484326943152487">"Emis de:"</string>
+ <string name="validity_period" msgid="57988851973181309">"Validitate:"</string>
+ <string name="issued_on" msgid="2082890654801808368">"Emis pe:"</string>
+ <string name="expires_on" msgid="8061200430557020704">"Expiră pe:"</string>
+ <string name="stopping" msgid="4839698519340302982">"Se opreşte..."</string>
+ <string name="stop" msgid="5687251076030630074">"Opriţi"</string>
+ <string name="reload" msgid="8585220783228408062">"Actualizaţi"</string>
+ <string name="back" msgid="8414603107175713668">"Înapoi"</string>
+ <string name="forward" msgid="4288210890526641577">"Redirecţionaţi"</string>
+ <string name="save" msgid="5922311934992468496">"OK"</string>
+ <string name="do_not_save" msgid="6777633870113477714">"Anulaţi"</string>
+ <!-- outdated translation 969988560160364559 --> <string name="location" msgid="3411848697912600125">"Locaţie"</string>
+ <!-- no translation found for containing_folder (6771180232953030479) -->
+ <skip />
+ <!-- no translation found for new_folder (7743540149088867917) -->
+ <skip />
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <!-- no translation found for no_subfolders (5880411440592452802) -->
+ <skip />
+ <!-- no translation found for add_to_bookmarks_menu_option (4449323955122214389) -->
+ <skip />
+ <!-- no translation found for add_to_homescreen_menu_option (1461447829242963790) -->
+ <skip />
+ <!-- no translation found for add_to_other_folder_menu_option (5450890093372998187) -->
+ <skip />
+ <!-- outdated translation 5990326151488445481 --> <string name="name" msgid="5462672162695365387">"Nume"</string>
+ <string name="http" msgid="2163722670597250102">"http://"</string>
+ <!-- outdated translation 588165100024086565 --> <string name="save_to_bookmarks" msgid="6101482434920313244">"Adăugaţi marcaj"</string>
+ <!-- no translation found for bookmark_this_page (7530739804320811054) -->
+ <skip />
+ <string name="edit_bookmark" msgid="5024089053490231905">"Modificaţi marcajul"</string>
+ <!-- outdated translation 9202323987633899835 --> <string name="create_shortcut_bookmark" msgid="1995095662095484289">"Adăugaţi o comandă rapidă pe ecranul de pornire"</string>
+ <string name="open_bookmark" msgid="8473581305759935790">"Deschideţi"</string>
+ <string name="remove_bookmark" msgid="8407495852801410891">"Ştergeţi marcajul"</string>
+ <string name="remove_from_bookmarks" msgid="4374080666576982775">"Eliminaţi din marcaje"</string>
+ <string name="remove_history_item" msgid="5021424935726728618">"Eliminaţi din istoric"</string>
+ <string name="set_as_homepage" msgid="4752937379414905560">"Setaţi ca pagină de pornire"</string>
+ <string name="bookmark_saved" msgid="2766434679871317557">"Marcajul a fost salvat."</string>
+ <string name="bookmark_not_saved" msgid="700600955089376724">"Marcajul nu poate fi salvat."</string>
+ <string name="homepage_set" msgid="8768087280310966395">"Pagină de pornire setată."</string>
+ <string name="bookmark_needs_title" msgid="6245900436119218187">"Marcajul trebuie să fie denumit."</string>
+ <string name="bookmark_needs_url" msgid="7809876865972755158">"Marcajul trebuie să aibă o locaţie."</string>
+ <string name="bookmark_url_not_valid" msgid="6719785633980202419">"Adresa URL nu este validă."</string>
+ <string name="bookmark_cannot_save_url" msgid="791722768778386941">"Această adresă URL nu poate fi marcată."</string>
+ <string name="delete_bookmark" msgid="2422989994934201992">"Ştergeţi"</string>
+ <string name="bookmark_page" msgid="6845189305130307274">"Marcaţi ultima pagină afişată"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
+ <string name="current_page" msgid="7510129573681663135">"din "</string>
+ <string name="delete_bookmark_warning" msgid="758043186202032205">"Marcajul „<xliff:g id="BOOKMARK">%s</xliff:g>” va fi şters."</string>
+ <string name="open_in_new_window" msgid="6596775546468054510">"Deschideţi într-o fereastră nouă"</string>
+ <string name="goto_dot" msgid="3895839050522602723">"Accesaţi"</string>
+ <!-- no translation found for incognito_tab (5419458065370134289) -->
+ <skip />
+ <string name="select_dot" msgid="6299170761900561967">"Selectaţi text"</string>
+ <string name="tab_picker_title" msgid="864478399057782913">"Ferestre curente"</string>
+ <string name="tab_picker_remove_tab" msgid="630087809802479397">"Închideţi"</string>
+ <string name="bookmarks" msgid="1961279134885867815">"Marcaje"</string>
+ <string name="shortcut_bookmark" msgid="3974876480401135895">"Marcaj"</string>
+ <string name="history" msgid="2451240511251410032">"Istoric"</string>
+ <string name="menu_view_download" msgid="2124570321712995120">"Descărcări"</string>
+ <string name="copy_page_url" msgid="7635062169011319208">"Copiaţi adresa URL a paginii"</string>
+ <string name="share_page" msgid="593756995297268343">"Distribuiţi pagina"</string>
+ <!-- no translation found for menu_save_webarchive (3934652434001459581) -->
+ <skip />
+ <!-- no translation found for webarchive_saved (7045250341467345007) -->
+ <skip />
+ <!-- no translation found for webarchive_failed (2880998204746620260) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
+ <string name="contextmenu_openlink" msgid="7237961252214188935">"Deschideţi"</string>
+ <string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"Deschideţi într-o fereastră nouă"</string>
+ <string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"Marcaţi linkul"</string>
+ <string name="contextmenu_savelink" msgid="5508554930832538184">"Salvaţi linkul"</string>
+ <string name="contextmenu_sharelink" msgid="5392275392280130331">"Distribuiţi linkul"</string>
+ <string name="contextmenu_copy" msgid="398860586635404030">"Copiaţi"</string>
+ <string name="contextmenu_copylink" msgid="5153657160294534270">"Copiaţi adresa URL a linkului"</string>
+ <string name="contextmenu_download_image" msgid="4243829645180686912">"Salvaţi imaginea"</string>
+ <string name="contextmenu_view_image" msgid="3870625602053600905">"Vizualizaţi imaginea"</string>
+ <string name="contextmenu_set_wallpaper" msgid="3691902960115350686">"Setaţi ca imagine de fundal"</string>
+ <string name="contextmenu_dial_dot" msgid="5856550683415933806">"Apelaţi..."</string>
+ <string name="contextmenu_add_contact" msgid="3183511922223645716">"Adăugaţi o persoană în agendă"</string>
+ <string name="contextmenu_send_mail" msgid="1014513374828775660">"Trimiteţi un e-mail"</string>
+ <string name="contextmenu_map" msgid="7471390435434034912">"Hartă"</string>
+ <string name="choosertitle_sharevia" msgid="4600490613341909086">"Distribuiţi prin"</string>
+ <string name="clear" msgid="7070043081700011461">"Ştergeţi"</string>
+ <string name="replace" msgid="4843033491070384047">"Înlocuiţi"</string>
+ <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Marcaje"</string>
+ <string name="menu_preferences" msgid="6709237687234102240">"Setări"</string>
+ <string name="pref_content_title" msgid="722227111894838633">"Setările conţinutului paginii"</string>
+ <string name="pref_content_load_images" msgid="2125616852957377561">"Încărcaţi imagini"</string>
+ <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Afişaţi imagini din paginile web"</string>
+ <string name="pref_content_block_popups" msgid="7808433807197256726">"Blocaţi ferestrele de tip pop-up"</string>
+ <string name="pref_content_javascript" msgid="4570972030299516843">"Activaţi JavaScript"</string>
+ <string name="pref_content_open_in_background" msgid="824123779725118663">"Deschideţi în fundal"</string>
+ <string name="pref_content_plugins" msgid="7231944644794301582">"Activaţi pluginurile"</string>
+ <string-array name="pref_content_plugins_choices">
+ <item msgid="6745108155096660725">"Întotdeauna activ"</item>
+ <item msgid="2484126708670016519">"La cerere"</item>
+ <item msgid="8547442717307793863">"Dezactivat"</item>
+ </string-array>
+ <string name="pref_content_open_in_background_summary" msgid="1737664075721181678">"Deschideţi noi ferestre în spatele celei curente"</string>
+ <string name="pref_content_homepage" msgid="6082437160778559806">"Setaţi pagina de pornire"</string>
+ <!-- no translation found for pref_content_search_engine (1620101310821644144) -->
+ <skip />
+ <!-- no translation found for pref_content_search_engine_summary (5162667665858487316) -->
+ <skip />
+ <!-- no translation found for pref_set_homepage_to (7196350233061395098) -->
+ <skip />
+ <!-- outdated translation 1493179933653044553 --> <string name="pref_use_current" msgid="1778622474040406672">"Utilizaţi pagina curentă"</string>
+ <!-- no translation found for pref_use_blank (8503238592551111169) -->
+ <skip />
+ <!-- no translation found for pref_use_default (192587563274735878) -->
+ <skip />
+ <string name="pref_content_autofit" msgid="8260474534053660809">"Potriviţi paginile automat"</string>
+ <string name="pref_content_autofit_summary" msgid="4587831659894879986">"Formataţi paginile web pentru a se potrivi cu ecranul"</string>
+ <!-- no translation found for pref_personal_title (1447687455755683695) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome (1695182180332194033) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome_summary (7414133931827321055) -->
+ <skip />
+ <!-- no translation found for pref_personal_google_account (952360133341490071) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks (59237515966184432) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks_summary (4791767605662205482) -->
+ <skip />
+ <!-- no translation found for pref_personal_start_syncing (6046972042512655232) -->
+ <skip />
+ <!-- no translation found for pref_personal_account_dialog_title (1390867119887955530) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled (1174197447388234595) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled_summary (422640696197018914) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor (1350709161524642663) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor_summary (6748434431641768870) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_name (8566130291459685955) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_email_address (7967585896612797173) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_company_name (2813443159949210417) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1 (836433242509243081) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1_hint (5965659598509327172) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2 (8194745202893822479) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2_hint (2048330295853546405) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_city (4193225955409148508) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_state (8549739922338171458) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_zip_code (283668573295656671) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_country (7234470301239156656) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_phone_number (4938852821413729276) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_save_profile (8349915287435262888) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_save (6834102203944938409) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_delete (2421442112954362732) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_delete_profile (7112035941146003753) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
+ <string name="pref_privacy_title" msgid="1052470980370846151">"Setări privind confidenţialitatea"</string>
+ <string name="pref_privacy_clear_cache" msgid="3380316479925886998">"Goliţi memoria cache"</string>
+ <string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"Ştergeţi conţinutul memoriei cache şi bazele de date"</string>
+ <string name="pref_privacy_clear_cache_dlg" msgid="5541011591300753881">"Conţinutul local al memoriei cache şi bazele de date se vor şterge."</string>
+ <string name="pref_privacy_clear_cookies" msgid="3095583579133780331">"Ştergeţi toate datele despre cookie-uri"</string>
+ <string name="pref_privacy_clear_cookies_summary" msgid="6962742063990677520">"Ştergeţi toate cookie-urile din browser"</string>
+ <string name="pref_privacy_clear_cookies_dlg" msgid="552855688091432682">"Toate cookie-urile vor fi şterse."</string>
+ <string name="pref_privacy_clear_history" msgid="8723795508825198477">"Ştergeţi istoricul"</string>
+ <string name="pref_privacy_clear_history_summary" msgid="6868501330708940734">"Ştergeţi istoricul de navigare din browser"</string>
+ <string name="pref_privacy_clear_history_dlg" msgid="544903007914753853">"Istoricul de navigare din browser va fi şters."</string>
+ <string name="pref_privacy_clear_form_data" msgid="4232668196344383987">"Ştergeţi datele din formular"</string>
+ <string name="pref_privacy_clear_form_data_summary" msgid="1790390894719517167">"Ştergeţi toate datele din formulare"</string>
+ <string name="pref_privacy_clear_form_data_dlg" msgid="4443621086781197928">"Toate datele salvate în formular vor fi şterse."</string>
+ <string name="pref_privacy_clear_passwords" msgid="4750234112289277480">"Ştergeţi parolele"</string>
+ <string name="pref_privacy_clear_passwords_summary" msgid="8856782718942903335">"Ştergeţi toate parolele salvate"</string>
+ <string name="pref_privacy_clear_passwords_dlg" msgid="2083869328824248255">"Toate parolele salvate vor fi şterse."</string>
+ <string name="pref_privacy_enable_geolocation" msgid="1395040170290765686">"Activaţi locaţia"</string>
+ <string name="pref_privacy_enable_geolocation_summary" msgid="8437020934664306205">"Permiteţi site-urilor să solicite accesul la locaţia dvs."</string>
+ <string name="pref_privacy_clear_geolocation_access" msgid="6649680770030042980">"Opriţi accesul la locaţie"</string>
+ <string name="pref_privacy_clear_geolocation_access_summary" msgid="7750143359497314679">"Opriţi accesul tuturor site-urilor web la locaţia dvs."</string>
+ <string name="pref_privacy_clear_geolocation_access_dlg" msgid="7327063124488827244">"Opriţi accesul tuturor site-urilor web la locaţia dvs."</string>
+ <string name="pref_security_title" msgid="5763978646932160021">"Setări de securitate"</string>
+ <string name="pref_security_remember_passwords" msgid="6492957683454529549">"Activaţi reţinerea parolelor"</string>
+ <string name="pref_security_remember_passwords_summary" msgid="256388703356349137">"Salvaţi numele de utilizatori şi parolele pentru site-urile web"</string>
+ <string name="pref_security_save_form_data" msgid="1213669802810198893">"Reţineţi datele din formular"</string>
+ <string name="pref_security_save_form_data_summary" msgid="4994074685153708026">"Doresc să se reţină datele introduse pentru o utilizare ulterioară"</string>
+ <string name="pref_security_show_security_warning" msgid="8901135676266754559">"Afişaţi avertismentele de securitate"</string>
+ <string name="pref_security_show_security_warning_summary" msgid="8968906112720511704">"Afişaţi avertismentul dacă apare o problemă de securitate a unui site"</string>
+ <string name="pref_security_accept_cookies" msgid="3201367661925047989">"Acceptaţi cookie-uri"</string>
+ <string name="pref_security_accept_cookies_summary" msgid="1465118934875026920">"Permiteţi site-urilor salvarea şi citirea datelor de tip „cookie”"</string>
+ <string name="pref_text_size" msgid="3827031324346612208">"Dimensiune text"</string>
+ <string-array name="pref_text_size_choices">
+ <item msgid="4952686548944739548">"Minusculă"</item>
+ <item msgid="1950030433642671460">"Mică"</item>
+ <item msgid="4338347520133294584">"Normală"</item>
+ <item msgid="5043128215356351184">"Mare"</item>
+ <item msgid="7201512237890458902">"Foarte mare"</item>
+ </string-array>
+ <string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Dimensiune text"</string>
+ <string name="pref_default_zoom" msgid="8076142259097187395">"Zoom prestabilit"</string>
+ <string-array name="pref_default_zoom_choices">
+ <item msgid="549583171195154919">"Departe"</item>
+ <item msgid="5619034257768161024">"Mediu"</item>
+ <item msgid="3840999588443167001">"Închideţi"</item>
+ </string-array>
+ <string name="pref_default_zoom_dialogtitle" msgid="6095974367125109021">"Zoom prestabilit"</string>
+ <string name="pref_content_load_page" msgid="2219810141690955452">"Deschideţi paginile ca prezentare generală"</string>
+ <string name="pref_content_load_page_summary" msgid="8792093504054149369">"Afişaţi prezentarea generală a paginilor deschise recent"</string>
+ <string name="pref_extras_title" msgid="3091250467679722382">"Setări avansate"</string>
+ <string name="pref_extras_website_settings" msgid="67866640052455549">"Setări site web"</string>
+ <string name="pref_extras_website_settings_summary" msgid="1656771443223494406">"Setări avansate pentru site-uri web individuale"</string>
+ <string name="pref_extras_reset_default" msgid="8904000515846202110">"Resetaţi la valorile prestabilite"</string>
+ <string name="pref_extras_reset_default_summary" msgid="4247870778270414501">"Restabiliţi setările prestabilite"</string>
+ <string name="pref_extras_reset_default_dlg" msgid="6640261575874704022">"Setările vor fi aduse la valorile prestabilite."</string>
+ <string name="pref_extras_reset_default_dlg_title" msgid="2250334970728938936">"Resetaţi la valorile prestabilite"</string>
+ <string name="pref_development_title" msgid="3263854204533056480">"Remediaţi erorile"</string>
+ <string name="pref_default_text_encoding" msgid="5742965543955558478">"Codificare text"</string>
+ <!-- no translation found for pref_default_text_encoding_choices:7 (2193955365569270096) -->
+ <string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Codificare text"</string>
+ <string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"Există o problemă de conexiune la date"</string>
+ <string name="browserFrameFileErrorLabel" msgid="8063691502792670367">"Problemă cu fişierul"</string>
+ <string name="browserFrameFormResubmitLabel" msgid="2685923472682180360">"Confirmaţi"</string>
+ <string name="browserFrameFormResubmitMessage" msgid="2752182215695632138">"Pagina pe care încercaţi să o vizualizaţi conţine date deja postate („POSTDATA”). În caz că le retransmiteţi, orice acţiune efectuată prin formularul de pe pagină (cum ar fi o căutare sau o achiziţie online), se va repeta."</string>
+ <string name="loadSuspendedTitle" msgid="675991625288706944">"Nicio conexiune la reţea"</string>
+ <string name="loadSuspended" msgid="3133656588880851273">"Pagina nu poate fi încărcată de browser, deoarece nu există nicio conexiune la internet."</string>
+ <string name="clear_history" msgid="5998307092715979619">"Ştergeţi istoricul"</string>
+ <string name="browser_history" msgid="1038987118290272525">"Pagini recent vizitate"</string>
+ <string name="empty_history" msgid="8738772352308207274">"Istoricul de navigare este gol."</string>
+ <string name="add_new_bookmark" msgid="8086367791400349049">"Adăugaţi marcajul..."</string>
+ <string name="add_bookmark_short" msgid="3783984330998103735">"Adăugaţi"</string>
+ <string name="search_hint" msgid="4647356319916631820">"Căutaţi sau introduceţi adresa URL"</string>
+ <string name="search_button_text" msgid="5235226933877634410">"Accesaţi"</string>
+ <string name="search_settings_description" msgid="1422401062529014107">"Marcaje şi istoric web"</string>
+ <string name="attention" msgid="3473639060042811244">"Atenţie"</string>
+ <string name="popup_window_attempt" msgid="2673111696288657989">"Site-ul încearcă să deschidă o fereastră de tip pop-up."</string>
+ <string name="allow" msgid="1157313689171991335">"Permiteţi"</string>
+ <string name="block" msgid="9172175889884707800">"Blocaţi"</string>
+ <string name="too_many_windows_dialog_title" msgid="5175503564948906442">"Număr maxim de ferestre deschise"</string>
+ <string name="too_many_windows_dialog_message" msgid="1398571800233959583">"Nu puteţi deschide o nouă fereastră deoarece depăşiţi numărul maxim permis."</string>
+ <string name="too_many_subwindows_dialog_title" msgid="3805453941587725944">"Fereastră de tip pop-up deja deschisă"</string>
+ <string name="too_many_subwindows_dialog_message" msgid="5827289829907966657">"Nu se pot deschide mai multe ferestre de tip pop-up în acelaşi timp."</string>
+ <string name="download_title" msgid="2122874021047565594">"Istoricul descărcărilor"</string>
+ <string name="download_unknown_filename" msgid="4013465542563652175">"<Necunoscut>"</string>
+ <string name="download_menu_open" msgid="4888327480367757513">"Deschideţi"</string>
+ <string name="download_menu_clear" msgid="6264454531553418124">"Ştergeţi din listă"</string>
+ <string name="download_menu_delete" msgid="8815502136393894148">"Ştergeţi"</string>
+ <string name="download_menu_cancel" msgid="2545333007601851574">"Anulaţi descărcarea"</string>
+ <string name="download_menu_cancel_all" msgid="2136550823151999166">"Anulaţi toate descărcările"</string>
+ <string name="download_cancel_dlg_title" msgid="8909108500262799748">"Anulaţi descărcările"</string>
+ <string name="download_cancel_dlg_msg" msgid="6285389170052357797">"Toate cele <xliff:g id="DOWNLOAD_COUNT">%d</xliff:g> (de) descărcări vor fi anulate şi şterse din istoricul de descărcări."</string>
+ <string name="download_delete_file" msgid="5330036497843073249">"Fişierul va fi şters"</string>
+ <string name="download_file_error_dlg_title" msgid="2693630283595384874">"Spaţiu de stocare insuficient"</string>
+ <string name="download_file_error_dlg_msg" msgid="5156405410324072471">"<xliff:g id="FILENAME">%s</xliff:g> nu poate fi descărcat."\n"Eliberaţi spaţiu în telefon şi încercaţi din nou."</string>
+ <string name="download_failed_generic_dlg_title" msgid="6106781095337833391">"Descărcare nereuşită"</string>
+ <!-- outdated translation 605904452159416792 --> <string name="download_no_sdcard_dlg_title" product="nosdcard" msgid="56777245081568508">"Niciun card SD"</string>
+ <string name="download_no_sdcard_dlg_title" product="default" msgid="605904452159416792">"Niciun card SD"</string>
+ <!-- no translation found for download_no_sdcard_dlg_msg (3144652102051031721) -->
+ <skip />
+ <string name="download_no_sdcard_dlg_msg" product="default" msgid="2616399456116301518">"Este necesar un card SD pentru a se descărca fişierul <xliff:g id="FILENAME">%s</xliff:g>."</string>
+ <!-- outdated translation 6877712666046917741 --> <string name="download_sdcard_busy_dlg_title" product="nosdcard" msgid="8081445664689818973">"Card SD nedisponibil"</string>
+ <string name="download_sdcard_busy_dlg_title" product="default" msgid="6877712666046917741">"Card SD nedisponibil"</string>
+ <!-- outdated translation 3473883538192835204 --> <string name="download_sdcard_busy_dlg_msg" product="nosdcard" msgid="3979329954835690147">"Cardul SD este ocupat. Pentru a permite descărcări, selectaţi în notificare opţiunea „Dezactivaţi stocarea pe USB”."</string>
+ <string name="download_sdcard_busy_dlg_msg" product="default" msgid="3473883538192835204">"Cardul SD este ocupat. Pentru a permite descărcări, selectaţi în notificare opţiunea „Dezactivaţi stocarea pe USB”."</string>
+ <string name="download_no_application_title" msgid="1286056729168874295">"Fişierul nu poate fi deschis"</string>
+ <string name="retry" msgid="1835923075542266721">"Încercaţi din nou"</string>
+ <string name="no_downloads" msgid="3947445710685021498">"Istoricul de descărcări este gol."</string>
+ <string name="download_error" msgid="413496839831257187">"Descărcare nereuşită."</string>
+ <string name="download_success" msgid="2279041638155595203">"Descărcare completă pentru <xliff:g id="FILE">%s</xliff:g>."</string>
+ <string name="download_running" msgid="2622942231322015059">"Se descarcă..."</string>
+ <string name="download_pending" msgid="2599683668575349559">"Se începe descărcarea..."</string>
+ <string name="download_pending_network" msgid="6548714525679461053">"Se aşteaptă realizarea conexiunii de date..."</string>
+ <string name="download_running_paused" msgid="6418029352085656495">"Se aşteaptă realizarea conexiunii de date..."</string>
+ <string name="download_canceled" msgid="6057083743144492515">"Descărcarea a fost anulată."</string>
+ <string name="download_not_acceptable" msgid="313769696131563652">"Descărcare imposibilă. Conţinutul nu este acceptat pe acest tip de telefon."</string>
+ <string name="download_file_error" msgid="1206648050615176113">"Descărcarea nu poate fi terminată. Nu există spaţiu suficient."</string>
+ <string name="download_length_required" msgid="9038605488460437406">"Descărcare imposibilă. Dimensiunea elementului nu poate fi determinată."</string>
+ <string name="download_precondition_failed" msgid="8327584102874295580">"Descărcarea a fost întreruptă şi nu poate fi reluată."</string>
+ <string name="search_the_web" msgid="6046130189241962337">"Căutaţi pe web"</string>
+ <string name="webstorage_outofspace_notification_title" msgid="1160474608059771788">"Spaţiul de stocare pentru browser este insuficient"</string>
+ <string name="webstorage_outofspace_notification_text" msgid="7341075135051829692">"Faceţi clic pentru a elibera spaţiu."</string>
+ <string name="webstorage_clear_data_title" msgid="689484577124333977">"Ştergeţi datele stocate"</string>
+ <string name="webstorage_clear_data_dialog_title" msgid="345457466368974706">"Ştergeţi datele stocate"</string>
+ <string name="webstorage_clear_data_dialog_message" msgid="6678281256970470125">"Toate datele stocate de acest site web vor fi şterse"</string>
+ <string name="webstorage_clear_data_dialog_ok_button" msgid="2516563534211898636">"Ştergeţi toate datele"</string>
+ <string name="webstorage_clear_data_dialog_cancel_button" msgid="2028867751958942762">"Anulaţi"</string>
+ <string name="webstorage_origin_summary_mb_stored" msgid="1985885826292236210">"MO stocaţi în telefonul dvs."</string>
+ <string name="loading_video" msgid="4887871585216091096">"Se încarcă videoclipul"</string>
+ <string name="geolocation_permissions_prompt_message" msgid="356796102004052471">"<xliff:g id="WEBSITE_ORIGIN">%s</xliff:g> doreşte să vă cunoască locaţia"</string>
+ <string name="geolocation_permissions_prompt_share" msgid="9084486342048347976">"Distribuiţi locaţia"</string>
+ <string name="geolocation_permissions_prompt_dont_share" msgid="6303025160237860300">"Refuzaţi"</string>
+ <string name="geolocation_permissions_prompt_remember" msgid="3118526300707348308">"Reţineţi preferinţele"</string>
+ <string name="geolocation_permissions_prompt_toast_allowed" msgid="987286072035125498">"Site-ul poate accesa locaţia dvs. Modificaţi în Setări – > Setări site web"</string>
+ <string name="geolocation_permissions_prompt_toast_disallowed" msgid="7695100950212692515">"Site-ul nu poate accesa locaţia dvs. Modificaţi în Setări – > Setări site web"</string>
+ <string name="geolocation_settings_page_title" msgid="1745477985097536528">"Opriţi accesul la locaţie"</string>
+ <string name="geolocation_settings_page_summary_allowed" msgid="9180251524290811398">"În prezent, site-ul poate accesa locaţia dvs."</string>
+ <string name="geolocation_settings_page_summary_not_allowed" msgid="4589649082203102544">"În prezent, site-ul nu vă poate accesa locaţia."</string>
+ <string name="geolocation_settings_page_dialog_title" msgid="1549842043381347668">"Opriţi accesul la locaţie"</string>
+ <string name="geolocation_settings_page_dialog_message" msgid="7586671987576403993">"Accesul la locaţie al acestui site web va fi oprit"</string>
+ <string name="geolocation_settings_page_dialog_ok_button" msgid="4789434178048077287">"Ştergeţi accesul"</string>
+ <string name="geolocation_settings_page_dialog_cancel_button" msgid="7941036504673409747">"Anulaţi"</string>
+ <string name="website_settings_clear_all" msgid="8739804325997655980">"Ştergeţi toate datele"</string>
+ <string name="website_settings_clear_all_dialog_title" msgid="7791826325122461718">"Ştergeţi toate setările site-ului web?"</string>
+ <string name="website_settings_clear_all_dialog_message" msgid="6150502090601476333">"Toate datele de pe site-ul web şi permisiunile locaţiei vor fi şterse."</string>
+ <string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"Ştergeţi toate datele"</string>
+ <string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"Anulaţi"</string>
+ <string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"Se setează imaginea de fundal..."</string>
+ <!-- no translation found for defaultBookmarksUpButton (2303951020715704735) -->
+ <skip />
+ <!-- no translation found for empty_bookmarks_folder (7843361614634930942) -->
+ <skip />
+ <!-- no translation found for rlz_access_point (7165847807377650632) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_title (3325557652271172128) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_description (2187665745413495303) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_remove (8105572409059113340) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_import (6933613853573899218) -->
+ <skip />
+</resources>
diff --git a/res/values-ru-xlarge/strings.xml b/res/values-ru-xlarge/strings.xml
new file mode 100644
index 0000000..9442ad4
--- /dev/null
+++ b/res/values-ru-xlarge/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="new_tab" msgid="7275656655054293038">"Новая вкладка"</string>
+ <string name="new_incognito_tab" msgid="5149742197322201152">"Новая вкладка инкогнито"</string>
+ <string name="active_tabs" msgid="5324492165541331128">"Вкладки"</string>
+</resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 341dbe0..b639789 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -19,6 +19,7 @@
<string name="application_name" msgid="1935869255545976415">"Браузер"</string>
<string name="choose_upload" msgid="3649366287575002063">"Выберите файл для загрузки"</string>
<string name="new_tab" msgid="4505722538297295141">"Новое окно"</string>
+ <string name="new_incognito_tab" msgid="5821404839654751753">"Новое окно в режиме инкогнито"</string>
<string name="active_tabs" msgid="3050623868203544623">"Окна"</string>
<string name="tab_bookmarks" msgid="2305793036003473653">"Закладки"</string>
<string name="tab_most_visited" msgid="1077402532455000703">"Часто посещаемые"</string>
@@ -32,12 +33,6 @@
<string name="bookmarks_search" msgid="5229596268214362873">"Браузер"</string>
<string name="cancel" msgid="3017274947407233702">"Отмена"</string>
<string name="ok" msgid="1509280796718850364">"ОК"</string>
- <plurals name="matches_found">
- <item quantity="zero" msgid="6242659159545399963">"Соответствий нет"</item>
- <item quantity="one" msgid="4352019729062956802">"1 соответствие"</item>
- <item quantity="few" msgid="5544267486978946555">"Соответствий: <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item quantity="other" msgid="6616125067364315405">"Соответствий: <xliff:g id="NUMBER">%d</xliff:g>"</item>
- </plurals>
<string name="title_bar_loading" msgid="7438217780834640678">"Загрузка…"</string>
<string name="page_info" msgid="4048529256302257195">"Информация о странице"</string>
<string name="page_info_view" msgid="5303490449842635158">"Информация о странице"</string>
@@ -46,6 +41,8 @@
<string name="ssl_continue" msgid="8031515015829358457">"Продолжить"</string>
<string name="security_warning" msgid="6607795404322797541">"Угроза безопасности"</string>
<string name="view_certificate" msgid="1472768887529093862">"Просмотреть сертификат"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
<string name="ssl_untrusted" msgid="5369967226521102194">"Этот сертификат получен из ненадежных источников."</string>
<string name="ssl_mismatch" msgid="558688832420069896">"Название сайта не соответствует названию в сертификате."</string>
<string name="ssl_expired" msgid="5739349389499575559">"Срок действия сертификата истек."</string>
@@ -67,12 +64,23 @@
<string name="forward" msgid="4288210890526641577">"Вперед"</string>
<string name="save" msgid="5922311934992468496">"ОК"</string>
<string name="do_not_save" msgid="6777633870113477714">"Отмена"</string>
- <string name="location" msgid="969988560160364559">"URL-адрес"</string>
- <string name="name" msgid="5990326151488445481">"Имя"</string>
+ <string name="location" msgid="3411848697912600125">"Адрес"</string>
+ <string name="containing_folder" msgid="6771180232953030479">"Добавить в"</string>
+ <string name="new_folder" msgid="7743540149088867917">"Новая папка"</string>
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <string name="no_subfolders" msgid="5880411440592452802">"Нет подпапок"</string>
+ <string name="add_to_bookmarks_menu_option" msgid="4449323955122214389">"Закладки"</string>
+ <string name="add_to_homescreen_menu_option" msgid="1461447829242963790">"Главный экран"</string>
+ <string name="add_to_other_folder_menu_option" msgid="5450890093372998187">"Другая папка…"</string>
+ <string name="name" msgid="5462672162695365387">"Ярлык"</string>
<string name="http" msgid="2163722670597250102">"http://"</string>
- <string name="save_to_bookmarks" msgid="588165100024086565">"Добавить закладку"</string>
+ <string name="save_to_bookmarks" msgid="6101482434920313244">"Добавить в Закладки"</string>
+ <string name="bookmark_this_page" msgid="7530739804320811054">"Закладка для этой страницы"</string>
<string name="edit_bookmark" msgid="5024089053490231905">"Изменить закладку"</string>
- <string name="create_shortcut_bookmark" msgid="9202323987633899835">"Добавить ярлык на главную страницу"</string>
+ <string name="create_shortcut_bookmark" msgid="1995095662095484289">"Добавить ярлык на главную"</string>
<string name="open_bookmark" msgid="8473581305759935790">"Открыть"</string>
<string name="remove_bookmark" msgid="8407495852801410891">"Удалить закладку"</string>
<string name="remove_from_bookmarks" msgid="4374080666576982775">"Удалить из закладок"</string>
@@ -87,13 +95,15 @@
<string name="bookmark_cannot_save_url" msgid="791722768778386941">"Невозможно добавить этот URL в закладки"</string>
<string name="delete_bookmark" msgid="2422989994934201992">"Удалить"</string>
<string name="bookmark_page" msgid="6845189305130307274">"Добавить в закладки последнюю просмотренную страницу"</string>
- <string name="switch_to_thumbnails" msgid="5493351529609043151">"Уменьшенные изображения"</string>
- <string name="switch_to_list" msgid="8900531247982121055">"В виде списка"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
<string name="current_page" msgid="7510129573681663135">"на "</string>
<string name="delete_bookmark_warning" msgid="758043186202032205">"Закладка \"<xliff:g id="BOOKMARK">%s</xliff:g>\" будет удалена."</string>
<string name="open_in_new_window" msgid="6596775546468054510">"Открыть в новом окне"</string>
<string name="goto_dot" msgid="3895839050522602723">"Поиск"</string>
- <string name="find_dot" msgid="6259312434696611957">"Найти на странице"</string>
+ <string name="incognito_tab" msgid="5419458065370134289">"Открыть новую вкладку в режиме инкогнито"</string>
<string name="select_dot" msgid="6299170761900561967">"Выбрать текст"</string>
<string name="tab_picker_title" msgid="864478399057782913">"Открытые окна"</string>
<string name="tab_picker_remove_tab" msgid="630087809802479397">"Закрыть"</string>
@@ -103,6 +113,13 @@
<string name="menu_view_download" msgid="2124570321712995120">"Загрузки"</string>
<string name="copy_page_url" msgid="7635062169011319208">"Копировать URL страницы"</string>
<string name="share_page" msgid="593756995297268343">"Отправить страницу"</string>
+ <string name="menu_save_webarchive" msgid="3934652434001459581">"Сохранить как веб-архив"</string>
+ <string name="webarchive_saved" msgid="7045250341467345007">"Веб-архив сохранен."</string>
+ <string name="webarchive_failed" msgid="2880998204746620260">"Не удалось сохранить веб-архив."</string>
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
<string name="contextmenu_openlink" msgid="7237961252214188935">"Открыть"</string>
<string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"Открыть в новом окне"</string>
<string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"Добавить ссылку в закладки"</string>
@@ -138,11 +155,44 @@
<string name="pref_content_homepage" msgid="6082437160778559806">"Домашняя страница"</string>
<string name="pref_content_search_engine" msgid="1620101310821644144">"Поисковая система"</string>
<string name="pref_content_search_engine_summary" msgid="5162667665858487316">"Выберите поисковую систему"</string>
- <string name="pref_use_current" msgid="1493179933653044553">"Использовать текущую страницу"</string>
+ <string name="pref_set_homepage_to" msgid="7196350233061395098">"При запуске браузера"</string>
+ <string name="pref_use_current" msgid="1778622474040406672">"Показывать текущую страницу"</string>
+ <string name="pref_use_blank" msgid="8503238592551111169">"Показывать пустую страницу"</string>
+ <string name="pref_use_default" msgid="192587563274735878">"Показывать страницу по умолчанию"</string>
<string name="pref_content_autofit" msgid="8260474534053660809">"Мобильный вид"</string>
<string name="pref_content_autofit_summary" msgid="4587831659894879986">"Адаптировать контент к размеру экрана мобильного устройства"</string>
- <string name="pref_content_landscape_only" msgid="2022546812766219672">"Только горизонтально"</string>
- <string name="pref_content_landscape_only_summary" msgid="1008238895535428855">"Показывать страницы только в горизонтальной ориентации"</string>
+ <string name="pref_personal_title" msgid="1447687455755683695">"Личные настройки"</string>
+ <string name="pref_personal_sync_with_chrome" msgid="1695182180332194033">"Синхронизировать с Google Chrome"</string>
+ <string name="pref_personal_sync_with_chrome_summary" msgid="7414133931827321055">"Совместно использовать закладки и другие данные в браузере Android и Google Chrome"</string>
+ <string name="pref_personal_google_account" msgid="952360133341490071">"Аккаунт Google"</string>
+ <string name="pref_personal_sync_bookmarks" msgid="59237515966184432">"Синхронизировать закладки"</string>
+ <string name="pref_personal_sync_bookmarks_summary" msgid="4791767605662205482">"Синхронизировать закладки браузера Android и Google Chrome"</string>
+ <string name="pref_personal_start_syncing" msgid="6046972042512655232">"Синхронизировать"</string>
+ <string name="pref_personal_account_dialog_title" msgid="1390867119887955530">"Выберите аккаунт Google"</string>
+ <string name="pref_autofill_enabled" msgid="1174197447388234595">"Автозаполнение форм"</string>
+ <string name="pref_autofill_enabled_summary" msgid="422640696197018914">"Заполнение веб-форм одним кликом"</string>
+ <string name="pref_autofill_profile_editor" msgid="1350709161524642663">"Настройки автозаполнения"</string>
+ <string name="pref_autofill_profile_editor_summary" msgid="6748434431641768870">"Настройка и управление данными для автозаполняемых форм"</string>
+ <string name="autofill_profile_editor_name" msgid="8566130291459685955">"Полное имя:"</string>
+ <string name="autofill_profile_editor_email_address" msgid="7967585896612797173">"Эл. почта:"</string>
+ <string name="autofill_profile_editor_company_name" msgid="2813443159949210417">"Название компании:"</string>
+ <string name="autofill_profile_editor_address_line_1" msgid="836433242509243081">"Адресная строка 1:"</string>
+ <string name="autofill_profile_editor_address_line_1_hint" msgid="5965659598509327172">"Адрес, почтовый ящик, адрес до востребования"</string>
+ <string name="autofill_profile_editor_address_line_2" msgid="8194745202893822479">"Адресная строка 2:"</string>
+ <string name="autofill_profile_editor_address_line_2_hint" msgid="2048330295853546405">"Квартира, офис, блок, здание, этаж и т. д."</string>
+ <string name="autofill_profile_editor_city" msgid="4193225955409148508">"Город:"</string>
+ <string name="autofill_profile_editor_state" msgid="8549739922338171458">"Штат / провинция / регион:"</string>
+ <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_save_profile" msgid="8349915287435262888">"Сохранить профиль"</string>
+ <string name="autofill_profile_successful_save" msgid="6834102203944938409">"Профиль сохранен"</string>
+ <string name="autofill_profile_successful_delete" msgid="2421442112954362732">"Профиль удален"</string>
+ <string name="autofill_profile_editor_delete_profile" msgid="7112035941146003753">"Удалить данные профиля"</string>
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
<string name="pref_privacy_title" msgid="1052470980370846151">"Настройки конфиденциальности"</string>
<string name="pref_privacy_clear_cache" msgid="3380316479925886998">"Очистить кэш"</string>
<string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"Удалить контент и данные, сохраненные браузером"</string>
@@ -208,6 +258,7 @@
<item msgid="891615911084608570">"Японская (ISO-2022-JP)"</item>
<item msgid="5589150448475151241">"Японская (SHIFT_JIS)"</item>
<item msgid="7356792686950371843">"Японская (EUC-JP)"</item>
+ <item msgid="2193955365569270096">"Корейская (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Кодировка текста"</string>
<string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"Проблема с подключением"</string>
@@ -296,4 +347,11 @@
<string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"Удалить все данные"</string>
<string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"Отмена"</string>
<string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"Установка фонового рисунка..."</string>
+ <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Закладки"</string>
+ <string name="empty_bookmarks_folder" msgid="7843361614634930942">"Нет закладок"</string>
+ <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
+ <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Синхронизация с аккаунтом Google"</string>
+ <string name="import_bookmarks_dialog_description" msgid="2187665745413495303">"Закладки Android не связаны с аккаунтом Google"</string>
+ <string name="import_bookmarks_dialog_remove" msgid="8105572409059113340">"Удалить закладки Android"</string>
+ <string name="import_bookmarks_dialog_import" msgid="6933613853573899218">"Добавить закладки Android в аккаунт <xliff:g id="GOOGLE_ACCOUNT">%s</xliff:g>"</string>
</resources>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
new file mode 100644
index 0000000..34be6c4
--- /dev/null
+++ b/res/values-sk/strings.xml
@@ -0,0 +1,401 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2007 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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="application_name" msgid="1935869255545976415">"Prehliadač"</string>
+ <string name="choose_upload" msgid="3649366287575002063">"Zvoliť súbor, ktorý chcete odovzdať"</string>
+ <string name="new_tab" msgid="4505722538297295141">"Nové okno"</string>
+ <!-- no translation found for new_incognito_tab (5821404839654751753) -->
+ <skip />
+ <string name="active_tabs" msgid="3050623868203544623">"Windows"</string>
+ <string name="tab_bookmarks" msgid="2305793036003473653">"Záložky"</string>
+ <string name="tab_most_visited" msgid="1077402532455000703">"Najviac navštevované"</string>
+ <string name="tab_history" msgid="1979267558744613746">"História"</string>
+ <string name="added_to_bookmarks" msgid="1020224130695956728">"Pridané medzi záložky"</string>
+ <string name="removed_from_bookmarks" msgid="6063705902028438800">"Odstránené zo záložiek"</string>
+ <string name="sign_in_to" msgid="5939425800148759165">"Prihláste sa do služby <xliff:g id="HOSTNAME">%s1</xliff:g> „<xliff:g id="REALM">%s2</xliff:g>“"</string>
+ <string name="username" msgid="5057566336518215922">"Meno"</string>
+ <string name="password" msgid="1177138552305184404">"Heslo"</string>
+ <string name="action" msgid="183105774472071343">"Prihlásiť sa"</string>
+ <string name="bookmarks_search" msgid="5229596268214362873">"Prehliadač"</string>
+ <string name="cancel" msgid="3017274947407233702">"Zrušiť"</string>
+ <string name="ok" msgid="1509280796718850364">"OK"</string>
+ <string name="title_bar_loading" msgid="7438217780834640678">"Prebieha načítavanie…"</string>
+ <string name="page_info" msgid="4048529256302257195">"Informácie o stránke"</string>
+ <string name="page_info_view" msgid="5303490449842635158">"Zobraziť informácie o stránke"</string>
+ <string name="page_info_address" msgid="2222306609532903254">"Adresa:"</string>
+ <string name="ssl_warnings_header" msgid="79744901983636370">"Vyskytli sa problémy s certifikátom zabezpečenia týchto webových stránok."</string>
+ <string name="ssl_continue" msgid="8031515015829358457">"Pokračovať"</string>
+ <string name="security_warning" msgid="6607795404322797541">"Upozornenie zabezpečenia"</string>
+ <string name="view_certificate" msgid="1472768887529093862">"Zobraziť certifikát"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
+ <string name="ssl_untrusted" msgid="5369967226521102194">"Tento certifikát nepochádza od dôveryhodnej autority."</string>
+ <string name="ssl_mismatch" msgid="558688832420069896">"Názov webu sa nezhoduje s názvom uvedeným v certifikáte."</string>
+ <string name="ssl_expired" msgid="5739349389499575559">"Platnosť certifikátu skončila."</string>
+ <string name="ssl_not_yet_valid" msgid="2893167846212645846">"Tento certifikát zatiaľ nie je platný."</string>
+ <string name="ssl_certificate" msgid="5226747157992111668">"Certifikát zabezpečenia"</string>
+ <string name="ssl_certificate_is_valid" msgid="7096160815933145579">"Certifikát je platný."</string>
+ <string name="issued_to" msgid="9032338008819841339">"Vydané pre:"</string>
+ <string name="common_name" msgid="5745530093500062357">"Bežný názov:"</string>
+ <string name="org_name" msgid="8868889052889991293">"Organizácia:"</string>
+ <string name="org_unit" msgid="4489056376307768196">"Organizačná jednotka:"</string>
+ <string name="issued_by" msgid="6959484326943152487">"Vydal:"</string>
+ <string name="validity_period" msgid="57988851973181309">"Platnosť:"</string>
+ <string name="issued_on" msgid="2082890654801808368">"Dátum vydania:"</string>
+ <string name="expires_on" msgid="8061200430557020704">"Platnosť vyprší:"</string>
+ <string name="stopping" msgid="4839698519340302982">"Prebieha zastavenie..."</string>
+ <string name="stop" msgid="5687251076030630074">"Zastaviť"</string>
+ <string name="reload" msgid="8585220783228408062">"Obnoviť"</string>
+ <string name="back" msgid="8414603107175713668">"Späť"</string>
+ <string name="forward" msgid="4288210890526641577">"Poslať ďalej"</string>
+ <string name="save" msgid="5922311934992468496">"OK"</string>
+ <string name="do_not_save" msgid="6777633870113477714">"Zrušiť"</string>
+ <!-- outdated translation 969988560160364559 --> <string name="location" msgid="3411848697912600125">"Poloha"</string>
+ <!-- no translation found for containing_folder (6771180232953030479) -->
+ <skip />
+ <!-- no translation found for new_folder (7743540149088867917) -->
+ <skip />
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <!-- no translation found for no_subfolders (5880411440592452802) -->
+ <skip />
+ <!-- no translation found for add_to_bookmarks_menu_option (4449323955122214389) -->
+ <skip />
+ <!-- no translation found for add_to_homescreen_menu_option (1461447829242963790) -->
+ <skip />
+ <!-- no translation found for add_to_other_folder_menu_option (5450890093372998187) -->
+ <skip />
+ <!-- outdated translation 5990326151488445481 --> <string name="name" msgid="5462672162695365387">"Meno"</string>
+ <string name="http" msgid="2163722670597250102">"http://"</string>
+ <!-- outdated translation 588165100024086565 --> <string name="save_to_bookmarks" msgid="6101482434920313244">"Pridať záložku"</string>
+ <!-- no translation found for bookmark_this_page (7530739804320811054) -->
+ <skip />
+ <string name="edit_bookmark" msgid="5024089053490231905">"Upraviť záložku"</string>
+ <!-- outdated translation 9202323987633899835 --> <string name="create_shortcut_bookmark" msgid="1995095662095484289">"Pridať odkaz na plochu"</string>
+ <string name="open_bookmark" msgid="8473581305759935790">"Otvoriť"</string>
+ <string name="remove_bookmark" msgid="8407495852801410891">"Odstrániť záložku"</string>
+ <string name="remove_from_bookmarks" msgid="4374080666576982775">"Odstrániť zo záložiek"</string>
+ <string name="remove_history_item" msgid="5021424935726728618">"Odstrániť z histórie"</string>
+ <string name="set_as_homepage" msgid="4752937379414905560">"Nastaviť ako domovskú stránku"</string>
+ <string name="bookmark_saved" msgid="2766434679871317557">"Uložené medzi záložky."</string>
+ <string name="bookmark_not_saved" msgid="700600955089376724">"Záložku nie je možné uložiť."</string>
+ <string name="homepage_set" msgid="8768087280310966395">"Domovská stránka bola nastavená."</string>
+ <string name="bookmark_needs_title" msgid="6245900436119218187">"Záložka musí mať názov."</string>
+ <string name="bookmark_needs_url" msgid="7809876865972755158">"Záložka musí obsahovať umiestnenie."</string>
+ <string name="bookmark_url_not_valid" msgid="6719785633980202419">"Adresa URL nie je platná."</string>
+ <string name="bookmark_cannot_save_url" msgid="791722768778386941">"Túto adresu URL nemožno pridať do záložiek."</string>
+ <string name="delete_bookmark" msgid="2422989994934201992">"Odstrániť"</string>
+ <string name="bookmark_page" msgid="6845189305130307274">"Pridať poslednú zobrazenú stránku medzi záložky"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
+ <string name="current_page" msgid="7510129573681663135">"od "</string>
+ <string name="delete_bookmark_warning" msgid="758043186202032205">"Záložka <xliff:g id="BOOKMARK">%s</xliff:g> bude odstránená."</string>
+ <string name="open_in_new_window" msgid="6596775546468054510">"Otvoriť v novom okne"</string>
+ <string name="goto_dot" msgid="3895839050522602723">"Hľadať"</string>
+ <!-- no translation found for incognito_tab (5419458065370134289) -->
+ <skip />
+ <string name="select_dot" msgid="6299170761900561967">"Vybrať text"</string>
+ <string name="tab_picker_title" msgid="864478399057782913">"Aktuálne okná"</string>
+ <string name="tab_picker_remove_tab" msgid="630087809802479397">"Zavrieť"</string>
+ <string name="bookmarks" msgid="1961279134885867815">"Záložky"</string>
+ <string name="shortcut_bookmark" msgid="3974876480401135895">"Pridať medzi záložky"</string>
+ <string name="history" msgid="2451240511251410032">"História"</string>
+ <string name="menu_view_download" msgid="2124570321712995120">"Prevzatia"</string>
+ <string name="copy_page_url" msgid="7635062169011319208">"Kopírovať adresu URL stránky"</string>
+ <string name="share_page" msgid="593756995297268343">"Zdieľať stránku"</string>
+ <!-- no translation found for menu_save_webarchive (3934652434001459581) -->
+ <skip />
+ <!-- no translation found for webarchive_saved (7045250341467345007) -->
+ <skip />
+ <!-- no translation found for webarchive_failed (2880998204746620260) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
+ <string name="contextmenu_openlink" msgid="7237961252214188935">"Otvoriť"</string>
+ <string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"Otvoriť v novom okne"</string>
+ <string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"Pridať odkaz medzi záložky"</string>
+ <string name="contextmenu_savelink" msgid="5508554930832538184">"Uložiť odkaz"</string>
+ <string name="contextmenu_sharelink" msgid="5392275392280130331">"Zdieľať odkaz"</string>
+ <string name="contextmenu_copy" msgid="398860586635404030">"Kopírovať"</string>
+ <string name="contextmenu_copylink" msgid="5153657160294534270">"Kopírovať adresu URL odkazu"</string>
+ <string name="contextmenu_download_image" msgid="4243829645180686912">"Uložiť obrázok"</string>
+ <string name="contextmenu_view_image" msgid="3870625602053600905">"Zobraziť obrázok"</string>
+ <string name="contextmenu_set_wallpaper" msgid="3691902960115350686">"Nastaviť ako tapetu"</string>
+ <string name="contextmenu_dial_dot" msgid="5856550683415933806">"Vytočiť..."</string>
+ <string name="contextmenu_add_contact" msgid="3183511922223645716">"Pridať kontakt"</string>
+ <string name="contextmenu_send_mail" msgid="1014513374828775660">"Poslať e-mail"</string>
+ <string name="contextmenu_map" msgid="7471390435434034912">"Mapa"</string>
+ <string name="choosertitle_sharevia" msgid="4600490613341909086">"Zdieľať pomocou"</string>
+ <string name="clear" msgid="7070043081700011461">"Vymazať"</string>
+ <string name="replace" msgid="4843033491070384047">"Nahradiť"</string>
+ <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Záložky"</string>
+ <string name="menu_preferences" msgid="6709237687234102240">"Nastavenia"</string>
+ <string name="pref_content_title" msgid="722227111894838633">"Nastavenia obsahu stránky"</string>
+ <string name="pref_content_load_images" msgid="2125616852957377561">"Načítať obrázky"</string>
+ <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Zobrazovať obrázky na webových stránkach"</string>
+ <string name="pref_content_block_popups" msgid="7808433807197256726">"Blokovať kontextové okná"</string>
+ <string name="pref_content_javascript" msgid="4570972030299516843">"Povoliť JavaScript"</string>
+ <string name="pref_content_open_in_background" msgid="824123779725118663">"Otvoriť na pozadí"</string>
+ <string name="pref_content_plugins" msgid="7231944644794301582">"Povoliť doplnky"</string>
+ <string-array name="pref_content_plugins_choices">
+ <item msgid="6745108155096660725">"Vždy zapnuté"</item>
+ <item msgid="2484126708670016519">"Na požiadanie"</item>
+ <item msgid="8547442717307793863">"Vypnuté"</item>
+ </string-array>
+ <string name="pref_content_open_in_background_summary" msgid="1737664075721181678">"Otvárať nové okná za aktuálnym oknom"</string>
+ <string name="pref_content_homepage" msgid="6082437160778559806">"Nastaviť domovskú stránku"</string>
+ <!-- no translation found for pref_content_search_engine (1620101310821644144) -->
+ <skip />
+ <!-- no translation found for pref_content_search_engine_summary (5162667665858487316) -->
+ <skip />
+ <!-- no translation found for pref_set_homepage_to (7196350233061395098) -->
+ <skip />
+ <!-- outdated translation 1493179933653044553 --> <string name="pref_use_current" msgid="1778622474040406672">"Použiť aktuálnu stránku"</string>
+ <!-- no translation found for pref_use_blank (8503238592551111169) -->
+ <skip />
+ <!-- no translation found for pref_use_default (192587563274735878) -->
+ <skip />
+ <string name="pref_content_autofit" msgid="8260474534053660809">"Automaticky prispôsobiť"</string>
+ <string name="pref_content_autofit_summary" msgid="4587831659894879986">"Prispôsobiť veľkosť webových stránok obrazovke"</string>
+ <!-- no translation found for pref_personal_title (1447687455755683695) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome (1695182180332194033) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome_summary (7414133931827321055) -->
+ <skip />
+ <!-- no translation found for pref_personal_google_account (952360133341490071) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks (59237515966184432) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks_summary (4791767605662205482) -->
+ <skip />
+ <!-- no translation found for pref_personal_start_syncing (6046972042512655232) -->
+ <skip />
+ <!-- no translation found for pref_personal_account_dialog_title (1390867119887955530) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled (1174197447388234595) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled_summary (422640696197018914) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor (1350709161524642663) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor_summary (6748434431641768870) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_name (8566130291459685955) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_email_address (7967585896612797173) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_company_name (2813443159949210417) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1 (836433242509243081) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1_hint (5965659598509327172) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2 (8194745202893822479) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2_hint (2048330295853546405) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_city (4193225955409148508) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_state (8549739922338171458) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_zip_code (283668573295656671) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_country (7234470301239156656) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_phone_number (4938852821413729276) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_save_profile (8349915287435262888) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_save (6834102203944938409) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_delete (2421442112954362732) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_delete_profile (7112035941146003753) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
+ <string name="pref_privacy_title" msgid="1052470980370846151">"Nastavenia ochrany osobných údajov"</string>
+ <string name="pref_privacy_clear_cache" msgid="3380316479925886998">"Vymazať medzipamäť"</string>
+ <string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"Vymazať všetok obsah a databázy uložené do miestnej medzipamäte"</string>
+ <string name="pref_privacy_clear_cache_dlg" msgid="5541011591300753881">"Obsah a databázy uložené v miestnej medzipamäti budú odstránené."</string>
+ <string name="pref_privacy_clear_cookies" msgid="3095583579133780331">"Vymazať údaje súborov cookie"</string>
+ <string name="pref_privacy_clear_cookies_summary" msgid="6962742063990677520">"Vymazať všetky súbory cookie prehliadača"</string>
+ <string name="pref_privacy_clear_cookies_dlg" msgid="552855688091432682">"Všetky súbory cookie budú odstránené."</string>
+ <string name="pref_privacy_clear_history" msgid="8723795508825198477">"Vymazať históriu"</string>
+ <string name="pref_privacy_clear_history_summary" msgid="6868501330708940734">"Vymazať históriu navigácie v prehliadači"</string>
+ <string name="pref_privacy_clear_history_dlg" msgid="544903007914753853">"História navigácie v prehliadači bude odstránená."</string>
+ <string name="pref_privacy_clear_form_data" msgid="4232668196344383987">"Vymazať údaje formulárov"</string>
+ <string name="pref_privacy_clear_form_data_summary" msgid="1790390894719517167">"Vymazať všetky uložené údaje formulárov"</string>
+ <string name="pref_privacy_clear_form_data_dlg" msgid="4443621086781197928">"Všetky uložené údaje formulárov budú vymazané."</string>
+ <string name="pref_privacy_clear_passwords" msgid="4750234112289277480">"Vymazať heslá"</string>
+ <string name="pref_privacy_clear_passwords_summary" msgid="8856782718942903335">"Vymazať všetky uložené heslá"</string>
+ <string name="pref_privacy_clear_passwords_dlg" msgid="2083869328824248255">"Všetky uložené heslá budú odstránené."</string>
+ <string name="pref_privacy_enable_geolocation" msgid="1395040170290765686">"Povoliť polohu"</string>
+ <string name="pref_privacy_enable_geolocation_summary" msgid="8437020934664306205">"Povoliť webovým stránkam žiadať o prístup k informáciám o vašej polohe"</string>
+ <string name="pref_privacy_clear_geolocation_access" msgid="6649680770030042980">"Zrušiť prístup k polohe"</string>
+ <string name="pref_privacy_clear_geolocation_access_summary" msgid="7750143359497314679">"Zrušiť všetkým webovým stránkam prístup k polohe"</string>
+ <string name="pref_privacy_clear_geolocation_access_dlg" msgid="7327063124488827244">"Zrušiť všetkým webovým stránkam prístup k polohe"</string>
+ <string name="pref_security_title" msgid="5763978646932160021">"Nastavenia zabezpečenia"</string>
+ <string name="pref_security_remember_passwords" msgid="6492957683454529549">"Zapamätať heslá"</string>
+ <string name="pref_security_remember_passwords_summary" msgid="256388703356349137">"Ukladať používateľské mená a heslá pre webové stránky"</string>
+ <string name="pref_security_save_form_data" msgid="1213669802810198893">"Zapamätať údaje formulárov"</string>
+ <string name="pref_security_save_form_data_summary" msgid="4994074685153708026">"Zapamätať si údaje, ktoré zadám do formulárov, na ďalšie použitie"</string>
+ <string name="pref_security_show_security_warning" msgid="8901135676266754559">"Zobraziť upozornenia zabezpečenia"</string>
+ <string name="pref_security_show_security_warning_summary" msgid="8968906112720511704">"Zobraziť upozornenia, ak dôjde k problému so zabezpečením webových stránok"</string>
+ <string name="pref_security_accept_cookies" msgid="3201367661925047989">"Prijímať súbory cookie"</string>
+ <string name="pref_security_accept_cookies_summary" msgid="1465118934875026920">"Povoliť webovým lokalitám ukladať a čítať súbory cookie"</string>
+ <string name="pref_text_size" msgid="3827031324346612208">"Veľkosť textu"</string>
+ <string-array name="pref_text_size_choices">
+ <item msgid="4952686548944739548">"Malé"</item>
+ <item msgid="1950030433642671460">"Malý"</item>
+ <item msgid="4338347520133294584">"Normálna"</item>
+ <item msgid="5043128215356351184">"Veľké"</item>
+ <item msgid="7201512237890458902">"Veľmi veľký"</item>
+ </string-array>
+ <string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Veľkosť textu"</string>
+ <string name="pref_default_zoom" msgid="8076142259097187395">"Predvolené priblíženie"</string>
+ <string-array name="pref_default_zoom_choices">
+ <item msgid="549583171195154919">"Ďaleko"</item>
+ <item msgid="5619034257768161024">"Stredné"</item>
+ <item msgid="3840999588443167001">"Zavrieť"</item>
+ </string-array>
+ <string name="pref_default_zoom_dialogtitle" msgid="6095974367125109021">"Predvolené priblíženie"</string>
+ <string name="pref_content_load_page" msgid="2219810141690955452">"Otvárať stránky v náhľade"</string>
+ <string name="pref_content_load_page_summary" msgid="8792093504054149369">"Zobraziť náhľad novo otvorených stránok"</string>
+ <string name="pref_extras_title" msgid="3091250467679722382">"Rozšírené nastavenia"</string>
+ <string name="pref_extras_website_settings" msgid="67866640052455549">"Zrušiť prístup k polohe"</string>
+ <string name="pref_extras_website_settings_summary" msgid="1656771443223494406">"Rozšírené nastavenia pre jednotlivé webové stránky"</string>
+ <string name="pref_extras_reset_default" msgid="8904000515846202110">"Obnoviť predvolené"</string>
+ <string name="pref_extras_reset_default_summary" msgid="4247870778270414501">"Obnoviť predvolené nastavenia"</string>
+ <string name="pref_extras_reset_default_dlg" msgid="6640261575874704022">"Budú obnovené predvolené hodnoty nastavení."</string>
+ <string name="pref_extras_reset_default_dlg_title" msgid="2250334970728938936">"Obnoviť predvolené"</string>
+ <string name="pref_development_title" msgid="3263854204533056480">"Ladiť"</string>
+ <string name="pref_default_text_encoding" msgid="5742965543955558478">"Kódovanie textu"</string>
+ <!-- no translation found for pref_default_text_encoding_choices:7 (2193955365569270096) -->
+ <string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Kódovanie textu"</string>
+ <string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"Problémy s dátovým pripojením"</string>
+ <string name="browserFrameFileErrorLabel" msgid="8063691502792670367">"Problém so súborom"</string>
+ <string name="browserFrameFormResubmitLabel" msgid="2685923472682180360">"Potvrdiť"</string>
+ <string name="browserFrameFormResubmitMessage" msgid="2752182215695632138">"Stránka, ktorú sa pokúšate zobraziť, obsahuje údaje, ktoré už boli odoslané (POSTDATA). Ak údaje odošlete znova, akákoľvek akcia vykonaná pomocou formulára na stránke prebehne znova (napr. hľadanie či nákup online)."</string>
+ <string name="loadSuspendedTitle" msgid="675991625288706944">"Žiadne pripojenie k sieti"</string>
+ <string name="loadSuspended" msgid="3133656588880851273">"Prehliadač nemôže túto stránku načítať, pretože nie je k dispozícii pripojenie na Internet."</string>
+ <string name="clear_history" msgid="5998307092715979619">"Vymazať históriu"</string>
+ <string name="browser_history" msgid="1038987118290272525">"Nedávno navštívené stránky"</string>
+ <string name="empty_history" msgid="8738772352308207274">"História prehliadača je prázdna."</string>
+ <string name="add_new_bookmark" msgid="8086367791400349049">"Pridať záložku..."</string>
+ <string name="add_bookmark_short" msgid="3783984330998103735">"Pridať"</string>
+ <string name="search_hint" msgid="4647356319916631820">"Vyhľadajte alebo zadajte adresu URL"</string>
+ <string name="search_button_text" msgid="5235226933877634410">"Hľadať"</string>
+ <string name="search_settings_description" msgid="1422401062529014107">"Záložky a webová história"</string>
+ <string name="attention" msgid="3473639060042811244">"Pozor"</string>
+ <string name="popup_window_attempt" msgid="2673111696288657989">"Táto stránka sa pokúša otvoriť kontextové okno."</string>
+ <string name="allow" msgid="1157313689171991335">"Povoliť"</string>
+ <string name="block" msgid="9172175889884707800">"Blokovať"</string>
+ <string name="too_many_windows_dialog_title" msgid="5175503564948906442">"Bol dosiahnutý maximálny počet okien"</string>
+ <string name="too_many_windows_dialog_message" msgid="1398571800233959583">"Nové okno sa nedá otvoriť, pretože je už otvorený maximálny počet okien."</string>
+ <string name="too_many_subwindows_dialog_title" msgid="3805453941587725944">"Kontextové okno je už otvorené"</string>
+ <string name="too_many_subwindows_dialog_message" msgid="5827289829907966657">"Nie je možné otvoriť nové kontextové okno, pretože môže byť otvorené iba jedno."</string>
+ <string name="download_title" msgid="2122874021047565594">"História preberania"</string>
+ <string name="download_unknown_filename" msgid="4013465542563652175">"<Neznáme>"</string>
+ <string name="download_menu_open" msgid="4888327480367757513">"Otvoriť"</string>
+ <string name="download_menu_clear" msgid="6264454531553418124">"Vymazať zo zoznamu"</string>
+ <string name="download_menu_delete" msgid="8815502136393894148">"Odstrániť"</string>
+ <string name="download_menu_cancel" msgid="2545333007601851574">"Zrušiť preberanie"</string>
+ <string name="download_menu_cancel_all" msgid="2136550823151999166">"Zrušiť preberanie všetkých súborov"</string>
+ <string name="download_cancel_dlg_title" msgid="8909108500262799748">"Zrušiť preberanie"</string>
+ <string name="download_cancel_dlg_msg" msgid="6285389170052357797">"Preberanie všetkých súborov (<xliff:g id="DOWNLOAD_COUNT">%d</xliff:g>) bude zrušené a súbory budú vymazané z histórie preberania."</string>
+ <string name="download_delete_file" msgid="5330036497843073249">"Súbor bude odstránený"</string>
+ <string name="download_file_error_dlg_title" msgid="2693630283595384874">"Nedostatok miesta"</string>
+ <string name="download_file_error_dlg_msg" msgid="5156405410324072471">"Súbor <xliff:g id="FILENAME">%s</xliff:g> nemožno prevziať."\n"Uvoľnite pamäť telefónu a akciu opakujte."</string>
+ <string name="download_failed_generic_dlg_title" msgid="6106781095337833391">"Prevzatie zlyhalo"</string>
+ <!-- outdated translation 605904452159416792 --> <string name="download_no_sdcard_dlg_title" product="nosdcard" msgid="56777245081568508">"Žiadna karta SD"</string>
+ <string name="download_no_sdcard_dlg_title" product="default" msgid="605904452159416792">"Žiadna karta SD"</string>
+ <!-- no translation found for download_no_sdcard_dlg_msg (3144652102051031721) -->
+ <skip />
+ <string name="download_no_sdcard_dlg_msg" product="default" msgid="2616399456116301518">"Na kartu SD je potrebné prevziať súbor <xliff:g id="FILENAME">%s</xliff:g>."</string>
+ <!-- outdated translation 6877712666046917741 --> <string name="download_sdcard_busy_dlg_title" product="nosdcard" msgid="8081445664689818973">"Karta SD nie je dostupná"</string>
+ <string name="download_sdcard_busy_dlg_title" product="default" msgid="6877712666046917741">"Karta SD nie je dostupná"</string>
+ <!-- outdated translation 3473883538192835204 --> <string name="download_sdcard_busy_dlg_msg" product="nosdcard" msgid="3979329954835690147">"Karta SD je zaneprázdnená. Ak chcete povoliť preberanie, vyberte v upozornení možnosť Vypnúť pamäť USB."</string>
+ <string name="download_sdcard_busy_dlg_msg" product="default" msgid="3473883538192835204">"Karta SD je zaneprázdnená. Ak chcete povoliť preberanie, vyberte v upozornení možnosť Vypnúť pamäť USB."</string>
+ <string name="download_no_application_title" msgid="1286056729168874295">"Súbor nemožno otvoriť"</string>
+ <string name="retry" msgid="1835923075542266721">"Skúsiť znova"</string>
+ <string name="no_downloads" msgid="3947445710685021498">"História preberania je prázdna."</string>
+ <string name="download_error" msgid="413496839831257187">"Preberanie bolo neúspešné."</string>
+ <string name="download_success" msgid="2279041638155595203">"<xliff:g id="FILE">%s</xliff:g> Preberanie dokončené."</string>
+ <string name="download_running" msgid="2622942231322015059">"Prebieha preberanie..."</string>
+ <string name="download_pending" msgid="2599683668575349559">"Prebieha spustenie preberania..."</string>
+ <string name="download_pending_network" msgid="6548714525679461053">"Čakanie na dátové pripojenie..."</string>
+ <string name="download_running_paused" msgid="6418029352085656495">"Čakanie na dátové pripojenie..."</string>
+ <string name="download_canceled" msgid="6057083743144492515">"Preberanie bolo zrušené."</string>
+ <string name="download_not_acceptable" msgid="313769696131563652">"Nemožno prevziať. Telefón tento obsah nepodporuje."</string>
+ <string name="download_file_error" msgid="1206648050615176113">"Preberanie nie je možné dokončiť. Nie je dostatok miesta."</string>
+ <string name="download_length_required" msgid="9038605488460437406">"Nie je možné prevziať. Veľkosť položky sa nedajú určiť."</string>
+ <string name="download_precondition_failed" msgid="8327584102874295580">"Preberanie bolo prerušené a nie je možné v ňom pokračovať."</string>
+ <string name="search_the_web" msgid="6046130189241962337">"Hľadať na webe"</string>
+ <string name="webstorage_outofspace_notification_title" msgid="1160474608059771788">"Pamäť prehliadača je plná"</string>
+ <string name="webstorage_outofspace_notification_text" msgid="7341075135051829692">"Kliknutím uvoľníte miesto."</string>
+ <string name="webstorage_clear_data_title" msgid="689484577124333977">"Vymazať uložené dáta"</string>
+ <string name="webstorage_clear_data_dialog_title" msgid="345457466368974706">"Vymazať uložené dáta"</string>
+ <string name="webstorage_clear_data_dialog_message" msgid="6678281256970470125">"Všetky údaje uložené týmito webovými stránkami budú odstránené"</string>
+ <string name="webstorage_clear_data_dialog_ok_button" msgid="2516563534211898636">"Vymazať všetky"</string>
+ <string name="webstorage_clear_data_dialog_cancel_button" msgid="2028867751958942762">"Zrušiť"</string>
+ <string name="webstorage_origin_summary_mb_stored" msgid="1985885826292236210">"Zrušiť prístup k polohe"</string>
+ <string name="loading_video" msgid="4887871585216091096">"Prebieha načítavanie videa"</string>
+ <string name="geolocation_permissions_prompt_message" msgid="356796102004052471">"Webové stránky <xliff:g id="WEBSITE_ORIGIN">%s</xliff:g> požadujú informácie o vašej polohe"</string>
+ <string name="geolocation_permissions_prompt_share" msgid="9084486342048347976">"Zdieľať polohu"</string>
+ <string name="geolocation_permissions_prompt_dont_share" msgid="6303025160237860300">"Odmietnuť"</string>
+ <string name="geolocation_permissions_prompt_remember" msgid="3118526300707348308">"Zapamätať predvoľbu"</string>
+ <string name="geolocation_permissions_prompt_toast_allowed" msgid="987286072035125498">"Tieto stránky môžu pristupovať k vašej aktuálnej polohe. Toto nastavenie môžete zmeniť tu: Nastavenia –> Nastavenia webových stránok."</string>
+ <string name="geolocation_permissions_prompt_toast_disallowed" msgid="7695100950212692515">"Tieto stránky nemôžu pristupovať k vašej aktuálnej polohe. Toto nastavenie môžete zmeniť tu: Nastavenia –> Nastavenia webových stránok."</string>
+ <string name="geolocation_settings_page_title" msgid="1745477985097536528">"Zrušiť prístup k polohe"</string>
+ <string name="geolocation_settings_page_summary_allowed" msgid="9180251524290811398">"Tieto stránky môžu aktuálne získať prístup k informáciám o vašej polohe"</string>
+ <string name="geolocation_settings_page_summary_not_allowed" msgid="4589649082203102544">"Tieto stránky nemôžu momentálne získať prístup k informáciám o vašej polohe"</string>
+ <string name="geolocation_settings_page_dialog_title" msgid="1549842043381347668">"Zrušiť prístup k polohe"</string>
+ <string name="geolocation_settings_page_dialog_message" msgid="7586671987576403993">"Prístup týchto webových stránok k informáciám o polohe bude zrušený"</string>
+ <string name="geolocation_settings_page_dialog_ok_button" msgid="4789434178048077287">"Zrušiť prístup"</string>
+ <string name="geolocation_settings_page_dialog_cancel_button" msgid="7941036504673409747">"Zrušiť"</string>
+ <string name="website_settings_clear_all" msgid="8739804325997655980">"Vymazať všetky"</string>
+ <string name="website_settings_clear_all_dialog_title" msgid="7791826325122461718">"Vymazať všetky nastavenia webových stránok?"</string>
+ <string name="website_settings_clear_all_dialog_message" msgid="6150502090601476333">"Všetky údaje webových stránok a oprávnenia pristupovať k informáciám o polohe budú odstránené."</string>
+ <string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"Odstrániť všetky údaje"</string>
+ <string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"Zrušiť"</string>
+ <string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"Prebieha nastavenie tapety..."</string>
+ <!-- no translation found for defaultBookmarksUpButton (2303951020715704735) -->
+ <skip />
+ <!-- no translation found for empty_bookmarks_folder (7843361614634930942) -->
+ <skip />
+ <!-- no translation found for rlz_access_point (7165847807377650632) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_title (3325557652271172128) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_description (2187665745413495303) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_remove (8105572409059113340) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_import (6933613853573899218) -->
+ <skip />
+</resources>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
new file mode 100644
index 0000000..a3f23da
--- /dev/null
+++ b/res/values-sl/strings.xml
@@ -0,0 +1,401 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2007 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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="application_name" msgid="1935869255545976415">"Brskalnik"</string>
+ <string name="choose_upload" msgid="3649366287575002063">"Izberite datoteko za prenos v strežnik"</string>
+ <string name="new_tab" msgid="4505722538297295141">"Novo okno"</string>
+ <!-- no translation found for new_incognito_tab (5821404839654751753) -->
+ <skip />
+ <string name="active_tabs" msgid="3050623868203544623">"Okna"</string>
+ <string name="tab_bookmarks" msgid="2305793036003473653">"Zaznamki"</string>
+ <string name="tab_most_visited" msgid="1077402532455000703">"Najpogosteje obiskovano"</string>
+ <string name="tab_history" msgid="1979267558744613746">"Zgodovina"</string>
+ <string name="added_to_bookmarks" msgid="1020224130695956728">"Dodano med zaznamke"</string>
+ <string name="removed_from_bookmarks" msgid="6063705902028438800">"Odstranjeno iz zaznamkov"</string>
+ <string name="sign_in_to" msgid="5939425800148759165">"Prijavi se v <xliff:g id="HOSTNAME">%s1</xliff:g> »<xliff:g id="REALM">%s2</xliff:g>«"</string>
+ <string name="username" msgid="5057566336518215922">"Ime"</string>
+ <string name="password" msgid="1177138552305184404">"Geslo"</string>
+ <string name="action" msgid="183105774472071343">"Prijava"</string>
+ <string name="bookmarks_search" msgid="5229596268214362873">"Brskalnik"</string>
+ <string name="cancel" msgid="3017274947407233702">"Prekliči"</string>
+ <string name="ok" msgid="1509280796718850364">"V redu"</string>
+ <string name="title_bar_loading" msgid="7438217780834640678">"Nalaganje …"</string>
+ <string name="page_info" msgid="4048529256302257195">"Podatki o strani"</string>
+ <string name="page_info_view" msgid="5303490449842635158">"Prikaži podatke o strani"</string>
+ <string name="page_info_address" msgid="2222306609532903254">"Naslov:"</string>
+ <string name="ssl_warnings_header" msgid="79744901983636370">"Z varnostnim potrdilom za to spletno mesto so težave."</string>
+ <string name="ssl_continue" msgid="8031515015829358457">"Naprej"</string>
+ <string name="security_warning" msgid="6607795404322797541">"Varnostno opozorilo"</string>
+ <string name="view_certificate" msgid="1472768887529093862">"Prikaži potrdilo"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
+ <string name="ssl_untrusted" msgid="5369967226521102194">"Potrdila ni izdal zaupanja vreden overitelj."</string>
+ <string name="ssl_mismatch" msgid="558688832420069896">"Ime mesta se ne ujema z imenom potrdila."</string>
+ <string name="ssl_expired" msgid="5739349389499575559">"Potrdilo je poteklo."</string>
+ <string name="ssl_not_yet_valid" msgid="2893167846212645846">"Potrdilo še ni veljavno."</string>
+ <string name="ssl_certificate" msgid="5226747157992111668">"Varnostno potrdilo"</string>
+ <string name="ssl_certificate_is_valid" msgid="7096160815933145579">"Potrdilo je veljavno."</string>
+ <string name="issued_to" msgid="9032338008819841339">"Izdano za:"</string>
+ <string name="common_name" msgid="5745530093500062357">"Pogosto ime:"</string>
+ <string name="org_name" msgid="8868889052889991293">"Organizacija:"</string>
+ <string name="org_unit" msgid="4489056376307768196">"Organizacijska enota:"</string>
+ <string name="issued_by" msgid="6959484326943152487">"Izdal:"</string>
+ <string name="validity_period" msgid="57988851973181309">"Veljavnost:"</string>
+ <string name="issued_on" msgid="2082890654801808368">"Izdano:"</string>
+ <string name="expires_on" msgid="8061200430557020704">"Velja do:"</string>
+ <string name="stopping" msgid="4839698519340302982">"Ustavljanje ..."</string>
+ <string name="stop" msgid="5687251076030630074">"Ustavi"</string>
+ <string name="reload" msgid="8585220783228408062">"Osveži"</string>
+ <string name="back" msgid="8414603107175713668">"Nazaj"</string>
+ <string name="forward" msgid="4288210890526641577">"Posreduj"</string>
+ <string name="save" msgid="5922311934992468496">"V redu"</string>
+ <string name="do_not_save" msgid="6777633870113477714">"Prekliči"</string>
+ <!-- outdated translation 969988560160364559 --> <string name="location" msgid="3411848697912600125">"Lokacija"</string>
+ <!-- no translation found for containing_folder (6771180232953030479) -->
+ <skip />
+ <!-- no translation found for new_folder (7743540149088867917) -->
+ <skip />
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <!-- no translation found for no_subfolders (5880411440592452802) -->
+ <skip />
+ <!-- no translation found for add_to_bookmarks_menu_option (4449323955122214389) -->
+ <skip />
+ <!-- no translation found for add_to_homescreen_menu_option (1461447829242963790) -->
+ <skip />
+ <!-- no translation found for add_to_other_folder_menu_option (5450890093372998187) -->
+ <skip />
+ <!-- outdated translation 5990326151488445481 --> <string name="name" msgid="5462672162695365387">"Ime"</string>
+ <string name="http" msgid="2163722670597250102">"http://"</string>
+ <!-- outdated translation 588165100024086565 --> <string name="save_to_bookmarks" msgid="6101482434920313244">"Dodaj zaznamek"</string>
+ <!-- no translation found for bookmark_this_page (7530739804320811054) -->
+ <skip />
+ <string name="edit_bookmark" msgid="5024089053490231905">"Uredi zaznamek"</string>
+ <!-- outdated translation 9202323987633899835 --> <string name="create_shortcut_bookmark" msgid="1995095662095484289">"Dodaj bližnjico do domače strani"</string>
+ <string name="open_bookmark" msgid="8473581305759935790">"Odpri"</string>
+ <string name="remove_bookmark" msgid="8407495852801410891">"Izbriši zaznamek"</string>
+ <string name="remove_from_bookmarks" msgid="4374080666576982775">"Odstrani iz zaznamkov"</string>
+ <string name="remove_history_item" msgid="5021424935726728618">"Odstrani iz zgodovine"</string>
+ <string name="set_as_homepage" msgid="4752937379414905560">"Nastavi kot domačo stran"</string>
+ <string name="bookmark_saved" msgid="2766434679871317557">"Shranjeno med zaznamke."</string>
+ <string name="bookmark_not_saved" msgid="700600955089376724">"Zaznamka ni mogoče shraniti."</string>
+ <string name="homepage_set" msgid="8768087280310966395">"Domača stran je nastavljena."</string>
+ <string name="bookmark_needs_title" msgid="6245900436119218187">"Zaznamek mora imeti ime."</string>
+ <string name="bookmark_needs_url" msgid="7809876865972755158">"Zaznamek mora imeti lokacijo."</string>
+ <string name="bookmark_url_not_valid" msgid="6719785633980202419">"URL ni veljaven."</string>
+ <string name="bookmark_cannot_save_url" msgid="791722768778386941">"URL-ja ni mogoče označiti z zaznamkom."</string>
+ <string name="delete_bookmark" msgid="2422989994934201992">"Izbriši"</string>
+ <string name="bookmark_page" msgid="6845189305130307274">"Zaznamuj nazadnje ogledano stran"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
+ <string name="current_page" msgid="7510129573681663135">"od "</string>
+ <string name="delete_bookmark_warning" msgid="758043186202032205">"Zaznamek »<xliff:g id="BOOKMARK">%s</xliff:g>« bo izbrisan"</string>
+ <string name="open_in_new_window" msgid="6596775546468054510">"Odpri v novem oknu"</string>
+ <string name="goto_dot" msgid="3895839050522602723">"Pojdi"</string>
+ <!-- no translation found for incognito_tab (5419458065370134289) -->
+ <skip />
+ <string name="select_dot" msgid="6299170761900561967">"Izberi besedilo"</string>
+ <string name="tab_picker_title" msgid="864478399057782913">"Trenutna okna"</string>
+ <string name="tab_picker_remove_tab" msgid="630087809802479397">"Zapri"</string>
+ <string name="bookmarks" msgid="1961279134885867815">"Zaznamki"</string>
+ <string name="shortcut_bookmark" msgid="3974876480401135895">"Zaznamek"</string>
+ <string name="history" msgid="2451240511251410032">"Zgodovina"</string>
+ <string name="menu_view_download" msgid="2124570321712995120">"Prenosi"</string>
+ <string name="copy_page_url" msgid="7635062169011319208">"Kopiraj URL strani"</string>
+ <string name="share_page" msgid="593756995297268343">"Stran deli z drugimi"</string>
+ <!-- no translation found for menu_save_webarchive (3934652434001459581) -->
+ <skip />
+ <!-- no translation found for webarchive_saved (7045250341467345007) -->
+ <skip />
+ <!-- no translation found for webarchive_failed (2880998204746620260) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
+ <string name="contextmenu_openlink" msgid="7237961252214188935">"Odpri"</string>
+ <string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"Odpri v novem oknu"</string>
+ <string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"Povezava zaznamka"</string>
+ <string name="contextmenu_savelink" msgid="5508554930832538184">"Shrani povezavo"</string>
+ <string name="contextmenu_sharelink" msgid="5392275392280130331">"Skupna raba povezave"</string>
+ <string name="contextmenu_copy" msgid="398860586635404030">"Kopiraj"</string>
+ <string name="contextmenu_copylink" msgid="5153657160294534270">"Kopiraj URL povezave"</string>
+ <string name="contextmenu_download_image" msgid="4243829645180686912">"Shrani sliko"</string>
+ <string name="contextmenu_view_image" msgid="3870625602053600905">"Prikaži sliko"</string>
+ <string name="contextmenu_set_wallpaper" msgid="3691902960115350686">"Nastavi kot ozadje"</string>
+ <string name="contextmenu_dial_dot" msgid="5856550683415933806">"Klicanje ..."</string>
+ <string name="contextmenu_add_contact" msgid="3183511922223645716">"Dodaj stik"</string>
+ <string name="contextmenu_send_mail" msgid="1014513374828775660">"Pošlji e-pošto"</string>
+ <string name="contextmenu_map" msgid="7471390435434034912">"Zemljevid"</string>
+ <string name="choosertitle_sharevia" msgid="4600490613341909086">"Skupna raba prek"</string>
+ <string name="clear" msgid="7070043081700011461">"Počisti"</string>
+ <string name="replace" msgid="4843033491070384047">"Zamenjaj"</string>
+ <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Zaznamki"</string>
+ <string name="menu_preferences" msgid="6709237687234102240">"Nastavitve"</string>
+ <string name="pref_content_title" msgid="722227111894838633">"Nastavitve vsebine strani"</string>
+ <string name="pref_content_load_images" msgid="2125616852957377561">"Naloži slike"</string>
+ <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Prikaži slike na spletnih straneh"</string>
+ <string name="pref_content_block_popups" msgid="7808433807197256726">"Blokiraj pojavna okna"</string>
+ <string name="pref_content_javascript" msgid="4570972030299516843">"Omogoči JavaScript"</string>
+ <string name="pref_content_open_in_background" msgid="824123779725118663">"Odpri v ozadju"</string>
+ <string name="pref_content_plugins" msgid="7231944644794301582">"Omogoči vtičnike"</string>
+ <string-array name="pref_content_plugins_choices">
+ <item msgid="6745108155096660725">"Vedno vključeno"</item>
+ <item msgid="2484126708670016519">"Na zahtevo"</item>
+ <item msgid="8547442717307793863">"Izključen"</item>
+ </string-array>
+ <string name="pref_content_open_in_background_summary" msgid="1737664075721181678">"Odpri nova okna za trenutnim"</string>
+ <string name="pref_content_homepage" msgid="6082437160778559806">"Nastavi domačo stran"</string>
+ <!-- no translation found for pref_content_search_engine (1620101310821644144) -->
+ <skip />
+ <!-- no translation found for pref_content_search_engine_summary (5162667665858487316) -->
+ <skip />
+ <!-- no translation found for pref_set_homepage_to (7196350233061395098) -->
+ <skip />
+ <!-- outdated translation 1493179933653044553 --> <string name="pref_use_current" msgid="1778622474040406672">"Uporabi trenutno stran"</string>
+ <!-- no translation found for pref_use_blank (8503238592551111169) -->
+ <skip />
+ <!-- no translation found for pref_use_default (192587563274735878) -->
+ <skip />
+ <string name="pref_content_autofit" msgid="8260474534053660809">"Samodejno prilagodi velikost strani"</string>
+ <string name="pref_content_autofit_summary" msgid="4587831659894879986">"Oblikuj spletne strani, da se prilegajo zaslonu"</string>
+ <!-- no translation found for pref_personal_title (1447687455755683695) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome (1695182180332194033) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome_summary (7414133931827321055) -->
+ <skip />
+ <!-- no translation found for pref_personal_google_account (952360133341490071) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks (59237515966184432) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks_summary (4791767605662205482) -->
+ <skip />
+ <!-- no translation found for pref_personal_start_syncing (6046972042512655232) -->
+ <skip />
+ <!-- no translation found for pref_personal_account_dialog_title (1390867119887955530) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled (1174197447388234595) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled_summary (422640696197018914) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor (1350709161524642663) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor_summary (6748434431641768870) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_name (8566130291459685955) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_email_address (7967585896612797173) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_company_name (2813443159949210417) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1 (836433242509243081) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1_hint (5965659598509327172) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2 (8194745202893822479) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2_hint (2048330295853546405) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_city (4193225955409148508) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_state (8549739922338171458) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_zip_code (283668573295656671) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_country (7234470301239156656) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_phone_number (4938852821413729276) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_save_profile (8349915287435262888) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_save (6834102203944938409) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_delete (2421442112954362732) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_delete_profile (7112035941146003753) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
+ <string name="pref_privacy_title" msgid="1052470980370846151">"Nastavitve zasebnosti"</string>
+ <string name="pref_privacy_clear_cache" msgid="3380316479925886998">"Počisti predpomnilnik"</string>
+ <string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"Počisti lokalno predpomnjeno vsebino in zbirke podatkov"</string>
+ <string name="pref_privacy_clear_cache_dlg" msgid="5541011591300753881">"Lokalno predpomnjena vsebina in zbirke podatkov bodo izbrisane."</string>
+ <string name="pref_privacy_clear_cookies" msgid="3095583579133780331">"Počisti vse podatke piškotkov"</string>
+ <string name="pref_privacy_clear_cookies_summary" msgid="6962742063990677520">"Počisti vse piškotke brskalnika"</string>
+ <string name="pref_privacy_clear_cookies_dlg" msgid="552855688091432682">"Vsi piškotki bodo izbrisani."</string>
+ <string name="pref_privacy_clear_history" msgid="8723795508825198477">"Počisti zgodovino"</string>
+ <string name="pref_privacy_clear_history_summary" msgid="6868501330708940734">"Počisti zgodovino krmarjenja brskalnika"</string>
+ <string name="pref_privacy_clear_history_dlg" msgid="544903007914753853">"Zgodovina krmarjenja brskalnika bo izbrisana."</string>
+ <string name="pref_privacy_clear_form_data" msgid="4232668196344383987">"Počisti podatke obrazca"</string>
+ <string name="pref_privacy_clear_form_data_summary" msgid="1790390894719517167">"Počisti vse shranjene podatke obrazcev"</string>
+ <string name="pref_privacy_clear_form_data_dlg" msgid="4443621086781197928">"Vsi shranjeni podatki obrazcev bodo izbrisani."</string>
+ <string name="pref_privacy_clear_passwords" msgid="4750234112289277480">"Počisti gesla"</string>
+ <string name="pref_privacy_clear_passwords_summary" msgid="8856782718942903335">"Počisti vsa shranjena gesla"</string>
+ <string name="pref_privacy_clear_passwords_dlg" msgid="2083869328824248255">"Vsa shranjena gesla bodo preklicana."</string>
+ <string name="pref_privacy_enable_geolocation" msgid="1395040170290765686">"Omogoči lokacijo"</string>
+ <string name="pref_privacy_enable_geolocation_summary" msgid="8437020934664306205">"Dovoli mestom, da zahtevajo dostop do moje lokacije"</string>
+ <string name="pref_privacy_clear_geolocation_access" msgid="6649680770030042980">"Počisti dostop do lokacije"</string>
+ <string name="pref_privacy_clear_geolocation_access_summary" msgid="7750143359497314679">"Počisti dostop do lokacije za vsa spletna mesta"</string>
+ <string name="pref_privacy_clear_geolocation_access_dlg" msgid="7327063124488827244">"Počisti dostop do lokacije za vsa spletna mesta"</string>
+ <string name="pref_security_title" msgid="5763978646932160021">"Varnostne nastavitve"</string>
+ <string name="pref_security_remember_passwords" msgid="6492957683454529549">"Zapomni si gesla"</string>
+ <string name="pref_security_remember_passwords_summary" msgid="256388703356349137">"Shrani uporabniška imena in gesla za spletna mesta"</string>
+ <string name="pref_security_save_form_data" msgid="1213669802810198893">"Zapomni si podatke obrazcev"</string>
+ <string name="pref_security_save_form_data_summary" msgid="4994074685153708026">"Zapomni si podatke, ki jih vnašam v obrazce, za poznejšo uporabo"</string>
+ <string name="pref_security_show_security_warning" msgid="8901135676266754559">"Pokaži varnostna opozorila"</string>
+ <string name="pref_security_show_security_warning_summary" msgid="8968906112720511704">"Pokaži opozorilo, če je težava z varnostjo mesta"</string>
+ <string name="pref_security_accept_cookies" msgid="3201367661925047989">"Sprejmi piškotke"</string>
+ <string name="pref_security_accept_cookies_summary" msgid="1465118934875026920">"Dovoli mestom shranjevati in brati podatke »piškotkov«"</string>
+ <string name="pref_text_size" msgid="3827031324346612208">"Velikost besedila"</string>
+ <string-array name="pref_text_size_choices">
+ <item msgid="4952686548944739548">"Zelo majhna"</item>
+ <item msgid="1950030433642671460">"Majhna"</item>
+ <item msgid="4338347520133294584">"Običajna"</item>
+ <item msgid="5043128215356351184">"Velika"</item>
+ <item msgid="7201512237890458902">"Velikanska"</item>
+ </string-array>
+ <string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Velikost besedila"</string>
+ <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>
+ <item msgid="5619034257768161024">"Srednja"</item>
+ <item msgid="3840999588443167001">"Zapri"</item>
+ </string-array>
+ <string name="pref_default_zoom_dialogtitle" msgid="6095974367125109021">"Privzeta povečava/pomanjšava"</string>
+ <string name="pref_content_load_page" msgid="2219810141690955452">"Odpri strani v pregledu"</string>
+ <string name="pref_content_load_page_summary" msgid="8792093504054149369">"Pokaži pregled na novo odprtih strani"</string>
+ <string name="pref_extras_title" msgid="3091250467679722382">"Dodatne nastavitve"</string>
+ <string name="pref_extras_website_settings" msgid="67866640052455549">"Nastavitve spletnega mesta"</string>
+ <string name="pref_extras_website_settings_summary" msgid="1656771443223494406">"Dodatne nastavitve za posamezna spletna mesta"</string>
+ <string name="pref_extras_reset_default" msgid="8904000515846202110">"Ponastavi na privzeto"</string>
+ <string name="pref_extras_reset_default_summary" msgid="4247870778270414501">"Obnovitev privzetih nastavitev"</string>
+ <string name="pref_extras_reset_default_dlg" msgid="6640261575874704022">"Nastavitve bodo povrnjene na privzete vrednosti."</string>
+ <string name="pref_extras_reset_default_dlg_title" msgid="2250334970728938936">"Ponastavi na privzeto"</string>
+ <string name="pref_development_title" msgid="3263854204533056480">"Odpravljanje napak"</string>
+ <string name="pref_default_text_encoding" msgid="5742965543955558478">"Kodiranje besedila"</string>
+ <!-- no translation found for pref_default_text_encoding_choices:7 (2193955365569270096) -->
+ <string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Kodiranje besedila"</string>
+ <string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"Težava s povezljivostjo podatkov"</string>
+ <string name="browserFrameFileErrorLabel" msgid="8063691502792670367">"Težava z datoteko"</string>
+ <string name="browserFrameFormResubmitLabel" msgid="2685923472682180360">"Potrdi"</string>
+ <string name="browserFrameFormResubmitMessage" msgid="2752182215695632138">"Stran, ki si jo poskušate ogledati, vsebuje podatke, ki so bili že poslani (POSTDATA). Če boste znova poslali podatke, bodo ponovljena vsa morebitna dejanja obrazca na strani (kot je iskanje ali spletni nakup)."</string>
+ <string name="loadSuspendedTitle" msgid="675991625288706944">"Ni omrežne povezave"</string>
+ <string name="loadSuspended" msgid="3133656588880851273">"Brskalnik ne more naložiti te strani, ker ni internetne povezave."</string>
+ <string name="clear_history" msgid="5998307092715979619">"Počisti zgodovino"</string>
+ <string name="browser_history" msgid="1038987118290272525">"Nedavno obiskane strani"</string>
+ <string name="empty_history" msgid="8738772352308207274">"Zgodovina brskanja je prazna."</string>
+ <string name="add_new_bookmark" msgid="8086367791400349049">"Dodaj zaznamek ..."</string>
+ <string name="add_bookmark_short" msgid="3783984330998103735">"Dodaj"</string>
+ <string name="search_hint" msgid="4647356319916631820">"Poiščite ali vnesite URL"</string>
+ <string name="search_button_text" msgid="5235226933877634410">"Pojdi"</string>
+ <string name="search_settings_description" msgid="1422401062529014107">"Zaznamki in spletna zgodovina"</string>
+ <string name="attention" msgid="3473639060042811244">"Pozor"</string>
+ <string name="popup_window_attempt" msgid="2673111696288657989">"To mesto poskuša odpreti pojavno okno."</string>
+ <string name="allow" msgid="1157313689171991335">"Omogoči"</string>
+ <string name="block" msgid="9172175889884707800">"Blokiraj"</string>
+ <string name="too_many_windows_dialog_title" msgid="5175503564948906442">"Dosežena je omejitev za okna"</string>
+ <string name="too_many_windows_dialog_message" msgid="1398571800233959583">"Novega okna ni mogoče odpreti, ker ste jih že odprli največje dovoljeno število."</string>
+ <string name="too_many_subwindows_dialog_title" msgid="3805453941587725944">"Pojavno okno je že odprto"</string>
+ <string name="too_many_subwindows_dialog_message" msgid="5827289829907966657">"Novega pojavnega okna ni mogoče odpreti, ker je lahko odprto samo eno."</string>
+ <string name="download_title" msgid="2122874021047565594">"Zgodovina prenosov"</string>
+ <string name="download_unknown_filename" msgid="4013465542563652175">"<Neznano>"</string>
+ <string name="download_menu_open" msgid="4888327480367757513">"Odpri"</string>
+ <string name="download_menu_clear" msgid="6264454531553418124">"Počisti s seznama"</string>
+ <string name="download_menu_delete" msgid="8815502136393894148">"Izbriši"</string>
+ <string name="download_menu_cancel" msgid="2545333007601851574">"Prekliči prenos"</string>
+ <string name="download_menu_cancel_all" msgid="2136550823151999166">"Prekliči vse prenose"</string>
+ <string name="download_cancel_dlg_title" msgid="8909108500262799748">"Prekliči prenose"</string>
+ <string name="download_cancel_dlg_msg" msgid="6285389170052357797">"Vseh <xliff:g id="DOWNLOAD_COUNT">%d</xliff:g> prenosov bo preklicanih in počiščenih iz zgodovine prenosov."</string>
+ <string name="download_delete_file" msgid="5330036497843073249">"Datoteka bo izbrisana"</string>
+ <string name="download_file_error_dlg_title" msgid="2693630283595384874">"Zmanjkalo je prostora"</string>
+ <string name="download_file_error_dlg_msg" msgid="5156405410324072471">"<xliff:g id="FILENAME">%s</xliff:g> ni mogoče prenesti."\n"Sprostite nekaj prostora v telefonu in poskusite znova."</string>
+ <string name="download_failed_generic_dlg_title" msgid="6106781095337833391">"Prenos ni uspel"</string>
+ <!-- outdated translation 605904452159416792 --> <string name="download_no_sdcard_dlg_title" product="nosdcard" msgid="56777245081568508">"Ni kartice SD"</string>
+ <string name="download_no_sdcard_dlg_title" product="default" msgid="605904452159416792">"Ni kartice SD"</string>
+ <!-- no translation found for download_no_sdcard_dlg_msg (3144652102051031721) -->
+ <skip />
+ <string name="download_no_sdcard_dlg_msg" product="default" msgid="2616399456116301518">"Za prenos je zahtevana kartica SD <xliff:g id="FILENAME">%s</xliff:g>."</string>
+ <!-- outdated translation 6877712666046917741 --> <string name="download_sdcard_busy_dlg_title" product="nosdcard" msgid="8081445664689818973">"Kartica SD ni na voljo"</string>
+ <string name="download_sdcard_busy_dlg_title" product="default" msgid="6877712666046917741">"Kartica SD ni na voljo"</string>
+ <!-- outdated translation 3473883538192835204 --> <string name="download_sdcard_busy_dlg_msg" product="nosdcard" msgid="3979329954835690147">"Kartica SD je zasedena. Če želite omogočiti prenose, izberite »Izklopi pomnilnik USB« v območju za obvestila."</string>
+ <string name="download_sdcard_busy_dlg_msg" product="default" msgid="3473883538192835204">"Kartica SD je zasedena. Če želite omogočiti prenose, izberite »Izklopi pomnilnik USB« v območju za obvestila."</string>
+ <string name="download_no_application_title" msgid="1286056729168874295">"Ne morem odpreti datoteke"</string>
+ <string name="retry" msgid="1835923075542266721">"Poskusi znova"</string>
+ <string name="no_downloads" msgid="3947445710685021498">"Zgodovina prenosov je prazna."</string>
+ <string name="download_error" msgid="413496839831257187">"Prenos ni uspel."</string>
+ <string name="download_success" msgid="2279041638155595203">"Prenos <xliff:g id="FILE">%s</xliff:g> je dokončan."</string>
+ <string name="download_running" msgid="2622942231322015059">"Prenos ..."</string>
+ <string name="download_pending" msgid="2599683668575349559">"Začetek prenosa ..."</string>
+ <string name="download_pending_network" msgid="6548714525679461053">"Čakanje na podatkovno povezavo ..."</string>
+ <string name="download_running_paused" msgid="6418029352085656495">"Čakanje na podatkovno povezavo ..."</string>
+ <string name="download_canceled" msgid="6057083743144492515">"Prenos je preklican."</string>
+ <string name="download_not_acceptable" msgid="313769696131563652">"Prenos ni mogoč. Vsebina ni podprta v tem telefonu."</string>
+ <string name="download_file_error" msgid="1206648050615176113">"Prenosa ni mogoče dokončati. Ni dovolj prostora."</string>
+ <string name="download_length_required" msgid="9038605488460437406">"Prenos ni mogoč. Velikosti elementa ni mogoče določiti."</string>
+ <string name="download_precondition_failed" msgid="8327584102874295580">"Prenos je prekinjen. Ni ga mogoče nadaljevati."</string>
+ <string name="search_the_web" msgid="6046130189241962337">"Iskanje v spletu"</string>
+ <string name="webstorage_outofspace_notification_title" msgid="1160474608059771788">"Pomnilnik brskalnika je poln"</string>
+ <string name="webstorage_outofspace_notification_text" msgid="7341075135051829692">"Kliknite, če želite sprostiti prostor."</string>
+ <string name="webstorage_clear_data_title" msgid="689484577124333977">"Počisti shranjene podatke"</string>
+ <string name="webstorage_clear_data_dialog_title" msgid="345457466368974706">"Počisti shranjene podatke"</string>
+ <string name="webstorage_clear_data_dialog_message" msgid="6678281256970470125">"Vsi podatki, ki jih je shranilo spletno mesto, bodo izbrisani"</string>
+ <string name="webstorage_clear_data_dialog_ok_button" msgid="2516563534211898636">"Počisti vse"</string>
+ <string name="webstorage_clear_data_dialog_cancel_button" msgid="2028867751958942762">"Prekliči"</string>
+ <string name="webstorage_origin_summary_mb_stored" msgid="1985885826292236210">"MB shranjeno v telefonu"</string>
+ <string name="loading_video" msgid="4887871585216091096">"Nalaganje videoposnetka"</string>
+ <string name="geolocation_permissions_prompt_message" msgid="356796102004052471">"<xliff:g id="WEBSITE_ORIGIN">%s</xliff:g> želi izvedeti vašo lokacijo"</string>
+ <string name="geolocation_permissions_prompt_share" msgid="9084486342048347976">"Skupna raba lokacije"</string>
+ <string name="geolocation_permissions_prompt_dont_share" msgid="6303025160237860300">"Zavrni"</string>
+ <string name="geolocation_permissions_prompt_remember" msgid="3118526300707348308">"Zapomni si izbiro"</string>
+ <string name="geolocation_permissions_prompt_toast_allowed" msgid="987286072035125498">"To mesto lahko dostopa do vaše lokacije. Spremenite to v možnostih »Nastavitve« > »Nastavitve spletnega mesta«"</string>
+ <string name="geolocation_permissions_prompt_toast_disallowed" msgid="7695100950212692515">"To mesto ne more dostopati do vaše lokacije. Spremenite to v možnostih »Nastavitve« > »Nastavitve spletnega mesta«"</string>
+ <string name="geolocation_settings_page_title" msgid="1745477985097536528">"Počisti dostop do lokacije"</string>
+ <string name="geolocation_settings_page_summary_allowed" msgid="9180251524290811398">"To mesto trenutno lahko dostopa do vaše lokacije"</string>
+ <string name="geolocation_settings_page_summary_not_allowed" msgid="4589649082203102544">"To mesto trenutno ne more dostopati do vaše lokacije"</string>
+ <string name="geolocation_settings_page_dialog_title" msgid="1549842043381347668">"Počisti dostop do lokacije"</string>
+ <string name="geolocation_settings_page_dialog_message" msgid="7586671987576403993">"Dostop do lokacije za to spletno mesto bo počiščen"</string>
+ <string name="geolocation_settings_page_dialog_ok_button" msgid="4789434178048077287">"Počisti dostop"</string>
+ <string name="geolocation_settings_page_dialog_cancel_button" msgid="7941036504673409747">"Prekliči"</string>
+ <string name="website_settings_clear_all" msgid="8739804325997655980">"Počisti vse"</string>
+ <string name="website_settings_clear_all_dialog_title" msgid="7791826325122461718">"Želite počistiti vse nastavitve spletnega mesta?"</string>
+ <string name="website_settings_clear_all_dialog_message" msgid="6150502090601476333">"Vsi podatki spletnega mesta in dovoljenja za lokacijo bodo izbrisani."</string>
+ <string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"Izbriši vse podatke"</string>
+ <string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"Prekliči"</string>
+ <string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"Nastavljanje slik za ozadje ..."</string>
+ <!-- no translation found for defaultBookmarksUpButton (2303951020715704735) -->
+ <skip />
+ <!-- no translation found for empty_bookmarks_folder (7843361614634930942) -->
+ <skip />
+ <!-- no translation found for rlz_access_point (7165847807377650632) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_title (3325557652271172128) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_description (2187665745413495303) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_remove (8105572409059113340) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_import (6933613853573899218) -->
+ <skip />
+</resources>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
new file mode 100644
index 0000000..8beb3b1
--- /dev/null
+++ b/res/values-sr/strings.xml
@@ -0,0 +1,401 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2007 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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="application_name" msgid="1935869255545976415">"Прегледач"</string>
+ <string name="choose_upload" msgid="3649366287575002063">"Одаберите датотеку за отпремање"</string>
+ <string name="new_tab" msgid="4505722538297295141">"Нови прозор"</string>
+ <!-- no translation found for new_incognito_tab (5821404839654751753) -->
+ <skip />
+ <string name="active_tabs" msgid="3050623868203544623">"Прозори"</string>
+ <string name="tab_bookmarks" msgid="2305793036003473653">"Обележивачи"</string>
+ <string name="tab_most_visited" msgid="1077402532455000703">"Најпосећенији"</string>
+ <string name="tab_history" msgid="1979267558744613746">"Историја"</string>
+ <string name="added_to_bookmarks" msgid="1020224130695956728">"Додато у обележиваче"</string>
+ <string name="removed_from_bookmarks" msgid="6063705902028438800">"Уклоњено из обележивача"</string>
+ <string name="sign_in_to" msgid="5939425800148759165">"Пријављивање на <xliff:g id="HOSTNAME">%s1</xliff:g> „<xliff:g id="REALM">%s2</xliff:g>“"</string>
+ <string name="username" msgid="5057566336518215922">"Име"</string>
+ <string name="password" msgid="1177138552305184404">"Лозинка"</string>
+ <string name="action" msgid="183105774472071343">"Пријави ме"</string>
+ <string name="bookmarks_search" msgid="5229596268214362873">"Прегледач"</string>
+ <string name="cancel" msgid="3017274947407233702">"Откажи"</string>
+ <string name="ok" msgid="1509280796718850364">"Потврди"</string>
+ <string name="title_bar_loading" msgid="7438217780834640678">"Учитавање…"</string>
+ <string name="page_info" msgid="4048529256302257195">"Информације о страници"</string>
+ <string name="page_info_view" msgid="5303490449842635158">"Прикажи информације о страници"</string>
+ <string name="page_info_address" msgid="2222306609532903254">"Адреса:"</string>
+ <string name="ssl_warnings_header" msgid="79744901983636370">"Постоје проблеми са безбедносним сертификатом за овај сајт."</string>
+ <string name="ssl_continue" msgid="8031515015829358457">"Настави"</string>
+ <string name="security_warning" msgid="6607795404322797541">"Безбедносно упозорење"</string>
+ <string name="view_certificate" msgid="1472768887529093862">"Прикажи сертификат"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
+ <string name="ssl_untrusted" msgid="5369967226521102194">"Овај сертификат не потиче од поузданог ауторитета."</string>
+ <string name="ssl_mismatch" msgid="558688832420069896">"Назив сајта се не подудара са називом на сертификату."</string>
+ <string name="ssl_expired" msgid="5739349389499575559">"Овај сертификат је истекао."</string>
+ <string name="ssl_not_yet_valid" msgid="2893167846212645846">"Овај сертификат још увек није важећи."</string>
+ <string name="ssl_certificate" msgid="5226747157992111668">"Безбедносни сертификат"</string>
+ <string name="ssl_certificate_is_valid" msgid="7096160815933145579">"Овај сертификат је важећи."</string>
+ <string name="issued_to" msgid="9032338008819841339">"Издато за:"</string>
+ <string name="common_name" msgid="5745530093500062357">"Уобичајени назив:"</string>
+ <string name="org_name" msgid="8868889052889991293">"Организација:"</string>
+ <string name="org_unit" msgid="4489056376307768196">"Организациона јединица:"</string>
+ <string name="issued_by" msgid="6959484326943152487">"Издавалац:"</string>
+ <string name="validity_period" msgid="57988851973181309">"Ваљаност:"</string>
+ <string name="issued_on" msgid="2082890654801808368">"Издато дана:"</string>
+ <string name="expires_on" msgid="8061200430557020704">"Датум истека:"</string>
+ <string name="stopping" msgid="4839698519340302982">"Заустављање…"</string>
+ <string name="stop" msgid="5687251076030630074">"Заустави"</string>
+ <string name="reload" msgid="8585220783228408062">"Освежи"</string>
+ <string name="back" msgid="8414603107175713668">"Назад"</string>
+ <string name="forward" msgid="4288210890526641577">"Проследи"</string>
+ <string name="save" msgid="5922311934992468496">"Потврди"</string>
+ <string name="do_not_save" msgid="6777633870113477714">"Откажи"</string>
+ <!-- outdated translation 969988560160364559 --> <string name="location" msgid="3411848697912600125">"Локација"</string>
+ <!-- no translation found for containing_folder (6771180232953030479) -->
+ <skip />
+ <!-- no translation found for new_folder (7743540149088867917) -->
+ <skip />
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <!-- no translation found for no_subfolders (5880411440592452802) -->
+ <skip />
+ <!-- no translation found for add_to_bookmarks_menu_option (4449323955122214389) -->
+ <skip />
+ <!-- no translation found for add_to_homescreen_menu_option (1461447829242963790) -->
+ <skip />
+ <!-- no translation found for add_to_other_folder_menu_option (5450890093372998187) -->
+ <skip />
+ <!-- outdated translation 5990326151488445481 --> <string name="name" msgid="5462672162695365387">"Назив"</string>
+ <string name="http" msgid="2163722670597250102">"http://"</string>
+ <!-- outdated translation 588165100024086565 --> <string name="save_to_bookmarks" msgid="6101482434920313244">"Додај обележивач"</string>
+ <!-- no translation found for bookmark_this_page (7530739804320811054) -->
+ <skip />
+ <string name="edit_bookmark" msgid="5024089053490231905">"Измени обележивач"</string>
+ <!-- outdated translation 9202323987633899835 --> <string name="create_shortcut_bookmark" msgid="1995095662095484289">"Додај пречицу на почетну"</string>
+ <string name="open_bookmark" msgid="8473581305759935790">"Отвори"</string>
+ <string name="remove_bookmark" msgid="8407495852801410891">"Избриши обележивач"</string>
+ <string name="remove_from_bookmarks" msgid="4374080666576982775">"Уклони из обележивача"</string>
+ <string name="remove_history_item" msgid="5021424935726728618">"Уклони из историје"</string>
+ <string name="set_as_homepage" msgid="4752937379414905560">"Постави као почетну страницу"</string>
+ <string name="bookmark_saved" msgid="2766434679871317557">"Сачувано у обележивачима."</string>
+ <string name="bookmark_not_saved" msgid="700600955089376724">"Није могуће сачувати обележивач."</string>
+ <string name="homepage_set" msgid="8768087280310966395">"Почетна страница је постављена."</string>
+ <string name="bookmark_needs_title" msgid="6245900436119218187">"Обележивач мора да има назив."</string>
+ <string name="bookmark_needs_url" msgid="7809876865972755158">"Обележивач мора да има локацију."</string>
+ <string name="bookmark_url_not_valid" msgid="6719785633980202419">"URL адреса није важећа."</string>
+ <string name="bookmark_cannot_save_url" msgid="791722768778386941">"Ова URL адреса не може да се обележи."</string>
+ <string name="delete_bookmark" msgid="2422989994934201992">"Брисање"</string>
+ <string name="bookmark_page" msgid="6845189305130307274">"Обележи последњу приказану страницу"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
+ <string name="current_page" msgid="7510129573681663135">"са "</string>
+ <string name="delete_bookmark_warning" msgid="758043186202032205">"Обележивач „<xliff:g id="BOOKMARK">%s</xliff:g>“ ће бити избрисан."</string>
+ <string name="open_in_new_window" msgid="6596775546468054510">"Отвори у новом прозору"</string>
+ <string name="goto_dot" msgid="3895839050522602723">"Иди"</string>
+ <!-- no translation found for incognito_tab (5419458065370134289) -->
+ <skip />
+ <string name="select_dot" msgid="6299170761900561967">"Изабери текст"</string>
+ <string name="tab_picker_title" msgid="864478399057782913">"Тренутни прозори"</string>
+ <string name="tab_picker_remove_tab" msgid="630087809802479397">"Затвори"</string>
+ <string name="bookmarks" msgid="1961279134885867815">"Обележивачи"</string>
+ <string name="shortcut_bookmark" msgid="3974876480401135895">"Обележивач"</string>
+ <string name="history" msgid="2451240511251410032">"Историја"</string>
+ <string name="menu_view_download" msgid="2124570321712995120">"Преузимања"</string>
+ <string name="copy_page_url" msgid="7635062169011319208">"Копирај URL адресу странице"</string>
+ <string name="share_page" msgid="593756995297268343">"Дели страницу"</string>
+ <!-- no translation found for menu_save_webarchive (3934652434001459581) -->
+ <skip />
+ <!-- no translation found for webarchive_saved (7045250341467345007) -->
+ <skip />
+ <!-- no translation found for webarchive_failed (2880998204746620260) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
+ <string name="contextmenu_openlink" msgid="7237961252214188935">"Отвори"</string>
+ <string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"Отвори у новом прозору"</string>
+ <string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"Обележи везу"</string>
+ <string name="contextmenu_savelink" msgid="5508554930832538184">"Сачувај везу"</string>
+ <string name="contextmenu_sharelink" msgid="5392275392280130331">"Дели везу"</string>
+ <string name="contextmenu_copy" msgid="398860586635404030">"Копирај"</string>
+ <string name="contextmenu_copylink" msgid="5153657160294534270">"Копирај URL адресу везе"</string>
+ <string name="contextmenu_download_image" msgid="4243829645180686912">"Сачувај слику"</string>
+ <string name="contextmenu_view_image" msgid="3870625602053600905">"Прикажи слику"</string>
+ <string name="contextmenu_set_wallpaper" msgid="3691902960115350686">"Постави као позадину"</string>
+ <string name="contextmenu_dial_dot" msgid="5856550683415933806">"Позови..."</string>
+ <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="clear" msgid="7070043081700011461">"Брисање"</string>
+ <string name="replace" msgid="4843033491070384047">"Замени"</string>
+ <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Обележивачи"</string>
+ <string name="menu_preferences" msgid="6709237687234102240">"Подешавања"</string>
+ <string name="pref_content_title" msgid="722227111894838633">"Подешавања садржаја странице"</string>
+ <string name="pref_content_load_images" msgid="2125616852957377561">"Учитај слике"</string>
+ <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Прикажи слике на веб страницама"</string>
+ <string name="pref_content_block_popups" msgid="7808433807197256726">"Блокирај искачуће прозоре"</string>
+ <string name="pref_content_javascript" msgid="4570972030299516843">"Омогући JavaScript"</string>
+ <string name="pref_content_open_in_background" msgid="824123779725118663">"Отвори у позадини"</string>
+ <string name="pref_content_plugins" msgid="7231944644794301582">"Омогући програмске додатке"</string>
+ <string-array name="pref_content_plugins_choices">
+ <item msgid="6745108155096660725">"Увек укључено"</item>
+ <item msgid="2484126708670016519">"На захтев"</item>
+ <item msgid="8547442717307793863">"Искључено"</item>
+ </string-array>
+ <string name="pref_content_open_in_background_summary" msgid="1737664075721181678">"Отварање нових прозора иза тренутног прозора"</string>
+ <string name="pref_content_homepage" msgid="6082437160778559806">"Постави почетну страницу"</string>
+ <!-- no translation found for pref_content_search_engine (1620101310821644144) -->
+ <skip />
+ <!-- no translation found for pref_content_search_engine_summary (5162667665858487316) -->
+ <skip />
+ <!-- no translation found for pref_set_homepage_to (7196350233061395098) -->
+ <skip />
+ <!-- outdated translation 1493179933653044553 --> <string name="pref_use_current" msgid="1778622474040406672">"Користи тренутну страницу"</string>
+ <!-- no translation found for pref_use_blank (8503238592551111169) -->
+ <skip />
+ <!-- no translation found for pref_use_default (192587563274735878) -->
+ <skip />
+ <string name="pref_content_autofit" msgid="8260474534053660809">"Аутоматски уклопи странице"</string>
+ <string name="pref_content_autofit_summary" msgid="4587831659894879986">"Подешавање формата веб страница тако да се уклопе на екран"</string>
+ <!-- no translation found for pref_personal_title (1447687455755683695) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome (1695182180332194033) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome_summary (7414133931827321055) -->
+ <skip />
+ <!-- no translation found for pref_personal_google_account (952360133341490071) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks (59237515966184432) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks_summary (4791767605662205482) -->
+ <skip />
+ <!-- no translation found for pref_personal_start_syncing (6046972042512655232) -->
+ <skip />
+ <!-- no translation found for pref_personal_account_dialog_title (1390867119887955530) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled (1174197447388234595) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled_summary (422640696197018914) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor (1350709161524642663) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor_summary (6748434431641768870) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_name (8566130291459685955) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_email_address (7967585896612797173) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_company_name (2813443159949210417) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1 (836433242509243081) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1_hint (5965659598509327172) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2 (8194745202893822479) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2_hint (2048330295853546405) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_city (4193225955409148508) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_state (8549739922338171458) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_zip_code (283668573295656671) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_country (7234470301239156656) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_phone_number (4938852821413729276) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_save_profile (8349915287435262888) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_save (6834102203944938409) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_delete (2421442112954362732) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_delete_profile (7112035941146003753) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
+ <string name="pref_privacy_title" msgid="1052470980370846151">"Подешавања приватности"</string>
+ <string name="pref_privacy_clear_cache" msgid="3380316479925886998">"Обриши кеш"</string>
+ <string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"Брисање садржаја и база података из локалног кеша"</string>
+ <string name="pref_privacy_clear_cache_dlg" msgid="5541011591300753881">"Садржај и базе података биће избрисани из локалног кеша."</string>
+ <string name="pref_privacy_clear_cookies" msgid="3095583579133780331">"Избриши све податке колачића"</string>
+ <string name="pref_privacy_clear_cookies_summary" msgid="6962742063990677520">"Брисање свих колачића из прегледача"</string>
+ <string name="pref_privacy_clear_cookies_dlg" msgid="552855688091432682">"Сви колачићи биће избрисани."</string>
+ <string name="pref_privacy_clear_history" msgid="8723795508825198477">"Обриши историју"</string>
+ <string name="pref_privacy_clear_history_summary" msgid="6868501330708940734">"Брисање историје навигације у прегледачу"</string>
+ <string name="pref_privacy_clear_history_dlg" msgid="544903007914753853">"Историја навигације у прегледачу биће избрисана."</string>
+ <string name="pref_privacy_clear_form_data" msgid="4232668196344383987">"Обриши податке из обрасца"</string>
+ <string name="pref_privacy_clear_form_data_summary" msgid="1790390894719517167">"Брисање свих сачуваних података образаца"</string>
+ <string name="pref_privacy_clear_form_data_dlg" msgid="4443621086781197928">"Сви сачувани подаци за обрасце биће избрисани."</string>
+ <string name="pref_privacy_clear_passwords" msgid="4750234112289277480">"Обриши лозинке"</string>
+ <string name="pref_privacy_clear_passwords_summary" msgid="8856782718942903335">"Брисање свих сачуваних лозинки"</string>
+ <string name="pref_privacy_clear_passwords_dlg" msgid="2083869328824248255">"Све сачуване лозинке биће избрисане."</string>
+ <string name="pref_privacy_enable_geolocation" msgid="1395040170290765686">"Омогући локацију"</string>
+ <string name="pref_privacy_enable_geolocation_summary" msgid="8437020934664306205">"Омогућавање да сајтови захтевају приступ вашој локацији"</string>
+ <string name="pref_privacy_clear_geolocation_access" msgid="6649680770030042980">"Обриши приступ локацији"</string>
+ <string name="pref_privacy_clear_geolocation_access_summary" msgid="7750143359497314679">"Брисање приступа локацији за све веб сајтове"</string>
+ <string name="pref_privacy_clear_geolocation_access_dlg" msgid="7327063124488827244">"Брисање приступа локацији за све веб сајтове"</string>
+ <string name="pref_security_title" msgid="5763978646932160021">"Безбедносна подешавања"</string>
+ <string name="pref_security_remember_passwords" msgid="6492957683454529549">"Запамти лозинке"</string>
+ <string name="pref_security_remember_passwords_summary" msgid="256388703356349137">"Чување корисничких имена и лозинки за веб сајтове"</string>
+ <string name="pref_security_save_form_data" msgid="1213669802810198893">"Запамти податке из обрасца"</string>
+ <string name="pref_security_save_form_data_summary" msgid="4994074685153708026">"Памћење података које уносим у обрасце ради накнадног коришћења"</string>
+ <string name="pref_security_show_security_warning" msgid="8901135676266754559">"Прикажи безбедносна упозорења"</string>
+ <string name="pref_security_show_security_warning_summary" msgid="8968906112720511704">"Приказивање упозорења ако постоји проблем у вези са безбедношћу сајта"</string>
+ <string name="pref_security_accept_cookies" msgid="3201367661925047989">"Прихвати колачиће"</string>
+ <string name="pref_security_accept_cookies_summary" msgid="1465118934875026920">"Омогућавање да сајтови сачувају и прочитају податке „колачића“"</string>
+ <string name="pref_text_size" msgid="3827031324346612208">"Величина текста"</string>
+ <string-array name="pref_text_size_choices">
+ <item msgid="4952686548944739548">"Мајушно"</item>
+ <item msgid="1950030433642671460">"Мала"</item>
+ <item msgid="4338347520133294584">"Нормалан"</item>
+ <item msgid="5043128215356351184">"Велика"</item>
+ <item msgid="7201512237890458902">"Огромно"</item>
+ </string-array>
+ <string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Величина текста"</string>
+ <string name="pref_default_zoom" msgid="8076142259097187395">"Подразумевано зумирај"</string>
+ <string-array name="pref_default_zoom_choices">
+ <item msgid="549583171195154919">"Издалека"</item>
+ <item msgid="5619034257768161024">"Средња"</item>
+ <item msgid="3840999588443167001">"Затвори"</item>
+ </string-array>
+ <string name="pref_default_zoom_dialogtitle" msgid="6095974367125109021">"Подразумевано зумирање"</string>
+ <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="3091250467679722382">"Напредна подешавања"</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" msgid="8904000515846202110">"Поново постави подразумевано"</string>
+ <string name="pref_extras_reset_default_summary" msgid="4247870778270414501">"Враћање подразумеваних подешавања"</string>
+ <string name="pref_extras_reset_default_dlg" msgid="6640261575874704022">"Поново ће бити постављене подразумеване вредности подешавања."</string>
+ <string name="pref_extras_reset_default_dlg_title" msgid="2250334970728938936">"Поновно постављање подразумеваног"</string>
+ <string name="pref_development_title" msgid="3263854204533056480">"Отклањање грешака"</string>
+ <string name="pref_default_text_encoding" msgid="5742965543955558478">"Кодирање текста"</string>
+ <!-- no translation found for pref_default_text_encoding_choices:7 (2193955365569270096) -->
+ <string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Кодирање текста"</string>
+ <string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"Проблем при повезивању са подацима"</string>
+ <string name="browserFrameFileErrorLabel" msgid="8063691502792670367">"Проблем са датотеком"</string>
+ <string name="browserFrameFormResubmitLabel" msgid="2685923472682180360">"Потврда"</string>
+ <string name="browserFrameFormResubmitMessage" msgid="2752182215695632138">"Страница коју покушавате да видите садржи већ послате податке („POSTDATA“). Уколико их поново пошаљете, радње за све што унесете у образац на страници (нпр. приликом претраге или куповине на мрежи) биће поновљене."</string>
+ <string name="loadSuspendedTitle" msgid="675991625288706944">"Нема везе са мрежом"</string>
+ <string name="loadSuspended" msgid="3133656588880851273">"Није могуће учитати ову страницу у прегледачу зато што нема везе са Интернетом."</string>
+ <string name="clear_history" msgid="5998307092715979619">"Обриши историју"</string>
+ <string name="browser_history" msgid="1038987118290272525">"Недавно посећене странице"</string>
+ <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_button_text" msgid="5235226933877634410">"Иди"</string>
+ <string name="search_settings_description" msgid="1422401062529014107">"Обележивачи и веб историја"</string>
+ <string name="attention" msgid="3473639060042811244">"Пажња"</string>
+ <string name="popup_window_attempt" msgid="2673111696288657989">"Овај сајт покушава да отвори искачући прозор."</string>
+ <string name="allow" msgid="1157313689171991335">"Дозволи"</string>
+ <string name="block" msgid="9172175889884707800">"Блокирај"</string>
+ <string name="too_many_windows_dialog_title" msgid="5175503564948906442">"Достигнуто је ограничење броја отворених прозора"</string>
+ <string name="too_many_windows_dialog_message" msgid="1398571800233959583">"Није било могуће отворити нови прозор зато што сте већ отворили максималан број прозора."</string>
+ <string name="too_many_subwindows_dialog_title" msgid="3805453941587725944">"Искачући прозор је већ отворен"</string>
+ <string name="too_many_subwindows_dialog_message" msgid="5827289829907966657">"Није било могуће отворити нови искачући прозор зато што не може истовремено да буде отворено више њих."</string>
+ <string name="download_title" msgid="2122874021047565594">"Историја преузимања"</string>
+ <string name="download_unknown_filename" msgid="4013465542563652175">"<Непознато>"</string>
+ <string name="download_menu_open" msgid="4888327480367757513">"Отвори"</string>
+ <string name="download_menu_clear" msgid="6264454531553418124">"Обриши са листе"</string>
+ <string name="download_menu_delete" msgid="8815502136393894148">"Избриши"</string>
+ <string name="download_menu_cancel" msgid="2545333007601851574">"Откажи преузимање"</string>
+ <string name="download_menu_cancel_all" msgid="2136550823151999166">"Откажи сва преузимања"</string>
+ <string name="download_cancel_dlg_title" msgid="8909108500262799748">"Отказивање преузимања"</string>
+ <string name="download_cancel_dlg_msg" msgid="6285389170052357797">"Сва преузимања (<xliff:g id="DOWNLOAD_COUNT">%d</xliff:g>) биће отказана и обрисана из историје преузимања."</string>
+ <string name="download_delete_file" msgid="5330036497843073249">"Датотека ће бити избрисана"</string>
+ <string name="download_file_error_dlg_title" msgid="2693630283595384874">"Нема више места"</string>
+ <string name="download_file_error_dlg_msg" msgid="5156405410324072471">"Није било могуће преузети датотеку <xliff:g id="FILENAME">%s</xliff:g>."\n"Ослободите додатни простор на телефону и покушајте поново."</string>
+ <string name="download_failed_generic_dlg_title" msgid="6106781095337833391">"Преузимање није успело"</string>
+ <!-- outdated translation 605904452159416792 --> <string name="download_no_sdcard_dlg_title" product="nosdcard" msgid="56777245081568508">"Нема SD картице"</string>
+ <string name="download_no_sdcard_dlg_title" product="default" msgid="605904452159416792">"Нема SD картице"</string>
+ <!-- no translation found for download_no_sdcard_dlg_msg (3144652102051031721) -->
+ <skip />
+ <string name="download_no_sdcard_dlg_msg" product="default" msgid="2616399456116301518">"SD картица је потребна за преузимање датотеке <xliff:g id="FILENAME">%s</xliff:g>."</string>
+ <!-- outdated translation 6877712666046917741 --> <string name="download_sdcard_busy_dlg_title" product="nosdcard" msgid="8081445664689818973">"SD картица је недоступна"</string>
+ <string name="download_sdcard_busy_dlg_title" product="default" msgid="6877712666046917741">"SD картица је недоступна"</string>
+ <!-- outdated translation 3473883538192835204 --> <string name="download_sdcard_busy_dlg_msg" product="nosdcard" msgid="3979329954835690147">"SD картица је заузета. Да бисте омогућили преузимања, у оквиру обавештења изаберите „Искључи USB складиште“."</string>
+ <string name="download_sdcard_busy_dlg_msg" product="default" msgid="3473883538192835204">"SD картица је заузета. Да бисте омогућили преузимања, у оквиру обавештења изаберите „Искључи USB складиште“."</string>
+ <string name="download_no_application_title" msgid="1286056729168874295">"Није могуће отворити датотеку"</string>
+ <string name="retry" msgid="1835923075542266721">"Покушај поново"</string>
+ <string name="no_downloads" msgid="3947445710685021498">"Историја преузимања је празна."</string>
+ <string name="download_error" msgid="413496839831257187">"Преузимање није успело."</string>
+ <string name="download_success" msgid="2279041638155595203">"<xliff:g id="FILE">%s</xliff:g> Преузимање је довршено."</string>
+ <string name="download_running" msgid="2622942231322015059">"Преузимање…"</string>
+ <string name="download_pending" msgid="2599683668575349559">"Покретање преузимања…"</string>
+ <string name="download_pending_network" msgid="6548714525679461053">"Чекање на повезивање података…"</string>
+ <string name="download_running_paused" msgid="6418029352085656495">"Чекање на повезивање података…"</string>
+ <string name="download_canceled" msgid="6057083743144492515">"Преузимање је отказано."</string>
+ <string name="download_not_acceptable" msgid="313769696131563652">"Преузимање није могуће. Телефон не подржава овај садржај."</string>
+ <string name="download_file_error" msgid="1206648050615176113">"Није могуће довршити преузимање због недостатка простора."</string>
+ <string name="download_length_required" msgid="9038605488460437406">"Није могуће преузети ставку зато што се не може утврдити њена величина."</string>
+ <string name="download_precondition_failed" msgid="8327584102874295580">"Дошло је до прекида при преузимању и није га могуће наставити."</string>
+ <string name="search_the_web" msgid="6046130189241962337">"Претражи Веб"</string>
+ <string name="webstorage_outofspace_notification_title" msgid="1160474608059771788">"Складиште прегледача је пуно"</string>
+ <string name="webstorage_outofspace_notification_text" msgid="7341075135051829692">"Кликните да бисте ослободили додатни простор."</string>
+ <string name="webstorage_clear_data_title" msgid="689484577124333977">"Брисање сачуваних података"</string>
+ <string name="webstorage_clear_data_dialog_title" msgid="345457466368974706">"Брисање сачуваних података"</string>
+ <string name="webstorage_clear_data_dialog_message" msgid="6678281256970470125">"Сви подаци које је овај веб сајт сачувао биће избрисани"</string>
+ <string name="webstorage_clear_data_dialog_ok_button" msgid="2516563534211898636">"Обриши све"</string>
+ <string name="webstorage_clear_data_dialog_cancel_button" msgid="2028867751958942762">"Откажи"</string>
+ <string name="webstorage_origin_summary_mb_stored" msgid="1985885826292236210">"MB сачувани на телефону"</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_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_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>
+ <string name="geolocation_settings_page_dialog_title" msgid="1549842043381347668">"Брисање приступа локацији"</string>
+ <string name="geolocation_settings_page_dialog_message" msgid="7586671987576403993">"Приступ локацији биће избрисан за овај веб сајт"</string>
+ <string name="geolocation_settings_page_dialog_ok_button" msgid="4789434178048077287">"Обриши приступ"</string>
+ <string name="geolocation_settings_page_dialog_cancel_button" msgid="7941036504673409747">"Откажи"</string>
+ <string name="website_settings_clear_all" msgid="8739804325997655980">"Обриши све"</string>
+ <string name="website_settings_clear_all_dialog_title" msgid="7791826325122461718">"Желите ли да избришете сва подешавања веб сајта?"</string>
+ <string name="website_settings_clear_all_dialog_message" msgid="6150502090601476333">"Сви подаци о веб сајтовима и дозволе за локације биће избрисани."</string>
+ <string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"Избриши све податке"</string>
+ <string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"Откажи"</string>
+ <string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"Постављање позадине..."</string>
+ <!-- no translation found for defaultBookmarksUpButton (2303951020715704735) -->
+ <skip />
+ <!-- no translation found for empty_bookmarks_folder (7843361614634930942) -->
+ <skip />
+ <!-- no translation found for rlz_access_point (7165847807377650632) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_title (3325557652271172128) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_description (2187665745413495303) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_remove (8105572409059113340) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_import (6933613853573899218) -->
+ <skip />
+</resources>
diff --git a/res/values-sv-xlarge/strings.xml b/res/values-sv-xlarge/strings.xml
new file mode 100644
index 0000000..13b5470
--- /dev/null
+++ b/res/values-sv-xlarge/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="new_tab" msgid="7275656655054293038">"Ny flik"</string>
+ <string name="new_incognito_tab" msgid="5149742197322201152">"Ny inkognitoflik"</string>
+ <string name="active_tabs" msgid="5324492165541331128">"Flikar"</string>
+</resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 76d3d0a..96eab03 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -19,6 +19,7 @@
<string name="application_name" msgid="1935869255545976415">"Webbläs."</string>
<string name="choose_upload" msgid="3649366287575002063">"Välj filen som du vill överföra"</string>
<string name="new_tab" msgid="4505722538297295141">"Nytt fönster"</string>
+ <string name="new_incognito_tab" msgid="5821404839654751753">"Nytt inkognitofönster"</string>
<string name="active_tabs" msgid="3050623868203544623">"Fönster"</string>
<string name="tab_bookmarks" msgid="2305793036003473653">"Bokmärken"</string>
<string name="tab_most_visited" msgid="1077402532455000703">"Mest besökta"</string>
@@ -32,12 +33,6 @@
<string name="bookmarks_search" msgid="5229596268214362873">"Webbläsare"</string>
<string name="cancel" msgid="3017274947407233702">"Avbryt"</string>
<string name="ok" msgid="1509280796718850364">"OK"</string>
- <plurals name="matches_found">
- <item quantity="zero" msgid="6242659159545399963">"Inga träffar"</item>
- <item quantity="one" msgid="4352019729062956802">"1 träff"</item>
- <item quantity="few" msgid="5544267486978946555">"<xliff:g id="NUMBER">%d</xliff:g> träffar"</item>
- <item quantity="other" msgid="6616125067364315405">"<xliff:g id="NUMBER">%d</xliff:g> träffar"</item>
- </plurals>
<string name="title_bar_loading" msgid="7438217780834640678">"Hämtar…"</string>
<string name="page_info" msgid="4048529256302257195">"Sidinformation"</string>
<string name="page_info_view" msgid="5303490449842635158">"Visa sidinformation"</string>
@@ -46,6 +41,8 @@
<string name="ssl_continue" msgid="8031515015829358457">"Fortsätt"</string>
<string name="security_warning" msgid="6607795404322797541">"Säkerhetsvarning"</string>
<string name="view_certificate" msgid="1472768887529093862">"Visa certifikat"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
<string name="ssl_untrusted" msgid="5369967226521102194">"Detta certifikat kommer inte från en betrodd utfärdare."</string>
<string name="ssl_mismatch" msgid="558688832420069896">"Webbplatsens namn stämmer inte med namnet på certifikatet."</string>
<string name="ssl_expired" msgid="5739349389499575559">"Certifikatet har upphört att gälla."</string>
@@ -67,12 +64,23 @@
<string name="forward" msgid="4288210890526641577">"Framåt"</string>
<string name="save" msgid="5922311934992468496">"OK"</string>
<string name="do_not_save" msgid="6777633870113477714">"Avbryt"</string>
- <string name="location" msgid="969988560160364559">"Plats"</string>
- <string name="name" msgid="5990326151488445481">"Namn"</string>
+ <string name="location" msgid="3411848697912600125">"Adress"</string>
+ <string name="containing_folder" msgid="6771180232953030479">"Lägg till"</string>
+ <string name="new_folder" msgid="7743540149088867917">"Ny mapp"</string>
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <string name="no_subfolders" msgid="5880411440592452802">"Inga undermappar"</string>
+ <string name="add_to_bookmarks_menu_option" msgid="4449323955122214389">"Bokmärken"</string>
+ <string name="add_to_homescreen_menu_option" msgid="1461447829242963790">"Startsida"</string>
+ <string name="add_to_other_folder_menu_option" msgid="5450890093372998187">"En annan mapp"</string>
+ <string name="name" msgid="5462672162695365387">"Etikett"</string>
<string name="http" msgid="2163722670597250102">"http://"</string>
- <string name="save_to_bookmarks" msgid="588165100024086565">"Lägg till bokmärke"</string>
+ <string name="save_to_bookmarks" msgid="6101482434920313244">"Lägg till i bokmärken"</string>
+ <string name="bookmark_this_page" msgid="7530739804320811054">"Lägg till bokmärke för den här sidan"</string>
<string name="edit_bookmark" msgid="5024089053490231905">"Redigera bokmärke"</string>
- <string name="create_shortcut_bookmark" msgid="9202323987633899835">"Lägg till genväg till startsidan"</string>
+ <string name="create_shortcut_bookmark" msgid="1995095662095484289">"Lägg till genväg på startsidan"</string>
<string name="open_bookmark" msgid="8473581305759935790">"Öppna"</string>
<string name="remove_bookmark" msgid="8407495852801410891">"Ta bort bokmärke"</string>
<string name="remove_from_bookmarks" msgid="4374080666576982775">"Ta bort från bokmärken"</string>
@@ -87,13 +95,15 @@
<string name="bookmark_cannot_save_url" msgid="791722768778386941">"Det går inte att spara webbadressen som ett bokmärke"</string>
<string name="delete_bookmark" msgid="2422989994934201992">"Ta bort"</string>
<string name="bookmark_page" msgid="6845189305130307274">"Skapa bokmärke för den senast visade sidan"</string>
- <string name="switch_to_thumbnails" msgid="5493351529609043151">"Miniatyrvy"</string>
- <string name="switch_to_list" msgid="8900531247982121055">"Listvy"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
<string name="current_page" msgid="7510129573681663135">"från "</string>
<string name="delete_bookmark_warning" msgid="758043186202032205">"Bokmärket <xliff:g id="BOOKMARK">%s</xliff:g> tas bort."</string>
<string name="open_in_new_window" msgid="6596775546468054510">"Öppna i nytt fönster"</string>
<string name="goto_dot" msgid="3895839050522602723">"Kör"</string>
- <string name="find_dot" msgid="6259312434696611957">"Sök på sidan"</string>
+ <string name="incognito_tab" msgid="5419458065370134289">"Öppna ny inkognitoflik"</string>
<string name="select_dot" msgid="6299170761900561967">"Markera text"</string>
<string name="tab_picker_title" msgid="864478399057782913">"Aktuellt fönster"</string>
<string name="tab_picker_remove_tab" msgid="630087809802479397">"Stäng"</string>
@@ -103,6 +113,13 @@
<string name="menu_view_download" msgid="2124570321712995120">"Hämtningar"</string>
<string name="copy_page_url" msgid="7635062169011319208">"Kopiera sidans webbadress"</string>
<string name="share_page" msgid="593756995297268343">"Dela sida"</string>
+ <string name="menu_save_webarchive" msgid="3934652434001459581">"Spara som webbarkiv"</string>
+ <string name="webarchive_saved" msgid="7045250341467345007">"Webbarkivet har sparats"</string>
+ <string name="webarchive_failed" msgid="2880998204746620260">"Det gick inte att spara webbarkivet."</string>
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
<string name="contextmenu_openlink" msgid="7237961252214188935">"Öppna"</string>
<string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"Öppna i nytt fönster"</string>
<string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"Skapa ett bokmärke av länken"</string>
@@ -138,11 +155,44 @@
<string name="pref_content_homepage" msgid="6082437160778559806">"Ange startsida"</string>
<string name="pref_content_search_engine" msgid="1620101310821644144">"Ange sökmotor"</string>
<string name="pref_content_search_engine_summary" msgid="5162667665858487316">"Välj en sökmotor"</string>
- <string name="pref_use_current" msgid="1493179933653044553">"Använd aktuell sida"</string>
+ <string name="pref_set_homepage_to" msgid="7196350233061395098">"Ställ in på..."</string>
+ <string name="pref_use_current" msgid="1778622474040406672">"Aktuell sida"</string>
+ <string name="pref_use_blank" msgid="8503238592551111169">"Tom sida"</string>
+ <string name="pref_use_default" msgid="192587563274735878">"Standardsida"</string>
<string name="pref_content_autofit" msgid="8260474534053660809">"Autoanpassa sidor"</string>
<string name="pref_content_autofit_summary" msgid="4587831659894879986">"Anpassa webbsidor efter skärmen"</string>
- <string name="pref_content_landscape_only" msgid="2022546812766219672">"Endast liggande"</string>
- <string name="pref_content_landscape_only_summary" msgid="1008238895535428855">"Visa bara sidor i det bredare, liggande formatet"</string>
+ <string name="pref_personal_title" msgid="1447687455755683695">"Personliga inställningar"</string>
+ <string name="pref_personal_sync_with_chrome" msgid="1695182180332194033">"Synkronisera med Google Chrome"</string>
+ <string name="pref_personal_sync_with_chrome_summary" msgid="7414133931827321055">"Dela bokmärken och andra data mellan Androids webbläsare och Google Chrome"</string>
+ <string name="pref_personal_google_account" msgid="952360133341490071">"Google-konto"</string>
+ <string name="pref_personal_sync_bookmarks" msgid="59237515966184432">"Synkronisera bokmärken"</string>
+ <string name="pref_personal_sync_bookmarks_summary" msgid="4791767605662205482">"Synkronisera bokmärken mellan Androids webbläsare och Google Chrome"</string>
+ <string name="pref_personal_start_syncing" msgid="6046972042512655232">"Synkronisera nu"</string>
+ <string name="pref_personal_account_dialog_title" msgid="1390867119887955530">"Välj Google-konto"</string>
+ <string name="pref_autofill_enabled" msgid="1174197447388234595">"Automatisk ifyllning av formulär"</string>
+ <string name="pref_autofill_enabled_summary" msgid="422640696197018914">"Fyll i webbformulär med ett enda klick"</string>
+ <string name="pref_autofill_profile_editor" msgid="1350709161524642663">"Inställningar för Autofyll"</string>
+ <string name="pref_autofill_profile_editor_summary" msgid="6748434431641768870">"Konfigurera och hantera data för automatisk ifyllning av formulär"</string>
+ <string name="autofill_profile_editor_name" msgid="8566130291459685955">"Fullständigt namn:"</string>
+ <string name="autofill_profile_editor_email_address" msgid="7967585896612797173">"E-post:"</string>
+ <string name="autofill_profile_editor_company_name" msgid="2813443159949210417">"Företagsnamn:"</string>
+ <string name="autofill_profile_editor_address_line_1" msgid="836433242509243081">"Adressrad 1:"</string>
+ <string name="autofill_profile_editor_address_line_1_hint" msgid="5965659598509327172">"Gatuadress, postboxadress, c/o"</string>
+ <string name="autofill_profile_editor_address_line_2" msgid="8194745202893822479">"Adressrad 2:"</string>
+ <string name="autofill_profile_editor_address_line_2_hint" msgid="2048330295853546405">"Lägenhetsnummer, byggnad, våning med mera"</string>
+ <string name="autofill_profile_editor_city" msgid="4193225955409148508">"Stad:"</string>
+ <string name="autofill_profile_editor_state" msgid="8549739922338171458">"Stat/provins/region:"</string>
+ <string name="autofill_profile_editor_zip_code" msgid="283668573295656671">"Postnummer:"</string>
+ <string name="autofill_profile_editor_country" msgid="7234470301239156656">"Land:"</string>
+ <string name="autofill_profile_editor_phone_number" msgid="4938852821413729276">"Telefon:"</string>
+ <string name="autofill_profile_editor_save_profile" msgid="8349915287435262888">"Spara profil"</string>
+ <string name="autofill_profile_successful_save" msgid="6834102203944938409">"Profilen har sparats"</string>
+ <string name="autofill_profile_successful_delete" msgid="2421442112954362732">"Profilen har tagits bort"</string>
+ <string name="autofill_profile_editor_delete_profile" msgid="7112035941146003753">"Ta bort profildata"</string>
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
<string name="pref_privacy_title" msgid="1052470980370846151">"Sekretessinställningar"</string>
<string name="pref_privacy_clear_cache" msgid="3380316479925886998">"Rensa cacheminne"</string>
<string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"Ta bort innehåll och databaser som cachelagrats lokalt"</string>
@@ -208,6 +258,7 @@
<item msgid="891615911084608570">"Japansk (ISO-2022-JP)"</item>
<item msgid="5589150448475151241">"Japansk (SHIFT_JIS)"</item>
<item msgid="7356792686950371843">"Japansk (EUC-JP)"</item>
+ <item msgid="2193955365569270096">"koreanska (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Textkodning"</string>
<string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"Problem med dataanslutning"</string>
@@ -296,4 +347,11 @@
<string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"Ta bort alla data"</string>
<string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"Avbryt"</string>
<string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"Anger bakgrund..."</string>
+ <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Bokmärken"</string>
+ <string name="empty_bookmarks_folder" msgid="7843361614634930942">"Det finns inga bokmärken"</string>
+ <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
+ <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Synkronisera med Google-konto"</string>
+ <string name="import_bookmarks_dialog_description" msgid="2187665745413495303">"Dina Android-bokmärken har inte kopplats till något Google-konto"</string>
+ <string name="import_bookmarks_dialog_remove" msgid="8105572409059113340">"Ta bort dina Android-bokmärken"</string>
+ <string name="import_bookmarks_dialog_import" msgid="6933613853573899218">"Lägg till dina Android-bokmärken i bokmärkena för <xliff:g id="GOOGLE_ACCOUNT">%s</xliff:g>"</string>
</resources>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
new file mode 100644
index 0000000..ff4fcbe
--- /dev/null
+++ b/res/values-th/strings.xml
@@ -0,0 +1,401 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2007 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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="application_name" msgid="1935869255545976415">"เบราว์เซอร์"</string>
+ <string name="choose_upload" msgid="3649366287575002063">"เลือกไฟล์ที่จะอัปโหลด"</string>
+ <string name="new_tab" msgid="4505722538297295141">"หน้าต่างใหม่"</string>
+ <!-- no translation found for new_incognito_tab (5821404839654751753) -->
+ <skip />
+ <string name="active_tabs" msgid="3050623868203544623">"Windows"</string>
+ <string name="tab_bookmarks" msgid="2305793036003473653">"บุ๊กมาร์ก"</string>
+ <string name="tab_most_visited" msgid="1077402532455000703">"เข้าชมมากที่สุด"</string>
+ <string name="tab_history" msgid="1979267558744613746">"ประวัติ"</string>
+ <string name="added_to_bookmarks" msgid="1020224130695956728">"เพิ่มลงในบุ๊กมาร์กแล้ว"</string>
+ <string name="removed_from_bookmarks" msgid="6063705902028438800">"นำออกจากบุ๊กมาร์ก"</string>
+ <string name="sign_in_to" msgid="5939425800148759165">"ลงชื่อเข้าใช้ที่ <xliff:g id="HOSTNAME">%s1</xliff:g> \"<xliff:g id="REALM">%s2</xliff:g>\""</string>
+ <string name="username" msgid="5057566336518215922">"ชื่อ"</string>
+ <string name="password" msgid="1177138552305184404">"รหัสผ่าน"</string>
+ <string name="action" msgid="183105774472071343">"ลงชื่อเข้าใช้"</string>
+ <string name="bookmarks_search" msgid="5229596268214362873">"เบราว์เซอร์"</string>
+ <string name="cancel" msgid="3017274947407233702">"ยกเลิก"</string>
+ <string name="ok" msgid="1509280796718850364">"ตกลง"</string>
+ <string name="title_bar_loading" msgid="7438217780834640678">"กำลังโหลด…"</string>
+ <string name="page_info" msgid="4048529256302257195">"ข้อมูลหน้าเว็บ"</string>
+ <string name="page_info_view" msgid="5303490449842635158">"ดูข้อมูลหน้าเว็บ"</string>
+ <string name="page_info_address" msgid="2222306609532903254">"ที่อยู่:"</string>
+ <string name="ssl_warnings_header" msgid="79744901983636370">"มีปัญหาเกี่ยวกับใบรับรองความปลอดภัยของไซต์นี้"</string>
+ <string name="ssl_continue" msgid="8031515015829358457">"ดำเนินการต่อ"</string>
+ <string name="security_warning" msgid="6607795404322797541">"คำเตือนเกี่ยวกับความปลอดภัย"</string>
+ <string name="view_certificate" msgid="1472768887529093862">"ดูใบรับรอง"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
+ <string name="ssl_untrusted" msgid="5369967226521102194">"ใบรับรองนี้ไม่ได้มาจากผู้ออกที่เชื่อถือได้"</string>
+ <string name="ssl_mismatch" msgid="558688832420069896">"ชื่อไซต์ไม่ตรงกับในใบรับรอง"</string>
+ <string name="ssl_expired" msgid="5739349389499575559">"ใบรับรองนี้หมดอายุแล้ว"</string>
+ <string name="ssl_not_yet_valid" msgid="2893167846212645846">"ใบรับรองนี้ยังใช้งานไม่ได้"</string>
+ <string name="ssl_certificate" msgid="5226747157992111668">"ใบรับรองความปลอดภัย"</string>
+ <string name="ssl_certificate_is_valid" msgid="7096160815933145579">"ใบรับรองนี้ใช้งานได้"</string>
+ <string name="issued_to" msgid="9032338008819841339">"ออกให้แก่:"</string>
+ <string name="common_name" msgid="5745530093500062357">"ชื่อทั่วไป:"</string>
+ <string name="org_name" msgid="8868889052889991293">"องค์กร:"</string>
+ <string name="org_unit" msgid="4489056376307768196">"หน่วยองค์กร:"</string>
+ <string name="issued_by" msgid="6959484326943152487">"ออกโดย:"</string>
+ <string name="validity_period" msgid="57988851973181309">"อายุการใช้งาน:"</string>
+ <string name="issued_on" msgid="2082890654801808368">"ออกเมื่อ:"</string>
+ <string name="expires_on" msgid="8061200430557020704">"หมดอายุวันที่:"</string>
+ <string name="stopping" msgid="4839698519340302982">"กำลังหยุด..."</string>
+ <string name="stop" msgid="5687251076030630074">"หยุด"</string>
+ <string name="reload" msgid="8585220783228408062">"รีเฟรช"</string>
+ <string name="back" msgid="8414603107175713668">"ย้อนกลับ"</string>
+ <string name="forward" msgid="4288210890526641577">"ส่งต่อ"</string>
+ <string name="save" msgid="5922311934992468496">"ตกลง"</string>
+ <string name="do_not_save" msgid="6777633870113477714">"ยกเลิก"</string>
+ <!-- outdated translation 969988560160364559 --> <string name="location" msgid="3411848697912600125">"ตำแหน่ง"</string>
+ <!-- no translation found for containing_folder (6771180232953030479) -->
+ <skip />
+ <!-- no translation found for new_folder (7743540149088867917) -->
+ <skip />
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <!-- no translation found for no_subfolders (5880411440592452802) -->
+ <skip />
+ <!-- no translation found for add_to_bookmarks_menu_option (4449323955122214389) -->
+ <skip />
+ <!-- no translation found for add_to_homescreen_menu_option (1461447829242963790) -->
+ <skip />
+ <!-- no translation found for add_to_other_folder_menu_option (5450890093372998187) -->
+ <skip />
+ <!-- outdated translation 5990326151488445481 --> <string name="name" msgid="5462672162695365387">"ชื่อ"</string>
+ <string name="http" msgid="2163722670597250102">"http://"</string>
+ <!-- outdated translation 4680844117598293907 --> <string name="save_to_bookmarks" msgid="6101482434920313244">"บุ๊กมาร์ก"</string>
+ <!-- no translation found for bookmark_this_page (7530739804320811054) -->
+ <skip />
+ <string name="edit_bookmark" msgid="5024089053490231905">"แก้ไขบุ๊กมาร์ก"</string>
+ <!-- outdated translation 9202323987633899835 --> <string name="create_shortcut_bookmark" msgid="1995095662095484289">"เพิ่มทางลัดไปหน้าแรก"</string>
+ <string name="open_bookmark" msgid="8473581305759935790">"เปิด"</string>
+ <string name="remove_bookmark" msgid="8407495852801410891">"ลบบุ๊กมาร์ก"</string>
+ <string name="remove_from_bookmarks" msgid="4374080666576982775">"นำออกจากบุ๊กมาร์ก"</string>
+ <string name="remove_history_item" msgid="5021424935726728618">"นำออกจากประวัติ"</string>
+ <string name="set_as_homepage" msgid="4752937379414905560">"ตั้งเป็นหน้าแรก"</string>
+ <string name="bookmark_saved" msgid="2766434679871317557">"บันทึกไว้ในบุ๊กมาร์กแล้ว"</string>
+ <string name="bookmark_not_saved" msgid="700600955089376724">"บันทึกบุ๊กมาร์กไม่ได้"</string>
+ <string name="homepage_set" msgid="8768087280310966395">"ตั้งค่าหน้าแรกแล้ว"</string>
+ <string name="bookmark_needs_title" msgid="6245900436119218187">"บุ๊กมาร์กต้องมีชื่อ"</string>
+ <string name="bookmark_needs_url" msgid="7809876865972755158">"บุ๊กมาร์กต้องมีตำแหน่ง"</string>
+ <string name="bookmark_url_not_valid" msgid="6719785633980202419">"URL ไม่ถูกต้อง"</string>
+ <string name="bookmark_cannot_save_url" msgid="791722768778386941">"ไม่สามารถบุ๊กมาร์ก URL นี้ได้"</string>
+ <string name="delete_bookmark" msgid="2422989994934201992">"ลบ"</string>
+ <string name="bookmark_page" msgid="6845189305130307274">"บุ๊กมาร์กหน้าที่เพิ่งดูล่าสุด"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
+ <string name="current_page" msgid="7510129573681663135">"จาก "</string>
+ <string name="delete_bookmark_warning" msgid="758043186202032205">"บุ๊กมาร์ก \"<xliff:g id="BOOKMARK">%s</xliff:g>\" จะถูกลบ"</string>
+ <string name="open_in_new_window" msgid="6596775546468054510">"เปิดในหน้าต่างใหม่"</string>
+ <string name="goto_dot" msgid="3895839050522602723">"ไป"</string>
+ <!-- no translation found for incognito_tab (5419458065370134289) -->
+ <skip />
+ <string name="select_dot" msgid="6299170761900561967">"เลือกข้อความ"</string>
+ <string name="tab_picker_title" msgid="864478399057782913">"หน้าต่างปัจจุบัน"</string>
+ <string name="tab_picker_remove_tab" msgid="630087809802479397">"ปิด"</string>
+ <string name="bookmarks" msgid="1961279134885867815">"บุ๊กมาร์ก"</string>
+ <string name="shortcut_bookmark" msgid="3974876480401135895">"บุ๊กมาร์ก"</string>
+ <string name="history" msgid="2451240511251410032">"ประวัติ"</string>
+ <string name="menu_view_download" msgid="2124570321712995120">"สิ่งที่ดาวน์โหลด"</string>
+ <string name="copy_page_url" msgid="7635062169011319208">"คัดลอก URL หน้าเว็บ"</string>
+ <string name="share_page" msgid="593756995297268343">"แบ่งปันหน้าเว็บ"</string>
+ <!-- no translation found for menu_save_webarchive (3934652434001459581) -->
+ <skip />
+ <!-- no translation found for webarchive_saved (7045250341467345007) -->
+ <skip />
+ <!-- no translation found for webarchive_failed (2880998204746620260) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
+ <string name="contextmenu_openlink" msgid="7237961252214188935">"เปิด"</string>
+ <string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"เปิดในหน้าต่างใหม่"</string>
+ <string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"ลิงก์บุ๊กมาร์ก"</string>
+ <string name="contextmenu_savelink" msgid="5508554930832538184">"บันทึกลิงก์"</string>
+ <string name="contextmenu_sharelink" msgid="5392275392280130331">"แบ่งปันลิงก์"</string>
+ <string name="contextmenu_copy" msgid="398860586635404030">"คัดลอก"</string>
+ <string name="contextmenu_copylink" msgid="5153657160294534270">"คัดลอก URL ของลิงก์"</string>
+ <string name="contextmenu_download_image" msgid="4243829645180686912">"บันทึกภาพ"</string>
+ <string name="contextmenu_view_image" msgid="3870625602053600905">"ดูภาพ"</string>
+ <string name="contextmenu_set_wallpaper" msgid="3691902960115350686">"ตั้งเป็นวอลเปเปอร์"</string>
+ <string name="contextmenu_dial_dot" msgid="5856550683415933806">"โทร..."</string>
+ <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="clear" msgid="7070043081700011461">"ล้าง"</string>
+ <string name="replace" msgid="4843033491070384047">"แทนที่"</string>
+ <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"บุ๊กมาร์ก"</string>
+ <string name="menu_preferences" msgid="6709237687234102240">"การตั้งค่า"</string>
+ <string name="pref_content_title" msgid="722227111894838633">"การตั้งค่าเนื้อหาหน้าเว็บ"</string>
+ <string name="pref_content_load_images" msgid="2125616852957377561">"โหลดภาพ"</string>
+ <string name="pref_content_load_images_summary" msgid="5055874125248398584">"แสดงรูปภาพบนหน้าเว็บ"</string>
+ <string name="pref_content_block_popups" msgid="7808433807197256726">"ปิดกั้นหน้าต่างป๊อปอัป"</string>
+ <string name="pref_content_javascript" msgid="4570972030299516843">"เปิดการใช้งาน JavaScript"</string>
+ <string name="pref_content_open_in_background" msgid="824123779725118663">"เปิดในพื้นหลัง"</string>
+ <string name="pref_content_plugins" msgid="7231944644794301582">"เปิดการใช้งานปลั๊กอิน"</string>
+ <string-array name="pref_content_plugins_choices">
+ <item msgid="6745108155096660725">"เปิดใช้เสมอ"</item>
+ <item msgid="2484126708670016519">"ตามคำขอ"</item>
+ <item msgid="8547442717307793863">"ปิด"</item>
+ </string-array>
+ <string name="pref_content_open_in_background_summary" msgid="1737664075721181678">"เปิดหน้าต่างใหม่ใต้หน้าต่างปัจจุบัน"</string>
+ <string name="pref_content_homepage" msgid="6082437160778559806">"ตั้งค่าหน้าแรก"</string>
+ <!-- no translation found for pref_content_search_engine (1620101310821644144) -->
+ <skip />
+ <!-- no translation found for pref_content_search_engine_summary (5162667665858487316) -->
+ <skip />
+ <!-- no translation found for pref_set_homepage_to (7196350233061395098) -->
+ <skip />
+ <!-- outdated translation 1493179933653044553 --> <string name="pref_use_current" msgid="1778622474040406672">"ใช้หน้าปัจจุบัน"</string>
+ <!-- no translation found for pref_use_blank (8503238592551111169) -->
+ <skip />
+ <!-- no translation found for pref_use_default (192587563274735878) -->
+ <skip />
+ <string name="pref_content_autofit" msgid="8260474534053660809">"ปรับหน้าให้พอดีอัตโนมัติ"</string>
+ <string name="pref_content_autofit_summary" msgid="4587831659894879986">"ปรับรูปแบบหน้าเว็บให้พอดีกับหน้าจอ"</string>
+ <!-- no translation found for pref_personal_title (1447687455755683695) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome (1695182180332194033) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome_summary (7414133931827321055) -->
+ <skip />
+ <!-- no translation found for pref_personal_google_account (952360133341490071) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks (59237515966184432) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks_summary (4791767605662205482) -->
+ <skip />
+ <!-- no translation found for pref_personal_start_syncing (6046972042512655232) -->
+ <skip />
+ <!-- no translation found for pref_personal_account_dialog_title (1390867119887955530) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled (1174197447388234595) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled_summary (422640696197018914) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor (1350709161524642663) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor_summary (6748434431641768870) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_name (8566130291459685955) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_email_address (7967585896612797173) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_company_name (2813443159949210417) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1 (836433242509243081) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1_hint (5965659598509327172) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2 (8194745202893822479) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2_hint (2048330295853546405) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_city (4193225955409148508) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_state (8549739922338171458) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_zip_code (283668573295656671) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_country (7234470301239156656) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_phone_number (4938852821413729276) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_save_profile (8349915287435262888) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_save (6834102203944938409) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_delete (2421442112954362732) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_delete_profile (7112035941146003753) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
+ <string name="pref_privacy_title" msgid="1052470980370846151">"การตั้งค่าข้อมูลส่วนบุคคล"</string>
+ <string name="pref_privacy_clear_cache" msgid="3380316479925886998">"ล้างแคช"</string>
+ <string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"ล้างเนื้อหาและฐานข้อมูลที่เก็บไว้ในเครื่อง"</string>
+ <string name="pref_privacy_clear_cache_dlg" msgid="5541011591300753881">"เนื้อหาและฐานข้อมูลที่เก็บไว้ในเครื่องจะถูกลบ"</string>
+ <string name="pref_privacy_clear_cookies" msgid="3095583579133780331">"ล้างข้อมูลคุกกี้ทั้งหมด"</string>
+ <string name="pref_privacy_clear_cookies_summary" msgid="6962742063990677520">"ล้างคุกกี้ทั้งหมดของเบราว์เซอร์"</string>
+ <string name="pref_privacy_clear_cookies_dlg" msgid="552855688091432682">"คุกกี้ทั้งหมดจะถูกลบ"</string>
+ <string name="pref_privacy_clear_history" msgid="8723795508825198477">"ล้างประวัติ"</string>
+ <string name="pref_privacy_clear_history_summary" msgid="6868501330708940734">"ล้างประวัติการนำทางเบราว์เซอร์"</string>
+ <string name="pref_privacy_clear_history_dlg" msgid="544903007914753853">"ประวัติการนำทางของเบราว์เซอร์จะถูกลบ"</string>
+ <string name="pref_privacy_clear_form_data" msgid="4232668196344383987">"ล้างข้อมูลในฟอร์ม"</string>
+ <string name="pref_privacy_clear_form_data_summary" msgid="1790390894719517167">"ล้างข้อมูลในฟอร์มที่บันทึกไว้ทั้งหมด"</string>
+ <string name="pref_privacy_clear_form_data_dlg" msgid="4443621086781197928">"ข้อมูลในฟอร์มที่บันทึกไว้ทั้งหมดจะถูกลบ"</string>
+ <string name="pref_privacy_clear_passwords" msgid="4750234112289277480">"ล้างรหัสผ่าน"</string>
+ <string name="pref_privacy_clear_passwords_summary" msgid="8856782718942903335">"ล้างรหัสผ่านที่บันทึกไว้ทั้งหมด"</string>
+ <string name="pref_privacy_clear_passwords_dlg" msgid="2083869328824248255">"รหัสผ่านทั้งหมดที่บันทึกไว้จะถูกลบ"</string>
+ <string name="pref_privacy_enable_geolocation" msgid="1395040170290765686">"เปิดการใช้งานตำแหน่ง"</string>
+ <string name="pref_privacy_enable_geolocation_summary" msgid="8437020934664306205">"อนุญาตให้ไซต์ขอเข้าถึงตำแหน่งของคุณ"</string>
+ <string name="pref_privacy_clear_geolocation_access" msgid="6649680770030042980">"ล้างการเข้าถึงตำแหน่ง"</string>
+ <string name="pref_privacy_clear_geolocation_access_summary" msgid="7750143359497314679">"ล้างการเข้าถึงตำแหน่งสำหรับทุกเว็บไซต์"</string>
+ <string name="pref_privacy_clear_geolocation_access_dlg" msgid="7327063124488827244">"ล้างการเข้าถึงตำแหน่งสำหรับทุกเว็บไซต์"</string>
+ <string name="pref_security_title" msgid="5763978646932160021">"การตั้งค่าความปลอดภัย"</string>
+ <string name="pref_security_remember_passwords" msgid="6492957683454529549">"จำรหัสผ่าน"</string>
+ <string name="pref_security_remember_passwords_summary" msgid="256388703356349137">"บันทึกชื่อผู้ใช้และรหัสผ่านสำหรับเว็บไซต์"</string>
+ <string name="pref_security_save_form_data" msgid="1213669802810198893">"จำข้อมูลในฟอร์ม"</string>
+ <string name="pref_security_save_form_data_summary" msgid="4994074685153708026">"จำข้อมูลที่ฉันพิมพ์ในฟอร์มสำหรับใช้ในภายหลัง"</string>
+ <string name="pref_security_show_security_warning" msgid="8901135676266754559">"แสดงคำเตือนเกี่ยวกับความปลอดภัย"</string>
+ <string name="pref_security_show_security_warning_summary" msgid="8968906112720511704">"แสดงคำเตือนหากมีปัญหาเกี่ยวกับความปลอดภัยของไซต์"</string>
+ <string name="pref_security_accept_cookies" msgid="3201367661925047989">"ยอมรับคุกกี้"</string>
+ <string name="pref_security_accept_cookies_summary" msgid="1465118934875026920">"อนุญาตให้ไซต์บันทึกและอ่านข้อมูล \"คุกกี้\""</string>
+ <string name="pref_text_size" msgid="3827031324346612208">"ขนาดข้อความ"</string>
+ <string-array name="pref_text_size_choices">
+ <item msgid="4952686548944739548">"เล็กมาก"</item>
+ <item msgid="1950030433642671460">"เล็ก"</item>
+ <item msgid="4338347520133294584">"ปกติ"</item>
+ <item msgid="5043128215356351184">"ใหญ่"</item>
+ <item msgid="7201512237890458902">"ใหญ่มาก"</item>
+ </string-array>
+ <string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"ขนาดข้อความ"</string>
+ <string name="pref_default_zoom" msgid="8076142259097187395">"การซูมเริ่มต้น"</string>
+ <string-array name="pref_default_zoom_choices">
+ <item msgid="549583171195154919">"ไกล"</item>
+ <item msgid="5619034257768161024">"ปานกลาง"</item>
+ <item msgid="3840999588443167001">"ปิด"</item>
+ </string-array>
+ <string name="pref_default_zoom_dialogtitle" msgid="6095974367125109021">"การซูมเริ่มต้น"</string>
+ <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="3091250467679722382">"การตั้งค่าขั้นสูง"</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" msgid="8904000515846202110">"รีเซ็ตเป็นค่าเริ่มต้น"</string>
+ <string name="pref_extras_reset_default_summary" msgid="4247870778270414501">"คืนค่าเริ่มต้น"</string>
+ <string name="pref_extras_reset_default_dlg" msgid="6640261575874704022">"การตั้งค่าจะกลับไปเป็นค่าเริ่มต้น"</string>
+ <string name="pref_extras_reset_default_dlg_title" msgid="2250334970728938936">"รีเซ็ตเป็นค่าเริ่มต้น"</string>
+ <string name="pref_development_title" msgid="3263854204533056480">"แก้ไขข้อบกพร่อง"</string>
+ <string name="pref_default_text_encoding" msgid="5742965543955558478">"การเข้ารหัสข้อความ"</string>
+ <!-- no translation found for pref_default_text_encoding_choices:7 (2193955365569270096) -->
+ <string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"การเข้ารหัสข้อความ"</string>
+ <string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"ปัญหาการเชื่อมต่อข้อมูล"</string>
+ <string name="browserFrameFileErrorLabel" msgid="8063691502792670367">"ปัญหาเกี่ยวกับไฟล์"</string>
+ <string name="browserFrameFormResubmitLabel" msgid="2685923472682180360">"ยืนยัน"</string>
+ <string name="browserFrameFormResubmitMessage" msgid="2752182215695632138">"หน้าที่คุณพยายามดูมีข้อมูลที่ส่งไปแล้ว (\"POSTDATA\") หากคุณส่งข้อมูลซ้ำ การทำงานของแบบฟอร์มบนหน้านั้น (เช่น การค้นหาหรือซื้อออนไลน์) จะถูกทำซ้ำ"</string>
+ <string name="loadSuspendedTitle" msgid="675991625288706944">"ไม่มีการเชื่อมต่อเครือข่าย"</string>
+ <string name="loadSuspended" msgid="3133656588880851273">"เบราว์เซอร์ไม่สามารถโหลดหน้านี้เนื่องจากไม่มีการเชื่อมต่ออินเทอร์เน็ต"</string>
+ <string name="clear_history" msgid="5998307092715979619">"ล้างประวัติ"</string>
+ <string name="browser_history" msgid="1038987118290272525">"หน้าที่เพิ่งเข้าชมเมื่อเร็วๆ นี้"</string>
+ <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_button_text" msgid="5235226933877634410">"ไป"</string>
+ <string name="search_settings_description" msgid="1422401062529014107">"บุ๊กมาร์กและประวัติเว็บ"</string>
+ <string name="attention" msgid="3473639060042811244">"โปรดทราบ"</string>
+ <string name="popup_window_attempt" msgid="2673111696288657989">"ไซต์นี้กำลังพยายามเปิดหน้าต่างป๊อปอัป"</string>
+ <string name="allow" msgid="1157313689171991335">"อนุญาต"</string>
+ <string name="block" msgid="9172175889884707800">"ปิดกั้น"</string>
+ <string name="too_many_windows_dialog_title" msgid="5175503564948906442">"จำนวนหน้าต่างถึงขีดจำกัดแล้ว"</string>
+ <string name="too_many_windows_dialog_message" msgid="1398571800233959583">"ไม่สามารถเปิดหน้าต่างใหม่ได้เนื่องจากคุณเปิดหน้าต่างถึงจำนวนสูงสุดแล้ว"</string>
+ <string name="too_many_subwindows_dialog_title" msgid="3805453941587725944">"ป๊อปอัปเปิดอยู่แล้ว"</string>
+ <string name="too_many_subwindows_dialog_message" msgid="5827289829907966657">"ไม่สามารถเปิดหน้าต่างป๊อปอัปใหม่ได้เนื่องจากเปิดได้ครั้งละหน้าต่างเท่านั้น"</string>
+ <string name="download_title" msgid="2122874021047565594">"ประวัติการดาวน์โหลด"</string>
+ <string name="download_unknown_filename" msgid="4013465542563652175">"<ไม่รู้จัก>"</string>
+ <string name="download_menu_open" msgid="4888327480367757513">"เปิด"</string>
+ <string name="download_menu_clear" msgid="6264454531553418124">"ล้างจากรายการ"</string>
+ <string name="download_menu_delete" msgid="8815502136393894148">"ลบ"</string>
+ <string name="download_menu_cancel" msgid="2545333007601851574">"ยกเลิกการดาวน์โหลด"</string>
+ <string name="download_menu_cancel_all" msgid="2136550823151999166">"ยกเลิกการดาวน์โหลดทั้งหมด"</string>
+ <string name="download_cancel_dlg_title" msgid="8909108500262799748">"ยกเลิกการดาวน์โหลด"</string>
+ <string name="download_cancel_dlg_msg" msgid="6285389170052357797">"การดาวน์โหลดทั้ง <xliff:g id="DOWNLOAD_COUNT">%d</xliff:g> รายการจะถูกยกเลิกและล้างออกจากประวัติการดาวน์โหลด"</string>
+ <string name="download_delete_file" msgid="5330036497843073249">"ไฟล์จะถูกลบ"</string>
+ <string name="download_file_error_dlg_title" msgid="2693630283595384874">"ไม่มีพื้นที่"</string>
+ <string name="download_file_error_dlg_msg" msgid="5156405410324072471">"ไม่สามารถดาวน์โหลด <xliff:g id="FILENAME">%s</xliff:g> "\n"เพิ่มพื้นที่ว่างบนโทรศัพท์ของคุณ แล้วลองใหม่อีกครั้ง"</string>
+ <string name="download_failed_generic_dlg_title" msgid="6106781095337833391">"การดาวน์โหลดไม่สำเร็จ"</string>
+ <!-- outdated translation 605904452159416792 --> <string name="download_no_sdcard_dlg_title" product="nosdcard" msgid="56777245081568508">"ไม่มีการ์ด SD"</string>
+ <string name="download_no_sdcard_dlg_title" product="default" msgid="605904452159416792">"ไม่มีการ์ด SD"</string>
+ <!-- no translation found for download_no_sdcard_dlg_msg (3144652102051031721) -->
+ <skip />
+ <string name="download_no_sdcard_dlg_msg" product="default" msgid="2616399456116301518">"ต้องมีการ์ด SD เพื่อดาวน์โหลด <xliff:g id="FILENAME">%s</xliff:g>"</string>
+ <!-- outdated translation 6877712666046917741 --> <string name="download_sdcard_busy_dlg_title" product="nosdcard" msgid="8081445664689818973">"การ์ด SD ใช้งานไม่ได้"</string>
+ <string name="download_sdcard_busy_dlg_title" product="default" msgid="6877712666046917741">"การ์ด SD ใช้งานไม่ได้"</string>
+ <!-- outdated translation 3473883538192835204 --> <string name="download_sdcard_busy_dlg_msg" product="nosdcard" msgid="3979329954835690147">"การ์ด SD ไม่ว่าง หากต้องการอนุญาตให้ดาวน์โหลด เลือก \"ปิดพื้นที่จัดเก็บ USB\" ในการแจ้งเตือน"</string>
+ <string name="download_sdcard_busy_dlg_msg" product="default" msgid="3473883538192835204">"การ์ด SD ไม่ว่าง หากต้องการอนุญาตให้ดาวน์โหลด เลือก \"ปิดพื้นที่จัดเก็บ USB\" ในการแจ้งเตือน"</string>
+ <string name="download_no_application_title" msgid="1286056729168874295">"ไม่สามารถเปิดไฟล์ได้"</string>
+ <string name="retry" msgid="1835923075542266721">"ลองอีกครั้ง"</string>
+ <string name="no_downloads" msgid="3947445710685021498">"ประวัติการดาวน์โหลดว่างเปล่า"</string>
+ <string name="download_error" msgid="413496839831257187">"การดาวน์โหลดไม่สำเร็จ"</string>
+ <string name="download_success" msgid="2279041638155595203">"ดาวน์โหลด <xliff:g id="FILE">%s</xliff:g> เสร็จสมบูรณ์"</string>
+ <string name="download_running" msgid="2622942231322015059">"กำลังดาวน์โหลด..."</string>
+ <string name="download_pending" msgid="2599683668575349559">"เริ่มต้นดาวน์โหลด…"</string>
+ <string name="download_pending_network" msgid="6548714525679461053">"กำลังรอการเชื่อมต่อข้อมูล..."</string>
+ <string name="download_running_paused" msgid="6418029352085656495">"กำลังรอการเชื่อมต่อข้อมูล..."</string>
+ <string name="download_canceled" msgid="6057083743144492515">"การดาวน์โหลดถูกยกเลิก"</string>
+ <string name="download_not_acceptable" msgid="313769696131563652">"ไม่สามารถดาวน์โหลดได้เนื่องจากเนื้อหาไม่ได้รับการสนับสนุนบนโทรศัพท์นี้"</string>
+ <string name="download_file_error" msgid="1206648050615176113">"ไม่สามารถดาวน์โหลดได้เสร็จสิ้นเนื่องจากมีพื้นที่ไม่พอ"</string>
+ <string name="download_length_required" msgid="9038605488460437406">"ไม่สามารถดาวน์โหลดได้เนื่องจากไม่ทราบขนาดรายการ"</string>
+ <string name="download_precondition_failed" msgid="8327584102874295580">"การดาวน์โหลดขัดข้อง ไม่สามารถดำเนินการต่อได้"</string>
+ <string name="search_the_web" msgid="6046130189241962337">"ค้นหาเว็บ"</string>
+ <string name="webstorage_outofspace_notification_title" msgid="1160474608059771788">"พื้นที่จัดเก็บของเบราว์เซอร์เต็ม"</string>
+ <string name="webstorage_outofspace_notification_text" msgid="7341075135051829692">"คลิกเพื่อเพิ่มพื้นที่ว่าง"</string>
+ <string name="webstorage_clear_data_title" msgid="689484577124333977">"ล้างข้อมูลที่เก็บไว้"</string>
+ <string name="webstorage_clear_data_dialog_title" msgid="345457466368974706">"ล้างข้อมูลที่เก็บไว้"</string>
+ <string name="webstorage_clear_data_dialog_message" msgid="6678281256970470125">"ข้อมูลทั้งหมดที่จัดเก็บโดยเว็บไซต์นี้จะถูกลบ"</string>
+ <string name="webstorage_clear_data_dialog_ok_button" msgid="2516563534211898636">"ล้างทั้งหมด"</string>
+ <string name="webstorage_clear_data_dialog_cancel_button" msgid="2028867751958942762">"ยกเลิก"</string>
+ <string name="webstorage_origin_summary_mb_stored" msgid="1985885826292236210">"MB ที่จัดเก็บบนโทรศัพท์ของคุณ"</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_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_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>
+ <string name="geolocation_settings_page_dialog_title" msgid="1549842043381347668">"ล้างการเข้าถึงตำแหน่ง"</string>
+ <string name="geolocation_settings_page_dialog_message" msgid="7586671987576403993">"การเข้าถึงตำแหน่งสำหรับเว็บไซต์นี้จะถูกล้าง"</string>
+ <string name="geolocation_settings_page_dialog_ok_button" msgid="4789434178048077287">"ล้างการเข้าถึง"</string>
+ <string name="geolocation_settings_page_dialog_cancel_button" msgid="7941036504673409747">"ยกเลิก"</string>
+ <string name="website_settings_clear_all" msgid="8739804325997655980">"ล้างทั้งหมด"</string>
+ <string name="website_settings_clear_all_dialog_title" msgid="7791826325122461718">"ต้องการล้างการตั้งค่าเว็บไซต์ทั้งหมดหรือไม่"</string>
+ <string name="website_settings_clear_all_dialog_message" msgid="6150502090601476333">"ข้อมูลเว็บไซต์และการอนุญาตให้เข้าถึงตำแหน่งทั้งหมดจะถูกลบ"</string>
+ <string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"ลบข้อมูลทั้งหมด"</string>
+ <string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"ยกเลิก"</string>
+ <string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"กำลังตั้งค่าวอลเปเปอร์..."</string>
+ <!-- no translation found for defaultBookmarksUpButton (2303951020715704735) -->
+ <skip />
+ <!-- no translation found for empty_bookmarks_folder (7843361614634930942) -->
+ <skip />
+ <!-- no translation found for rlz_access_point (7165847807377650632) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_title (3325557652271172128) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_description (2187665745413495303) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_remove (8105572409059113340) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_import (6933613853573899218) -->
+ <skip />
+</resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
new file mode 100644
index 0000000..81004aa
--- /dev/null
+++ b/res/values-tl/strings.xml
@@ -0,0 +1,401 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2007 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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="application_name" msgid="1935869255545976415">"Browser"</string>
+ <string name="choose_upload" msgid="3649366287575002063">"Pumili ng file para sa pag-upload"</string>
+ <string name="new_tab" msgid="4505722538297295141">"Bagong window"</string>
+ <!-- no translation found for new_incognito_tab (5821404839654751753) -->
+ <skip />
+ <string name="active_tabs" msgid="3050623868203544623">"Windows"</string>
+ <string name="tab_bookmarks" msgid="2305793036003473653">"Mga Bookmark"</string>
+ <string name="tab_most_visited" msgid="1077402532455000703">"Pinaka-binibisita"</string>
+ <string name="tab_history" msgid="1979267558744613746">"Kasaysayan"</string>
+ <string name="added_to_bookmarks" msgid="1020224130695956728">"Idinagdag sa mga bookmark"</string>
+ <string name="removed_from_bookmarks" msgid="6063705902028438800">"Inalis mula sa mga bookmark"</string>
+ <string name="sign_in_to" msgid="5939425800148759165">"Mag-sign in sa <xliff:g id="HOSTNAME">%s1</xliff:g> \"<xliff:g id="REALM">%s2</xliff:g>\""</string>
+ <string name="username" msgid="5057566336518215922">"Pangalan"</string>
+ <string name="password" msgid="1177138552305184404">"Password"</string>
+ <string name="action" msgid="183105774472071343">"Mag-sign in"</string>
+ <string name="bookmarks_search" msgid="5229596268214362873">"Browser"</string>
+ <string name="cancel" msgid="3017274947407233702">"Kanselahin"</string>
+ <string name="ok" msgid="1509280796718850364">"OK"</string>
+ <string name="title_bar_loading" msgid="7438217780834640678">"Naglo-load…"</string>
+ <string name="page_info" msgid="4048529256302257195">"Impormasyon ng pahina"</string>
+ <string name="page_info_view" msgid="5303490449842635158">"Tingnan ang impormasyon ng pahina"</string>
+ <string name="page_info_address" msgid="2222306609532903254">"Address:"</string>
+ <string name="ssl_warnings_header" msgid="79744901983636370">"May mga problema sa certificate na pangseguridad para sa site na ito."</string>
+ <string name="ssl_continue" msgid="8031515015829358457">"Magpatuloy"</string>
+ <string name="security_warning" msgid="6607795404322797541">"Babala sa seguridad"</string>
+ <string name="view_certificate" msgid="1472768887529093862">"Tingnan ang certificate"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
+ <string name="ssl_untrusted" msgid="5369967226521102194">"Hindi nagmula ang certificate na ito sa isang pinagkakatiwalaang kinauukulan."</string>
+ <string name="ssl_mismatch" msgid="558688832420069896">"Hindi tumutugma ang pangalan ng site sa pangalan sa certificate."</string>
+ <string name="ssl_expired" msgid="5739349389499575559">"Nag-expire na ang certificate na ito."</string>
+ <string name="ssl_not_yet_valid" msgid="2893167846212645846">"Hindi pa wasto ang certificate na ito."</string>
+ <string name="ssl_certificate" msgid="5226747157992111668">"Certificate na pangseguridad"</string>
+ <string name="ssl_certificate_is_valid" msgid="7096160815933145579">"Wasto ang certificate na ito."</string>
+ <string name="issued_to" msgid="9032338008819841339">"Ibinigay kay:"</string>
+ <string name="common_name" msgid="5745530093500062357">"Karaniwang pangalan:"</string>
+ <string name="org_name" msgid="8868889052889991293">"Samahan:"</string>
+ <string name="org_unit" msgid="4489056376307768196">"Unit na pangsamahan:"</string>
+ <string name="issued_by" msgid="6959484326943152487">"Ibinigay ni:"</string>
+ <string name="validity_period" msgid="57988851973181309">"Pagpapatunay:"</string>
+ <string name="issued_on" msgid="2082890654801808368">"Ibinigay noong:"</string>
+ <string name="expires_on" msgid="8061200430557020704">"Mag-e-expire sa:"</string>
+ <string name="stopping" msgid="4839698519340302982">"Tumitigil..."</string>
+ <string name="stop" msgid="5687251076030630074">"Huminto"</string>
+ <string name="reload" msgid="8585220783228408062">"I-refresh"</string>
+ <string name="back" msgid="8414603107175713668">"Bumalik"</string>
+ <string name="forward" msgid="4288210890526641577">"Ipasa"</string>
+ <string name="save" msgid="5922311934992468496">"OK"</string>
+ <string name="do_not_save" msgid="6777633870113477714">"Kanselahin"</string>
+ <!-- outdated translation 969988560160364559 --> <string name="location" msgid="3411848697912600125">"Lokasyon"</string>
+ <!-- no translation found for containing_folder (6771180232953030479) -->
+ <skip />
+ <!-- no translation found for new_folder (7743540149088867917) -->
+ <skip />
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <!-- no translation found for no_subfolders (5880411440592452802) -->
+ <skip />
+ <!-- no translation found for add_to_bookmarks_menu_option (4449323955122214389) -->
+ <skip />
+ <!-- no translation found for add_to_homescreen_menu_option (1461447829242963790) -->
+ <skip />
+ <!-- no translation found for add_to_other_folder_menu_option (5450890093372998187) -->
+ <skip />
+ <!-- outdated translation 5990326151488445481 --> <string name="name" msgid="5462672162695365387">"Pangalan"</string>
+ <string name="http" msgid="2163722670597250102">"http://"</string>
+ <!-- outdated translation 588165100024086565 --> <string name="save_to_bookmarks" msgid="6101482434920313244">"Magdagdag ng bookmark"</string>
+ <!-- no translation found for bookmark_this_page (7530739804320811054) -->
+ <skip />
+ <string name="edit_bookmark" msgid="5024089053490231905">"I-edit ang bookmark"</string>
+ <!-- outdated translation 9202323987633899835 --> <string name="create_shortcut_bookmark" msgid="1995095662095484289">"Magdagdag ng shortcut sa Home"</string>
+ <string name="open_bookmark" msgid="8473581305759935790">"Buksan"</string>
+ <string name="remove_bookmark" msgid="8407495852801410891">"Tanggalin ang bookmark"</string>
+ <string name="remove_from_bookmarks" msgid="4374080666576982775">"Alisin mula sa mga bookmark"</string>
+ <string name="remove_history_item" msgid="5021424935726728618">"Alisin mula sa kasaysayan"</string>
+ <string name="set_as_homepage" msgid="4752937379414905560">"Itakda bilang homepage"</string>
+ <string name="bookmark_saved" msgid="2766434679871317557">"Na-save sa mga bookmark."</string>
+ <string name="bookmark_not_saved" msgid="700600955089376724">"Hindi nagawang i-save ang bookmark."</string>
+ <string name="homepage_set" msgid="8768087280310966395">"Naitakda ang homepage."</string>
+ <string name="bookmark_needs_title" msgid="6245900436119218187">"Dapat na may pangalan ang bookmark."</string>
+ <string name="bookmark_needs_url" msgid="7809876865972755158">"Dapat na may lokasyon ang bookmark."</string>
+ <string name="bookmark_url_not_valid" msgid="6719785633980202419">"Hindi wasto ang URL."</string>
+ <string name="bookmark_cannot_save_url" msgid="791722768778386941">"Hindi mabu-bookmark ang URL na ito."</string>
+ <string name="delete_bookmark" msgid="2422989994934201992">"Tanggalin"</string>
+ <string name="bookmark_page" msgid="6845189305130307274">"I-bookmark ang huling tiningnang pahina"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
+ <string name="current_page" msgid="7510129573681663135">"mula sa "</string>
+ <string name="delete_bookmark_warning" msgid="758043186202032205">"Tatanggalin ang bookmark na \"<xliff:g id="BOOKMARK">%s</xliff:g>\"."</string>
+ <string name="open_in_new_window" msgid="6596775546468054510">"Buksan sa bagong window"</string>
+ <string name="goto_dot" msgid="3895839050522602723">"Pumunta"</string>
+ <!-- no translation found for incognito_tab (5419458065370134289) -->
+ <skip />
+ <string name="select_dot" msgid="6299170761900561967">"Pumili ng teksto"</string>
+ <string name="tab_picker_title" msgid="864478399057782913">"Kasalukuyang windows"</string>
+ <string name="tab_picker_remove_tab" msgid="630087809802479397">"Isara"</string>
+ <string name="bookmarks" msgid="1961279134885867815">"Mga Bookmark"</string>
+ <string name="shortcut_bookmark" msgid="3974876480401135895">"Bookmark"</string>
+ <string name="history" msgid="2451240511251410032">"Kasaysayan"</string>
+ <string name="menu_view_download" msgid="2124570321712995120">"Mga Pag-download"</string>
+ <string name="copy_page_url" msgid="7635062169011319208">"Kopyahin ang url ng pahina"</string>
+ <string name="share_page" msgid="593756995297268343">"Ibahagi ang pahina"</string>
+ <!-- no translation found for menu_save_webarchive (3934652434001459581) -->
+ <skip />
+ <!-- no translation found for webarchive_saved (7045250341467345007) -->
+ <skip />
+ <!-- no translation found for webarchive_failed (2880998204746620260) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
+ <string name="contextmenu_openlink" msgid="7237961252214188935">"Buksan"</string>
+ <string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"Buksan sa bagong window"</string>
+ <string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"I-bookmark ang link"</string>
+ <string name="contextmenu_savelink" msgid="5508554930832538184">"I-save ang link"</string>
+ <string name="contextmenu_sharelink" msgid="5392275392280130331">"Ibahagi ang link"</string>
+ <string name="contextmenu_copy" msgid="398860586635404030">"Kopyahin"</string>
+ <string name="contextmenu_copylink" msgid="5153657160294534270">"Kopyahin ang link na URL"</string>
+ <string name="contextmenu_download_image" msgid="4243829645180686912">"I-save ang larawan"</string>
+ <string name="contextmenu_view_image" msgid="3870625602053600905">"Tingnan ang larawan"</string>
+ <string name="contextmenu_set_wallpaper" msgid="3691902960115350686">"Itakda bilang wallpaper"</string>
+ <string name="contextmenu_dial_dot" msgid="5856550683415933806">"I-dial…"</string>
+ <string name="contextmenu_add_contact" msgid="3183511922223645716">"Magdagdag ng contact"</string>
+ <string name="contextmenu_send_mail" msgid="1014513374828775660">"Magpadala ng email"</string>
+ <string name="contextmenu_map" msgid="7471390435434034912">"Mapa"</string>
+ <string name="choosertitle_sharevia" msgid="4600490613341909086">"Ibahagi sa pamamagitan ng"</string>
+ <string name="clear" msgid="7070043081700011461">"I-clear"</string>
+ <string name="replace" msgid="4843033491070384047">"Palitan"</string>
+ <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Mga Bookmark"</string>
+ <string name="menu_preferences" msgid="6709237687234102240">"Mga Setting"</string>
+ <string name="pref_content_title" msgid="722227111894838633">"Mga setting ng nilalaman ng pahina"</string>
+ <string name="pref_content_load_images" msgid="2125616852957377561">"I-load ang mga larawan"</string>
+ <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Ipakita ang mga larawan sa mga web page"</string>
+ <string name="pref_content_block_popups" msgid="7808433807197256726">"I-block ang mga pop-up window"</string>
+ <string name="pref_content_javascript" msgid="4570972030299516843">"Paganahin ang JavaScript"</string>
+ <string name="pref_content_open_in_background" msgid="824123779725118663">"Buksan sa background"</string>
+ <string name="pref_content_plugins" msgid="7231944644794301582">"Paganahin ang mga plug-in"</string>
+ <string-array name="pref_content_plugins_choices">
+ <item msgid="6745108155096660725">"Palaging naka-on"</item>
+ <item msgid="2484126708670016519">"Sa kahilingan"</item>
+ <item msgid="8547442717307793863">"Naka-off"</item>
+ </string-array>
+ <string name="pref_content_open_in_background_summary" msgid="1737664075721181678">"Buksan ang bagong windows sa likuran ng kasalukuyang isa"</string>
+ <string name="pref_content_homepage" msgid="6082437160778559806">"Itakda ang home page"</string>
+ <!-- no translation found for pref_content_search_engine (1620101310821644144) -->
+ <skip />
+ <!-- no translation found for pref_content_search_engine_summary (5162667665858487316) -->
+ <skip />
+ <!-- no translation found for pref_set_homepage_to (7196350233061395098) -->
+ <skip />
+ <!-- outdated translation 1493179933653044553 --> <string name="pref_use_current" msgid="1778622474040406672">"Gamitin ang kasalukuyang pahina"</string>
+ <!-- no translation found for pref_use_blank (8503238592551111169) -->
+ <skip />
+ <!-- no translation found for pref_use_default (192587563274735878) -->
+ <skip />
+ <string name="pref_content_autofit" msgid="8260474534053660809">"Mga auto-fit na pahina"</string>
+ <string name="pref_content_autofit_summary" msgid="4587831659894879986">"I-format ang mga web page upang iakma sa screen"</string>
+ <!-- no translation found for pref_personal_title (1447687455755683695) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome (1695182180332194033) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome_summary (7414133931827321055) -->
+ <skip />
+ <!-- no translation found for pref_personal_google_account (952360133341490071) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks (59237515966184432) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks_summary (4791767605662205482) -->
+ <skip />
+ <!-- no translation found for pref_personal_start_syncing (6046972042512655232) -->
+ <skip />
+ <!-- no translation found for pref_personal_account_dialog_title (1390867119887955530) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled (1174197447388234595) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled_summary (422640696197018914) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor (1350709161524642663) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor_summary (6748434431641768870) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_name (8566130291459685955) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_email_address (7967585896612797173) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_company_name (2813443159949210417) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1 (836433242509243081) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1_hint (5965659598509327172) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2 (8194745202893822479) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2_hint (2048330295853546405) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_city (4193225955409148508) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_state (8549739922338171458) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_zip_code (283668573295656671) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_country (7234470301239156656) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_phone_number (4938852821413729276) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_save_profile (8349915287435262888) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_save (6834102203944938409) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_delete (2421442112954362732) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_delete_profile (7112035941146003753) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
+ <string name="pref_privacy_title" msgid="1052470980370846151">"Mga setting ng privacy"</string>
+ <string name="pref_privacy_clear_cache" msgid="3380316479925886998">"I-clear ang cache"</string>
+ <string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"I-clear ang lokal na naka-cache na nilalaman at mga database"</string>
+ <string name="pref_privacy_clear_cache_dlg" msgid="5541011591300753881">"Tatanggalin ang lokal na na-cache na nilalaman at mga database."</string>
+ <string name="pref_privacy_clear_cookies" msgid="3095583579133780331">"I-clear ang lahat ng data ng cookie"</string>
+ <string name="pref_privacy_clear_cookies_summary" msgid="6962742063990677520">"I-clear ang lahat ng cookies ng browser"</string>
+ <string name="pref_privacy_clear_cookies_dlg" msgid="552855688091432682">"Tatanggalin ang lahat ng cookies."</string>
+ <string name="pref_privacy_clear_history" msgid="8723795508825198477">"I-clear ang kasaysayan"</string>
+ <string name="pref_privacy_clear_history_summary" msgid="6868501330708940734">"I-clear ang kasaysayan ng nabigasyon ng browser"</string>
+ <string name="pref_privacy_clear_history_dlg" msgid="544903007914753853">"Tatanggalin ang kasaysayan ng nabigasyon ng browser."</string>
+ <string name="pref_privacy_clear_form_data" msgid="4232668196344383987">"I-clear ang data ng form"</string>
+ <string name="pref_privacy_clear_form_data_summary" msgid="1790390894719517167">"I-clear ang lahat ng naka-save na data ng form"</string>
+ <string name="pref_privacy_clear_form_data_dlg" msgid="4443621086781197928">"Tatanggalin ang lahat ng naka-save na data ng form."</string>
+ <string name="pref_privacy_clear_passwords" msgid="4750234112289277480">"I-clear ang mga password"</string>
+ <string name="pref_privacy_clear_passwords_summary" msgid="8856782718942903335">"I-clear ang lahat ng mga naka-save na password"</string>
+ <string name="pref_privacy_clear_passwords_dlg" msgid="2083869328824248255">"Tatanggalin ang lahat ng mga naka-save na password."</string>
+ <string name="pref_privacy_enable_geolocation" msgid="1395040170290765686">"Paganahin ang lokasyon"</string>
+ <string name="pref_privacy_enable_geolocation_summary" msgid="8437020934664306205">"Payagan ang mga site na humiling ng access sa iyong lokasyon"</string>
+ <string name="pref_privacy_clear_geolocation_access" msgid="6649680770030042980">"I-clear ang access sa lokasyon"</string>
+ <string name="pref_privacy_clear_geolocation_access_summary" msgid="7750143359497314679">"I-clear ang access ng lokasyon para sa lahat ng mga website"</string>
+ <string name="pref_privacy_clear_geolocation_access_dlg" msgid="7327063124488827244">"I-clear ang access ng lokasyon para sa lahat ng mga website"</string>
+ <string name="pref_security_title" msgid="5763978646932160021">"Mga setting ng seguridad"</string>
+ <string name="pref_security_remember_passwords" msgid="6492957683454529549">"Tandaan ang mga password"</string>
+ <string name="pref_security_remember_passwords_summary" msgid="256388703356349137">"I-save ang mga username at password para sa mga website"</string>
+ <string name="pref_security_save_form_data" msgid="1213669802810198893">"Tandaan ang data ng form"</string>
+ <string name="pref_security_save_form_data_summary" msgid="4994074685153708026">"Tandaan ang data na tina-type ko sa mga form para sa paggamit sa ibang pagkakataon"</string>
+ <string name="pref_security_show_security_warning" msgid="8901135676266754559">"Ipakita ang mga babala sa seguridad"</string>
+ <string name="pref_security_show_security_warning_summary" msgid="8968906112720511704">"Ipakita ang babala kung may problema sa seguridad ng site"</string>
+ <string name="pref_security_accept_cookies" msgid="3201367661925047989">"Tanggapin ang cookies"</string>
+ <string name="pref_security_accept_cookies_summary" msgid="1465118934875026920">"Payagan ang mga site na i-save at basahin ang data ng \"cookie\""</string>
+ <string name="pref_text_size" msgid="3827031324346612208">"Laki ng teksto"</string>
+ <string-array name="pref_text_size_choices">
+ <item msgid="4952686548944739548">"Katiting"</item>
+ <item msgid="1950030433642671460">"Maliit"</item>
+ <item msgid="4338347520133294584">"Normal"</item>
+ <item msgid="5043128215356351184">"Malaki"</item>
+ <item msgid="7201512237890458902">"Malaki"</item>
+ </string-array>
+ <string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Laki ng teksto"</string>
+ <string name="pref_default_zoom" msgid="8076142259097187395">"Default zoom"</string>
+ <string-array name="pref_default_zoom_choices">
+ <item msgid="549583171195154919">"Malayo"</item>
+ <item msgid="5619034257768161024">"Katamtaman"</item>
+ <item msgid="3840999588443167001">"Isara"</item>
+ </string-array>
+ <string name="pref_default_zoom_dialogtitle" msgid="6095974367125109021">"Default zoom"</string>
+ <string name="pref_content_load_page" msgid="2219810141690955452">"Buksan ang mga pahina sa pangkalahatang-ideya"</string>
+ <string name="pref_content_load_page_summary" msgid="8792093504054149369">"Ipakita ang pangkalahatang-ideya ng mga bagong bukas na pahina"</string>
+ <string name="pref_extras_title" msgid="3091250467679722382">"Mga advanced na setting"</string>
+ <string name="pref_extras_website_settings" msgid="67866640052455549">"Mga setting ng website"</string>
+ <string name="pref_extras_website_settings_summary" msgid="1656771443223494406">"Mga advanced na setting para sa mga indibidwal na website"</string>
+ <string name="pref_extras_reset_default" msgid="8904000515846202110">"Itakda muli bilang default"</string>
+ <string name="pref_extras_reset_default_summary" msgid="4247870778270414501">"Ibalik ang mga default na setting"</string>
+ <string name="pref_extras_reset_default_dlg" msgid="6640261575874704022">"Babalik ang mga setting sa mga default na halaga."</string>
+ <string name="pref_extras_reset_default_dlg_title" msgid="2250334970728938936">"Itakda muli bilang default"</string>
+ <string name="pref_development_title" msgid="3263854204533056480">"Debug"</string>
+ <string name="pref_default_text_encoding" msgid="5742965543955558478">"Pag-encode ng teksto"</string>
+ <!-- no translation found for pref_default_text_encoding_choices:7 (2193955365569270096) -->
+ <string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Pag-encode ng teksto"</string>
+ <string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"Problema sa pagkakakonekta ng data"</string>
+ <string name="browserFrameFileErrorLabel" msgid="8063691502792670367">"Problema sa file"</string>
+ <string name="browserFrameFormResubmitLabel" msgid="2685923472682180360">"Kumpirmahin"</string>
+ <string name="browserFrameFormResubmitMessage" msgid="2752182215695632138">"Naglalaman ang pahina na iyong sinusubukang tingnan ng data na naisumite na (\"POSTDATA\"). Kung ipapadala mong muli ang data, uulitin ang anumang pagkilos na isinagawa ng form sa pahina (gaya ng paghahanap o online na pagbili)."</string>
+ <string name="loadSuspendedTitle" msgid="675991625288706944">"Walang koneksyon sa network"</string>
+ <string name="loadSuspended" msgid="3133656588880851273">"Hindi malo-load ng browser ang pahinang ito dahil walang koneksyon sa internet."</string>
+ <string name="clear_history" msgid="5998307092715979619">"I-clear ang kasaysayan"</string>
+ <string name="browser_history" msgid="1038987118290272525">"Mga pahinang binisita kamakailan"</string>
+ <string name="empty_history" msgid="8738772352308207274">"Walang laman ang kasaysayan ng browser."</string>
+ <string name="add_new_bookmark" msgid="8086367791400349049">"Magdagdag ng bookmark..."</string>
+ <string name="add_bookmark_short" msgid="3783984330998103735">"Idagdag"</string>
+ <string name="search_hint" msgid="4647356319916631820">"Hanapin o i-type ang URL"</string>
+ <string name="search_button_text" msgid="5235226933877634410">"Pumunta"</string>
+ <string name="search_settings_description" msgid="1422401062529014107">"Mga bookmark at kasaysayan ng web"</string>
+ <string name="attention" msgid="3473639060042811244">"Bigyang pansin"</string>
+ <string name="popup_window_attempt" msgid="2673111696288657989">"Tinatangka ng site na ito na magbukas ng isang pop-up window."</string>
+ <string name="allow" msgid="1157313689171991335">"Payagan"</string>
+ <string name="block" msgid="9172175889884707800">"I-block"</string>
+ <string name="too_many_windows_dialog_title" msgid="5175503564948906442">"Naabot na ang limitasyon ng window"</string>
+ <string name="too_many_windows_dialog_message" msgid="1398571800233959583">"Hindi makapagbukas ng isang bagong window dahil binuksan mo na ang maximum na bilang."</string>
+ <string name="too_many_subwindows_dialog_title" msgid="3805453941587725944">"Bukas na ang pop-up"</string>
+ <string name="too_many_subwindows_dialog_message" msgid="5827289829907966657">"Hindi makakapagbukas ng bagong pop-up window dahil isa lang ang maaaring buksan anumang oras."</string>
+ <string name="download_title" msgid="2122874021047565594">"Kasaysayan ng pag-download"</string>
+ <string name="download_unknown_filename" msgid="4013465542563652175">"<Hindi Kilala>"</string>
+ <string name="download_menu_open" msgid="4888327480367757513">"Buksan"</string>
+ <string name="download_menu_clear" msgid="6264454531553418124">"I-clear mula sa listahan"</string>
+ <string name="download_menu_delete" msgid="8815502136393894148">"Tanggalin"</string>
+ <string name="download_menu_cancel" msgid="2545333007601851574">"Kanselahin ang pag-download"</string>
+ <string name="download_menu_cancel_all" msgid="2136550823151999166">"Kanselahin ang lahat ng mga download"</string>
+ <string name="download_cancel_dlg_title" msgid="8909108500262799748">"Kanselahin ang mga pag-download"</string>
+ <string name="download_cancel_dlg_msg" msgid="6285389170052357797">"Kakanselahin at iki-clear mula sa kasaysayan ng pag-download ang lahat ng <xliff:g id="DOWNLOAD_COUNT">%d</xliff:g> (na) pag-download."</string>
+ <string name="download_delete_file" msgid="5330036497843073249">"Tatanggalin ang file"</string>
+ <string name="download_file_error_dlg_title" msgid="2693630283595384874">"Wala nang espasyo"</string>
+ <string name="download_file_error_dlg_msg" msgid="5156405410324072471">"Hindi mada-download ang <xliff:g id="FILENAME">%s</xliff:g>."\n" Maglaan ng ilang espasyo sa iyong telepono at subukang muli."</string>
+ <string name="download_failed_generic_dlg_title" msgid="6106781095337833391">"Hindi matagumpay ang pag-download"</string>
+ <!-- outdated translation 605904452159416792 --> <string name="download_no_sdcard_dlg_title" product="nosdcard" msgid="56777245081568508">"Walang SD card"</string>
+ <string name="download_no_sdcard_dlg_title" product="default" msgid="605904452159416792">"Walang SD card"</string>
+ <!-- no translation found for download_no_sdcard_dlg_msg (3144652102051031721) -->
+ <skip />
+ <string name="download_no_sdcard_dlg_msg" product="default" msgid="2616399456116301518">"Kinakailangan ang isang SD card upang i-download ang <xliff:g id="FILENAME">%s</xliff:g>."</string>
+ <!-- outdated translation 6877712666046917741 --> <string name="download_sdcard_busy_dlg_title" product="nosdcard" msgid="8081445664689818973">"Hindi available ang SD card."</string>
+ <string name="download_sdcard_busy_dlg_title" product="default" msgid="6877712666046917741">"Hindi available ang SD card."</string>
+ <!-- outdated translation 3473883538192835204 --> <string name="download_sdcard_busy_dlg_msg" product="nosdcard" msgid="3979329954835690147">"Abala ang SD card. Upang payagan ang mga pag-download, piliin ang \"I-off ang USB storage\" sa notification."</string>
+ <string name="download_sdcard_busy_dlg_msg" product="default" msgid="3473883538192835204">"Abala ang SD card. Upang payagan ang mga pag-download, piliin ang \"I-off ang USB storage\" sa notification."</string>
+ <string name="download_no_application_title" msgid="1286056729168874295">"Hindi mabuksan ang file"</string>
+ <string name="retry" msgid="1835923075542266721">"Subukang muli"</string>
+ <string name="no_downloads" msgid="3947445710685021498">"Walang laman ang kasaysayan ng pag-download."</string>
+ <string name="download_error" msgid="413496839831257187">"Hindi matagumpay ang pag-download."</string>
+ <string name="download_success" msgid="2279041638155595203">"<xliff:g id="FILE">%s</xliff:g> Kumpleto na ang pag-download."</string>
+ <string name="download_running" msgid="2622942231322015059">"Nagda-download..."</string>
+ <string name="download_pending" msgid="2599683668575349559">"Sinisimulan ang pag-download..."</string>
+ <string name="download_pending_network" msgid="6548714525679461053">"Naghihintay para sa koneksyon ng data..."</string>
+ <string name="download_running_paused" msgid="6418029352085656495">"Naghihintay para sa koneksyon ng data..."</string>
+ <string name="download_canceled" msgid="6057083743144492515">"Kinansela ang pag-download."</string>
+ <string name="download_not_acceptable" msgid="313769696131563652">"Hindi makapag-download. Hindi suportado ang nilalaman sa teleponong ito."</string>
+ <string name="download_file_error" msgid="1206648050615176113">"Hindi matatapos ang pag-download. Walang sapat na espasyo."</string>
+ <string name="download_length_required" msgid="9038605488460437406">"Hindi mada-download. Hindi matukoy ang laki ng item."</string>
+ <string name="download_precondition_failed" msgid="8327584102874295580">"Pinigilan ang pag-download. Hindi ito maipapagpatuloy."</string>
+ <string name="search_the_web" msgid="6046130189241962337">"Maghanap sa web"</string>
+ <string name="webstorage_outofspace_notification_title" msgid="1160474608059771788">"Puno na ang imbakan ng browser"</string>
+ <string name="webstorage_outofspace_notification_text" msgid="7341075135051829692">"Mag-click upang maglaan ng espasyo."</string>
+ <string name="webstorage_clear_data_title" msgid="689484577124333977">"I-clear ang nakaimbak na data"</string>
+ <string name="webstorage_clear_data_dialog_title" msgid="345457466368974706">"I-clear ang nakaimbak na data"</string>
+ <string name="webstorage_clear_data_dialog_message" msgid="6678281256970470125">"Tatanggalin ang lahat ng data na nakaimbak sa website na ito"</string>
+ <string name="webstorage_clear_data_dialog_ok_button" msgid="2516563534211898636">"I-clear lahat"</string>
+ <string name="webstorage_clear_data_dialog_cancel_button" msgid="2028867751958942762">"Kanselahin"</string>
+ <string name="webstorage_origin_summary_mb_stored" msgid="1985885826292236210">"Nakaimbak na MB sa iyong telepono"</string>
+ <string name="loading_video" msgid="4887871585216091096">"Nilo-load ang video"</string>
+ <string name="geolocation_permissions_prompt_message" msgid="356796102004052471">"Gustong malaman ng <xliff:g id="WEBSITE_ORIGIN">%s</xliff:g> ang iyong lokasyon"</string>
+ <string name="geolocation_permissions_prompt_share" msgid="9084486342048347976">"Ibahagi ang lokasyon"</string>
+ <string name="geolocation_permissions_prompt_dont_share" msgid="6303025160237860300">"Tanggihan"</string>
+ <string name="geolocation_permissions_prompt_remember" msgid="3118526300707348308">"Tandaan ang kagustuhan"</string>
+ <string name="geolocation_permissions_prompt_toast_allowed" msgid="987286072035125498">"Maa-access ng site na ito ang iyong lokasyon. Baguhin ito sa Mga Setting --> Mga setting ng website"</string>
+ <string name="geolocation_permissions_prompt_toast_disallowed" msgid="7695100950212692515">"Hindi maa-access ng site na ito ang iyong lokasyon. Baguhin ito sa Mga Setting --> Mga setting ng website"</string>
+ <string name="geolocation_settings_page_title" msgid="1745477985097536528">"I-clear ang access sa lokasyon"</string>
+ <string name="geolocation_settings_page_summary_allowed" msgid="9180251524290811398">"Kasalukuyang maa-access ng site na ito ang iyong lokasyon"</string>
+ <string name="geolocation_settings_page_summary_not_allowed" msgid="4589649082203102544">"Kasalukuyang hindi maa-access ng site na ito ang iyong lokasyon"</string>
+ <string name="geolocation_settings_page_dialog_title" msgid="1549842043381347668">"I-clear ang access sa lokasyon"</string>
+ <string name="geolocation_settings_page_dialog_message" msgid="7586671987576403993">"Iki-clear ang access sa lokasyon para sa website na ito."</string>
+ <string name="geolocation_settings_page_dialog_ok_button" msgid="4789434178048077287">"I-clear ang access"</string>
+ <string name="geolocation_settings_page_dialog_cancel_button" msgid="7941036504673409747">"Kanselahin"</string>
+ <string name="website_settings_clear_all" msgid="8739804325997655980">"I-clear lahat"</string>
+ <string name="website_settings_clear_all_dialog_title" msgid="7791826325122461718">"I-clear ang lahat ng mga setting ng website?"</string>
+ <string name="website_settings_clear_all_dialog_message" msgid="6150502090601476333">"Tatanggalin ang lahat ng data ng website at pahintulot sa lokasyon."</string>
+ <string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"Tanggalin ang lahat ng data"</string>
+ <string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"Kanselahin"</string>
+ <string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"Itinatakda ang wallpaper..."</string>
+ <!-- no translation found for defaultBookmarksUpButton (2303951020715704735) -->
+ <skip />
+ <!-- no translation found for empty_bookmarks_folder (7843361614634930942) -->
+ <skip />
+ <!-- no translation found for rlz_access_point (7165847807377650632) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_title (3325557652271172128) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_description (2187665745413495303) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_remove (8105572409059113340) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_import (6933613853573899218) -->
+ <skip />
+</resources>
diff --git a/res/values-tr-xlarge/strings.xml b/res/values-tr-xlarge/strings.xml
new file mode 100644
index 0000000..cf3cf07
--- /dev/null
+++ b/res/values-tr-xlarge/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="new_tab" msgid="7275656655054293038">"Yeni sekme"</string>
+ <string name="new_incognito_tab" msgid="5149742197322201152">"Yeni gizli sekme"</string>
+ <string name="active_tabs" msgid="5324492165541331128">"Sekmeler"</string>
+</resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index e120a3b..3c05969 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -19,6 +19,7 @@
<string name="application_name" msgid="1935869255545976415">"Tarayıcı"</string>
<string name="choose_upload" msgid="3649366287575002063">"Yükleme için dosya seçin"</string>
<string name="new_tab" msgid="4505722538297295141">"Yeni pencere"</string>
+ <string name="new_incognito_tab" msgid="5821404839654751753">"Yeni gizli pencere"</string>
<string name="active_tabs" msgid="3050623868203544623">"Pencereler"</string>
<string name="tab_bookmarks" msgid="2305793036003473653">"Favoriler"</string>
<string name="tab_most_visited" msgid="1077402532455000703">"En çok ziyaret edilenler"</string>
@@ -32,12 +33,6 @@
<string name="bookmarks_search" msgid="5229596268214362873">"Tarayıcı"</string>
<string name="cancel" msgid="3017274947407233702">"İptal"</string>
<string name="ok" msgid="1509280796718850364">"Tamam"</string>
- <plurals name="matches_found">
- <item quantity="zero" msgid="6242659159545399963">"Eşleşme yok"</item>
- <item quantity="one" msgid="4352019729062956802">"1 eşleşme"</item>
- <item quantity="few" msgid="5544267486978946555">"<xliff:g id="NUMBER">%d</xliff:g> eşleşme"</item>
- <item quantity="other" msgid="6616125067364315405">"<xliff:g id="NUMBER">%d</xliff:g> eşleşme"</item>
- </plurals>
<string name="title_bar_loading" msgid="7438217780834640678">"Yükleniyor…"</string>
<string name="page_info" msgid="4048529256302257195">"Sayfa bilgileri"</string>
<string name="page_info_view" msgid="5303490449842635158">"Sayfa bilgilerini görüntüle"</string>
@@ -46,6 +41,8 @@
<string name="ssl_continue" msgid="8031515015829358457">"Devam Et"</string>
<string name="security_warning" msgid="6607795404322797541">"Güvenlik uyarısı"</string>
<string name="view_certificate" msgid="1472768887529093862">"Sertifikayı görüntüle"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
<string name="ssl_untrusted" msgid="5369967226521102194">"Bu sertifika güvenilir bir yetkiliden değil."</string>
<string name="ssl_mismatch" msgid="558688832420069896">"Sitenin adı sertifika üzerindeki adla eşleşmiyor."</string>
<string name="ssl_expired" msgid="5739349389499575559">"Bu sertifikanın süresi dolmuş."</string>
@@ -67,12 +64,23 @@
<string name="forward" msgid="4288210890526641577">"İleri"</string>
<string name="save" msgid="5922311934992468496">"Tamam"</string>
<string name="do_not_save" msgid="6777633870113477714">"İptal"</string>
- <string name="location" msgid="969988560160364559">"Konum"</string>
- <string name="name" msgid="5990326151488445481">"Ad"</string>
+ <string name="location" msgid="3411848697912600125">"Adres"</string>
+ <string name="containing_folder" msgid="6771180232953030479">"Şu klasöre ekle"</string>
+ <string name="new_folder" msgid="7743540149088867917">"Yeni klasör"</string>
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <string name="no_subfolders" msgid="5880411440592452802">"Alt klasör yok"</string>
+ <string name="add_to_bookmarks_menu_option" msgid="4449323955122214389">"Yer işaretleri"</string>
+ <string name="add_to_homescreen_menu_option" msgid="1461447829242963790">"Ana ekran"</string>
+ <string name="add_to_other_folder_menu_option" msgid="5450890093372998187">"Diğer klasör..."</string>
+ <string name="name" msgid="5462672162695365387">"Etiket"</string>
<string name="http" msgid="2163722670597250102">"http://"</string>
- <string name="save_to_bookmarks" msgid="588165100024086565">"Favori ekle"</string>
+ <string name="save_to_bookmarks" msgid="6101482434920313244">"Yer İşaretlerine Ekle"</string>
+ <string name="bookmark_this_page" msgid="7530739804320811054">"Bu sayfaya yer işareti koy"</string>
<string name="edit_bookmark" msgid="5024089053490231905">"Favorileri düzenle"</string>
- <string name="create_shortcut_bookmark" msgid="9202323987633899835">"Ana ekrana kısayol ekle"</string>
+ <string name="create_shortcut_bookmark" msgid="1995095662095484289">"Ana ekrana kısayol ekle"</string>
<string name="open_bookmark" msgid="8473581305759935790">"Aç"</string>
<string name="remove_bookmark" msgid="8407495852801410891">"Favoriyi sil"</string>
<string name="remove_from_bookmarks" msgid="4374080666576982775">"Favorilerden kaldır"</string>
@@ -87,13 +95,15 @@
<string name="bookmark_cannot_save_url" msgid="791722768778386941">"Bu URL yer işareti olarak eklenemez."</string>
<string name="delete_bookmark" msgid="2422989994934201992">"Sil"</string>
<string name="bookmark_page" msgid="6845189305130307274">"Son görüntülenen sayfayı favori olarak işaretle"</string>
- <string name="switch_to_thumbnails" msgid="5493351529609043151">"Küçük resim görünümü"</string>
- <string name="switch_to_list" msgid="8900531247982121055">"Liste görünümü"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
<string name="current_page" msgid="7510129573681663135">"kaynak: "</string>
<string name="delete_bookmark_warning" msgid="758043186202032205">"Favori \"<xliff:g id="BOOKMARK">%s</xliff:g>\" silinecek."</string>
<string name="open_in_new_window" msgid="6596775546468054510">"Yeni pencerede aç"</string>
<string name="goto_dot" msgid="3895839050522602723">"Git"</string>
- <string name="find_dot" msgid="6259312434696611957">"Sayfada bul"</string>
+ <string name="incognito_tab" msgid="5419458065370134289">"Yeni gizli sekme aç"</string>
<string name="select_dot" msgid="6299170761900561967">"Metin seç"</string>
<string name="tab_picker_title" msgid="864478399057782913">"Geçerli pencereler"</string>
<string name="tab_picker_remove_tab" msgid="630087809802479397">"Kapat"</string>
@@ -103,6 +113,13 @@
<string name="menu_view_download" msgid="2124570321712995120">"İndirme işlemleri"</string>
<string name="copy_page_url" msgid="7635062169011319208">"Sayfa url\'sini kopyala"</string>
<string name="share_page" msgid="593756995297268343">"Sayfayı paylaş"</string>
+ <string name="menu_save_webarchive" msgid="3934652434001459581">"Web Arşivi olarak Kaydet"</string>
+ <string name="webarchive_saved" msgid="7045250341467345007">"Web arşivi kaydedildi."</string>
+ <string name="webarchive_failed" msgid="2880998204746620260">"Web arşivi kaydedilemedi."</string>
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
<string name="contextmenu_openlink" msgid="7237961252214188935">"Aç"</string>
<string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"Yeni pencerede aç"</string>
<string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"Favori bağlantısı"</string>
@@ -138,11 +155,44 @@
<string name="pref_content_homepage" msgid="6082437160778559806">"Ana sayfayı ayarla"</string>
<string name="pref_content_search_engine" msgid="1620101310821644144">"Arama motoru ayarlayın"</string>
<string name="pref_content_search_engine_summary" msgid="5162667665858487316">"Arama moturu seçin"</string>
- <string name="pref_use_current" msgid="1493179933653044553">"Geçerli sayfayı kullan"</string>
+ <string name="pref_set_homepage_to" msgid="7196350233061395098">"Ana sayfayı ayarla..."</string>
+ <string name="pref_use_current" msgid="1778622474040406672">"Mevcut sayfa"</string>
+ <string name="pref_use_blank" msgid="8503238592551111169">"Boş sayfa"</string>
+ <string name="pref_use_default" msgid="192587563274735878">"Varsayılan sayfa"</string>
<string name="pref_content_autofit" msgid="8260474534053660809">"Sayfaları otomatik sığdır"</string>
<string name="pref_content_autofit_summary" msgid="4587831659894879986">"Web sayfalarını ekrana sığacak şekilde biçimlendir"</string>
- <string name="pref_content_landscape_only" msgid="2022546812766219672">"Yalnızca yatay görüntü"</string>
- <string name="pref_content_landscape_only_summary" msgid="1008238895535428855">"Sayfaları yalnızca daha geniş, yatay ekran yönünde görüntüle"</string>
+ <string name="pref_personal_title" msgid="1447687455755683695">"Kişisel ayarlar"</string>
+ <string name="pref_personal_sync_with_chrome" msgid="1695182180332194033">"Google Chrome ile senkronize et"</string>
+ <string name="pref_personal_sync_with_chrome_summary" msgid="7414133931827321055">"Yer işaretlerini ve diğer verileri Android Tarayıcı ile Google Chrome arasında paylaş"</string>
+ <string name="pref_personal_google_account" msgid="952360133341490071">"Google hesabı"</string>
+ <string name="pref_personal_sync_bookmarks" msgid="59237515966184432">"Yer işaretlerini senkronize et"</string>
+ <string name="pref_personal_sync_bookmarks_summary" msgid="4791767605662205482">"Yer işaretlerini Android Tarayıcı ve Google Chrome arasında senkronize et"</string>
+ <string name="pref_personal_start_syncing" msgid="6046972042512655232">"Senk. başlat"</string>
+ <string name="pref_personal_account_dialog_title" msgid="1390867119887955530">"Paylaşım için Google hesabını seçin"</string>
+ <string name="pref_autofill_enabled" msgid="1174197447388234595">"Formu Otomatik Doldur"</string>
+ <string name="pref_autofill_enabled_summary" msgid="422640696197018914">"Web formlarını tek bir tıklamayla doldurun"</string>
+ <string name="pref_autofill_profile_editor" msgid="1350709161524642663">"Otomatik Doldurma Ayarları"</string>
+ <string name="pref_autofill_profile_editor_summary" msgid="6748434431641768870">"Otomatik Doldurulan formlara ilişkin verileri ayarlayın ve yönetin"</string>
+ <string name="autofill_profile_editor_name" msgid="8566130291459685955">"Tam ad:"</string>
+ <string name="autofill_profile_editor_email_address" msgid="7967585896612797173">"E-posta:"</string>
+ <string name="autofill_profile_editor_company_name" msgid="2813443159949210417">"Şirket adı:"</string>
+ <string name="autofill_profile_editor_address_line_1" msgid="836433242509243081">"Adres satırı 1:"</string>
+ <string name="autofill_profile_editor_address_line_1_hint" msgid="5965659598509327172">"Sokak adresi, posta kutusu, alıcı"</string>
+ <string name="autofill_profile_editor_address_line_2" msgid="8194745202893822479">"Adres satırı 2:"</string>
+ <string name="autofill_profile_editor_address_line_2_hint" msgid="2048330295853546405">"Apartman, blok, daire, bina, kat vb."</string>
+ <string name="autofill_profile_editor_city" msgid="4193225955409148508">"Şehir / Kasaba:"</string>
+ <string name="autofill_profile_editor_state" msgid="8549739922338171458">"Eyalet / Vilayet / Bölge:"</string>
+ <string name="autofill_profile_editor_zip_code" msgid="283668573295656671">"Posta kodu:"</string>
+ <string name="autofill_profile_editor_country" msgid="7234470301239156656">"Ülke:"</string>
+ <string name="autofill_profile_editor_phone_number" msgid="4938852821413729276">"Telefon:"</string>
+ <string name="autofill_profile_editor_save_profile" msgid="8349915287435262888">"Profili kaydet"</string>
+ <string name="autofill_profile_successful_save" msgid="6834102203944938409">"Profil kaydedildi"</string>
+ <string name="autofill_profile_successful_delete" msgid="2421442112954362732">"Profil silindi"</string>
+ <string name="autofill_profile_editor_delete_profile" msgid="7112035941146003753">"Profil verileri sil"</string>
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
<string name="pref_privacy_title" msgid="1052470980370846151">"Gizlilik ayarları"</string>
<string name="pref_privacy_clear_cache" msgid="3380316479925886998">"Önbelleği temizle"</string>
<string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"Yerel olarak önbelleğe alınmış içeriği ve veritabanlarını temizle"</string>
@@ -208,6 +258,7 @@
<item msgid="891615911084608570">"Japonca (ISO-2022-JP)"</item>
<item msgid="5589150448475151241">"Japonca (SHIFT_JIS)"</item>
<item msgid="7356792686950371843">"Japonca (EUC-JP)"</item>
+ <item msgid="2193955365569270096">"Korece (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Metin kodlama"</string>
<string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"Veri bağlantısı sorunu"</string>
@@ -296,4 +347,11 @@
<string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"Tüm verileri sil"</string>
<string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"İptal"</string>
<string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"Duvar kağıdı ayarlanıyor..."</string>
+ <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Yer işaretleri"</string>
+ <string name="empty_bookmarks_folder" msgid="7843361614634930942">"Hiçbir yer işareti yok"</string>
+ <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
+ <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Google hesabı ile senkronize et"</string>
+ <string name="import_bookmarks_dialog_description" msgid="2187665745413495303">"Android yer işaretleriniz bir Google hesabı ile ilişkilendirilmemiş"</string>
+ <string name="import_bookmarks_dialog_remove" msgid="8105572409059113340">"Android yer işaretlerinizi kaldırın"</string>
+ <string name="import_bookmarks_dialog_import" msgid="6933613853573899218">"Android yer işaretlerinizi <xliff:g id="GOOGLE_ACCOUNT">%s</xliff:g> yer işaretlerine ekleyin"</string>
</resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
new file mode 100644
index 0000000..111ffee
--- /dev/null
+++ b/res/values-uk/strings.xml
@@ -0,0 +1,401 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2007 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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="application_name" msgid="1935869255545976415">"Переглядач"</string>
+ <string name="choose_upload" msgid="3649366287575002063">"Вибер. файл для завантаж."</string>
+ <string name="new_tab" msgid="4505722538297295141">"Нове вікно"</string>
+ <!-- no translation found for new_incognito_tab (5821404839654751753) -->
+ <skip />
+ <string name="active_tabs" msgid="3050623868203544623">"Вікна"</string>
+ <string name="tab_bookmarks" msgid="2305793036003473653">"Закладки"</string>
+ <string name="tab_most_visited" msgid="1077402532455000703">"Часто відвідувані"</string>
+ <string name="tab_history" msgid="1979267558744613746">"Історія"</string>
+ <string name="added_to_bookmarks" msgid="1020224130695956728">"Додано до закладок"</string>
+ <string name="removed_from_bookmarks" msgid="6063705902028438800">"Видалено із закладок"</string>
+ <string name="sign_in_to" msgid="5939425800148759165">"Увійти в <xliff:g id="HOSTNAME">%s1</xliff:g> \"<xliff:g id="REALM">%s2</xliff:g>\""</string>
+ <string name="username" msgid="5057566336518215922">"Ім\'я"</string>
+ <string name="password" msgid="1177138552305184404">"Пароль"</string>
+ <string name="action" msgid="183105774472071343">"Увійти"</string>
+ <string name="bookmarks_search" msgid="5229596268214362873">"Переглядач"</string>
+ <string name="cancel" msgid="3017274947407233702">"Скасувати"</string>
+ <string name="ok" msgid="1509280796718850364">"OK"</string>
+ <string name="title_bar_loading" msgid="7438217780834640678">"Завант-ня…"</string>
+ <string name="page_info" msgid="4048529256302257195">"Інфо про стор."</string>
+ <string name="page_info_view" msgid="5303490449842635158">"Інфо про стор."</string>
+ <string name="page_info_address" msgid="2222306609532903254">"Адреса:"</string>
+ <string name="ssl_warnings_header" msgid="79744901983636370">"Виникли проблеми із сертифікатом безпеки для цього сайту."</string>
+ <string name="ssl_continue" msgid="8031515015829358457">"Продовжити"</string>
+ <string name="security_warning" msgid="6607795404322797541">"Застереж. про небезп."</string>
+ <string name="view_certificate" msgid="1472768887529093862">"Переглянути сертиф."</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
+ <string name="ssl_untrusted" msgid="5369967226521102194">"Сертиф-т походить від ненадійн. центру сертиф-ції."</string>
+ <string name="ssl_mismatch" msgid="558688832420069896">"Назва сайту не відповідає назві в сертифікаті."</string>
+ <string name="ssl_expired" msgid="5739349389499575559">"Термін дії сертиф. завершився."</string>
+ <string name="ssl_not_yet_valid" msgid="2893167846212645846">"Цей сертифікат ще недійсний."</string>
+ <string name="ssl_certificate" msgid="5226747157992111668">"Сертифікат безпеки"</string>
+ <string name="ssl_certificate_is_valid" msgid="7096160815933145579">"Цей сертифікат є дійсним."</string>
+ <string name="issued_to" msgid="9032338008819841339">"Кому видано:"</string>
+ <string name="common_name" msgid="5745530093500062357">"Загальне ім\'я:"</string>
+ <string name="org_name" msgid="8868889052889991293">"Організація:"</string>
+ <string name="org_unit" msgid="4489056376307768196">"Організац. підрозділ:"</string>
+ <string name="issued_by" msgid="6959484326943152487">"Ким видано:"</string>
+ <string name="validity_period" msgid="57988851973181309">"Чинність:"</string>
+ <string name="issued_on" msgid="2082890654801808368">"Дата видачі:"</string>
+ <string name="expires_on" msgid="8061200430557020704">"Діє до:"</string>
+ <string name="stopping" msgid="4839698519340302982">"Зупинка..."</string>
+ <string name="stop" msgid="5687251076030630074">"Зупин."</string>
+ <string name="reload" msgid="8585220783228408062">"Оновити"</string>
+ <string name="back" msgid="8414603107175713668">"Назад"</string>
+ <string name="forward" msgid="4288210890526641577">"Уперед"</string>
+ <string name="save" msgid="5922311934992468496">"OK"</string>
+ <string name="do_not_save" msgid="6777633870113477714">"Скасувати"</string>
+ <!-- outdated translation 969988560160364559 --> <string name="location" msgid="3411848697912600125">"Місцезнах."</string>
+ <!-- no translation found for containing_folder (6771180232953030479) -->
+ <skip />
+ <!-- no translation found for new_folder (7743540149088867917) -->
+ <skip />
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <!-- no translation found for no_subfolders (5880411440592452802) -->
+ <skip />
+ <!-- no translation found for add_to_bookmarks_menu_option (4449323955122214389) -->
+ <skip />
+ <!-- no translation found for add_to_homescreen_menu_option (1461447829242963790) -->
+ <skip />
+ <!-- no translation found for add_to_other_folder_menu_option (5450890093372998187) -->
+ <skip />
+ <!-- outdated translation 5990326151488445481 --> <string name="name" msgid="5462672162695365387">"Назва"</string>
+ <string name="http" msgid="2163722670597250102">"http://"</string>
+ <!-- outdated translation 588165100024086565 --> <string name="save_to_bookmarks" msgid="6101482434920313244">"Додати закладку"</string>
+ <!-- no translation found for bookmark_this_page (7530739804320811054) -->
+ <skip />
+ <string name="edit_bookmark" msgid="5024089053490231905">"Редаг. закладку"</string>
+ <!-- outdated translation 9202323987633899835 --> <string name="create_shortcut_bookmark" msgid="1995095662095484289">"Додати ярлик на Головну"</string>
+ <string name="open_bookmark" msgid="8473581305759935790">"Відкр."</string>
+ <string name="remove_bookmark" msgid="8407495852801410891">"Видалити закладку"</string>
+ <string name="remove_from_bookmarks" msgid="4374080666576982775">"Видалити із закладок"</string>
+ <string name="remove_history_item" msgid="5021424935726728618">"Видалити з історії"</string>
+ <string name="set_as_homepage" msgid="4752937379414905560">"Установ. як дом. стор."</string>
+ <string name="bookmark_saved" msgid="2766434679871317557">"Збережено до закладок."</string>
+ <string name="bookmark_not_saved" msgid="700600955089376724">"Неможл. зберегти закладку"</string>
+ <string name="homepage_set" msgid="8768087280310966395">"Дом. стор. встан."</string>
+ <string name="bookmark_needs_title" msgid="6245900436119218187">"Закладка має мати назву."</string>
+ <string name="bookmark_needs_url" msgid="7809876865972755158">"У закладки має бути місцезнах."</string>
+ <string name="bookmark_url_not_valid" msgid="6719785633980202419">"URL-адреса недійсна."</string>
+ <string name="bookmark_cannot_save_url" msgid="791722768778386941">"Закладка для цієї URL-адр. неможлива"</string>
+ <string name="delete_bookmark" msgid="2422989994934201992">"Видалити"</string>
+ <string name="bookmark_page" msgid="6845189305130307274">"Створ. закладку для ост. стор."</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
+ <string name="current_page" msgid="7510129573681663135">"з "</string>
+ <string name="delete_bookmark_warning" msgid="758043186202032205">"Закладку \"<xliff:g id="BOOKMARK">%s</xliff:g>\" буде видалено."</string>
+ <string name="open_in_new_window" msgid="6596775546468054510">"Відкрити в нов. вікні"</string>
+ <string name="goto_dot" msgid="3895839050522602723">"Викон."</string>
+ <!-- no translation found for incognito_tab (5419458065370134289) -->
+ <skip />
+ <string name="select_dot" msgid="6299170761900561967">"Вибрати текст"</string>
+ <string name="tab_picker_title" msgid="864478399057782913">"Поточні вікна"</string>
+ <string name="tab_picker_remove_tab" msgid="630087809802479397">"Закрити"</string>
+ <string name="bookmarks" msgid="1961279134885867815">"Закладки"</string>
+ <string name="shortcut_bookmark" msgid="3974876480401135895">"Закладка"</string>
+ <string name="history" msgid="2451240511251410032">"Історія"</string>
+ <string name="menu_view_download" msgid="2124570321712995120">"Завантаження"</string>
+ <string name="copy_page_url" msgid="7635062169011319208">"Копіюв. URL стор."</string>
+ <string name="share_page" msgid="593756995297268343">"Надісл. стор."</string>
+ <!-- no translation found for menu_save_webarchive (3934652434001459581) -->
+ <skip />
+ <!-- no translation found for webarchive_saved (7045250341467345007) -->
+ <skip />
+ <!-- no translation found for webarchive_failed (2880998204746620260) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
+ <string name="contextmenu_openlink" msgid="7237961252214188935">"Відкр."</string>
+ <string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"Відкрити в нов. вікні"</string>
+ <string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"Закладка для посил."</string>
+ <string name="contextmenu_savelink" msgid="5508554930832538184">"Збер. посил."</string>
+ <string name="contextmenu_sharelink" msgid="5392275392280130331">"Надісл. посил."</string>
+ <string name="contextmenu_copy" msgid="398860586635404030">"Копіюв."</string>
+ <string name="contextmenu_copylink" msgid="5153657160294534270">"Копіюв. URL посил."</string>
+ <string name="contextmenu_download_image" msgid="4243829645180686912">"Зберегти зображ."</string>
+ <string name="contextmenu_view_image" msgid="3870625602053600905">"Перегл. зображ."</string>
+ <string name="contextmenu_set_wallpaper" msgid="3691902960115350686">"Устан. як фон. мал."</string>
+ <string name="contextmenu_dial_dot" msgid="5856550683415933806">"Дзвонити..."</string>
+ <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="clear" msgid="7070043081700011461">"Очистити"</string>
+ <string name="replace" msgid="4843033491070384047">"Замінити"</string>
+ <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Закладки"</string>
+ <string name="menu_preferences" msgid="6709237687234102240">"Налаштув-ня"</string>
+ <string name="pref_content_title" msgid="722227111894838633">"Налашт-ня вмісту стор."</string>
+ <string name="pref_content_load_images" msgid="2125616852957377561">"Завантаж. зобр."</string>
+ <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Відобр. зображ. на веб-стор."</string>
+ <string name="pref_content_block_popups" msgid="7808433807197256726">"Блок. спливаючі вікна"</string>
+ <string name="pref_content_javascript" msgid="4570972030299516843">"Увімк. JavaScript"</string>
+ <string name="pref_content_open_in_background" msgid="824123779725118663">"Відкр. у фон. режимі"</string>
+ <string name="pref_content_plugins" msgid="7231944644794301582">"Увімкнути плагіни"</string>
+ <string-array name="pref_content_plugins_choices">
+ <item msgid="6745108155096660725">"Завжди увімк."</item>
+ <item msgid="2484126708670016519">"На вимогу"</item>
+ <item msgid="8547442717307793863">"Вимк."</item>
+ </string-array>
+ <string name="pref_content_open_in_background_summary" msgid="1737664075721181678">"Відкривати нові вікна за поточним"</string>
+ <string name="pref_content_homepage" msgid="6082437160778559806">"Устан. дом. стор."</string>
+ <!-- no translation found for pref_content_search_engine (1620101310821644144) -->
+ <skip />
+ <!-- no translation found for pref_content_search_engine_summary (5162667665858487316) -->
+ <skip />
+ <!-- no translation found for pref_set_homepage_to (7196350233061395098) -->
+ <skip />
+ <!-- outdated translation 1493179933653044553 --> <string name="pref_use_current" msgid="1778622474040406672">"Викор. поточну стор."</string>
+ <!-- no translation found for pref_use_blank (8503238592551111169) -->
+ <skip />
+ <!-- no translation found for pref_use_default (192587563274735878) -->
+ <skip />
+ <string name="pref_content_autofit" msgid="8260474534053660809">"Автомат. припасув."</string>
+ <string name="pref_content_autofit_summary" msgid="4587831659894879986">"Форматув. сторінки до розмірів екрана"</string>
+ <!-- no translation found for pref_personal_title (1447687455755683695) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome (1695182180332194033) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome_summary (7414133931827321055) -->
+ <skip />
+ <!-- no translation found for pref_personal_google_account (952360133341490071) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks (59237515966184432) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks_summary (4791767605662205482) -->
+ <skip />
+ <!-- no translation found for pref_personal_start_syncing (6046972042512655232) -->
+ <skip />
+ <!-- no translation found for pref_personal_account_dialog_title (1390867119887955530) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled (1174197447388234595) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled_summary (422640696197018914) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor (1350709161524642663) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor_summary (6748434431641768870) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_name (8566130291459685955) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_email_address (7967585896612797173) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_company_name (2813443159949210417) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1 (836433242509243081) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1_hint (5965659598509327172) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2 (8194745202893822479) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2_hint (2048330295853546405) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_city (4193225955409148508) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_state (8549739922338171458) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_zip_code (283668573295656671) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_country (7234470301239156656) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_phone_number (4938852821413729276) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_save_profile (8349915287435262888) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_save (6834102203944938409) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_delete (2421442112954362732) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_delete_profile (7112035941146003753) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
+ <string name="pref_privacy_title" msgid="1052470980370846151">"Налашт. конфіденц."</string>
+ <string name="pref_privacy_clear_cache" msgid="3380316479925886998">"Очистити кеш"</string>
+ <string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"Очистити локально кешов. вміст і бази даних"</string>
+ <string name="pref_privacy_clear_cache_dlg" msgid="5541011591300753881">"Локально кешований вміст і бази даних буде видалено."</string>
+ <string name="pref_privacy_clear_cookies" msgid="3095583579133780331">"Очист. всі дані файлів cookie"</string>
+ <string name="pref_privacy_clear_cookies_summary" msgid="6962742063990677520">"Очист. всі файли cookie перегл-ча"</string>
+ <string name="pref_privacy_clear_cookies_dlg" msgid="552855688091432682">"Усі файли cookie буде видалено."</string>
+ <string name="pref_privacy_clear_history" msgid="8723795508825198477">"Очистити історію"</string>
+ <string name="pref_privacy_clear_history_summary" msgid="6868501330708940734">"Очистити історію навігації переглядача"</string>
+ <string name="pref_privacy_clear_history_dlg" msgid="544903007914753853">"Історію навігації переглядача буде видалено."</string>
+ <string name="pref_privacy_clear_form_data" msgid="4232668196344383987">"Очист. дані форми"</string>
+ <string name="pref_privacy_clear_form_data_summary" msgid="1790390894719517167">"Очистити всі збережені дані форм"</string>
+ <string name="pref_privacy_clear_form_data_dlg" msgid="4443621086781197928">"Усі збережені дані форм буде видалено."</string>
+ <string name="pref_privacy_clear_passwords" msgid="4750234112289277480">"Очистити паролі"</string>
+ <string name="pref_privacy_clear_passwords_summary" msgid="8856782718942903335">"Очист. всі збережені паролі"</string>
+ <string name="pref_privacy_clear_passwords_dlg" msgid="2083869328824248255">"Усі збережені паролі буде видалено."</string>
+ <string name="pref_privacy_enable_geolocation" msgid="1395040170290765686">"Увімкнути місцезн."</string>
+ <string name="pref_privacy_enable_geolocation_summary" msgid="8437020934664306205">"Дозволити сайтам запитувати доступ до місцезн."</string>
+ <string name="pref_privacy_clear_geolocation_access" msgid="6649680770030042980">"Очист. доступ до місцезн."</string>
+ <string name="pref_privacy_clear_geolocation_access_summary" msgid="7750143359497314679">"Очист. доступ до місцезн. для всіх сайтів"</string>
+ <string name="pref_privacy_clear_geolocation_access_dlg" msgid="7327063124488827244">"Очист. доступ до місцезн. для всіх сайтів"</string>
+ <string name="pref_security_title" msgid="5763978646932160021">"Налаштув-ня безпеки"</string>
+ <string name="pref_security_remember_passwords" msgid="6492957683454529549">"Пам\'ятати паролі"</string>
+ <string name="pref_security_remember_passwords_summary" msgid="256388703356349137">"Зберігати імена корист. і паролі для сайтів"</string>
+ <string name="pref_security_save_form_data" msgid="1213669802810198893">"Запам\'ят. дані форми"</string>
+ <string name="pref_security_save_form_data_summary" msgid="4994074685153708026">"Пам\'ятати введ. у форми дані для майб. викор."</string>
+ <string name="pref_security_show_security_warning" msgid="8901135676266754559">"Показувати застереження."</string>
+ <string name="pref_security_show_security_warning_summary" msgid="8968906112720511704">"Показувати застереження, якщо є проблема з безпекою сайту"</string>
+ <string name="pref_security_accept_cookies" msgid="3201367661925047989">"Прийн. файли cookie"</string>
+ <string name="pref_security_accept_cookies_summary" msgid="1465118934875026920">"Дозвол. сайтам зберіг. і зчит. дані файлів cookie"</string>
+ <string name="pref_text_size" msgid="3827031324346612208">"Розмір тексту"</string>
+ <string-array name="pref_text_size_choices">
+ <item msgid="4952686548944739548">"Дуже мал."</item>
+ <item msgid="1950030433642671460">"Малий"</item>
+ <item msgid="4338347520133294584">"Звичайний"</item>
+ <item msgid="5043128215356351184">"Великий"</item>
+ <item msgid="7201512237890458902">"Дуже вел."</item>
+ </string-array>
+ <string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Розмір тексту"</string>
+ <string name="pref_default_zoom" msgid="8076142259097187395">"Масштаб за умовч."</string>
+ <string-array name="pref_default_zoom_choices">
+ <item msgid="549583171195154919">"Віддал."</item>
+ <item msgid="5619034257768161024">"Середній"</item>
+ <item msgid="3840999588443167001">"Наближ."</item>
+ </string-array>
+ <string name="pref_default_zoom_dialogtitle" msgid="6095974367125109021">"Масштаб за умовч."</string>
+ <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="3091250467679722382">"Розширені налашт-ня"</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" msgid="8904000515846202110">"Віднов. налашт. за умовч."</string>
+ <string name="pref_extras_reset_default_summary" msgid="4247870778270414501">"Відновити налашт. за умовч."</string>
+ <string name="pref_extras_reset_default_dlg" msgid="6640261575874704022">"Буде відновлено налашт-ня за умовчанням."</string>
+ <string name="pref_extras_reset_default_dlg_title" msgid="2250334970728938936">"Віднов. налашт. за умовч."</string>
+ <string name="pref_development_title" msgid="3263854204533056480">"Налагодж."</string>
+ <string name="pref_default_text_encoding" msgid="5742965543955558478">"Кодування тексту"</string>
+ <!-- no translation found for pref_default_text_encoding_choices:7 (2193955365569270096) -->
+ <string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Кодування тексту"</string>
+ <string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"Проблема з доступом до даних"</string>
+ <string name="browserFrameFileErrorLabel" msgid="8063691502792670367">"Проблема з файлом"</string>
+ <string name="browserFrameFormResubmitLabel" msgid="2685923472682180360">"Підтверд."</string>
+ <string name="browserFrameFormResubmitMessage" msgid="2752182215695632138">"Сторінка, яку ви намагаєтеся переглянути, містить уже подані дані (\"POSTDATA\"). При повторному надсиланні даних будь-які дії, виконані цією формою на сторінці (напр., пошук чи покупка онлайн), буде повторено."</string>
+ <string name="loadSuspendedTitle" msgid="675991625288706944">"Немає з\'єдн-ня з мережею"</string>
+ <string name="loadSuspended" msgid="3133656588880851273">"Переглядач не може завантажити цю стор. – немає підключення до Інтернету."</string>
+ <string name="clear_history" msgid="5998307092715979619">"Очистити історію"</string>
+ <string name="browser_history" msgid="1038987118290272525">"Нещодавно відвідані стор."</string>
+ <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_button_text" msgid="5235226933877634410">"Викон."</string>
+ <string name="search_settings_description" msgid="1422401062529014107">"Закладки й іст. веб-пошуку"</string>
+ <string name="attention" msgid="3473639060042811244">"Увага"</string>
+ <string name="popup_window_attempt" msgid="2673111696288657989">"Цей сайт намагається відкрити спливаюче вікно."</string>
+ <string name="allow" msgid="1157313689171991335">"Дозвол."</string>
+ <string name="block" msgid="9172175889884707800">"Блокув."</string>
+ <string name="too_many_windows_dialog_title" msgid="5175503564948906442">"Досягнуто ліміт вікон"</string>
+ <string name="too_many_windows_dialog_message" msgid="1398571800233959583">"Неможливо відкрити нове вікно – уже відкрито максимально дозволену кількість."</string>
+ <string name="too_many_subwindows_dialog_title" msgid="3805453941587725944">"Сплив. вікно вже відкр."</string>
+ <string name="too_many_subwindows_dialog_message" msgid="5827289829907966657">"Неможл. відкр. нове сплив. вікно – дозвол. лише 1 вікно в певний період часу."</string>
+ <string name="download_title" msgid="2122874021047565594">"Історія завантажень"</string>
+ <string name="download_unknown_filename" msgid="4013465542563652175">"<Невідомий>"</string>
+ <string name="download_menu_open" msgid="4888327480367757513">"Відкр."</string>
+ <string name="download_menu_clear" msgid="6264454531553418124">"Видалити зі списку"</string>
+ <string name="download_menu_delete" msgid="8815502136393894148">"Видалити"</string>
+ <string name="download_menu_cancel" msgid="2545333007601851574">"Скасув. завантаж."</string>
+ <string name="download_menu_cancel_all" msgid="2136550823151999166">"Скасув. всі завантаж-ня"</string>
+ <string name="download_cancel_dlg_title" msgid="8909108500262799748">"Скасувати завантаж."</string>
+ <string name="download_cancel_dlg_msg" msgid="6285389170052357797">"Усі <xliff:g id="DOWNLOAD_COUNT">%d</xliff:g> завантаж. буде скасовано й видалено з історії завантажень."</string>
+ <string name="download_delete_file" msgid="5330036497843073249">"Файл буде видалено"</string>
+ <string name="download_file_error_dlg_title" msgid="2693630283595384874">"Недост. місця"</string>
+ <string name="download_file_error_dlg_msg" msgid="5156405410324072471">"Файл <xliff:g id="FILENAME">%s</xliff:g> неможливо завантажити."\n"Звільніть місце в телефоні та спробуйте знову."</string>
+ <string name="download_failed_generic_dlg_title" msgid="6106781095337833391">"Завантаження не вдалося"</string>
+ <!-- outdated translation 605904452159416792 --> <string name="download_no_sdcard_dlg_title" product="nosdcard" msgid="56777245081568508">"Немає карти SD"</string>
+ <string name="download_no_sdcard_dlg_title" product="default" msgid="605904452159416792">"Немає карти SD"</string>
+ <!-- no translation found for download_no_sdcard_dlg_msg (3144652102051031721) -->
+ <skip />
+ <string name="download_no_sdcard_dlg_msg" product="default" msgid="2616399456116301518">"Щоб завантажити <xliff:g id="FILENAME">%s</xliff:g>, потрібна карта SD."</string>
+ <!-- outdated translation 6877712666046917741 --> <string name="download_sdcard_busy_dlg_title" product="nosdcard" msgid="8081445664689818973">"Карта SD недоступна"</string>
+ <string name="download_sdcard_busy_dlg_title" product="default" msgid="6877712666046917741">"Карта SD недоступна"</string>
+ <!-- outdated translation 3473883538192835204 --> <string name="download_sdcard_busy_dlg_msg" product="nosdcard" msgid="3979329954835690147">"Карта SD зайнята. Щоб дозвол. завантаж., виберіть у сповіщенні \"Вимкнути зберігання на USB\"."</string>
+ <string name="download_sdcard_busy_dlg_msg" product="default" msgid="3473883538192835204">"Карта SD зайнята. Щоб дозвол. завантаж., виберіть у сповіщенні \"Вимкнути зберігання на USB\"."</string>
+ <string name="download_no_application_title" msgid="1286056729168874295">"Файл не відкривається"</string>
+ <string name="retry" msgid="1835923075542266721">"Повтор."</string>
+ <string name="no_downloads" msgid="3947445710685021498">"Історія завантажень порожня."</string>
+ <string name="download_error" msgid="413496839831257187">"Завантаження не вдалося."</string>
+ <string name="download_success" msgid="2279041638155595203">"<xliff:g id="FILE">%s</xliff:g> завантажено."</string>
+ <string name="download_running" msgid="2622942231322015059">"Завантаж-ня…"</string>
+ <string name="download_pending" msgid="2599683668575349559">"Початок завант-ня..."</string>
+ <string name="download_pending_network" msgid="6548714525679461053">"Очік. з\'єднання з мережею..."</string>
+ <string name="download_running_paused" msgid="6418029352085656495">"Очік. з\'єднання з мережею..."</string>
+ <string name="download_canceled" msgid="6057083743144492515">"Завантаж. скасовано."</string>
+ <string name="download_not_acceptable" msgid="313769696131563652">"Неможливо завантажити. Вміст не підтримується цим телефоном."</string>
+ <string name="download_file_error" msgid="1206648050615176113">"Неможливо завершити завантаження. Недостатньо місця."</string>
+ <string name="download_length_required" msgid="9038605488460437406">"Завантаження не вдалося. Неможливо визначити розмір елемента."</string>
+ <string name="download_precondition_failed" msgid="8327584102874295580">"Завантаж. перервано. Неможливо відновити."</string>
+ <string name="search_the_web" msgid="6046130189241962337">"Пошук в Інтернеті"</string>
+ <string name="webstorage_outofspace_notification_title" msgid="1160474608059771788">"Пам\'ять перегл-ча заповн."</string>
+ <string name="webstorage_outofspace_notification_text" msgid="7341075135051829692">"Натисн., щоб звільн. місце."</string>
+ <string name="webstorage_clear_data_title" msgid="689484577124333977">"Очист. збереж. дані"</string>
+ <string name="webstorage_clear_data_dialog_title" msgid="345457466368974706">"Очист. збереж. дані"</string>
+ <string name="webstorage_clear_data_dialog_message" msgid="6678281256970470125">"Усі дані, збережені цим веб-сайтом, буде видалено"</string>
+ <string name="webstorage_clear_data_dialog_ok_button" msgid="2516563534211898636">"Очистити все"</string>
+ <string name="webstorage_clear_data_dialog_cancel_button" msgid="2028867751958942762">"Скасувати"</string>
+ <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_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_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>
+ <string name="geolocation_settings_page_dialog_title" msgid="1549842043381347668">"Очист. доступ до місцезн."</string>
+ <string name="geolocation_settings_page_dialog_message" msgid="7586671987576403993">"Доступ до місцезн. для цього сайту буде видалено"</string>
+ <string name="geolocation_settings_page_dialog_ok_button" msgid="4789434178048077287">"Очистити доступ"</string>
+ <string name="geolocation_settings_page_dialog_cancel_button" msgid="7941036504673409747">"Скасувати"</string>
+ <string name="website_settings_clear_all" msgid="8739804325997655980">"Очистити все"</string>
+ <string name="website_settings_clear_all_dialog_title" msgid="7791826325122461718">"Очистити всі налашт-ня сайтів?"</string>
+ <string name="website_settings_clear_all_dialog_message" msgid="6150502090601476333">"Усі дані веб-стор. і дозволи для місцезнах. буде видалено."</string>
+ <string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"Видалити всі дані"</string>
+ <string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"Скасувати"</string>
+ <string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"Встановл. фонового мал…"</string>
+ <!-- no translation found for defaultBookmarksUpButton (2303951020715704735) -->
+ <skip />
+ <!-- no translation found for empty_bookmarks_folder (7843361614634930942) -->
+ <skip />
+ <!-- no translation found for rlz_access_point (7165847807377650632) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_title (3325557652271172128) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_description (2187665745413495303) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_remove (8105572409059113340) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_import (6933613853573899218) -->
+ <skip />
+</resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
new file mode 100644
index 0000000..a8b0769
--- /dev/null
+++ b/res/values-vi/strings.xml
@@ -0,0 +1,401 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2007 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 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="application_name" msgid="1935869255545976415">"Trình duyệt"</string>
+ <string name="choose_upload" msgid="3649366287575002063">"Chọn tệp để tải lên"</string>
+ <string name="new_tab" msgid="4505722538297295141">"Cửa sổ mới"</string>
+ <!-- no translation found for new_incognito_tab (5821404839654751753) -->
+ <skip />
+ <string name="active_tabs" msgid="3050623868203544623">"Windows"</string>
+ <string name="tab_bookmarks" msgid="2305793036003473653">"Dấu trang"</string>
+ <string name="tab_most_visited" msgid="1077402532455000703">"Truy cập nhiều nhất"</string>
+ <string name="tab_history" msgid="1979267558744613746">"Lịch sử"</string>
+ <string name="added_to_bookmarks" msgid="1020224130695956728">"Đã thêm vào dấu trang"</string>
+ <string name="removed_from_bookmarks" msgid="6063705902028438800">"Đã xoá khỏi dấu trang"</string>
+ <string name="sign_in_to" msgid="5939425800148759165">"Đăng nhập vào <xliff:g id="HOSTNAME">%s1</xliff:g> \"<xliff:g id="REALM">%s2</xliff:g>\""</string>
+ <string name="username" msgid="5057566336518215922">"Tên"</string>
+ <string name="password" msgid="1177138552305184404">"Mật khẩu"</string>
+ <string name="action" msgid="183105774472071343">"Đăng nhập"</string>
+ <string name="bookmarks_search" msgid="5229596268214362873">"Trình duyệt"</string>
+ <string name="cancel" msgid="3017274947407233702">"Huỷ"</string>
+ <string name="ok" msgid="1509280796718850364">"OK"</string>
+ <string name="title_bar_loading" msgid="7438217780834640678">"Đang tải…"</string>
+ <string name="page_info" msgid="4048529256302257195">"Thông tin trang"</string>
+ <string name="page_info_view" msgid="5303490449842635158">"Xem thông tin trang"</string>
+ <string name="page_info_address" msgid="2222306609532903254">"Địa chỉ:"</string>
+ <string name="ssl_warnings_header" msgid="79744901983636370">"Có sự cố với chứng chỉ bảo mật cho trang web này."</string>
+ <string name="ssl_continue" msgid="8031515015829358457">"Tiếp tục"</string>
+ <string name="security_warning" msgid="6607795404322797541">"Cảnh báo bảo mật"</string>
+ <string name="view_certificate" msgid="1472768887529093862">"Xem chứng chỉ"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
+ <string name="ssl_untrusted" msgid="5369967226521102194">"Chứng chỉ này không xuất phát từ tổ chức phát hành tin cậy."</string>
+ <string name="ssl_mismatch" msgid="558688832420069896">"Tên của trang web không khớp với tên trên chứng chỉ."</string>
+ <string name="ssl_expired" msgid="5739349389499575559">"Chứng chỉ này đã hết hạn."</string>
+ <string name="ssl_not_yet_valid" msgid="2893167846212645846">"Chứng chỉ này chưa hợp lệ."</string>
+ <string name="ssl_certificate" msgid="5226747157992111668">"Chứng chỉ bảo mật"</string>
+ <string name="ssl_certificate_is_valid" msgid="7096160815933145579">"Chứng chỉ này hợp lệ."</string>
+ <string name="issued_to" msgid="9032338008819841339">"Cấp cho:"</string>
+ <string name="common_name" msgid="5745530093500062357">"Tên chung:"</string>
+ <string name="org_name" msgid="8868889052889991293">"Tổ chức:"</string>
+ <string name="org_unit" msgid="4489056376307768196">"Đơn vị tổ chức:"</string>
+ <string name="issued_by" msgid="6959484326943152487">"Cấp bởi:"</string>
+ <string name="validity_period" msgid="57988851973181309">"Tính hợp lệ:"</string>
+ <string name="issued_on" msgid="2082890654801808368">"Cấp vào:"</string>
+ <string name="expires_on" msgid="8061200430557020704">"Hết hạn vào:"</string>
+ <string name="stopping" msgid="4839698519340302982">"Đang dừng…"</string>
+ <string name="stop" msgid="5687251076030630074">"Dừng"</string>
+ <string name="reload" msgid="8585220783228408062">"Làm mới"</string>
+ <string name="back" msgid="8414603107175713668">"Quay lại"</string>
+ <string name="forward" msgid="4288210890526641577">"Chuyển tiếp"</string>
+ <string name="save" msgid="5922311934992468496">"OK"</string>
+ <string name="do_not_save" msgid="6777633870113477714">"Huỷ"</string>
+ <!-- outdated translation 969988560160364559 --> <string name="location" msgid="3411848697912600125">"Vị trí"</string>
+ <!-- no translation found for containing_folder (6771180232953030479) -->
+ <skip />
+ <!-- no translation found for new_folder (7743540149088867917) -->
+ <skip />
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <!-- no translation found for no_subfolders (5880411440592452802) -->
+ <skip />
+ <!-- no translation found for add_to_bookmarks_menu_option (4449323955122214389) -->
+ <skip />
+ <!-- no translation found for add_to_homescreen_menu_option (1461447829242963790) -->
+ <skip />
+ <!-- no translation found for add_to_other_folder_menu_option (5450890093372998187) -->
+ <skip />
+ <!-- outdated translation 5990326151488445481 --> <string name="name" msgid="5462672162695365387">"Tên"</string>
+ <string name="http" msgid="2163722670597250102">"http://"</string>
+ <!-- outdated translation 588165100024086565 --> <string name="save_to_bookmarks" msgid="6101482434920313244">"Thêm dấu trang"</string>
+ <!-- no translation found for bookmark_this_page (7530739804320811054) -->
+ <skip />
+ <string name="edit_bookmark" msgid="5024089053490231905">"Chỉnh sửa dấu trang"</string>
+ <!-- outdated translation 9202323987633899835 --> <string name="create_shortcut_bookmark" msgid="1995095662095484289">"Thêm lối tắt tới Màn hình trang chủ"</string>
+ <string name="open_bookmark" msgid="8473581305759935790">"Mở"</string>
+ <string name="remove_bookmark" msgid="8407495852801410891">"Xoá dấu trang"</string>
+ <string name="remove_from_bookmarks" msgid="4374080666576982775">"Xoá khỏi dấu trang"</string>
+ <string name="remove_history_item" msgid="5021424935726728618">"Xoá khỏi lịch sử"</string>
+ <string name="set_as_homepage" msgid="4752937379414905560">"Đặt làm trang chủ"</string>
+ <string name="bookmark_saved" msgid="2766434679871317557">"Đã lưu vào dấu trang."</string>
+ <string name="bookmark_not_saved" msgid="700600955089376724">"Không thể lưu dấu trang."</string>
+ <string name="homepage_set" msgid="8768087280310966395">"Đã đặt trang chủ."</string>
+ <string name="bookmark_needs_title" msgid="6245900436119218187">"Dấu trang phải có tên."</string>
+ <string name="bookmark_needs_url" msgid="7809876865972755158">"Dấu trang phải có vị trí."</string>
+ <string name="bookmark_url_not_valid" msgid="6719785633980202419">"URL không hợp lệ."</string>
+ <string name="bookmark_cannot_save_url" msgid="791722768778386941">"Không thể đánh dấu URL này."</string>
+ <string name="delete_bookmark" msgid="2422989994934201992">"Xoá"</string>
+ <string name="bookmark_page" msgid="6845189305130307274">"Đánh dấu trang xem lần cuối"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
+ <string name="current_page" msgid="7510129573681663135">"từ "</string>
+ <string name="delete_bookmark_warning" msgid="758043186202032205">"Dấu trang \"<xliff:g id="BOOKMARK">%s</xliff:g>\" sẽ bị xoá."</string>
+ <string name="open_in_new_window" msgid="6596775546468054510">"Mở trong cửa sổ mới"</string>
+ <string name="goto_dot" msgid="3895839050522602723">"Đến"</string>
+ <!-- no translation found for incognito_tab (5419458065370134289) -->
+ <skip />
+ <string name="select_dot" msgid="6299170761900561967">"Chọn văn bản"</string>
+ <string name="tab_picker_title" msgid="864478399057782913">"Cửa sổ hiện tại"</string>
+ <string name="tab_picker_remove_tab" msgid="630087809802479397">"Đóng"</string>
+ <string name="bookmarks" msgid="1961279134885867815">"Dấu trang"</string>
+ <string name="shortcut_bookmark" msgid="3974876480401135895">"Dấu trang"</string>
+ <string name="history" msgid="2451240511251410032">"Lịch sử"</string>
+ <string name="menu_view_download" msgid="2124570321712995120">"Nội dung tải xuống"</string>
+ <string name="copy_page_url" msgid="7635062169011319208">"Sao chép url của trang"</string>
+ <string name="share_page" msgid="593756995297268343">"Chia sẻ trang"</string>
+ <!-- no translation found for menu_save_webarchive (3934652434001459581) -->
+ <skip />
+ <!-- no translation found for webarchive_saved (7045250341467345007) -->
+ <skip />
+ <!-- no translation found for webarchive_failed (2880998204746620260) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
+ <string name="contextmenu_openlink" msgid="7237961252214188935">"Mở"</string>
+ <string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"Mở trong cửa sổ mới"</string>
+ <string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"Đánh dấu liên kết"</string>
+ <string name="contextmenu_savelink" msgid="5508554930832538184">"Lưu liên kết"</string>
+ <string name="contextmenu_sharelink" msgid="5392275392280130331">"Chia sẻ liên kết"</string>
+ <string name="contextmenu_copy" msgid="398860586635404030">"Sao chép"</string>
+ <string name="contextmenu_copylink" msgid="5153657160294534270">"Sao chép URL liên kết"</string>
+ <string name="contextmenu_download_image" msgid="4243829645180686912">"Lưu hình ảnh"</string>
+ <string name="contextmenu_view_image" msgid="3870625602053600905">"Xem hình ảnh"</string>
+ <string name="contextmenu_set_wallpaper" msgid="3691902960115350686">"Đặt làm hình nền"</string>
+ <string name="contextmenu_dial_dot" msgid="5856550683415933806">"Quay số…"</string>
+ <string name="contextmenu_add_contact" msgid="3183511922223645716">"Thêm liên hệ"</string>
+ <string name="contextmenu_send_mail" msgid="1014513374828775660">"Gửi email"</string>
+ <string name="contextmenu_map" msgid="7471390435434034912">"Bản đồ"</string>
+ <string name="choosertitle_sharevia" msgid="4600490613341909086">"Chia sẻ qua"</string>
+ <string name="clear" msgid="7070043081700011461">"Xoá"</string>
+ <string name="replace" msgid="4843033491070384047">"Thay thế"</string>
+ <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Dấu trang"</string>
+ <string name="menu_preferences" msgid="6709237687234102240">"Cài đặt"</string>
+ <string name="pref_content_title" msgid="722227111894838633">"Cài đặt nội dung trang"</string>
+ <string name="pref_content_load_images" msgid="2125616852957377561">"Tải hình ảnh"</string>
+ <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Hiển thị hình ảnh trên trang web"</string>
+ <string name="pref_content_block_popups" msgid="7808433807197256726">"Chặn cửa sổ bật lên"</string>
+ <string name="pref_content_javascript" msgid="4570972030299516843">"Bật JavaScript"</string>
+ <string name="pref_content_open_in_background" msgid="824123779725118663">"Mở dưới nền"</string>
+ <string name="pref_content_plugins" msgid="7231944644794301582">"Bật trình cắm"</string>
+ <string-array name="pref_content_plugins_choices">
+ <item msgid="6745108155096660725">"Luôn bật"</item>
+ <item msgid="2484126708670016519">"Theo yêu cầu"</item>
+ <item msgid="8547442717307793863">"Tắt"</item>
+ </string-array>
+ <string name="pref_content_open_in_background_summary" msgid="1737664075721181678">"Mở cửa sổ mới phía sau cửa sổ hiện tại"</string>
+ <string name="pref_content_homepage" msgid="6082437160778559806">"Đặt trang chủ"</string>
+ <!-- no translation found for pref_content_search_engine (1620101310821644144) -->
+ <skip />
+ <!-- no translation found for pref_content_search_engine_summary (5162667665858487316) -->
+ <skip />
+ <!-- no translation found for pref_set_homepage_to (7196350233061395098) -->
+ <skip />
+ <!-- outdated translation 1493179933653044553 --> <string name="pref_use_current" msgid="1778622474040406672">"Sử dụng trang hiện tại"</string>
+ <!-- no translation found for pref_use_blank (8503238592551111169) -->
+ <skip />
+ <!-- no translation found for pref_use_default (192587563274735878) -->
+ <skip />
+ <string name="pref_content_autofit" msgid="8260474534053660809">"Tự động điều chỉnh kích thước các trang"</string>
+ <string name="pref_content_autofit_summary" msgid="4587831659894879986">"Định dạng trang web để vừa với màn hình"</string>
+ <!-- no translation found for pref_personal_title (1447687455755683695) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome (1695182180332194033) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_with_chrome_summary (7414133931827321055) -->
+ <skip />
+ <!-- no translation found for pref_personal_google_account (952360133341490071) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks (59237515966184432) -->
+ <skip />
+ <!-- no translation found for pref_personal_sync_bookmarks_summary (4791767605662205482) -->
+ <skip />
+ <!-- no translation found for pref_personal_start_syncing (6046972042512655232) -->
+ <skip />
+ <!-- no translation found for pref_personal_account_dialog_title (1390867119887955530) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled (1174197447388234595) -->
+ <skip />
+ <!-- no translation found for pref_autofill_enabled_summary (422640696197018914) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor (1350709161524642663) -->
+ <skip />
+ <!-- no translation found for pref_autofill_profile_editor_summary (6748434431641768870) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_name (8566130291459685955) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_email_address (7967585896612797173) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_company_name (2813443159949210417) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1 (836433242509243081) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_1_hint (5965659598509327172) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2 (8194745202893822479) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_address_line_2_hint (2048330295853546405) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_city (4193225955409148508) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_state (8549739922338171458) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_zip_code (283668573295656671) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_country (7234470301239156656) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_phone_number (4938852821413729276) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_save_profile (8349915287435262888) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_save (6834102203944938409) -->
+ <skip />
+ <!-- no translation found for autofill_profile_successful_delete (2421442112954362732) -->
+ <skip />
+ <!-- no translation found for autofill_profile_editor_delete_profile (7112035941146003753) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
+ <string name="pref_privacy_title" msgid="1052470980370846151">"Cài đặt bảo mật"</string>
+ <string name="pref_privacy_clear_cache" msgid="3380316479925886998">"Xoá bộ nhớ cache"</string>
+ <string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"Xoá nội dung và cơ sở dữ liệu được lưu trong bộ nhớ cache cục bộ"</string>
+ <string name="pref_privacy_clear_cache_dlg" msgid="5541011591300753881">"Nội dung và cơ sở dữ liệu được lưu trong bộ nhớ cache cục bộ sẽ bị xoá."</string>
+ <string name="pref_privacy_clear_cookies" msgid="3095583579133780331">"Xoá tất cả dữ liệu cookie"</string>
+ <string name="pref_privacy_clear_cookies_summary" msgid="6962742063990677520">"Xoá tất cả cookie của trình duyệt"</string>
+ <string name="pref_privacy_clear_cookies_dlg" msgid="552855688091432682">"Tất cả cookie sẽ bị xoá."</string>
+ <string name="pref_privacy_clear_history" msgid="8723795508825198477">"Xoá lịch sử"</string>
+ <string name="pref_privacy_clear_history_summary" msgid="6868501330708940734">"Xoá lịch sử điều hướng của trình duyệt"</string>
+ <string name="pref_privacy_clear_history_dlg" msgid="544903007914753853">"Lịch sử điều hướng của trình duyệt sẽ bị xoá."</string>
+ <string name="pref_privacy_clear_form_data" msgid="4232668196344383987">"Xoá dữ liệu biểu mẫu"</string>
+ <string name="pref_privacy_clear_form_data_summary" msgid="1790390894719517167">"Xoá tất cả dữ liệu biểu mẫu đã lưu"</string>
+ <string name="pref_privacy_clear_form_data_dlg" msgid="4443621086781197928">"Tất cả dữ liệu biểu mẫu đã lưu sẽ bị xoá."</string>
+ <string name="pref_privacy_clear_passwords" msgid="4750234112289277480">"Xoá mật khẩu"</string>
+ <string name="pref_privacy_clear_passwords_summary" msgid="8856782718942903335">"Xoá tất cả mật khẩu đã lưu"</string>
+ <string name="pref_privacy_clear_passwords_dlg" msgid="2083869328824248255">"Tât cả mật khẩu đã lưu sẽ bị xoá."</string>
+ <string name="pref_privacy_enable_geolocation" msgid="1395040170290765686">"Bật vị trí"</string>
+ <string name="pref_privacy_enable_geolocation_summary" msgid="8437020934664306205">"Cho phép trang web yêu cầu quyền truy cập vào vị trí của bạn"</string>
+ <string name="pref_privacy_clear_geolocation_access" msgid="6649680770030042980">"Xoá truy cập vị trí"</string>
+ <string name="pref_privacy_clear_geolocation_access_summary" msgid="7750143359497314679">"Xoá truy cập vị trí cho tất cả trang web"</string>
+ <string name="pref_privacy_clear_geolocation_access_dlg" msgid="7327063124488827244">"Xoá truy cập vị trí cho tất cả trang web"</string>
+ <string name="pref_security_title" msgid="5763978646932160021">"Cài đặt bảo mật"</string>
+ <string name="pref_security_remember_passwords" msgid="6492957683454529549">"Nhớ mật khẩu"</string>
+ <string name="pref_security_remember_passwords_summary" msgid="256388703356349137">"Lưu tên người dùng và mật khẩu cho trang web"</string>
+ <string name="pref_security_save_form_data" msgid="1213669802810198893">"Nhớ dữ liệu biểu mẫu"</string>
+ <string name="pref_security_save_form_data_summary" msgid="4994074685153708026">"Nhớ dữ liệu tôi nhập trong biểu mẫu để sử dụng sau này"</string>
+ <string name="pref_security_show_security_warning" msgid="8901135676266754559">"Hiển thị cảnh báo bảo mật"</string>
+ <string name="pref_security_show_security_warning_summary" msgid="8968906112720511704">"Hiển thị cảnh báo nếu có sự cố với bảo mật của trang web"</string>
+ <string name="pref_security_accept_cookies" msgid="3201367661925047989">"Chấp nhận cookie"</string>
+ <string name="pref_security_accept_cookies_summary" msgid="1465118934875026920">"Cho phép trang web lưu và đọc dữ liệu \"cookie\""</string>
+ <string name="pref_text_size" msgid="3827031324346612208">"Kích cỡ chữ"</string>
+ <string-array name="pref_text_size_choices">
+ <item msgid="4952686548944739548">"Rất nhỏ"</item>
+ <item msgid="1950030433642671460">"Nhỏ"</item>
+ <item msgid="4338347520133294584">"Thường"</item>
+ <item msgid="5043128215356351184">"Lớn"</item>
+ <item msgid="7201512237890458902">"Rất lớn"</item>
+ </string-array>
+ <string name="pref_text_size_dialogtitle" msgid="3625388833512647865">"Kích cỡ chữ"</string>
+ <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>
+ <item msgid="5619034257768161024">"Trung bình"</item>
+ <item msgid="3840999588443167001">"Đóng"</item>
+ </string-array>
+ <string name="pref_default_zoom_dialogtitle" msgid="6095974367125109021">"Thu phóng mặc định"</string>
+ <string name="pref_content_load_page" msgid="2219810141690955452">"Mở các trang trong chế độ xem tổng quan"</string>
+ <string name="pref_content_load_page_summary" msgid="8792093504054149369">"Hiển thị tổng quan về các trang mới mở"</string>
+ <string name="pref_extras_title" msgid="3091250467679722382">"Cài đặt nâng cao"</string>
+ <string name="pref_extras_website_settings" msgid="67866640052455549">"Cài đặt trang web"</string>
+ <string name="pref_extras_website_settings_summary" msgid="1656771443223494406">"Cài đặt nâng cao cho các trang web riêng lẻ"</string>
+ <string name="pref_extras_reset_default" msgid="8904000515846202110">"Đặt lại về mặc định"</string>
+ <string name="pref_extras_reset_default_summary" msgid="4247870778270414501">"Khôi phục cài đặt mặc định"</string>
+ <string name="pref_extras_reset_default_dlg" msgid="6640261575874704022">"Cài đặt sẽ hoàn nguyên về giá trị mặc định."</string>
+ <string name="pref_extras_reset_default_dlg_title" msgid="2250334970728938936">"Đặt lại về mặc định"</string>
+ <string name="pref_development_title" msgid="3263854204533056480">"Gỡ lỗi"</string>
+ <string name="pref_default_text_encoding" msgid="5742965543955558478">"Mã hoá văn bản"</string>
+ <!-- no translation found for pref_default_text_encoding_choices:7 (2193955365569270096) -->
+ <string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Mã hoá văn bản"</string>
+ <string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"Sự cố kết nối dữ liệu"</string>
+ <string name="browserFrameFileErrorLabel" msgid="8063691502792670367">"Sự cố với tệp"</string>
+ <string name="browserFrameFormResubmitLabel" msgid="2685923472682180360">"Xác nhận"</string>
+ <string name="browserFrameFormResubmitMessage" msgid="2752182215695632138">"Trang bạn đang cố xem chứa dữ liệu đã được gửi (\"POSTDATA\"). Nếu bạn gửi lại dữ liệu, bất kỳ tác vụ nào mà biểu mẫu trên trang đã thực hiện (như tìm kiếm hoặc mua trực tuyến) sẽ được lặp lại."</string>
+ <string name="loadSuspendedTitle" msgid="675991625288706944">"Không có kết nối mạng"</string>
+ <string name="loadSuspended" msgid="3133656588880851273">"Trình duyệt không thể tải trang này vì không có kết nối internet."</string>
+ <string name="clear_history" msgid="5998307092715979619">"Xoá lịch sử"</string>
+ <string name="browser_history" msgid="1038987118290272525">"Các trang đã truy cập gần đây"</string>
+ <string name="empty_history" msgid="8738772352308207274">"Lịch sử trình duyệt trống."</string>
+ <string name="add_new_bookmark" msgid="8086367791400349049">"Thêm dấu trang..."</string>
+ <string name="add_bookmark_short" msgid="3783984330998103735">"Thêm"</string>
+ <string name="search_hint" msgid="4647356319916631820">"Tìm kiếm hoặc nhập URL"</string>
+ <string name="search_button_text" msgid="5235226933877634410">"Đến"</string>
+ <string name="search_settings_description" msgid="1422401062529014107">"Dấu trang và lịch sử web"</string>
+ <string name="attention" msgid="3473639060042811244">"Chú ý"</string>
+ <string name="popup_window_attempt" msgid="2673111696288657989">"Trang web này đang cố mở cửa sổ bật lên."</string>
+ <string name="allow" msgid="1157313689171991335">"Cho phép"</string>
+ <string name="block" msgid="9172175889884707800">"Chặn"</string>
+ <string name="too_many_windows_dialog_title" msgid="5175503564948906442">"Đã đạt tới giới hạn cửa sổ"</string>
+ <string name="too_many_windows_dialog_message" msgid="1398571800233959583">"Không thể mở cửa sổ mới vì bạn đã mở số cửa sổ tối đa."</string>
+ <string name="too_many_subwindows_dialog_title" msgid="3805453941587725944">"Cửa sổ bật lên đã mở"</string>
+ <string name="too_many_subwindows_dialog_message" msgid="5827289829907966657">"Không thể mở cửa sổ bật lên mới vì chỉ có thể mở một cửa sổ một lúc."</string>
+ <string name="download_title" msgid="2122874021047565594">"Lịch sử tải xuống"</string>
+ <string name="download_unknown_filename" msgid="4013465542563652175">"<Không xác định>"</string>
+ <string name="download_menu_open" msgid="4888327480367757513">"Mở"</string>
+ <string name="download_menu_clear" msgid="6264454531553418124">"Xoá khỏi danh sách"</string>
+ <string name="download_menu_delete" msgid="8815502136393894148">"Xoá"</string>
+ <string name="download_menu_cancel" msgid="2545333007601851574">"Huỷ tải xuống"</string>
+ <string name="download_menu_cancel_all" msgid="2136550823151999166">"Huỷ tất cả nội dung tải xuống"</string>
+ <string name="download_cancel_dlg_title" msgid="8909108500262799748">"Huỷ nội dung tải xuống"</string>
+ <string name="download_cancel_dlg_msg" msgid="6285389170052357797">"Tất cả <xliff:g id="DOWNLOAD_COUNT">%d</xliff:g> nội dung tải xuống sẽ bị huỷ và xoá khỏi lịch sử tải xuống."</string>
+ <string name="download_delete_file" msgid="5330036497843073249">"Tệp sẽ bị xoá"</string>
+ <string name="download_file_error_dlg_title" msgid="2693630283595384874">"Hết dung lượng"</string>
+ <string name="download_file_error_dlg_msg" msgid="5156405410324072471">"Không thể tải xuống <xliff:g id="FILENAME">%s</xliff:g>."\n"Tạo thêm dung lượng trên điện thoại của bạn và thử lại."</string>
+ <string name="download_failed_generic_dlg_title" msgid="6106781095337833391">"Tải xuống không thành công"</string>
+ <!-- outdated translation 605904452159416792 --> <string name="download_no_sdcard_dlg_title" product="nosdcard" msgid="56777245081568508">"Không có thẻ SD nào"</string>
+ <string name="download_no_sdcard_dlg_title" product="default" msgid="605904452159416792">"Không có thẻ SD nào"</string>
+ <!-- no translation found for download_no_sdcard_dlg_msg (3144652102051031721) -->
+ <skip />
+ <string name="download_no_sdcard_dlg_msg" product="default" msgid="2616399456116301518">"Cần thẻ SD để tải xuống <xliff:g id="FILENAME">%s</xliff:g>."</string>
+ <!-- outdated translation 6877712666046917741 --> <string name="download_sdcard_busy_dlg_title" product="nosdcard" msgid="8081445664689818973">"Thẻ SD không khả dụng"</string>
+ <string name="download_sdcard_busy_dlg_title" product="default" msgid="6877712666046917741">"Thẻ SD không khả dụng"</string>
+ <!-- outdated translation 3473883538192835204 --> <string name="download_sdcard_busy_dlg_msg" product="nosdcard" msgid="3979329954835690147">"Thẻ SD đang bận. Để cho phép tải xuống, hãy chọn \"Tắt bộ lưu trữ USB\" trong thông báo."</string>
+ <string name="download_sdcard_busy_dlg_msg" product="default" msgid="3473883538192835204">"Thẻ SD đang bận. Để cho phép tải xuống, hãy chọn \"Tắt bộ lưu trữ USB\" trong thông báo."</string>
+ <string name="download_no_application_title" msgid="1286056729168874295">"Không thể mở tệp"</string>
+ <string name="retry" msgid="1835923075542266721">"Thử lại"</string>
+ <string name="no_downloads" msgid="3947445710685021498">"Lịch sử tải xuống trống."</string>
+ <string name="download_error" msgid="413496839831257187">"Tải xuống không thành công."</string>
+ <string name="download_success" msgid="2279041638155595203">"Tải xuống <xliff:g id="FILE">%s</xliff:g> hoàn tất."</string>
+ <string name="download_running" msgid="2622942231322015059">"Đang tải xuống…"</string>
+ <string name="download_pending" msgid="2599683668575349559">"Đang bắt đầu tải xuống..."</string>
+ <string name="download_pending_network" msgid="6548714525679461053">"Đang đợi kết nối dữ liệu…"</string>
+ <string name="download_running_paused" msgid="6418029352085656495">"Đang đợi kết nối dữ liệu…"</string>
+ <string name="download_canceled" msgid="6057083743144492515">"Đã huỷ tải xuống."</string>
+ <string name="download_not_acceptable" msgid="313769696131563652">"Không thể tải xuống. Nội dung không được hỗ trợ trên điện thoại này."</string>
+ <string name="download_file_error" msgid="1206648050615176113">"Không thể hoàn tất tải xuống. Không đủ dung lượng."</string>
+ <string name="download_length_required" msgid="9038605488460437406">"Không thể tải xuống. Không thể xác định kích cỡ của mục."</string>
+ <string name="download_precondition_failed" msgid="8327584102874295580">"Tải xuống bị gián đoạn. Không thể tiếp tục tải xuống."</string>
+ <string name="search_the_web" msgid="6046130189241962337">"Tìm kiếm trên web"</string>
+ <string name="webstorage_outofspace_notification_title" msgid="1160474608059771788">"Bộ nhớ của trình duyệt đầy"</string>
+ <string name="webstorage_outofspace_notification_text" msgid="7341075135051829692">"Nhấp để tạo thêm dung lượng."</string>
+ <string name="webstorage_clear_data_title" msgid="689484577124333977">"Xoá dữ liệu đã lưu trữ"</string>
+ <string name="webstorage_clear_data_dialog_title" msgid="345457466368974706">"Xoá dữ liệu đã lưu trữ"</string>
+ <string name="webstorage_clear_data_dialog_message" msgid="6678281256970470125">"Tất cả dữ liệu được lưu trữ bởi trang web này sẽ bị xoá"</string>
+ <string name="webstorage_clear_data_dialog_ok_button" msgid="2516563534211898636">"Xoá tất cả"</string>
+ <string name="webstorage_clear_data_dialog_cancel_button" msgid="2028867751958942762">"Huỷ"</string>
+ <string name="webstorage_origin_summary_mb_stored" msgid="1985885826292236210">"MB được lưu trữ trên điện thoại"</string>
+ <string name="loading_video" msgid="4887871585216091096">"Đang tải video"</string>
+ <string name="geolocation_permissions_prompt_message" msgid="356796102004052471">"<xliff:g id="WEBSITE_ORIGIN">%s</xliff:g> muốn biết vị trí của bạn"</string>
+ <string name="geolocation_permissions_prompt_share" msgid="9084486342048347976">"Chia sẻ vị trí"</string>
+ <string name="geolocation_permissions_prompt_dont_share" msgid="6303025160237860300">"Từ chối"</string>
+ <string name="geolocation_permissions_prompt_remember" msgid="3118526300707348308">"Nhớ tuỳ chọn"</string>
+ <string name="geolocation_permissions_prompt_toast_allowed" msgid="987286072035125498">"Trang web này có thể truy cập vị trí của bạn. Thay đổi điều này trong Cài đặt -> Cài đặt trang web"</string>
+ <string name="geolocation_permissions_prompt_toast_disallowed" msgid="7695100950212692515">"Trang web này không thể truy cập vị trí của bạn. Thay đổi điều này trong Cài đặt -> Cài đặt trang web"</string>
+ <string name="geolocation_settings_page_title" msgid="1745477985097536528">"Xoá truy cập vị trí"</string>
+ <string name="geolocation_settings_page_summary_allowed" msgid="9180251524290811398">"Trang web này hiện có thể truy cập vị trí của bạn"</string>
+ <string name="geolocation_settings_page_summary_not_allowed" msgid="4589649082203102544">"Trang web này hiện không thể truy cập vị trí của bạn"</string>
+ <string name="geolocation_settings_page_dialog_title" msgid="1549842043381347668">"Xoá truy cập vị trí"</string>
+ <string name="geolocation_settings_page_dialog_message" msgid="7586671987576403993">"Truy cập vị trí cho trang web này sẽ bị xoá"</string>
+ <string name="geolocation_settings_page_dialog_ok_button" msgid="4789434178048077287">"Xoá truy cập"</string>
+ <string name="geolocation_settings_page_dialog_cancel_button" msgid="7941036504673409747">"Huỷ"</string>
+ <string name="website_settings_clear_all" msgid="8739804325997655980">"Xoá tất cả"</string>
+ <string name="website_settings_clear_all_dialog_title" msgid="7791826325122461718">"Xoá tất cả cài đặt trang web?"</string>
+ <string name="website_settings_clear_all_dialog_message" msgid="6150502090601476333">"Tất cả các quyền về vị trí và dữ liệu trên trang web sẽ bị xoá."</string>
+ <string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"Xoá tất cả dữ liệu"</string>
+ <string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"Huỷ"</string>
+ <string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"Đang đặt hình nền..."</string>
+ <!-- no translation found for defaultBookmarksUpButton (2303951020715704735) -->
+ <skip />
+ <!-- no translation found for empty_bookmarks_folder (7843361614634930942) -->
+ <skip />
+ <!-- no translation found for rlz_access_point (7165847807377650632) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_title (3325557652271172128) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_description (2187665745413495303) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_remove (8105572409059113340) -->
+ <skip />
+ <!-- no translation found for import_bookmarks_dialog_import (6933613853573899218) -->
+ <skip />
+</resources>
diff --git a/res/values-xlarge/dimensions.xml b/res/values-xlarge/dimensions.xml
new file mode 100644
index 0000000..5b86c86
--- /dev/null
+++ b/res/values-xlarge/dimensions.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2010 The Android Open Source Project Licensed under the
+ Apache License, Version 2.0 (the "License"); you may not use this file
+ except in compliance with the License. You may obtain a copy of the
+ License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by
+ applicable law or agreed to in writing, software distributed under the
+ License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+ CONDITIONS OF ANY KIND, either express or implied. See the License for
+ the specific language governing permissions and limitations under the
+ License.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <dimen name="bookmarkThumbnailWidth">180dip</dimen>
+ <dimen name="bookmarkThumbnailHeight">120dip</dimen>
+ <dimen name="favicon_padded_size">24dip</dimen>
+</resources>
diff --git a/res/values-xlarge/strings.xml b/res/values-xlarge/strings.xml
new file mode 100644
index 0000000..07b2b34
--- /dev/null
+++ b/res/values-xlarge/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- Name of menu item of a new tab.
+ Also used in the title bar when displaying a new tab [CHAR LIMIT=30] -->
+ <string name="new_tab">New tab</string>
+ <!-- Name of menu item of a new incognito tab. Also used in the
+ title bar when displaying a new tab [CHAR LIMIT=30] -->
+ <string name="new_incognito_tab">New incognito tab</string>
+ <!-- Name of menu item which brings up a list of the currently active tabs -->
+ <string name="active_tabs">Tabs</string>
+</resources>
diff --git a/res/values-xlarge/styles.xml b/res/values-xlarge/styles.xml
new file mode 100644
index 0000000..952d97a
--- /dev/null
+++ b/res/values-xlarge/styles.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ *
+ * Copyright 2006,2007,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.
+ */
+-->
+
+<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>
+ <style name="Dialog" parent="@android:style/Theme.Holo.Dialog" >
+ <item name="android:windowActionBar">false</item>
+ </style>
+ <style name="BookmarkTheme" parent="@android:Theme.Holo">
+ <item name="android:windowActionBar">false</item>
+ <item name="android:windowNoTitle">true</item>
+ <item name="android:colorBackgroundCacheHint">@null</item>
+ <item name="android:windowFrame">@null</item>
+ <item name="android:windowContentOverlay">@null</item>
+ <item name="android:windowIsFloating">true</item>
+ <item name="android:backgroundDimEnabled">false</item>
+ <item name="android:windowIsTranslucent">true</item>
+ </style>
+ <style name="ShortCutTheme" parent="@android:Theme.Holo">
+ </style>
+ <style name="ActionBarStyle">
+ <item name="android:height">48dip</item>
+ <item name="android:padding">0dip</item>
+ <item name="android:background">@drawable/tabbar_bg</item>
+ <item name="android:displayOptions"></item>
+ </style>
+ <style name="ActionButton">
+ <item name="android:background">@drawable/browserbarbutton</item>
+ </style>
+ <style name="Suggestions" parent="@android:style/Widget.Holo.Light.AutoCompleteTextView">
+ </style>
+ <style name="SuggestionLineMedium"
+ parent="@android:style/TextAppearance.Holo.Medium.Inverse">
+ </style>
+ <style name="SuggestionLineSmall"
+ parent="@android:style/TextAppearance.Holo.Small.Inverse">
+ </style>
+</resources>
diff --git a/res/values-zh-rCN-xlarge/strings.xml b/res/values-zh-rCN-xlarge/strings.xml
new file mode 100644
index 0000000..4a1b2da
--- /dev/null
+++ b/res/values-zh-rCN-xlarge/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="new_tab" msgid="7275656655054293038">"新建标签页"</string>
+ <string name="new_incognito_tab" msgid="5149742197322201152">"新建隐身标签页"</string>
+ <string name="active_tabs" msgid="5324492165541331128">"标签页"</string>
+</resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 41fa828..74368d2 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -19,6 +19,7 @@
<string name="application_name" msgid="1935869255545976415">"浏览器"</string>
<string name="choose_upload" msgid="3649366287575002063">"选择要上传的文件"</string>
<string name="new_tab" msgid="4505722538297295141">"新窗口"</string>
+ <string name="new_incognito_tab" msgid="5821404839654751753">"新隐身窗口"</string>
<string name="active_tabs" msgid="3050623868203544623">"窗口"</string>
<string name="tab_bookmarks" msgid="2305793036003473653">"书签"</string>
<string name="tab_most_visited" msgid="1077402532455000703">"访问最多"</string>
@@ -32,12 +33,6 @@
<string name="bookmarks_search" msgid="5229596268214362873">"浏览器"</string>
<string name="cancel" msgid="3017274947407233702">"取消"</string>
<string name="ok" msgid="1509280796718850364">"确定"</string>
- <plurals name="matches_found">
- <item quantity="zero" msgid="6242659159545399963">"没有匹配项"</item>
- <item quantity="one" msgid="4352019729062956802">"1 个匹配项"</item>
- <item quantity="few" msgid="5544267486978946555">"<xliff:g id="NUMBER">%d</xliff:g> 个匹配项"</item>
- <item quantity="other" msgid="6616125067364315405">"<xliff:g id="NUMBER">%d</xliff:g> 个匹配项"</item>
- </plurals>
<string name="title_bar_loading" msgid="7438217780834640678">"正在载入..."</string>
<string name="page_info" msgid="4048529256302257195">"网页信息"</string>
<string name="page_info_view" msgid="5303490449842635158">"查看网页信息"</string>
@@ -46,6 +41,8 @@
<string name="ssl_continue" msgid="8031515015829358457">"继续"</string>
<string name="security_warning" msgid="6607795404322797541">"安全警告"</string>
<string name="view_certificate" msgid="1472768887529093862">"查看证书"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
<string name="ssl_untrusted" msgid="5369967226521102194">"该证书并非来自可信的授权中心。"</string>
<string name="ssl_mismatch" msgid="558688832420069896">"网站的名称与证书上的名称不一致。"</string>
<string name="ssl_expired" msgid="5739349389499575559">"该证书已过期。"</string>
@@ -67,12 +64,23 @@
<string name="forward" msgid="4288210890526641577">"前进"</string>
<string name="save" msgid="5922311934992468496">"确定"</string>
<string name="do_not_save" msgid="6777633870113477714">"取消"</string>
- <string name="location" msgid="969988560160364559">"地点"</string>
- <string name="name" msgid="5990326151488445481">"姓名"</string>
+ <string name="location" msgid="3411848697912600125">"地址"</string>
+ <string name="containing_folder" msgid="6771180232953030479">"添加到"</string>
+ <string name="new_folder" msgid="7743540149088867917">"新建文件夹"</string>
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <string name="no_subfolders" msgid="5880411440592452802">"无子文件夹"</string>
+ <string name="add_to_bookmarks_menu_option" msgid="4449323955122214389">"书签"</string>
+ <string name="add_to_homescreen_menu_option" msgid="1461447829242963790">"主屏幕"</string>
+ <string name="add_to_other_folder_menu_option" msgid="5450890093372998187">"其他文件夹..."</string>
+ <string name="name" msgid="5462672162695365387">"标签"</string>
<string name="http" msgid="2163722670597250102">"http://"</string>
- <string name="save_to_bookmarks" msgid="588165100024086565">"添加书签"</string>
+ <string name="save_to_bookmarks" msgid="6101482434920313244">"添加到书签"</string>
+ <string name="bookmark_this_page" msgid="7530739804320811054">"将此页加为书签"</string>
<string name="edit_bookmark" msgid="5024089053490231905">"编辑书签"</string>
- <string name="create_shortcut_bookmark" msgid="9202323987633899835">"向主屏幕添加快捷方式"</string>
+ <string name="create_shortcut_bookmark" msgid="1995095662095484289">"向主屏幕添加快捷方式"</string>
<string name="open_bookmark" msgid="8473581305759935790">"打开"</string>
<string name="remove_bookmark" msgid="8407495852801410891">"删除书签"</string>
<string name="remove_from_bookmarks" msgid="4374080666576982775">"从书签中删除"</string>
@@ -87,13 +95,15 @@
<string name="bookmark_cannot_save_url" msgid="791722768778386941">"无法将此网址添加到书签。"</string>
<string name="delete_bookmark" msgid="2422989994934201992">"删除"</string>
<string name="bookmark_page" msgid="6845189305130307274">"将上次查看过的网页加为书签"</string>
- <string name="switch_to_thumbnails" msgid="5493351529609043151">"缩略图视图"</string>
- <string name="switch_to_list" msgid="8900531247982121055">"列表视图"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
<string name="current_page" msgid="7510129573681663135">"来源 "</string>
<string name="delete_bookmark_warning" msgid="758043186202032205">"将会删除书签“<xliff:g id="BOOKMARK">%s</xliff:g>”。"</string>
<string name="open_in_new_window" msgid="6596775546468054510">"在新窗口中打开"</string>
<string name="goto_dot" msgid="3895839050522602723">"转至"</string>
- <string name="find_dot" msgid="6259312434696611957">"页内查找"</string>
+ <string name="incognito_tab" msgid="5419458065370134289">"打开新的隐身标签页"</string>
<string name="select_dot" msgid="6299170761900561967">"选择文本"</string>
<string name="tab_picker_title" msgid="864478399057782913">"当前窗口"</string>
<string name="tab_picker_remove_tab" msgid="630087809802479397">"关闭"</string>
@@ -103,6 +113,13 @@
<string name="menu_view_download" msgid="2124570321712995120">"下载内容"</string>
<string name="copy_page_url" msgid="7635062169011319208">"复制网页网址"</string>
<string name="share_page" msgid="593756995297268343">"分享网页"</string>
+ <string name="menu_save_webarchive" msgid="3934652434001459581">"另存为网络存档"</string>
+ <string name="webarchive_saved" msgid="7045250341467345007">"网络存档已保存。"</string>
+ <string name="webarchive_failed" msgid="2880998204746620260">"无法保存网络存档。"</string>
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
<string name="contextmenu_openlink" msgid="7237961252214188935">"打开"</string>
<string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"在新窗口中打开"</string>
<string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"将链接加入书签"</string>
@@ -138,11 +155,44 @@
<string name="pref_content_homepage" msgid="6082437160778559806">"设置主页"</string>
<string name="pref_content_search_engine" msgid="1620101310821644144">"设置搜索引擎"</string>
<string name="pref_content_search_engine_summary" msgid="5162667665858487316">"选择搜索引擎"</string>
- <string name="pref_use_current" msgid="1493179933653044553">"使用当前页面"</string>
+ <string name="pref_set_homepage_to" msgid="7196350233061395098">"设置为..."</string>
+ <string name="pref_use_current" msgid="1778622474040406672">"当前页"</string>
+ <string name="pref_use_blank" msgid="8503238592551111169">"空白页"</string>
+ <string name="pref_use_default" msgid="192587563274735878">"默认页"</string>
<string name="pref_content_autofit" msgid="8260474534053660809">"自动调整页面"</string>
<string name="pref_content_autofit_summary" msgid="4587831659894879986">"调整网页版面以适合屏幕大小"</string>
- <string name="pref_content_landscape_only" msgid="2022546812766219672">"仅以横向模式显示"</string>
- <string name="pref_content_landscape_only_summary" msgid="1008238895535428855">"仅以横向宽屏模式显示网页"</string>
+ <string name="pref_personal_title" msgid="1447687455755683695">"个人设置"</string>
+ <string name="pref_personal_sync_with_chrome" msgid="1695182180332194033">"与谷歌浏览器同步"</string>
+ <string name="pref_personal_sync_with_chrome_summary" msgid="7414133931827321055">"在 Android 浏览器和谷歌浏览器之间共享书签和其他数据"</string>
+ <string name="pref_personal_google_account" msgid="952360133341490071">"Google 帐户"</string>
+ <string name="pref_personal_sync_bookmarks" msgid="59237515966184432">"同步书签"</string>
+ <string name="pref_personal_sync_bookmarks_summary" msgid="4791767605662205482">"在 Android 浏览器和谷歌浏览器之间同步书签"</string>
+ <string name="pref_personal_start_syncing" msgid="6046972042512655232">"开始同步"</string>
+ <string name="pref_personal_account_dialog_title" msgid="1390867119887955530">"选择要与其共享数据的 Google 帐户"</string>
+ <string name="pref_autofill_enabled" msgid="1174197447388234595">"表单自动填充"</string>
+ <string name="pref_autofill_enabled_summary" msgid="422640696197018914">"只需点击一下,即可填完网络表单"</string>
+ <string name="pref_autofill_profile_editor" msgid="1350709161524642663">"自动填充设置"</string>
+ <string name="pref_autofill_profile_editor_summary" msgid="6748434431641768870">"设置和管理自动填充表单的数据"</string>
+ <string name="autofill_profile_editor_name" msgid="8566130291459685955">"全名:"</string>
+ <string name="autofill_profile_editor_email_address" msgid="7967585896612797173">"电子邮件地址:"</string>
+ <string name="autofill_profile_editor_company_name" msgid="2813443159949210417">"公司名称:"</string>
+ <string name="autofill_profile_editor_address_line_1" msgid="836433242509243081">"地址行 1:"</string>
+ <string name="autofill_profile_editor_address_line_1_hint" msgid="5965659598509327172">"街道地址、邮政信箱、转交"</string>
+ <string name="autofill_profile_editor_address_line_2" msgid="8194745202893822479">"地址行 2:"</string>
+ <string name="autofill_profile_editor_address_line_2_hint" msgid="2048330295853546405">"公寓、套房、单元、楼栋、楼层等等。"</string>
+ <string name="autofill_profile_editor_city" msgid="4193225955409148508">"城市/乡镇:"</string>
+ <string name="autofill_profile_editor_state" msgid="8549739922338171458">"州或省/直辖市/自治区:"</string>
+ <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_save_profile" msgid="8349915287435262888">"保存个人资料"</string>
+ <string name="autofill_profile_successful_save" msgid="6834102203944938409">"个人资料已保存"</string>
+ <string name="autofill_profile_successful_delete" msgid="2421442112954362732">"个人资料已删除"</string>
+ <string name="autofill_profile_editor_delete_profile" msgid="7112035941146003753">"删除个人资料数据"</string>
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
<string name="pref_privacy_title" msgid="1052470980370846151">"隐私权设置"</string>
<string name="pref_privacy_clear_cache" msgid="3380316479925886998">"清除缓存"</string>
<string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"清除存储在本地缓存中的内容和数据库"</string>
@@ -208,6 +258,7 @@
<item msgid="891615911084608570">"日语 (ISO-2022-JP)"</item>
<item msgid="5589150448475151241">"日语 (SHIFT_JIS)"</item>
<item msgid="7356792686950371843">"日语 (EUC-JP)"</item>
+ <item msgid="2193955365569270096">"韩语 (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"文字编码"</string>
<string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"数据连接性问题"</string>
@@ -296,4 +347,11 @@
<string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"删除所有数据"</string>
<string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"取消"</string>
<string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"正在设置壁纸..."</string>
+ <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"书签"</string>
+ <string name="empty_bookmarks_folder" msgid="7843361614634930942">"无书签"</string>
+ <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
+ <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"与 Google 帐户同步"</string>
+ <string name="import_bookmarks_dialog_description" msgid="2187665745413495303">"Android 书签尚未与 Google 帐户关联"</string>
+ <string name="import_bookmarks_dialog_remove" msgid="8105572409059113340">"删除 Android 书签"</string>
+ <string name="import_bookmarks_dialog_import" msgid="6933613853573899218">"将 Android 书签添加到 <xliff:g id="GOOGLE_ACCOUNT">%s</xliff:g> 的书签中"</string>
</resources>
diff --git a/res/values-zh-rTW-xlarge/strings.xml b/res/values-zh-rTW-xlarge/strings.xml
new file mode 100644
index 0000000..156a1ea
--- /dev/null
+++ b/res/values-zh-rTW-xlarge/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="new_tab" msgid="7275656655054293038">"新分頁"</string>
+ <string name="new_incognito_tab" msgid="5149742197322201152">"新無痕式分頁"</string>
+ <string name="active_tabs" msgid="5324492165541331128">"分頁"</string>
+</resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 8b773bd..759fe23 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -19,6 +19,7 @@
<string name="application_name" msgid="1935869255545976415">"瀏覽器"</string>
<string name="choose_upload" msgid="3649366287575002063">"選擇要上載的檔案"</string>
<string name="new_tab" msgid="4505722538297295141">"新視窗"</string>
+ <string name="new_incognito_tab" msgid="5821404839654751753">"新的無痕式視窗"</string>
<string name="active_tabs" msgid="3050623868203544623">"視窗"</string>
<string name="tab_bookmarks" msgid="2305793036003473653">"書籤"</string>
<string name="tab_most_visited" msgid="1077402532455000703">"常用網頁"</string>
@@ -32,12 +33,6 @@
<string name="bookmarks_search" msgid="5229596268214362873">"瀏覽器"</string>
<string name="cancel" msgid="3017274947407233702">"取消"</string>
<string name="ok" msgid="1509280796718850364">"確定"</string>
- <plurals name="matches_found">
- <item quantity="zero" msgid="6242659159545399963">"沒有相配項"</item>
- <item quantity="one" msgid="4352019729062956802">"1 個相配項"</item>
- <item quantity="few" msgid="5544267486978946555">"<xliff:g id="NUMBER">%d</xliff:g> 個相符項目"</item>
- <item quantity="other" msgid="6616125067364315405">"<xliff:g id="NUMBER">%d</xliff:g> 個相符項目"</item>
- </plurals>
<string name="title_bar_loading" msgid="7438217780834640678">"載入中..."</string>
<string name="page_info" msgid="4048529256302257195">"頁面資訊"</string>
<string name="page_info_view" msgid="5303490449842635158">"檢視頁面資訊"</string>
@@ -46,6 +41,8 @@
<string name="ssl_continue" msgid="8031515015829358457">"繼續"</string>
<string name="security_warning" msgid="6607795404322797541">"安全性警告"</string>
<string name="view_certificate" msgid="1472768887529093862">"檢視憑證"</string>
+ <!-- no translation found for ssl_go_back (4598951822061593819) -->
+ <skip />
<string name="ssl_untrusted" msgid="5369967226521102194">"此憑證來自未信任的機構。"</string>
<string name="ssl_mismatch" msgid="558688832420069896">"網站名稱與憑證不符。"</string>
<string name="ssl_expired" msgid="5739349389499575559">"此憑證已過期"</string>
@@ -67,12 +64,23 @@
<string name="forward" msgid="4288210890526641577">"下一頁"</string>
<string name="save" msgid="5922311934992468496">"確定"</string>
<string name="do_not_save" msgid="6777633870113477714">"取消"</string>
- <string name="location" msgid="969988560160364559">"位置"</string>
- <string name="name" msgid="5990326151488445481">"名稱"</string>
+ <string name="location" msgid="3411848697912600125">"地址"</string>
+ <string name="containing_folder" msgid="6771180232953030479">"新增至"</string>
+ <string name="new_folder" msgid="7743540149088867917">"新資料夾"</string>
+ <!-- no translation found for edit_folder (621817453133656156) -->
+ <skip />
+ <!-- no translation found for delete_folder (2046483129024501116) -->
+ <skip />
+ <string name="no_subfolders" msgid="5880411440592452802">"沒有子資料夾"</string>
+ <string name="add_to_bookmarks_menu_option" msgid="4449323955122214389">"書籤"</string>
+ <string name="add_to_homescreen_menu_option" msgid="1461447829242963790">"主螢幕"</string>
+ <string name="add_to_other_folder_menu_option" msgid="5450890093372998187">"其他資料夾..."</string>
+ <string name="name" msgid="5462672162695365387">"標籤"</string>
<string name="http" msgid="2163722670597250102">"http://"</string>
- <string name="save_to_bookmarks" msgid="588165100024086565">"新增書籤"</string>
+ <string name="save_to_bookmarks" msgid="6101482434920313244">"加入書籤"</string>
+ <string name="bookmark_this_page" msgid="7530739804320811054">"將這個網頁加入書籤"</string>
<string name="edit_bookmark" msgid="5024089053490231905">"編輯書籤"</string>
- <string name="create_shortcut_bookmark" msgid="9202323987633899835">"新增捷徑至首頁"</string>
+ <string name="create_shortcut_bookmark" msgid="1995095662095484289">"新增捷徑至主螢幕"</string>
<string name="open_bookmark" msgid="8473581305759935790">"開啟"</string>
<string name="remove_bookmark" msgid="8407495852801410891">"刪除書籤"</string>
<string name="remove_from_bookmarks" msgid="4374080666576982775">"從書籤中移除"</string>
@@ -87,13 +95,15 @@
<string name="bookmark_cannot_save_url" msgid="791722768778386941">"無法將此網址加入書籤。"</string>
<string name="delete_bookmark" msgid="2422989994934201992">"刪除"</string>
<string name="bookmark_page" msgid="6845189305130307274">"將最後瀏覽的網頁加入書籤"</string>
- <string name="switch_to_thumbnails" msgid="5493351529609043151">"縮圖檢視"</string>
- <string name="switch_to_list" msgid="8900531247982121055">"清單檢視"</string>
+ <!-- no translation found for bookmark_thumbnail_view (3104780739986130377) -->
+ <skip />
+ <!-- no translation found for bookmark_list_view (7394379479920174576) -->
+ <skip />
<string name="current_page" msgid="7510129573681663135">"來源 "</string>
<string name="delete_bookmark_warning" msgid="758043186202032205">"刪除「<xliff:g id="BOOKMARK">%s</xliff:g>」書籤?"</string>
<string name="open_in_new_window" msgid="6596775546468054510">"在新視窗開啟"</string>
<string name="goto_dot" msgid="3895839050522602723">"前往"</string>
- <string name="find_dot" msgid="6259312434696611957">"在頁面中尋找"</string>
+ <string name="incognito_tab" msgid="5419458065370134289">"開啟新的無痕式分頁"</string>
<string name="select_dot" msgid="6299170761900561967">"選取文字"</string>
<string name="tab_picker_title" msgid="864478399057782913">"目前視窗"</string>
<string name="tab_picker_remove_tab" msgid="630087809802479397">"關閉"</string>
@@ -103,6 +113,13 @@
<string name="menu_view_download" msgid="2124570321712995120">"下載"</string>
<string name="copy_page_url" msgid="7635062169011319208">"複製網頁網址"</string>
<string name="share_page" msgid="593756995297268343">"分享網頁"</string>
+ <string name="menu_save_webarchive" msgid="3934652434001459581">"另存為網頁封存"</string>
+ <string name="webarchive_saved" msgid="7045250341467345007">"已儲存網頁封存。"</string>
+ <string name="webarchive_failed" msgid="2880998204746620260">"無法儲存網頁封存。"</string>
+ <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
+ <skip />
+ <!-- no translation found for contextheader_folder_empty (974171637803391651) -->
+ <skip />
<string name="contextmenu_openlink" msgid="7237961252214188935">"開啟"</string>
<string name="contextmenu_openlink_newwindow" msgid="992765050093960353">"在新視窗開啟"</string>
<string name="contextmenu_bookmark_thislink" msgid="8095373680616870021">"將連結加入書籤"</string>
@@ -138,11 +155,44 @@
<string name="pref_content_homepage" msgid="6082437160778559806">"設定首頁"</string>
<string name="pref_content_search_engine" msgid="1620101310821644144">"設定搜尋引擎"</string>
<string name="pref_content_search_engine_summary" msgid="5162667665858487316">"選取搜尋引擎"</string>
- <string name="pref_use_current" msgid="1493179933653044553">"使用目前的網頁"</string>
+ <string name="pref_set_homepage_to" msgid="7196350233061395098">"設為..."</string>
+ <string name="pref_use_current" msgid="1778622474040406672">"目前網頁"</string>
+ <string name="pref_use_blank" msgid="8503238592551111169">"空白網頁"</string>
+ <string name="pref_use_default" msgid="192587563274735878">"預設網頁"</string>
<string name="pref_content_autofit" msgid="8260474534053660809">"自動調整頁面"</string>
<string name="pref_content_autofit_summary" msgid="4587831659894879986">"配合螢幕大小調整網頁版面"</string>
- <string name="pref_content_landscape_only" msgid="2022546812766219672">"僅以水平模式顯示"</string>
- <string name="pref_content_landscape_only_summary" msgid="1008238895535428855">"僅以橫向寬螢幕瀏覽模式顯示網頁"</string>
+ <string name="pref_personal_title" msgid="1447687455755683695">"個人設定"</string>
+ <string name="pref_personal_sync_with_chrome" msgid="1695182180332194033">"與Google 瀏覽器保持同步"</string>
+ <string name="pref_personal_sync_with_chrome_summary" msgid="7414133931827321055">"共享「Android 瀏覽器」和「Google 瀏覽器」之間的書籤及其他資料"</string>
+ <string name="pref_personal_google_account" msgid="952360133341490071">"Google 帳戶"</string>
+ <string name="pref_personal_sync_bookmarks" msgid="59237515966184432">"同步處理書籤"</string>
+ <string name="pref_personal_sync_bookmarks_summary" msgid="4791767605662205482">"同步處理「Android 瀏覽器」和「Google 瀏覽器」之間的書籤"</string>
+ <string name="pref_personal_start_syncing" msgid="6046972042512655232">"開始同步"</string>
+ <string name="pref_personal_account_dialog_title" msgid="1390867119887955530">"請選取要與其共用的 Google 帳戶"</string>
+ <string name="pref_autofill_enabled" msgid="1174197447388234595">"表單自動填入"</string>
+ <string name="pref_autofill_enabled_summary" msgid="422640696197018914">"輕按一下即可填妥網頁表單"</string>
+ <string name="pref_autofill_profile_editor" msgid="1350709161524642663">"自動填入設定"</string>
+ <string name="pref_autofill_profile_editor_summary" msgid="6748434431641768870">"設定和管理自動填入的表單資料"</string>
+ <string name="autofill_profile_editor_name" msgid="8566130291459685955">"全名:"</string>
+ <string name="autofill_profile_editor_email_address" msgid="7967585896612797173">"電子郵件:"</string>
+ <string name="autofill_profile_editor_company_name" msgid="2813443159949210417">"公司名稱:"</string>
+ <string name="autofill_profile_editor_address_line_1" msgid="836433242509243081">"地址行 1:"</string>
+ <string name="autofill_profile_editor_address_line_1_hint" msgid="5965659598509327172">"路街巷弄、郵政信箱、代收人"</string>
+ <string name="autofill_profile_editor_address_line_2" msgid="8194745202893822479">"地址行 2:"</string>
+ <string name="autofill_profile_editor_address_line_2_hint" msgid="2048330295853546405">"門牌號碼、樓層等"</string>
+ <string name="autofill_profile_editor_city" msgid="4193225955409148508">"市區鄉鎮:"</string>
+ <string name="autofill_profile_editor_state" msgid="8549739922338171458">"州/省/地區:"</string>
+ <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_save_profile" msgid="8349915287435262888">"儲存設定檔"</string>
+ <string name="autofill_profile_successful_save" msgid="6834102203944938409">"設定檔已儲存"</string>
+ <string name="autofill_profile_successful_delete" msgid="2421442112954362732">"個人資料已刪除"</string>
+ <string name="autofill_profile_editor_delete_profile" msgid="7112035941146003753">"刪除設定檔資料"</string>
+ <!-- no translation found for autofill_setup_dialog_message (6605682320156223114) -->
+ <skip />
+ <!-- no translation found for autofill_setup_dialog_negative_toast (4653039631354546610) -->
+ <skip />
<string name="pref_privacy_title" msgid="1052470980370846151">"隱私設定"</string>
<string name="pref_privacy_clear_cache" msgid="3380316479925886998">"清除快取"</string>
<string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"清除本機快取內容與資料庫"</string>
@@ -208,6 +258,7 @@
<item msgid="891615911084608570">"日文 (ISO-2022-JP)"</item>
<item msgid="5589150448475151241">"日文 (SHIFT_JIS)"</item>
<item msgid="7356792686950371843">"日文 (EUC-JP)"</item>
+ <item msgid="2193955365569270096">"韓文 (EUC-KR)"</item>
</string-array>
<string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"文字編碼"</string>
<string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"資料連線問題"</string>
@@ -296,4 +347,11 @@
<string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"刪除所有資料"</string>
<string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"取消"</string>
<string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"設定桌布..."</string>
+ <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"書籤"</string>
+ <string name="empty_bookmarks_folder" msgid="7843361614634930942">"沒有任何書籤"</string>
+ <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
+ <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"與 Google 帳戶保持同步"</string>
+ <string name="import_bookmarks_dialog_description" msgid="2187665745413495303">"您的 Android 書籤未與任何 Google 帳戶建立關聯"</string>
+ <string name="import_bookmarks_dialog_remove" msgid="8105572409059113340">"移除您的 Android 書籤"</string>
+ <string name="import_bookmarks_dialog_import" msgid="6933613853573899218">"將您的 Android 書籤新增至 <xliff:g id="GOOGLE_ACCOUNT">%s</xliff:g> 的書籤"</string>
</resources>
diff --git a/res/values/bookmarks_icons.xml b/res/values/bookmarks_icons.xml
new file mode 100644
index 0000000..3f1b5d6
--- /dev/null
+++ b/res/values/bookmarks_icons.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <array name="bookmark_preloads">
+ <item>@raw/favicon_google</item>
+ <item>@raw/thumb_google</item>
+ <item>@raw/favicon_picasa</item>
+ <item>@raw/thumb_picasa</item>
+ <item>@raw/favicon_yahoo</item>
+ <item>@raw/thumb_yahoo</item>
+ <item>@raw/favicon_msn</item>
+ <item>@raw/thumb_msn</item>
+ <item>@raw/favicon_myspace</item>
+ <item>@raw/thumb_myspace</item>
+ <item>@raw/favicon_facebook</item>
+ <item>@raw/thumb_facebook</item>
+ <item>@raw/favicon_wikipedia</item>
+ <item>@raw/thumb_wikipedia</item>
+ <item>@raw/favicon_ebay</item>
+ <item>@raw/thumb_ebay</item>
+ <item>@raw/favicon_cnn</item>
+ <item>@raw/thumb_cnn</item>
+ <item>@raw/favicon_nytimes</item>
+ <item>@raw/thumb_nytimes</item>
+ <item>@raw/favicon_espn</item>
+ <item>@raw/thumb_espn</item>
+ <item>@raw/favicon_amazon</item>
+ <item>@raw/thumb_amazon</item>
+ <item>@raw/favicon_weatherchannel</item>
+ <item>@raw/thumb_weatherchannel</item>
+ <item>@raw/favicon_bbc</item>
+ <item>@raw/thumb_bbc</item>
+ </array>
+</resources>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 68bf253..5a5d255 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -20,19 +20,13 @@
<!-- FIXME: Change the name of this file! It is now being used generically
for the browser -->
<resources>
- <color name="username_text">#ffffffff</color>
- <color name="username_edit">#ff000000</color>
-
- <color name="password_text">#ffffffff</color>
- <color name="password_edit">#ff000000</color>
-
- <color name="ssl_text_label">#ffffffff</color>
- <color name="ssl_text_value">#ffffffff</color>
-
<color name="white">#ffffffff</color>
<color name="black">#ff000000</color>
-
-
<color name="geolocation_permissions_prompt_background">#ffdddddd</color>
+
+ <color name="bookmarkWidgetHeader">#383847</color>
+ <color name="bookmarkWidgetDivider">#383847</color>
+ <color name="bookmarkWidgetItemBackground">#2b2b3c</color>
+ <color name="bookmarkWidgetFolderBackground">#A0383847</color>
</resources>
diff --git a/res/values/dimensions.xml b/res/values/dimensions.xml
new file mode 100644
index 0000000..d51ab33
--- /dev/null
+++ b/res/values/dimensions.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2010 The Android Open Source Project Licensed under the
+ Apache License, Version 2.0 (the "License"); you may not use this file
+ except in compliance with the License. You may obtain a copy of the
+ License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by
+ applicable law or agreed to in writing, software distributed under the
+ License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+ CONDITIONS OF ANY KIND, either express or implied. See the License for
+ the specific language governing permissions and limitations under the
+ License.
+-->
+<resources
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- The width of a selected tab -->
+ <dimen
+ name="tab_width_selected">300dp</dimen>
+ <!-- The width of an unselected tab -->
+ <dimen
+ name="tab_width_unselected">300dp</dimen>
+
+ <dimen name="bookmarkThumbnailWidth">90dip</dimen>
+ <dimen name="bookmarkThumbnailHeight">80dip</dimen>
+ <dimen name="add_bookmark_width">500dip</dimen>
+ <dimen name="folder_selector_height">300dip</dimen>
+ <dimen name="widgetItemMinHeight">48dip</dimen>
+ <dimen name="favicon_size">16dip</dimen>
+ <dimen name="favicon_padded_size">20dip</dimen>
+</resources>
diff --git a/res/values/integers.xml b/res/values/integers.xml
new file mode 100644
index 0000000..2864d47
--- /dev/null
+++ b/res/values/integers.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2010 The Android Open Source Project Licensed under the
+ Apache License, Version 2.0 (the "License"); you may not use this file
+ except in compliance with the License. You may obtain a copy of the
+ License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by
+ applicable law or agreed to in writing, software distributed under the
+ License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+ CONDITIONS OF ANY KIND, either express or implied. See the License for
+ the specific language governing permissions and limitations under the
+ License.
+-->
+<resources
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- The number of lines in the suggestions dropdown in landscape -->
+ <integer name="max_suggest_lines_landscape">4</integer>
+ <!-- The number of lines in the suggestions dropdown in portrait -->
+ <integer name="max_suggest_lines_portrait">12</integer>
+ <!-- The maximum number of open tabs -->
+ <integer name="max_tabs">16</integer>
+ <!-- The duration of the tab animations in millisecs -->
+ <integer name="tab_animation_duration">500</integer>
+ <integer name="max_width_crumb">200</integer>
+ <!-- The maximum number of most visited URLs in the history tab -->
+ <integer name="most_visits_limit">10</integer>
+</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index fc0d68b..b1c04dc 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -20,6 +20,9 @@
<string name="choose_upload">Choose file for upload</string>
<!-- Name of menu item of a new tab. Also used in the title bar when displaying a new tab -->
<string name="new_tab">New window</string>
+ <!-- Name of menu item of a new incognito tab. Also used in the
+ title bar when displaying a new tab [CHAR LIMIT=30] -->
+ <string name="new_incognito_tab">New incognito window</string>
<!-- Name of menu item which brings up a list of the currently active tabs -->
<string name="active_tabs">Windows</string>
<!-- Name of tab containing bookmarks -->
@@ -44,25 +47,11 @@
<string name="action">Sign in</string>
<!-- The name of the bookmarks and history search suggestion source. -->
<string name="bookmarks_search">Browser</string>
-
<!-- Label for a cancel button. It is used for multiple cancel buttons in different contexts -->
<string name="cancel">Cancel</string>
<!-- Label for a confirm button. Used in multiple contexts. -->
<string name="ok">OK</string>
- <!-- Displayed on the Find dialog to display the number of matches
- found in the current page. -->
- <plurals name="matches_found">
- <!-- Case of no matches -->
- <item quantity="zero">No matches</item>
- <!-- Case of one match -->
- <item quantity="one">1 match</item>
- <!-- Case of "few" (two) matches -->
- <item quantity="few"><xliff:g id="number" example="2">%d</xliff:g> matches</item>
- <!-- Case of several matches -->
- <item quantity="other"><xliff:g id="number" example="137">%d</xliff:g> matches</item>
- </plurals>
-
<!-- Displayed on the title bar while the page is loading -->
<string name="title_bar_loading">Loading\u2026</string>
@@ -86,6 +75,9 @@
<!-- Label for a button on an SSL error dialog that lets the user view the
certificate -->
<string name="view_certificate">View certificate</string>
+ <!-- Label for a button on an SSL error dialog that lets the user go back to
+ the last page they were on instead of continuing to the new page. [CHAR-LIMIT=20] -->
+ <string name="ssl_go_back">Go back</string>
<!-- Message in an SSL Error dialog -->
<string name="ssl_untrusted">This certificate is not from a trusted authority.</string>
@@ -133,17 +125,37 @@
<!-- Button label to cancel saving a bookmark. -->
<string name="do_not_save">Cancel</string>
<!-- Field label in Bookmark dialog box: refers to URL of the page to bookmark -->
- <string name="location">Location</string>
+ <string name="location">Address</string>
+ <!-- Field label in Bookmark dialog box: refers to the folder in which to save the bookmark -->
+ <string name="containing_folder">Add to</string>
+ <!-- Default name for a new folder and label for a button that allows the user to create a new folder
+ in the add bookmark dialog -->
+ <string name="new_folder">New folder</string>
+ <!-- Context menu item to edit a folder [CHAR LIMIT=50] -->
+ <string name="edit_folder">Edit folder</string>
+ <!-- Context menu item to delete a folder [CHAR LIMIT=50] -->
+ <string name="delete_folder">Delete folder</string>
+ <!-- Label stating that the currently open folder has no subfolders
+ in the add bookmark dialog [CHAR-LIMIT=none]-->
+ <string name="no_subfolders">No subfolders</string>
+ <!-- Menu item to use the top level bookmarks folder to save a bookmark in. [CHAR-LIMIT=30]-->
+ <string name="add_to_bookmarks_menu_option">Bookmarks</string>
+ <!-- Menu item to save the newly created bookmark to the home screen. [CHAR-LIMIT=30]-->
+ <string name="add_to_homescreen_menu_option">Home screen</string>
+ <!-- Menu item to open a picker to determine which folder to save a bookmark in. [CHAR-LIMIT=30]-->
+ <string name="add_to_other_folder_menu_option">Other folder\u2026</string>
<!-- Field label in Bookmark dialog box: title that the user wishes to use for the bookmark -->
- <string name="name">Name</string>
+ <string name="name">Label</string>
<!-- Initial value in Location field in Bookmark dialog box -->
<string name="http">http://</string>
- <!-- Menu item that opens a dialog to save a bookmark, initialized with the current page -->
- <string name="save_to_bookmarks">Add bookmark</string>
+ <!-- Menu item that opens a dialog to save a bookmark for the current page [CHAR LIMIT=30] -->
+ <string name="save_to_bookmarks">Add to Bookmarks</string>
+ <!-- Title of the dialog to bookmark a page -->
+ <string name="bookmark_this_page">Bookmark this page</string>
<!-- Menu item on the bookmarks page, to edit an existing bookmark -->
<string name="edit_bookmark">Edit bookmark</string>
- <!-- Context menu item to create a shortcut to the bookmark on the desktop -->
- <string name="create_shortcut_bookmark">Add shortcut to Home</string>
+ <!-- Context menu item to create a shortcut to the bookmark on the desktop [CHAR LIMIT=50] -->
+ <string name="create_shortcut_bookmark">Add shortcut to home</string>
<!-- Context menu item to open the currently highlighted bookmark -->
<string name="open_bookmark">Open</string>
<!-- Menu item to remove the currently highlighted bookmark-->
@@ -176,11 +188,11 @@
showing. -->
<string name="bookmark_page">Bookmark last-viewed page</string>
<!-- Menu item in the page that displays all bookmarks. Switches to
- a grid view which shows thumbnails -->
- <string name="switch_to_thumbnails">Thumbnail view</string>
+ a grid view which shows thumbnails [CHAR LIMIT=20] -->
+ <string name="bookmark_thumbnail_view">Thumbnails</string>
<!-- Menu item in the page that displays all bookmarks. Switches to a
- list view which shows titles -->
- <string name="switch_to_list">List view</string>
+ list view which shows titles [CHAR LIMIT=20] -->
+ <string name="bookmark_list_view">List</string>
<!-- Summary text under the New Bookmark item on the Bookmarks screen.
Tells the user that if they select this item, it will bring up a
dialog to bookmark the page that the browser is currently viewing,
@@ -194,9 +206,8 @@
<string name="open_in_new_window">Open in new window</string>
<!-- Menu item to open a dialog which allows the user to enter a url or do search-->
<string name="goto_dot">Go</string>
- <!-- Menu item that opens up a dialog which allows the user to provide a
- string and search for it on the page. -->
- <string name="find_dot">Find on page</string>
+ <!-- Menu item that opens up a new incognito tab. [CHAR LIMIT=30] -->
+ <string name="incognito_tab">Open new incognito tab</string>
<!-- Menu item to switch to text selection mode for copy and paste. -->
<string name="select_dot">Select text</string>
<!-- Title of current windows screen; appears in title bar -->
@@ -217,6 +228,16 @@
<string name="copy_page_url">Copy page url</string>
<!-- Menu item -->
<string name="share_page">Share page</string>
+ <!-- Menu item for saving a page as a web archive. -->
+ <string name="menu_save_webarchive">Save as Web Archive</string>
+ <!-- Toast informing the user that the page has been saved. -->
+ <string name="webarchive_saved">Web archive saved.</string>
+ <!-- Toast informing the user that saving the page has failed. -->
+ <string name="webarchive_failed">Failed to save web archive.</string>
+ <!-- The number of bookmarks in a folder [CHAR LIMT=50] -->
+ <string name="contextheader_folder_bookmarkcount"><xliff:g id="bookmark_count">%d</xliff:g> bookmarks</string>
+ <!-- No bookmarks in the folder [CHAR LIMIT=50] -->
+ <string name="contextheader_folder_empty">Empty folder</string>
<!-- Context Menu item open the currently selected link in the current
window.-->
<string name="contextmenu_openlink">Open</string>
@@ -309,16 +330,86 @@
<string name="pref_content_search_engine">Set search engine</string>
<!-- Settings summary -->
<string name="pref_content_search_engine_summary">Select a search engine</string>
- <!-- Settings button label -->
- <string name="pref_use_current">Use current page</string>
+ <!-- Settings button label that to pick what to set the homepage to [CHAR LIMIT=40] -->
+ <string name="pref_set_homepage_to">Set to\u2026</string>
+ <!-- Settings button label to set the homepage to the current page [CHAR LIMIT=40] -->
+ <string name="pref_use_current">Current page</string>
+ <!-- Settings button label to set the homepage to a blank page [CHAR LIMIT=40] -->
+ <string name="pref_use_blank">Blank page</string>
+ <!-- Settings button label to set the homepage to the default page [CHAR LIMIT=40] -->
+ <string name="pref_use_default">Default page</string>
<!-- Settings label -->
<string name="pref_content_autofit">Auto-fit pages</string>
<!-- Settings summary -->
<string name="pref_content_autofit_summary">Format web pages to fit the screen</string>
- <!-- Settings label for enabling a mode where the browser is always set to landscape mode -->
- <string name="pref_content_landscape_only">Landscape-only display</string>
- <!-- Settings summary -->
- <string name="pref_content_landscape_only_summary">Display pages only in the wider, landscape screen orientation</string>
+
+ <!-- Settings screen & section title for "Personal settings". These include things like
+ configuring bookmark syncing to Google servers and form auto fill settings. [CHAR-LIMIT=32] -->
+ <string name="pref_personal_title">Personal settings</string>
+ <!-- Checkbox setting to enable or disable syncing bookmarks and other data with Google Chrome. [CHAR-LIMIT=48] -->
+ <string name="pref_personal_sync_with_chrome">Sync with Google Chrome</string>
+ <!-- Checkbox setting to enable or disable syncing bookmarks and other data with Google Chrome. [CHAR-LIMIT=none] -->
+ <string name="pref_personal_sync_with_chrome_summary">Share bookmarks & other data between Android Browser and Google Chrome</string>
+ <!-- Label indicating which Google account is being used to sync bookmarks between Android and Chrome [CHAR-LIMIT=20] -->
+ <string name="pref_personal_google_account">Google account</string>
+ <!-- Checkbox setting to enable or disable syncing bookmarks with Google Chrome. [CHAR-LIMIT=32] -->
+ <string name="pref_personal_sync_bookmarks">Sync bookmarks</string>
+ <!-- Summary for a checkbox setting to enable or disable syncing bookmarks with Google Chrome. [CHAR-LIMIT=none] -->
+ <string name="pref_personal_sync_bookmarks_summary">Sync bookmarks between Android Browser and Google Chrome</string>
+ <!-- Button to start a sync of bookmarks and other data between the Android Browser and Google Chrome [CHAR-LIMIT=20] -->
+ <string name="pref_personal_start_syncing">Start syncing</string>
+ <!-- Dialog title used when asking the user which Google account they want to use to sync data between Android Browser and Google Chrome [CHAR-LIMIT=20] -->
+ <string name="pref_personal_account_dialog_title">Select Google account to share with</string>
+
+ <!-- Checkbox setting for enabling/disabling the form AutoFill feature [CHAR-LIMIT=32] -->
+ <string name="pref_autofill_enabled">Form AutoFill</string>
+ <!-- Settings summary for the form AutoFill feature. [CHAR-LIMIT=none] -->
+ <string name="pref_autofill_enabled_summary">Fill out web forms in a single click</string>
+ <!-- Label for option that when clicked opens the AutoFill settings screen. Also used as the title of that AutoFill Settings screen. [CHAR-LIMIT=32] -->
+ <string name="pref_autofill_profile_editor">AutoFill Settings</string>
+ <!-- Summary for the AutoFill Settings preference [CHAR-LIMIT=none] -->
+ <string name="pref_autofill_profile_editor_summary">Set up & manage data for AutoFilled forms</string>
+
+ <!-- String for the user's full name in the AutoFill profile editor. [CHAR-LIMIT=32] -->
+ <string name="autofill_profile_editor_name">Full name:</string>
+ <!-- String for the user's e-mail address in the AutoFill profile editor. [CHAR-LIMIT=32] -->
+ <string name="autofill_profile_editor_email_address">Email:</string>
+ <!-- String for the user's company name in the AutoFill profile editor. [CHAR-LIMIT=32] -->
+ <string name="autofill_profile_editor_company_name">Company name:</string>
+ <!-- String for the first line of the user's address in the AutoFill profile editor. [CHAR-LIMIT=32] -->
+ <string name="autofill_profile_editor_address_line_1">Address line 1:</string>
+ <!-- String to suggest to the user the kind of data to be used for the first line of the address. CHAR-LIMIT=64] -->
+ <string name="autofill_profile_editor_address_line_1_hint">Street address, P.O. box, c/o</string>
+ <!-- String for the second line of the user's address in the AutoFill profile editor. [CHAR-LIMIT=32] -->
+ <string name="autofill_profile_editor_address_line_2">Address line 2:</string>
+ <!-- String to suggest to the user the kind of data to be used for the second line of the address. CHAR-LIMIT=64] -->
+ <string name="autofill_profile_editor_address_line_2_hint">Apartment, suite, unit, building, floor etc.</string>
+ <!-- String for the user's city or town in the AutoFill profile editor. [CHAR-LIMIT=32] -->
+ <string name="autofill_profile_editor_city">City / Town:</string>
+ <!-- String for the user's state or province or region in the AutoFill profile editor. [CHAR-LIMIT=32] -->
+ <string name="autofill_profile_editor_state">State / Province / Region:</string>
+ <!-- String for the user's zip code in the AutoFill profile editor. [CHAR-LIMIT=32] -->
+ <string name="autofill_profile_editor_zip_code">Zip code:</string>
+ <!-- String for the user's country in the AutoFill profile editor. [CHAR-LIMIT=32] -->
+ <string name="autofill_profile_editor_country">Country:</string>
+ <!-- String for the user's phone number in the AutoFill profile editor. [CHAR-LIMIT=32] -->
+ <string name="autofill_profile_editor_phone_number">Phone:</string>
+
+ <!-- Button text to save the AutoFill profile [CHAR-LIMIT=20] -->
+ <string name="autofill_profile_editor_save_profile">Save profile</string>
+ <!-- Toast message displayed when the profile has been successfully saved [CHAR-LIMIT=none] -->
+ <string name="autofill_profile_successful_save">Profile saved</string>
+ <!-- Toast message displayed when the profile has been successfully deleted [CHAR-LIMIT=none] -->
+ <string name="autofill_profile_successful_delete">Profile deleted</string>
+ <!-- Button text to delete all the AutoFill profile data [CHAR-LIMIT=20] -->
+ <string name="autofill_profile_editor_delete_profile">Delete profile data</string>
+
+ <!-- Text on a dialog shown to the user when they are prompted to set up the autofill feature [CHAR-LIMIT=NONE] -->
+ <string name="autofill_setup_dialog_message">Browser can automatically complete web forms like this one. Would you like to set up your profile?</string>
+ <!-- Toast message displayed when the user decides to not set up autofill at this time. We want to remind them that they can configure
+ it through the Browser Settings menu. [CHAR-LIMIT=NONE] -->
+ <string name="autofill_setup_dialog_negative_toast">AutoFill can always be configured through Browser Settings -> Personal Settings.</string>
+
<!-- Settings screen, section title -->
<string name="pref_privacy_title">Privacy settings</string>
<!-- Settings label -->
@@ -446,6 +537,8 @@
<!-- Do not tranlsate. Development option -->
<string name="pref_development_nav_dump" translatable="false">Enable nav cache dump</string>
<!-- Do not tranlsate. Development option -->
+ <string name="pref_development_hardware_accel" translatable="false">Enable OpenGL Rendering</string>
+ <!-- Do not tranlsate. Development option -->
<string name="js_engine_flags" translatable="false">Set JS flags</string>
<!-- Do not tranlsate. Development option -->
<string name="pref_development_uastring" translatable="false">UAString</string>
@@ -477,6 +570,8 @@
<item>Japanese (ISO-2022-JP)</item>
<item>Japanese (SHIFT_JIS)</item>
<item>Japanese (EUC-JP)</item>
+ <!-- No need to translate a EUC-KR part, and there is no string length limits. -->
+ <item>Korean (EUC-KR)</item>
<!-- TODO: We should add a lot more encodings. -->
</string-array>
<!-- Dialog box title -->
@@ -490,6 +585,7 @@
<item>ISO-2022-JP</item>
<item>SHIFT_JIS</item>
<item>EUC-JP</item>
+ <item>EUC-KR</item>
</string-array>
<string name="pref_default_text_encoding_default" translatable="false">Latin-1</string>
<!-- Title for a dialog displayed when the browser has a data connectivity
@@ -753,4 +849,32 @@
<string name="error_console_eval_text_hint" translatable="false">Evaluate JavaScript</string>
<string name="error_console_eval_button_text" translatable="false">Evaluate</string>
+ <!-- The default state to the "up to parent folder" button in the bookmarks UI. This
+ is displayed when the user is at the highest level and cannot go up [CHAR LIMIT=16] -->
+ <string name="defaultBookmarksUpButton">Bookmarks</string>
+
+ <!-- The string that is displayed when there are no bookmarks to display.
+ This is centered in the middle of the screen [CHAR LIMIT=NONE] -->
+ <string name="empty_bookmarks_folder">There are no bookmarks</string>
+
+ <!-- Access point for RLZ tracking. -->
+ <string name="rlz_access_point">Y1</string>
+
+ <!-- Title for a dialog asking the user what they want to do with their bookmarks when adding a sync account [CHAR-LIMIT=32] -->
+ <string name="import_bookmarks_dialog_title">Sync with Google account</string>
+
+ <!-- Description for a dialog asking the user what they want to do with their bookmarks when adding a sync account [CHAR-LIMIT=none] -->
+ <string name="import_bookmarks_dialog_description">Your Android bookmarks are not associated with a Google account</string>
+
+ <!-- Button allowing users to remove all of their existing bookmarks when setting up syncing with their bookmarks stored in Google Chrome [CHAR-LIMIT=64] -->
+ <string name="import_bookmarks_dialog_remove">Remove your Android bookmarks</string>
+
+ <!-- Button allowing users to import all of their existing bookmarks into an account when setting up syncing with their bookmarks stored in Google Chrome [CHAR-LIMIT=64] -->
+ <string name="import_bookmarks_dialog_import">Add your Android bookmarks to bookmarks for <xliff:g id="Google account" example="account@example.com">%s</xliff:g></string>
+
+ <!-- Url Selection Action Mode -->
+
+ <!-- Menu item to share URL selection [CHAR LIMIT=30] -->
+ <string name="menu_share_url">Share</string>
+
</resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 2e8510a..115676c 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -1,38 +1,64 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
-/*
+/*
*
* Copyright 2006,2007,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
+ * 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
+ * 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
+ * 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.Black">
- <item name="android:windowBackground">@color/white</item>
- <item name="android:colorBackground">#FFFFFFFF</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowContentOverlay">@null</item>
</style>
-
+ <style name="Dialog" parent="@android:style/Theme.Dialog">
+ <item name="android:background">@color/black</item>
+ </style>
+ <style name="ActionBar" parent="@android:style/Widget.ActionBar">
+ <item name="android:background">@color/black</item>
+ </style>
<style name="BookmarkTheme" parent="@android:Theme.Black">
<item name="android:windowNoTitle">true</item>
<item name="android:windowContentOverlay">@null</item>
</style>
-
+ <style name="ShortcutTheme" parent="@android:Theme.Holo.DialogWhenLarge">
+ <item name="android:windowNoTitle">true</item>
+ <item name="android:windowContentOverlay">@null</item>
+ </style>
<style name="TitleBar">
<item name="android:windowEnterAnimation">@anim/title_bar_enter</item>
<item name="android:windowExitAnimation">@anim/title_bar_exit</item>
</style>
+ <style name="HoloIcon">
+ <item name="android:paddingLeft">16dip</item>
+ <item name="android:paddingRight">16dip</item>
+ </style>
+ <style name="HoloButton" parent="@style/HoloIcon">
+ <item name="android:background">@drawable/browserbarbutton</item>
+ </style>
+ <style name="TabTitleSelected" parent="@android:style/TextAppearance.Small">
+ <item name="android:textColor">?android:attr/textColorPrimary</item>
+ <item name="android:textStyle">bold</item>
+ </style>
+ <style name="TabTitleUnselected" parent="@android:style/TextAppearance.Small">
+ <item name="android:textColor">?android:attr/textColorSecondary</item>
+ <item name="android:textStyle">normal</item>
+ </style>
+ <style name="Suggestions" parent="@android:style/Widget.AutoCompleteTextView">
+ </style>
+ <style name="SuggestionLineMedium" parent="@android:style/TextAppearance.Medium">
+ </style>
+ <style name="SuggestionLineSmall" parent="@android:style/TextAppearance.Small">
+ </style>
</resources>
-
diff --git a/res/xml/advanced_preferences.xml b/res/xml/advanced_preferences.xml
new file mode 100644
index 0000000..075232d
--- /dev/null
+++ b/res/xml/advanced_preferences.xml
@@ -0,0 +1,41 @@
+<?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">
+
+ <!-- Entries and values in this list are set dynamically. -->
+ <com.android.browser.search.SearchEnginePreference
+ android:key="search_engine"
+ android:title="@string/pref_content_search_engine"
+ android:defaultValue="google"
+ android:summary="@string/pref_content_search_engine_summary"
+ android:dialogTitle="@string/pref_content_search_engine" />
+
+ <PreferenceScreen
+ android:key="website_settings"
+ android:title="@string/pref_extras_website_settings"
+ android:summary="@string/pref_extras_website_settings_summary" />
+
+ <com.android.browser.BrowserYesNoPreference
+ android:key="reset_default_preferences"
+ android:title="@string/pref_extras_reset_default"
+ android:summary="@string/pref_extras_reset_default_summary"
+ android:dialogMessage="@string/pref_extras_reset_default_dlg"
+ android:dialogTitle="@string/pref_extras_reset_default_dlg_title"
+ android:dialogIcon="@android:drawable/ic_dialog_alert" />
+
+</PreferenceScreen>
diff --git a/res/xml/bookmarklistwidget_info.xml b/res/xml/bookmarklistwidget_info.xml
new file mode 100644
index 0000000..0baee5e
--- /dev/null
+++ b/res/xml/bookmarklistwidget_info.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!-- 3x3 Widget displaying the user's bookmarks as a list with favicons. -->
+<appwidget-provider
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:minWidth="219dip"
+ android:minHeight="219dip"
+ android:updatePeriodMillis="0"
+ android:previewImage="@drawable/preview"
+ android:initialLayout="@layout/bookmarklistwidget">
+</appwidget-provider>
diff --git a/res/xml/browser_preferences.xml b/res/xml/browser_preferences.xml
index 1da85ec..a2d91ff 100644
--- a/res/xml/browser_preferences.xml
+++ b/res/xml/browser_preferences.xml
@@ -68,12 +68,6 @@
android:summary="@string/pref_content_autofit_summary" />
<CheckBoxPreference
- android:key="landscape_only"
- android:defaultValue="false"
- android:title="@string/pref_content_landscape_only"
- android:summary="@string/pref_content_landscape_only_summary" />
-
- <CheckBoxPreference
android:key="enable_javascript"
android:defaultValue="true"
android:title="@string/pref_content_javascript" />
@@ -139,6 +133,12 @@
android:title="@string/pref_security_save_form_data"
android:summary="@string/pref_security_save_form_data_summary" />
+ <CheckBoxPreference
+ android:key="autofill_enabled"
+ android:defaultValue="true"
+ android:title="@string/pref_autofill_enabled"
+ android:summary="@string/pref_autofill_enabled_summary" />
+
<com.android.browser.BrowserYesNoPreference
android:key="privacy_clear_form_data"
android:title="@string/pref_privacy_clear_form_data"
diff --git a/res/xml/debug_preferences.xml b/res/xml/debug_preferences.xml
index c1ed1e6..50d4c14 100644
--- a/res/xml/debug_preferences.xml
+++ b/res/xml/debug_preferences.xml
@@ -16,59 +16,17 @@
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android" >
- <PreferenceCategory
- android:title="@string/pref_development_title"
- android:key="debug_menu" >
- <!-- The javascript console is enabled by default when the user has
- also enabled debug mode by navigating to about:debug. -->
- <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="enable_hardware_accel"
+ android:defaultValue="true"
+ android:title="@string/pref_development_hardware_accel" />
- <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" />
-
- <ListPreference
- android:key="user_agent"
- android:title="@string/pref_development_uastring"
- android:entries="@array/pref_development_ua_choices"
- android:entryValues="@array/pref_development_ua_values"
- android:defaultValue="0"/>
-
- </PreferenceCategory>
+ <ListPreference
+ android:key="user_agent"
+ android:title="@string/pref_development_uastring"
+ android:entries="@array/pref_development_ua_choices"
+ android:entryValues="@array/pref_development_ua_values"
+ android:defaultValue="0"/>
</PreferenceScreen>
diff --git a/res/xml/hidden_debug_preferences.xml b/res/xml/hidden_debug_preferences.xml
new file mode 100644
index 0000000..6d66eaa
--- /dev/null
+++ b/res/xml/hidden_debug_preferences.xml
@@ -0,0 +1,62 @@
+<?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="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/page_content_preferences.xml b/res/xml/page_content_preferences.xml
new file mode 100644
index 0000000..3d7791c
--- /dev/null
+++ b/res/xml/page_content_preferences.xml
@@ -0,0 +1,92 @@
+<?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">
+
+ <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"
+ android:title="@string/pref_default_zoom"
+ android:defaultValue="MEDIUM"
+ android:entries="@array/pref_default_zoom_choices"
+ android:entryValues="@array/pref_default_zoom_values"
+ android:dialogTitle="@string/pref_default_zoom_dialogtitle" />
+
+ <CheckBoxPreference
+ android:key="load_page"
+ android:defaultValue="true"
+ android:title="@string/pref_content_load_page"
+ android:summary="@string/pref_content_load_page_summary" />
+
+ <ListPreference
+ android:key="default_text_encoding"
+ android:title="@string/pref_default_text_encoding"
+ android:defaultValue="@string/pref_default_text_encoding_default"
+ android:entries="@array/pref_default_text_encoding_choices"
+ android:entryValues="@array/pref_default_text_encoding_values"
+ android:dialogTitle="@string/pref_default_text_encoding_dialogtitle" />
+
+ <CheckBoxPreference
+ android:key="block_popup_windows"
+ android:defaultValue="true"
+ android:title="@string/pref_content_block_popups" />
+
+ <CheckBoxPreference
+ android:key="load_images"
+ android:defaultValue="true"
+ android:title="@string/pref_content_load_images"
+ android:summary="@string/pref_content_load_images_summary" />
+
+ <CheckBoxPreference
+ android:key="autofit_pages"
+ android:defaultValue="true"
+ android:title="@string/pref_content_autofit"
+ android:summary="@string/pref_content_autofit_summary" />
+
+ <CheckBoxPreference
+ android:key="enable_javascript"
+ android:defaultValue="true"
+ android:title="@string/pref_content_javascript" />
+
+ <ListPreference
+ android:key="plugin_state"
+ android:title="@string/pref_content_plugins"
+ android:defaultValue="ON"
+ android:entries="@array/pref_content_plugins_choices"
+ android:entryValues="@array/pref_content_plugins_values"
+ android:dialogTitle="@string/pref_content_plugins" />
+
+ <CheckBoxPreference
+ android:key="open_in_background"
+ android:defaultValue="false"
+ android:title="@string/pref_content_open_in_background"
+ android:summary="@string/pref_content_open_in_background_summary" />
+
+ <com.android.browser.BrowserHomepagePreference
+ android:key="homepage"
+ android:title="@string/pref_content_homepage"
+ android:hint="@string/http"
+ android:inputType="textUri|textMultiLine" />
+
+</PreferenceScreen>
diff --git a/res/xml/personal_preferences.xml b/res/xml/personal_preferences.xml
new file mode 100644
index 0000000..30ebae2
--- /dev/null
+++ b/res/xml/personal_preferences.xml
@@ -0,0 +1,36 @@
+<?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">
+
+ <Preference android:key="sync_with_chrome"
+ android:title="@string/pref_personal_sync_with_chrome"
+ android:summary="@string/pref_personal_sync_with_chrome_summary"
+ />
+
+ <CheckBoxPreference android:key="autofill_enabled"
+ android:title="@string/pref_autofill_enabled"
+ android:summary="@string/pref_autofill_enabled_summary"
+ android:defaultValue="true"
+ />
+
+ <PreferenceScreen
+ android:fragment="com.android.browser.AutoFillSettingsFragment"
+ android:key="autofill_profile"
+ android:title="@string/pref_autofill_profile_editor"
+ android:summary="@string/pref_autofill_profile_editor_summary" />
+
+</PreferenceScreen>
diff --git a/res/xml/preference_headers.xml b/res/xml/preference_headers.xml
new file mode 100644
index 0000000..1a54990
--- /dev/null
+++ b/res/xml/preference_headers.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <header android:fragment="com.android.browser.preferences.PageContentPreferencesFragment"
+ android:title="@string/pref_content_title"
+ />
+
+ <header android:fragment="com.android.browser.preferences.PersonalPreferencesFragment"
+ android:title="@string/pref_personal_title"
+ />
+
+ <header android:fragment="com.android.browser.preferences.PrivacyPreferencesFragment"
+ android:title="@string/pref_privacy_title"
+ />
+
+ <header android:fragment="com.android.browser.preferences.SecurityPreferencesFragment"
+ android:title="@string/pref_security_title"
+ />
+
+ <header android:fragment="com.android.browser.preferences.AdvancedPreferencesFragment"
+ android:title="@string/pref_extras_title"
+ />
+</preference-headers>
diff --git a/res/xml/privacy_preferences.xml b/res/xml/privacy_preferences.xml
new file mode 100644
index 0000000..a6ea16b
--- /dev/null
+++ b/res/xml/privacy_preferences.xml
@@ -0,0 +1,79 @@
+<?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">
+
+ <com.android.browser.BrowserYesNoPreference
+ android:key="privacy_clear_cache"
+ android:title="@string/pref_privacy_clear_cache"
+ android:summary="@string/pref_privacy_clear_cache_summary"
+ android:dialogMessage="@string/pref_privacy_clear_cache_dlg"
+ android:dialogTitle="@string/clear"
+ android:dialogIcon="@android:drawable/ic_dialog_alert" />
+
+ <com.android.browser.BrowserYesNoPreference
+ android:key="privacy_clear_history"
+ android:title="@string/pref_privacy_clear_history"
+ android:summary="@string/pref_privacy_clear_history_summary"
+ android:dialogMessage="@string/pref_privacy_clear_history_dlg"
+ android:dialogTitle="@string/clear"
+ android:dialogIcon="@android:drawable/ic_dialog_alert"/>
+
+ <CheckBoxPreference
+ android:key="accept_cookies"
+ android:defaultValue="true"
+ android:title="@string/pref_security_accept_cookies"
+ android:summary="@string/pref_security_accept_cookies_summary" />
+
+ <com.android.browser.BrowserYesNoPreference
+ android:key="privacy_clear_cookies"
+ android:title="@string/pref_privacy_clear_cookies"
+ android:summary="@string/pref_privacy_clear_cookies_summary"
+ android:dialogMessage="@string/pref_privacy_clear_cookies_dlg"
+ android:dialogTitle="@string/clear"
+ android:dialogIcon="@android:drawable/ic_dialog_alert"/>
+
+ <CheckBoxPreference
+ android:key="save_formdata"
+ android:defaultValue="true"
+ android:title="@string/pref_security_save_form_data"
+ android:summary="@string/pref_security_save_form_data_summary" />
+
+ <com.android.browser.BrowserYesNoPreference
+ android:key="privacy_clear_form_data"
+ android:title="@string/pref_privacy_clear_form_data"
+ android:summary="@string/pref_privacy_clear_form_data_summary"
+ android:dialogMessage="@string/pref_privacy_clear_form_data_dlg"
+ android:dialogTitle="@string/clear"
+ android:dialogIcon="@android:drawable/ic_dialog_alert"/>
+
+ <CheckBoxPreference
+ android:key="enable_geolocation"
+ android:defaultValue="true"
+ android:title="@string/pref_privacy_enable_geolocation"
+ android:summary="@string/pref_privacy_enable_geolocation_summary" />
+
+ <com.android.browser.BrowserYesNoPreference
+ android:key="privacy_clear_geolocation_access"
+ android:dependency="enable_geolocation"
+ android:title="@string/pref_privacy_clear_geolocation_access"
+ android:summary="@string/pref_privacy_clear_geolocation_access_summary"
+ android:dialogMessage="@string/pref_privacy_clear_geolocation_access_dlg"
+ android:dialogTitle="@string/clear"
+ android:dialogIcon="@android:drawable/ic_dialog_alert"/>
+
+</PreferenceScreen>
diff --git a/res/xml/security_preferences.xml b/res/xml/security_preferences.xml
new file mode 100644
index 0000000..8d4464b
--- /dev/null
+++ b/res/xml/security_preferences.xml
@@ -0,0 +1,40 @@
+<?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="remember_passwords"
+ android:defaultValue="true"
+ android:title="@string/pref_security_remember_passwords"
+ android:summary="@string/pref_security_remember_passwords_summary" />
+
+ <com.android.browser.BrowserYesNoPreference
+ android:key="privacy_clear_passwords"
+ android:title="@string/pref_privacy_clear_passwords"
+ android:summary="@string/pref_privacy_clear_passwords_summary"
+ android:dialogMessage="@string/pref_privacy_clear_passwords_dlg"
+ android:dialogTitle="@string/clear"
+ android:dialogIcon="@android:drawable/ic_dialog_alert"/>
+
+ <CheckBoxPreference
+ android:key="show_security_warnings"
+ android:defaultValue="true"
+ android:title="@string/pref_security_show_security_warning"
+ android:summary="@string/pref_security_show_security_warning_summary" />
+
+</PreferenceScreen>
diff --git a/src/com/android/browser/ActiveTabsPage.java b/src/com/android/browser/ActiveTabsPage.java
index 2de7787..fb5ed3b 100644
--- a/src/com/android/browser/ActiveTabsPage.java
+++ b/src/com/android/browser/ActiveTabsPage.java
@@ -20,7 +20,7 @@
import android.graphics.Bitmap;
import android.os.Handler;
import android.util.AttributeSet;
-import android.view.KeyEvent;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -32,16 +32,19 @@
import android.widget.TextView;
public class ActiveTabsPage extends LinearLayout {
- private final BrowserActivity mBrowserActivity;
- private final LayoutInflater mFactory;
- private final TabControl mControl;
- private final TabsListAdapter mAdapter;
- private final ListView mListView;
- public ActiveTabsPage(BrowserActivity context, TabControl control) {
+ private static final String LOGTAG = "TabPicker";
+
+ private final LayoutInflater mFactory;
+ private final UiController mUiController;
+ private final TabControl mControl;
+ private final TabsListAdapter mAdapter;
+ private final ListView mListView;
+
+ public ActiveTabsPage(Context context, UiController control) {
super(context);
- mBrowserActivity = context;
- mControl = control;
+ mUiController = control;
+ mControl = control.getTabControl();
mFactory = LayoutInflater.from(context);
mFactory.inflate(R.layout.active_tabs, this);
mListView = (ListView) findViewById(R.id.list);
@@ -51,21 +54,24 @@
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
if (mControl.canCreateNewTab()) {
- position--;
+ position -= 2;
}
boolean needToAttach = false;
- if (position == -1) {
+ if (position == -2) {
// Create a new tab
- mBrowserActivity.openTabToHomePage();
+ 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 = !mBrowserActivity.switchToTab(position);
+ needToAttach = !mUiController.switchToTab(position);
}
- mBrowserActivity.removeActiveTabPage(needToAttach);
+ mUiController.removeActiveTabsPage(needToAttach);
}
});
}
@@ -98,7 +104,7 @@
public int getCount() {
int count = mControl.getTabCount();
if (mControl.canCreateNewTab()) {
- count++;
+ count += 2;
}
// XXX: This is a workaround to be more like a real adapter. Most
// adapters call notifyDataSetChanged() whenever the internal data
@@ -128,23 +134,28 @@
}
public int getItemViewType(int position) {
if (mControl.canCreateNewTab()) {
- position--;
+ position -= 2;
}
// Do not recycle the "add new tab" item.
- return position == -1 ? IGNORE_ITEM_VIEW_TYPE : 1;
+ 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--;
+ position -= 2;
}
if (convertView == null) {
- convertView = mFactory.inflate(position == -1 ?
- R.layout.tab_view_add_tab : R.layout.tab_view, 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 != -1) {
+ if (position >= 0) {
TextView title =
(TextView) convertView.findViewById(R.id.title);
TextView url = (TextView) convertView.findViewById(R.id.url);
@@ -152,7 +163,19 @@
(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 ");
+ }
tab.populatePickerData();
+ 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();
@@ -164,11 +187,11 @@
final int closePosition = position;
close.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
- mBrowserActivity.closeTab(
+ mUiController.closeTab(
mControl.getTab(closePosition));
if (tabCount == 1) {
- mBrowserActivity.openTabToHomePage();
- mBrowserActivity.removeActiveTabPage(false);
+ mUiController.openTabToHomePage();
+ mUiController.removeActiveTabsPage(false);
} else {
mNotified = true;
notifyDataSetChanged();
diff --git a/src/com/android/browser/AddBookmarkPage.java b/src/com/android/browser/AddBookmarkPage.java
index 594f985..24a8cd5 100644
--- a/src/com/android/browser/AddBookmarkPage.java
+++ b/src/com/android/browser/AddBookmarkPage.java
@@ -16,106 +16,583 @@
package com.android.browser;
+import com.android.browser.provider.BrowserProvider2;
+
import android.app.Activity;
+import android.app.LoaderManager;
import android.content.ContentResolver;
+import android.content.ContentUris;
+import android.content.ContentValues;
import android.content.Context;
-import android.content.Intent;
+import android.content.CursorLoader;
+import android.content.Loader;
+import android.content.SharedPreferences;
import android.content.res.Resources;
import android.database.Cursor;
import android.graphics.Bitmap;
+import android.graphics.drawable.Drawable;
import android.net.ParseException;
+import android.net.Uri;
import android.net.WebAddress;
+import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
-import android.provider.Browser;
+import android.preference.PreferenceManager;
+import android.provider.BrowserContract;
+import android.text.TextUtils;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.MenuItem;
import android.view.View;
+import android.view.ViewGroup;
import android.view.Window;
+import android.view.WindowManager;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.AdapterView;
+import android.widget.CursorAdapter;
import android.widget.EditText;
+import android.widget.ListView;
+import android.widget.PopupMenu;
import android.widget.TextView;
import android.widget.Toast;
import java.net.URI;
import java.net.URISyntaxException;
-import java.util.Date;
+import java.util.Stack;
-public class AddBookmarkPage extends Activity {
+public class AddBookmarkPage extends Activity
+ implements View.OnClickListener, TextView.OnEditorActionListener,
+ AdapterView.OnItemClickListener, LoaderManager.LoaderCallbacks<Cursor>,
+ BreadCrumbView.Controller, PopupMenu.OnMenuItemClickListener {
+
+ public static final long DEFAULT_FOLDER_ID = -1;
+ public static final String TOUCH_ICON_URL = "touch_icon_url";
+ // Place on an edited bookmark to remove the saved thumbnail
+ public static final String REMOVE_THUMBNAIL = "remove_thumbnail";
+ public static final String USER_AGENT = "user_agent";
+
+ /* package */ static final String EXTRA_EDIT_BOOKMARK = "bookmark";
+ /* package */ static final String EXTRA_IS_FOLDER = "is_folder";
+
+ private static final int MAX_CRUMBS_SHOWN = 2;
private final String LOGTAG = "Bookmarks";
+ // Set to true to see the crash on the code I would like to run.
+ private final boolean DEBUG_CRASH = false;
+
+ // IDs for the CursorLoaders that are used.
+ private final int LOADER_ID_FOLDER_CONTENTS = 0;
+ private final int LOADER_ID_ALL_FOLDERS = 1;
private EditText mTitle;
private EditText mAddress;
private TextView mButton;
private View mCancelButton;
private boolean mEditingExisting;
+ private boolean mEditingFolder;
private Bundle mMap;
private String mTouchIconUrl;
- private Bitmap mThumbnail;
private String mOriginalUrl;
+ private TextView mFolder;
+ private View mDefaultView;
+ private View mFolderSelector;
+ private EditText mFolderNamer;
+ private View mAddNewFolder;
+ private View mAddSeparator;
+ private long mCurrentFolder = 0;
+ private FolderAdapter mAdapter;
+ private BreadCrumbView mCrumbs;
+ private TextView mFakeTitle;
+ private View mCrumbHolder;
+ private ListView mListView;
+ private boolean mSaveToHomeScreen;
+ private long mRootFolder;
+
+ private static class Folder {
+ String Name;
+ long Id;
+ Folder(String name, long id) {
+ Name = name;
+ Id = id;
+ }
+ }
// Message IDs
private static final int SAVE_BOOKMARK = 100;
+ private static final int TOUCH_ICON_DOWNLOADED = 101;
private Handler mHandler;
- private View.OnClickListener mSaveBookmark = new View.OnClickListener() {
- public void onClick(View v) {
- if (save()) {
- finish();
+ private InputMethodManager getInputMethodManager() {
+ return (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
+ }
+
+ @Override
+ public void onTop(int level, Object data) {
+ if (null == data) return;
+ Folder folderData = (Folder) data;
+ long folder = folderData.Id;
+ Uri uri = BrowserContract.Bookmarks.buildFolderUri(folder);
+ LoaderManager manager = getLoaderManager();
+ CursorLoader loader = (CursorLoader) ((Loader) manager.getLoader(
+ LOADER_ID_FOLDER_CONTENTS));
+ loader.setUri(uri);
+ loader.forceLoad();
+ if (mFolderNamer.getVisibility() == View.VISIBLE) {
+ completeOrCancelFolderNaming(true);
+ }
+ }
+
+ @Override
+ public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
+ if (v == mFolderNamer) {
+ if (v.getText().length() > 0) {
+ if (actionId == EditorInfo.IME_NULL) {
+ // Only want to do this once.
+ if (event.getAction() == KeyEvent.ACTION_UP) {
+ completeOrCancelFolderNaming(false);
+ }
+ }
+ }
+ // Steal the key press; otherwise a newline will be added
+ return true;
+ }
+ return false;
+ }
+
+ private void switchToDefaultView(boolean changedFolder) {
+ mFolderSelector.setVisibility(View.GONE);
+ mDefaultView.setVisibility(View.VISIBLE);
+ mCrumbHolder.setVisibility(View.GONE);
+ mFakeTitle.setVisibility(View.VISIBLE);
+ if (changedFolder) {
+ Object data = mCrumbs.getTopData();
+ if (data != null) {
+ Folder folder = (Folder) data;
+ mCurrentFolder = folder.Id;
+ int resource = mCurrentFolder == mRootFolder ?
+ R.drawable.ic_menu_bookmarks :
+ com.android.internal.R.drawable.ic_menu_archive;
+ Drawable drawable = getResources().getDrawable(resource);
+ updateFolderLabel(folder.Name, drawable);
}
}
- };
+ }
- private View.OnClickListener mCancel = new View.OnClickListener() {
- public void onClick(View v) {
- finish();
+ @Override
+ public void onClick(View v) {
+ if (v == mButton) {
+ if (mFolderSelector.getVisibility() == View.VISIBLE) {
+ // We are showing the folder selector.
+ if (mFolderNamer.getVisibility() == View.VISIBLE) {
+ completeOrCancelFolderNaming(false);
+ } else {
+ // User has selected a folder. Go back to the opening page
+ mSaveToHomeScreen = false;
+ switchToDefaultView(true);
+ }
+ } else if (save()) {
+ finish();
+ }
+ } else if (v == mCancelButton) {
+ if (mFolderNamer.getVisibility() == View.VISIBLE) {
+ completeOrCancelFolderNaming(true);
+ } else if (mFolderSelector.getVisibility() == View.VISIBLE) {
+ switchToDefaultView(false);
+ } else {
+ finish();
+ }
+ } else if (v == mFolder) {
+ PopupMenu popup = new PopupMenu(this, mFolder);
+ popup.getMenuInflater().inflate(R.menu.folder_choice,
+ popup.getMenu());
+ if (mEditingFolder) {
+ popup.getMenu().removeItem(R.id.home_screen);
+ }
+ popup.setOnMenuItemClickListener(this);
+ popup.show();
+ } else if (v == mAddNewFolder) {
+ mFolderNamer.setVisibility(View.VISIBLE);
+ mFolderNamer.setText(R.string.new_folder);
+ mFolderNamer.requestFocus();
+ updateList();
+ mAddNewFolder.setVisibility(View.GONE);
+ mAddSeparator.setVisibility(View.GONE);
+ getInputMethodManager().showSoftInput(mFolderNamer,
+ InputMethodManager.SHOW_IMPLICIT);
}
- };
+ }
+
+ @Override
+ public boolean onMenuItemClick(MenuItem item) {
+ switch(item.getItemId()) {
+ case R.id.bookmarks:
+ mCurrentFolder = mRootFolder;
+ updateFolderLabel(item.getTitle(), item.getIcon());
+ mSaveToHomeScreen = false;
+ break;
+ case R.id.home_screen:
+ // Create a short cut to the home screen
+ mSaveToHomeScreen = true;
+ updateFolderLabel(item.getTitle(), item.getIcon());
+ break;
+ case R.id.other:
+ switchToFolderSelector();
+ break;
+ default:
+ return false;
+ }
+ return true;
+ }
+
+ // Refresh the ListView to hide or show the empty view, as necessary.
+ // Should be called after mFolderNamer is shown or hidden.
+ private void updateList() {
+ if (mAdapter.getCount() == 0) {
+ // XXX: Is there a better way to refresh the ListView?
+ mListView.setAdapter(mAdapter);
+ }
+ }
+
+ private void completeOrCancelFolderNaming(boolean cancel) {
+ if (!cancel && !TextUtils.isEmpty(mFolderNamer.getText())) {
+ String name = mFolderNamer.getText().toString();
+ long id = addFolderToCurrent(mFolderNamer.getText().toString());
+ descendInto(name, id);
+ }
+ mFolderNamer.setVisibility(View.GONE);
+ mAddNewFolder.setVisibility(View.VISIBLE);
+ mAddSeparator.setVisibility(View.VISIBLE);
+ getInputMethodManager().hideSoftInputFromWindow(
+ mFolderNamer.getWindowToken(), 0);
+ updateList();
+ }
+
+ private long addFolderToCurrent(String name) {
+ // Add the folder to the database
+ ContentValues values = new ContentValues();
+ values.put(BrowserContract.Bookmarks.TITLE,
+ name);
+ values.put(BrowserContract.Bookmarks.IS_FOLDER, 1);
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
+ String accountType = prefs.getString(BrowserBookmarksPage.PREF_ACCOUNT_TYPE, null);
+ String accountName = prefs.getString(BrowserBookmarksPage.PREF_ACCOUNT_NAME, null);
+ if (!TextUtils.isEmpty(accountName) && !TextUtils.isEmpty(accountType)) {
+ values.put(BrowserContract.Bookmarks.ACCOUNT_TYPE, accountType);
+ values.put(BrowserContract.Bookmarks.ACCOUNT_NAME, accountName);
+ }
+ long currentFolder;
+ Object data = mCrumbs.getTopData();
+ if (data != null) {
+ currentFolder = ((Folder) data).Id;
+ } else {
+ currentFolder = mRootFolder;
+ }
+ values.put(BrowserContract.Bookmarks.PARENT, currentFolder);
+ Uri uri = getContentResolver().insert(
+ BrowserContract.Bookmarks.CONTENT_URI, values);
+ if (uri != null) {
+ return ContentUris.parseId(uri);
+ } else {
+ return -1;
+ }
+ }
+
+ private void switchToFolderSelector() {
+ mDefaultView.setVisibility(View.GONE);
+ mFolderSelector.setVisibility(View.VISIBLE);
+ mCrumbHolder.setVisibility(View.VISIBLE);
+ mFakeTitle.setVisibility(View.GONE);
+ mAddNewFolder.setVisibility(View.VISIBLE);
+ mAddSeparator.setVisibility(View.VISIBLE);
+ }
+
+ private void descendInto(String foldername, long id) {
+ if (id != DEFAULT_FOLDER_ID) {
+ mCrumbs.pushView(foldername, new Folder(foldername, id));
+ mCrumbs.notifyController();
+ }
+ }
+
+ @Override
+ public Loader<Cursor> onCreateLoader(int id, Bundle args) {
+ String[] projection;
+ switch (id) {
+ case LOADER_ID_ALL_FOLDERS:
+ projection = new String[] {
+ BrowserContract.Bookmarks._ID,
+ BrowserContract.Bookmarks.PARENT,
+ BrowserContract.Bookmarks.TITLE,
+ BrowserContract.Bookmarks.IS_FOLDER
+ };
+ return new CursorLoader(this,
+ BrowserContract.Bookmarks.CONTENT_URI,
+ projection,
+ BrowserContract.Bookmarks.IS_FOLDER + " != 0",
+ null,
+ null);
+ case LOADER_ID_FOLDER_CONTENTS:
+ projection = new String[] {
+ BrowserContract.Bookmarks._ID,
+ BrowserContract.Bookmarks.TITLE,
+ BrowserContract.Bookmarks.IS_FOLDER
+ };
+ return new CursorLoader(this,
+ BrowserContract.Bookmarks.buildFolderUri(
+ mCurrentFolder),
+ projection,
+ BrowserContract.Bookmarks.IS_FOLDER + " != 0",
+ null,
+ null);
+ default:
+ throw new AssertionError("Asking for nonexistant loader!");
+ }
+ }
+
+ @Override
+ public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
+ switch (loader.getId()) {
+ case LOADER_ID_FOLDER_CONTENTS:
+ mAdapter.changeCursor(cursor);
+ break;
+ case LOADER_ID_ALL_FOLDERS:
+ long parent = mCurrentFolder;
+ int idIndex = cursor.getColumnIndexOrThrow(
+ BrowserContract.Bookmarks._ID);
+ int titleIndex = cursor.getColumnIndexOrThrow(
+ BrowserContract.Bookmarks.TITLE);
+ int parentIndex = cursor.getColumnIndexOrThrow(
+ BrowserContract.Bookmarks.PARENT);
+ Stack folderStack = new Stack();
+ while ((parent != BrowserProvider2.FIXED_ID_ROOT) &&
+ (parent != 0)) {
+ // First, find the folder corresponding to the current
+ // folder
+ if (!cursor.moveToFirst()) {
+ throw new AssertionError("No folders in the database!");
+ }
+ long folder;
+ do {
+ folder = cursor.getLong(idIndex);
+ } while (folder != parent && cursor.moveToNext());
+ if (cursor.isAfterLast()) {
+ throw new AssertionError("Folder(id=" + parent
+ + ") holding this bookmark does not exist!");
+ }
+ String name = cursor.getString(titleIndex);
+ if (parent == mCurrentFolder) {
+ Drawable draw = getResources().getDrawable(
+ com.android.internal.R.drawable.ic_menu_archive);
+ updateFolderLabel(name, draw);
+ }
+ folderStack.push(new Folder(name, parent));
+ parent = cursor.getLong(parentIndex);
+ }
+ while (!folderStack.isEmpty()) {
+ Folder thisFolder = (Folder) folderStack.pop();
+ mCrumbs.pushView(thisFolder.Name, thisFolder);
+ }
+ getLoaderManager().stopLoader(LOADER_ID_ALL_FOLDERS);
+ break;
+ default:
+ break;
+ }
+ }
+
+ /**
+ * Update the name and image to show where the bookmark will be added
+ * @param name Name of the location to save (folder name, bookmarks, or home
+ * screen.
+ * @param drawable Image to show corresponding to the save location.
+ */
+ void updateFolderLabel(CharSequence name, Drawable drawable) {
+ mFolder.setText(name);
+ mFolder.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null,
+ null);
+ }
+
+ @Override
+ public void onItemClick(AdapterView<?> parent, View view, int position,
+ long id) {
+ TextView tv = (TextView) view.findViewById(android.R.id.text1);
+ // Switch to the folder that was clicked on.
+ descendInto(tv.getText().toString(), id);
+ }
+
+ /**
+ * Shows a list of names of folders.
+ */
+ private class FolderAdapter extends CursorAdapter {
+ public FolderAdapter(Context context) {
+ super(context, null);
+ }
+
+ @Override
+ public void bindView(View view, Context context, Cursor cursor) {
+ ((TextView) view.findViewById(android.R.id.text1)).setText(
+ cursor.getString(cursor.getColumnIndexOrThrow(
+ BrowserContract.Bookmarks.TITLE)));
+ }
+
+ @Override
+ public View newView(Context context, Cursor cursor, ViewGroup parent) {
+ View view = LayoutInflater.from(context).inflate(
+ R.layout.folder_list_item, null);
+ view.setBackgroundDrawable(context.getResources().
+ getDrawable(android.R.drawable.list_selector_background));
+ return view;
+ }
+
+ @Override
+ public boolean isEmpty() {
+ // Do not show the empty view if the user is creating a new folder.
+ return super.isEmpty() && mFolderNamer.getVisibility() == View.GONE;
+ }
+ }
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
- requestWindowFeature(Window.FEATURE_LEFT_ICON);
+ if (DEBUG_CRASH) {
+ requestWindowFeature(Window.FEATURE_NO_TITLE);
+ }
+
+ mMap = getIntent().getExtras();
+
setContentView(R.layout.browser_add_bookmark);
- setTitle(R.string.save_to_bookmarks);
- getWindow().setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, R.drawable.ic_list_bookmark);
-
+
+ Window window = getWindow();
+ if (!DEBUG_CRASH) {
+ setTitle("");
+ }
+
String title = null;
String url = null;
- mMap = getIntent().getExtras();
+
+ mFakeTitle = (TextView) findViewById(R.id.fake_title);
+
if (mMap != null) {
- Bundle b = mMap.getBundle("bookmark");
+ Bundle b = mMap.getBundle(EXTRA_EDIT_BOOKMARK);
if (b != null) {
+ mEditingFolder = mMap.getBoolean(EXTRA_IS_FOLDER, false);
mMap = b;
mEditingExisting = true;
- setTitle(R.string.edit_bookmark);
+ mFakeTitle.setText(R.string.edit_bookmark);
+ if (mEditingFolder) {
+ findViewById(R.id.row_address).setVisibility(View.GONE);
+ }
+ } else {
+ int gravity = mMap.getInt("gravity", -1);
+ if (gravity != -1) {
+ WindowManager.LayoutParams l = window.getAttributes();
+ l.gravity = gravity;
+ window.setAttributes(l);
+ }
}
- title = mMap.getString("title");
- url = mOriginalUrl = mMap.getString("url");
- mTouchIconUrl = mMap.getString("touch_icon_url");
- mThumbnail = (Bitmap) mMap.getParcelable("thumbnail");
+ title = mMap.getString(BrowserContract.Bookmarks.TITLE);
+ url = mOriginalUrl = mMap.getString(BrowserContract.Bookmarks.URL);
+ mTouchIconUrl = mMap.getString(TOUCH_ICON_URL);
+ mCurrentFolder = mMap.getLong(BrowserContract.Bookmarks.PARENT, DEFAULT_FOLDER_ID);
+ }
+ mRootFolder = getBookmarksBarId(this);
+ if (mCurrentFolder == DEFAULT_FOLDER_ID) {
+ mCurrentFolder = mRootFolder;
}
mTitle = (EditText) findViewById(R.id.title);
mTitle.setText(title);
+
mAddress = (EditText) findViewById(R.id.address);
mAddress.setText(url);
- View.OnClickListener accept = mSaveBookmark;
mButton = (TextView) findViewById(R.id.OK);
- mButton.setOnClickListener(accept);
+ mButton.setOnClickListener(this);
mCancelButton = findViewById(R.id.cancel);
- mCancelButton.setOnClickListener(mCancel);
-
- if (!getWindow().getDecorView().isInTouchMode()) {
+ mCancelButton.setOnClickListener(this);
+
+ mFolder = (TextView) findViewById(R.id.folder);
+ mFolder.setOnClickListener(this);
+
+ mDefaultView = findViewById(R.id.default_view);
+ mFolderSelector = findViewById(R.id.folder_selector);
+
+ mFolderNamer = (EditText) findViewById(R.id.folder_namer);
+ mFolderNamer.setOnEditorActionListener(this);
+
+ mAddNewFolder = findViewById(R.id.add_new_folder);
+ mAddNewFolder.setOnClickListener(this);
+ mAddSeparator = findViewById(R.id.add_divider);
+
+ mCrumbs = (BreadCrumbView) findViewById(R.id.crumbs);
+ mCrumbs.setUseBackButton(true);
+ mCrumbs.setController(this);
+ String name = getString(R.string.bookmarks);
+ mCrumbs.pushView(name, false,
+ new Folder(name, BrowserProvider2.FIXED_ID_ROOT));
+ mCrumbHolder = findViewById(R.id.crumb_holder);
+ mCrumbs.setMaxVisible(MAX_CRUMBS_SHOWN);
+
+ mAdapter = new FolderAdapter(this);
+ mListView = (ListView) findViewById(R.id.list);
+ View empty = findViewById(R.id.empty);
+ mListView.setEmptyView(empty);
+ mListView.setAdapter(mAdapter);
+ mListView.setOnItemClickListener(this);
+ LoaderManager manager = getLoaderManager();
+ if (mCurrentFolder != BrowserProvider2.FIXED_ID_ROOT) {
+ // Find all the folders
+ manager.initLoader(LOADER_ID_ALL_FOLDERS, null, this);
+ }
+ // Find the contents of the current folder
+ manager.initLoader(LOADER_ID_FOLDER_CONTENTS, null, this);
+
+
+ if (!window.getDecorView().isInTouchMode()) {
mButton.requestFocus();
}
}
+ // FIXME: Use a CursorLoader
+ private long getBookmarksBarId(Context context) {
+ SharedPreferences prefs
+ = PreferenceManager.getDefaultSharedPreferences(context);
+ String accountName =
+ prefs.getString(BrowserBookmarksPage.PREF_ACCOUNT_NAME, null);
+ String accountType =
+ prefs.getString(BrowserBookmarksPage.PREF_ACCOUNT_TYPE, null);
+ if (TextUtils.isEmpty(accountName) || TextUtils.isEmpty(accountType)) {
+ return BrowserProvider2.FIXED_ID_ROOT;
+ }
+ Cursor cursor = null;
+ try {
+ cursor = context.getContentResolver().query(
+ BrowserContract.Bookmarks.CONTENT_URI,
+ new String[] { BrowserContract.Bookmarks._ID },
+ BrowserContract.ChromeSyncColumns.SERVER_UNIQUE + "=? AND "
+ + BrowserContract.Bookmarks.ACCOUNT_NAME + "=? AND "
+ + BrowserContract.Bookmarks.ACCOUNT_TYPE + "=?",
+ new String[] {
+ BrowserContract.ChromeSyncColumns
+ .FOLDER_NAME_BOOKMARKS_BAR,
+ accountName,
+ accountType },
+ null);
+ if (cursor != null && cursor.moveToFirst()) {
+ return cursor.getLong(0);
+ }
+ } finally {
+ if (cursor != null) cursor.close();
+ }
+ return BrowserProvider2.FIXED_ID_ROOT;
+ }
+
/**
* Runnable to save a bookmark, so it can be performed in its own thread.
*/
private class SaveBookmarkRunnable implements Runnable {
+ // FIXME: This should be an async task.
private Message mMessage;
private Context mContext;
public SaveBookmarkRunnable(Context ctx, Message msg) {
@@ -125,18 +602,18 @@
public void run() {
// Unbundle bookmark data.
Bundle bundle = mMessage.getData();
- String title = bundle.getString("title");
- String url = bundle.getString("url");
- boolean invalidateThumbnail = bundle.getBoolean(
- "invalidateThumbnail");
+ String title = bundle.getString(BrowserContract.Bookmarks.TITLE);
+ String url = bundle.getString(BrowserContract.Bookmarks.URL);
+ boolean invalidateThumbnail = bundle.getBoolean(REMOVE_THUMBNAIL);
Bitmap thumbnail = invalidateThumbnail ? null
- : (Bitmap) bundle.getParcelable("thumbnail");
- String touchIconUrl = bundle.getString("touchIconUrl");
+ : (Bitmap) bundle.getParcelable(BrowserContract.Bookmarks.THUMBNAIL);
+ String touchIconUrl = bundle.getString(TOUCH_ICON_URL);
// Save to the bookmarks DB.
try {
final ContentResolver cr = getContentResolver();
- Bookmarks.addBookmark(null, cr, url, title, thumbnail, true);
+ Bookmarks.addBookmark(AddBookmarkPage.this, false, url,
+ title, thumbnail, true, mCurrentFolder);
if (touchIconUrl != null) {
new DownloadTouchIcon(mContext, cr, url).execute(mTouchIconUrl);
}
@@ -148,6 +625,28 @@
}
}
+ private static class UpdateBookmarkTask extends AsyncTask<ContentValues, Void, Void> {
+ Context mContext;
+ Long mId;
+
+ public UpdateBookmarkTask(Context context, long id) {
+ mContext = context;
+ mId = id;
+ }
+
+ @Override
+ protected Void doInBackground(ContentValues... params) {
+ if (params.length != 1) {
+ throw new IllegalArgumentException("No ContentValues provided!");
+ }
+ Uri uri = ContentUris.withAppendedId(BookmarkUtils.getBookmarksUri(mContext), mId);
+ mContext.getContentResolver().update(
+ uri,
+ params[0], null, null);
+ return null;
+ }
+ }
+
private void createHandler() {
if (mHandler == null) {
mHandler = new Handler() {
@@ -163,6 +662,15 @@
Toast.LENGTH_LONG).show();
}
break;
+ case TOUCH_ICON_DOWNLOADED:
+ Bundle b = msg.getData();
+ sendBroadcast(BookmarkUtils.createAddToHomeIntent(
+ AddBookmarkPage.this,
+ b.getString(BrowserContract.Bookmarks.URL),
+ b.getString(BrowserContract.Bookmarks.TITLE),
+ (Bitmap) b.getParcelable(BrowserContract.Bookmarks.TOUCH_ICON),
+ (Bitmap) b.getParcelable(BrowserContract.Bookmarks.FAVICON)));
+ break;
}
}
};
@@ -176,12 +684,13 @@
createHandler();
String title = mTitle.getText().toString().trim();
- String unfilteredUrl =
- BrowserActivity.fixUrl(mAddress.getText().toString());
+ String unfilteredUrl;
+ unfilteredUrl = UrlUtils.fixUrl(mAddress.getText().toString());
+
boolean emptyTitle = title.length() == 0;
boolean emptyUrl = unfilteredUrl.trim().length() == 0;
Resources r = getResources();
- if (emptyTitle || emptyUrl) {
+ if (emptyTitle || (emptyUrl && !mEditingFolder)) {
if (emptyTitle) {
mTitle.setError(r.getText(R.string.bookmark_needs_title));
}
@@ -189,59 +698,105 @@
mAddress.setError(r.getText(R.string.bookmark_needs_url));
}
return false;
+
}
String url = unfilteredUrl.trim();
- try {
- // We allow bookmarks with a javascript: scheme, but these will in most cases
- // fail URI parsing, so don't try it if that's the kind of bookmark we have.
+ if (!mEditingFolder) {
+ try {
+ // We allow bookmarks with a javascript: scheme, but these will in most cases
+ // fail URI parsing, so don't try it if that's the kind of bookmark we have.
- if (!url.toLowerCase().startsWith("javascript:")) {
- URI uriObj = new URI(url);
- String scheme = uriObj.getScheme();
- if (!Bookmarks.urlHasAcceptableScheme(url)) {
- // If the scheme was non-null, let the user know that we
- // can't save their bookmark. If it was null, we'll assume
- // they meant http when we parse it in the WebAddress class.
- if (scheme != null) {
- mAddress.setError(r.getText(R.string.bookmark_cannot_save_url));
- return false;
+ if (!url.toLowerCase().startsWith("javascript:")) {
+ URI uriObj = new URI(url);
+ String scheme = uriObj.getScheme();
+ if (!Bookmarks.urlHasAcceptableScheme(url)) {
+ // If the scheme was non-null, let the user know that we
+ // can't save their bookmark. If it was null, we'll assume
+ // they meant http when we parse it in the WebAddress class.
+ if (scheme != null) {
+ mAddress.setError(r.getText(R.string.bookmark_cannot_save_url));
+ return false;
+ }
+ WebAddress address;
+ try {
+ address = new WebAddress(unfilteredUrl);
+ } catch (ParseException e) {
+ throw new URISyntaxException("", "");
+ }
+ if (address.getHost().length() == 0) {
+ throw new URISyntaxException("", "");
+ }
+ url = address.toString();
}
- WebAddress address;
- try {
- address = new WebAddress(unfilteredUrl);
- } catch (ParseException e) {
- throw new URISyntaxException("", "");
- }
- if (address.mHost.length() == 0) {
- throw new URISyntaxException("", "");
- }
- url = address.toString();
}
+ } catch (URISyntaxException e) {
+ mAddress.setError(r.getText(R.string.bookmark_url_not_valid));
+ return false;
}
- } catch (URISyntaxException e) {
- mAddress.setError(r.getText(R.string.bookmark_url_not_valid));
- return false;
}
+ if (mSaveToHomeScreen) {
+ mEditingExisting = false;
+ }
+
+ boolean urlUnmodified = url.equals(mOriginalUrl);
+
if (mEditingExisting) {
- mMap.putString("title", title);
- mMap.putString("url", url);
- mMap.putBoolean("invalidateThumbnail", !url.equals(mOriginalUrl));
- setResult(RESULT_OK, (new Intent()).setAction(
- getIntent().toString()).putExtras(mMap));
+ Long id = mMap.getLong(BrowserContract.Bookmarks._ID);
+ ContentValues values = new ContentValues();
+ values.put(BrowserContract.Bookmarks.TITLE, title);
+ values.put(BrowserContract.Bookmarks.PARENT, mCurrentFolder);
+ if (!mEditingFolder) {
+ values.put(BrowserContract.Bookmarks.URL, url);
+ if (!urlUnmodified) {
+ values.putNull(BrowserContract.Bookmarks.THUMBNAIL);
+ }
+ }
+ if (values.size() > 0) {
+ new UpdateBookmarkTask(getApplicationContext(), id).execute(values);
+ }
+ setResult(RESULT_OK);
} else {
- // Post a message to write to the DB.
+ Bitmap thumbnail;
+ Bitmap favicon;
+ if (urlUnmodified) {
+ thumbnail = (Bitmap) mMap.getParcelable(
+ BrowserContract.Bookmarks.THUMBNAIL);
+ favicon = (Bitmap) mMap.getParcelable(
+ BrowserContract.Bookmarks.FAVICON);
+ } else {
+ thumbnail = null;
+ favicon = null;
+ }
+
Bundle bundle = new Bundle();
- bundle.putString("title", title);
- bundle.putString("url", url);
- bundle.putParcelable("thumbnail", mThumbnail);
- bundle.putBoolean("invalidateThumbnail", !url.equals(mOriginalUrl));
- bundle.putString("touchIconUrl", mTouchIconUrl);
- Message msg = Message.obtain(mHandler, SAVE_BOOKMARK);
- msg.setData(bundle);
- // Start a new thread so as to not slow down the UI
- Thread t = new Thread(new SaveBookmarkRunnable(getApplicationContext(), msg));
- t.start();
+ bundle.putString(BrowserContract.Bookmarks.TITLE, title);
+ bundle.putString(BrowserContract.Bookmarks.URL, url);
+ bundle.putParcelable(BrowserContract.Bookmarks.FAVICON, favicon);
+
+ if (mSaveToHomeScreen) {
+ if (mTouchIconUrl != null && urlUnmodified) {
+ Message msg = Message.obtain(mHandler,
+ TOUCH_ICON_DOWNLOADED);
+ msg.setData(bundle);
+ DownloadTouchIcon icon = new DownloadTouchIcon(this, msg,
+ mMap.getString(USER_AGENT));
+ icon.execute(mTouchIconUrl);
+ } else {
+ sendBroadcast(BookmarkUtils.createAddToHomeIntent(this, url,
+ title, null /*touchIcon*/, favicon));
+ }
+ } else {
+ bundle.putParcelable(BrowserContract.Bookmarks.THUMBNAIL, thumbnail);
+ bundle.putBoolean(REMOVE_THUMBNAIL, !urlUnmodified);
+ bundle.putString(TOUCH_ICON_URL, mTouchIconUrl);
+ // Post a message to write to the DB.
+ Message msg = Message.obtain(mHandler, SAVE_BOOKMARK);
+ msg.setData(bundle);
+ // Start a new thread so as to not slow down the UI
+ Thread t = new Thread(new SaveBookmarkRunnable(getApplicationContext(), msg));
+ t.start();
+ }
setResult(RESULT_OK);
LogTag.logBookmarkAdded(url, "bookmarkview");
}
diff --git a/src/com/android/browser/AutoFillProfileDatabase.java b/src/com/android/browser/AutoFillProfileDatabase.java
new file mode 100644
index 0000000..3345e92
--- /dev/null
+++ b/src/com/android/browser/AutoFillProfileDatabase.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.provider.BaseColumns;
+import android.util.Log;
+import android.webkit.WebSettings.AutoFillProfile;
+
+public class AutoFillProfileDatabase {
+
+ static final String LOGTAG = "AutoFillProfileDatabase";
+
+ static final String DATABASE_NAME = "autofill.db";
+ static final int DATABASE_VERSION = 2;
+ static final String PROFILES_TABLE_NAME = "profiles";
+ private AutoFillProfileDatabaseHelper mOpenHelper;
+ private static AutoFillProfileDatabase sInstance;
+
+ public static final class Profiles implements BaseColumns {
+ private Profiles() { }
+
+ static final String FULL_NAME = "fullname";
+ static final String EMAIL_ADDRESS = "email";
+ static final String COMPANY_NAME = "companyname";
+ static final String ADDRESS_LINE_1 = "addressline1";
+ static final String ADDRESS_LINE_2 = "addressline2";
+ static final String CITY = "city";
+ static final String STATE = "state";
+ static final String ZIP_CODE = "zipcode";
+ static final String COUNTRY = "country";
+ static final String PHONE_NUMBER = "phone";
+ }
+
+ private static class AutoFillProfileDatabaseHelper extends SQLiteOpenHelper {
+ AutoFillProfileDatabaseHelper(Context context) {
+ super(context, DATABASE_NAME, null, DATABASE_VERSION);
+ }
+
+ @Override
+ public void onCreate(SQLiteDatabase db) {
+ db.execSQL("CREATE TABLE " + PROFILES_TABLE_NAME + " ("
+ + Profiles._ID + " INTEGER PRIMARY KEY,"
+ + Profiles.FULL_NAME + " TEXT,"
+ + Profiles.EMAIL_ADDRESS + " TEXT,"
+ + Profiles.COMPANY_NAME + " TEXT,"
+ + Profiles.ADDRESS_LINE_1 + " TEXT,"
+ + Profiles.ADDRESS_LINE_2 + " TEXT,"
+ + Profiles.CITY + " TEXT,"
+ + Profiles.STATE + " TEXT,"
+ + Profiles.ZIP_CODE + " TEXT,"
+ + Profiles.COUNTRY + " TEXT,"
+ + Profiles.PHONE_NUMBER + " TEXT"
+ + " );");
+ }
+
+ @Override
+ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+ Log.w(LOGTAG, "Upgrading database from version " + oldVersion + " to "
+ + newVersion + ", which will destroy all old data");
+ db.execSQL("DROP TABLE IF EXISTS " + PROFILES_TABLE_NAME);
+ onCreate(db);
+ }
+ }
+
+ private AutoFillProfileDatabase(Context context) {
+ mOpenHelper = new AutoFillProfileDatabaseHelper(context);
+ }
+
+ public static AutoFillProfileDatabase getInstance(Context context) {
+ if (sInstance == null) {
+ sInstance = new AutoFillProfileDatabase(context);
+ }
+ return sInstance;
+ }
+
+ private SQLiteDatabase getDatabase(boolean writable) {
+ return writable ? mOpenHelper.getWritableDatabase() : mOpenHelper.getReadableDatabase();
+ }
+
+ public void addOrUpdateProfile(final int id, AutoFillProfile profile) {
+ final String sql = "INSERT OR REPLACE INTO " + PROFILES_TABLE_NAME + " ("
+ + Profiles._ID + ","
+ + Profiles.FULL_NAME + ","
+ + Profiles.EMAIL_ADDRESS + ","
+ + Profiles.COMPANY_NAME + ","
+ + Profiles.ADDRESS_LINE_1 + ","
+ + Profiles.ADDRESS_LINE_2 + ","
+ + Profiles.CITY + ","
+ + Profiles.STATE + ","
+ + Profiles.ZIP_CODE + ","
+ + Profiles.COUNTRY + ","
+ + Profiles.PHONE_NUMBER
+ + ") VALUES (?,?,?,?,?,?,?,?,?,?,?);";
+ final Object[] params = { id,
+ profile.getFullName(),
+ profile.getEmailAddress(),
+ profile.getCompanyName(),
+ profile.getAddressLine1(),
+ profile.getAddressLine2(),
+ profile.getCity(),
+ profile.getState(),
+ profile.getZipCode(),
+ profile.getCountry(),
+ profile.getPhoneNumber() };
+ getDatabase(true).execSQL(sql, params);
+ }
+
+ public Cursor getProfile(int id) {
+ final String[] cols = {
+ Profiles.FULL_NAME,
+ Profiles.EMAIL_ADDRESS,
+ Profiles.COMPANY_NAME,
+ Profiles.ADDRESS_LINE_1,
+ Profiles.ADDRESS_LINE_2,
+ Profiles.CITY,
+ Profiles.STATE,
+ Profiles.ZIP_CODE,
+ Profiles.COUNTRY,
+ Profiles.PHONE_NUMBER
+ };
+
+ final String[] selectArgs = { Integer.toString(id) };
+ return getDatabase(false).query(PROFILES_TABLE_NAME, cols, Profiles._ID + "=?", selectArgs,
+ null, null, null, "1");
+ }
+
+ public void dropProfile(int id) {
+ final String sql = "DELETE FROM " + PROFILES_TABLE_NAME +" WHERE " + Profiles._ID + " = ?;";
+ final Object[] params = { id };
+ getDatabase(true).execSQL(sql, params);
+ }
+
+ public void close() {
+ mOpenHelper.close();
+ }
+}
diff --git a/src/com/android/browser/AutoFillSettingsFragment.java b/src/com/android/browser/AutoFillSettingsFragment.java
new file mode 100644
index 0000000..06a4256
--- /dev/null
+++ b/src/com/android/browser/AutoFillSettingsFragment.java
@@ -0,0 +1,168 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import android.app.Fragment;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.View.OnClickListener;
+import android.view.LayoutInflater;
+import android.webkit.WebSettings.AutoFillProfile;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.Toast;
+
+public class AutoFillSettingsFragment extends Fragment {
+
+ private static final String LOGTAG = "AutoFillSettingsFragment";
+
+ private EditText mFullNameEdit;
+ private EditText mEmailEdit;
+ private EditText mCompanyEdit;
+ private EditText mAddressLine1Edit;
+ private EditText mAddressLine2Edit;
+ private EditText mCityEdit;
+ private EditText mStateEdit;
+ private EditText mZipEdit;
+ private EditText mCountryEdit;
+ private EditText mPhoneEdit;
+
+ // Used to display toast after DB interactions complete.
+ private Handler mHandler;
+
+ private final static int PROFILE_SAVED_MSG = 100;
+ private final static int PROFILE_DELETED_MSG = 101;
+
+ // For now we support just one profile so it's safe to hardcode the
+ // id to 1 here. In the future this unique identifier will be set
+ // dynamically.
+ private int mUniqueId = 1;
+
+ public AutoFillSettingsFragment() {
+ mHandler = new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case PROFILE_SAVED_MSG:
+ Toast.makeText(getActivity(), R.string.autofill_profile_successful_save,
+ Toast.LENGTH_SHORT).show();
+ break;
+
+ case PROFILE_DELETED_MSG:
+ Toast.makeText(getActivity(), R.string.autofill_profile_successful_delete,
+ Toast.LENGTH_SHORT).show();
+ break;
+ }
+ }
+ };
+ }
+
+ @Override
+ public void onCreate(Bundle savedState) {
+ super.onCreate(savedState);
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ View v = inflater.inflate(R.layout.autofill_settings_fragment, container, false);
+
+ mFullNameEdit = (EditText)v.findViewById(R.id.autofill_profile_editor_name_edit);
+ mEmailEdit = (EditText)v.findViewById(R.id.autofill_profile_editor_email_address_edit);
+ mCompanyEdit = (EditText)v.findViewById(R.id.autofill_profile_editor_company_name_edit);
+ mAddressLine1Edit = (EditText)v.findViewById(
+ R.id.autofill_profile_editor_address_line_1_edit);
+ mAddressLine2Edit = (EditText)v.findViewById(
+ R.id.autofill_profile_editor_address_line_2_edit);
+ mCityEdit = (EditText)v.findViewById(R.id.autofill_profile_editor_city_edit);
+ mStateEdit = (EditText)v.findViewById(R.id.autofill_profile_editor_state_edit);
+ mZipEdit = (EditText)v.findViewById(R.id.autofill_profile_editor_zip_code_edit);
+ mCountryEdit = (EditText)v.findViewById(R.id.autofill_profile_editor_country_edit);
+ mPhoneEdit = (EditText)v.findViewById(R.id.autofill_profile_editor_phone_number_edit);
+
+ Button saveButton = (Button)v.findViewById(R.id.autofill_profile_editor_save_button);
+ saveButton.setOnClickListener(new OnClickListener() {
+ public void onClick(View button) {
+ AutoFillProfile newProfile = new AutoFillProfile(
+ mUniqueId,
+ mFullNameEdit.getText().toString(),
+ mEmailEdit.getText().toString(),
+ mCompanyEdit.getText().toString(),
+ mAddressLine1Edit.getText().toString(),
+ mAddressLine2Edit.getText().toString(),
+ mCityEdit.getText().toString(),
+ mStateEdit.getText().toString(),
+ mZipEdit.getText().toString(),
+ mCountryEdit.getText().toString(),
+ mPhoneEdit.getText().toString());
+
+ BrowserSettings.getInstance().setAutoFillProfile(getActivity(), newProfile,
+ mHandler.obtainMessage(PROFILE_SAVED_MSG));
+ }
+ });
+
+ Button deleteButton = (Button)v.findViewById(R.id.autofill_profile_editor_delete_button);
+ deleteButton.setOnClickListener(new OnClickListener() {
+ public void onClick(View button) {
+ // Clear the UI.
+ mFullNameEdit.setText("");
+ mEmailEdit.setText("");
+ mCompanyEdit.setText("");
+ mAddressLine1Edit.setText("");
+ mAddressLine2Edit.setText("");
+ mCityEdit.setText("");
+ mStateEdit.setText("");
+ mZipEdit.setText("");
+ mCountryEdit.setText("");
+ mPhoneEdit.setText("");
+
+ // 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,
+ mHandler.obtainMessage(PROFILE_DELETED_MSG));
+ }
+ });
+
+ Button cancelButton = (Button)v.findViewById(R.id.autofill_profile_editor_cancel_button);
+ cancelButton.setOnClickListener(new OnClickListener() {
+ public void onClick(View button) {
+ getFragmentManager().popBackStack();
+ }
+ });
+
+ // Populate the text boxes with any pre existing AutoFill data.
+ AutoFillProfile activeProfile = BrowserSettings.getInstance().getAutoFillProfile();
+ if (activeProfile != null) {
+ mFullNameEdit.setText(activeProfile.getFullName());
+ mEmailEdit.setText(activeProfile.getEmailAddress());
+ mCompanyEdit.setText(activeProfile.getCompanyName());
+ mAddressLine1Edit.setText(activeProfile.getAddressLine1());
+ mAddressLine2Edit.setText(activeProfile.getAddressLine2());
+ mCityEdit.setText(activeProfile.getCity());
+ mStateEdit.setText(activeProfile.getState());
+ mZipEdit.setText(activeProfile.getZipCode());
+ mCountryEdit.setText(activeProfile.getCountry());
+ mPhoneEdit.setText(activeProfile.getPhoneNumber());
+ }
+
+ return v;
+ }
+}
diff --git a/src/com/android/browser/BaseUi.java b/src/com/android/browser/BaseUi.java
new file mode 100644
index 0000000..b39cb43
--- /dev/null
+++ b/src/com/android/browser/BaseUi.java
@@ -0,0 +1,936 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import android.app.ActionBar;
+import android.app.Activity;
+import android.content.Context;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.PixelFormat;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.ActionMode;
+import android.view.Gravity;
+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.view.ViewGroup.LayoutParams;
+import android.view.WindowManager;
+import android.view.inputmethod.InputMethodManager;
+import android.webkit.WebChromeClient;
+import android.webkit.WebHistoryItem;
+import android.webkit.WebView;
+import android.widget.FrameLayout;
+import android.widget.ImageButton;
+import android.widget.LinearLayout;
+import android.widget.Toast;
+
+import java.util.List;
+
+/**
+ * UI interface definitions
+ */
+public class BaseUi implements UI, WebViewFactory {
+
+ private static final String LOGTAG = "BaseUi";
+
+ private static final FrameLayout.LayoutParams COVER_SCREEN_PARAMS =
+ new FrameLayout.LayoutParams(
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT);
+
+ private static final FrameLayout.LayoutParams COVER_SCREEN_GRAVITY_CENTER =
+ new FrameLayout.LayoutParams(
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ Gravity.CENTER);
+
+ Activity mActivity;
+ UiController mUiController;
+ TabControl mTabControl;
+ private Tab mActiveTab;
+ private InputMethodManager mInputManager;
+
+ private Drawable mSecLockIcon;
+ private Drawable mMixLockIcon;
+
+ private boolean mXLargeScreenSize;
+ private FrameLayout mBrowserFrameLayout;
+ private FrameLayout mContentView;
+ private FrameLayout mCustomViewContainer;
+ private TitleBarBase mTitleBar;
+ private TitleBarBase mFakeTitleBar;
+ private TabBar mTabBar;
+
+ private View mCustomView;
+ private WebChromeClient.CustomViewCallback mCustomViewCallback;
+
+ private CombinedBookmarkHistoryView mComboView;
+
+ private LinearLayout mErrorConsoleContainer = null;
+
+ private Toast mStopToast;
+ private ActiveTabsPage mActiveTabsPage;
+
+ // the default <video> poster
+ private Bitmap mDefaultVideoPoster;
+ // the video progress view
+ private View mVideoProgressView;
+
+ boolean mExtendedMenuOpen;
+ boolean mOptionsMenuOpen;
+
+ private boolean mActivityPaused;
+
+ public BaseUi(Activity browser, UiController controller) {
+ mActivity = browser;
+ mUiController = controller;
+ mTabControl = controller.getTabControl();
+ Resources res = mActivity.getResources();
+ mInputManager = (InputMethodManager)
+ browser.getSystemService(Activity.INPUT_METHOD_SERVICE);
+ mSecLockIcon = res.getDrawable(R.drawable.ic_secure);
+ mMixLockIcon = res.getDrawable(R.drawable.ic_partial_secure);
+
+
+ mXLargeScreenSize = (res.getConfiguration().screenLayout
+ & Configuration.SCREENLAYOUT_SIZE_MASK)
+ == Configuration.SCREENLAYOUT_SIZE_XLARGE;
+
+ FrameLayout frameLayout = (FrameLayout) mActivity.getWindow()
+ .getDecorView().findViewById(android.R.id.content);
+ mBrowserFrameLayout = (FrameLayout) LayoutInflater.from(mActivity)
+ .inflate(R.layout.custom_screen, null);
+ mContentView = (FrameLayout) mBrowserFrameLayout.findViewById(
+ R.id.main_content);
+ mErrorConsoleContainer = (LinearLayout) mBrowserFrameLayout
+ .findViewById(R.id.error_console);
+ mCustomViewContainer = (FrameLayout) mBrowserFrameLayout
+ .findViewById(R.id.fullscreen_custom_content);
+ frameLayout.addView(mBrowserFrameLayout, COVER_SCREEN_PARAMS);
+
+ if (mXLargeScreenSize) {
+ mTitleBar = new TitleBarXLarge(mActivity, mUiController);
+ mTitleBar.setProgress(100);
+ mFakeTitleBar = new TitleBarXLarge(mActivity, mUiController);
+ ActionBar actionBar = mActivity.getActionBar();
+ mTabBar = new TabBar(mActivity, mUiController, this);
+ actionBar.setCustomNavigationMode(mTabBar);
+ } else {
+ mTitleBar = new TitleBar(mActivity, mUiController);
+ // mTitleBar will be always be shown in the fully loaded mode on
+ // phone
+ mTitleBar.setProgress(100);
+ mFakeTitleBar = new TitleBar(mActivity, mUiController);
+ }
+ }
+
+ // webview factory
+
+ @Override
+ public WebView createWebView(boolean privateBrowsing) {
+ // Create a new WebView
+ ScrollWebView w = new ScrollWebView(mActivity, null,
+ android.R.attr.webViewStyle, privateBrowsing);
+ w.setScrollbarFadingEnabled(true);
+ w.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);
+ w.setMapTrackballToArrowKeys(false); // use trackball directly
+ // Enable the built-in zoom
+ w.getSettings().setBuiltInZoomControls(true);
+ if (mXLargeScreenSize) {
+ w.setScrollListener(mTabBar);
+ w.getSettings().setDisplayZoomControls(false);
+ }
+
+ // Add this WebView to the settings observer list and update the
+ // settings
+ final BrowserSettings s = BrowserSettings.getInstance();
+ s.addObserver(w.getSettings()).update(s, null);
+ return w;
+ }
+
+ @Override
+ public WebView createSubWebView(boolean privateBrowsing) {
+ ScrollWebView web = (ScrollWebView) createWebView(privateBrowsing);
+ if (mXLargeScreenSize) {
+ // no scroll listener for subview
+ web.setScrollListener(null);
+ }
+ return web;
+ }
+
+ void stopWebViewScrolling() {
+ ScrollWebView web = (ScrollWebView) mUiController.getCurrentWebView();
+ if (web != null) {
+ web.stopScroll();
+ }
+ }
+
+ private void cancelStopToast() {
+ if (mStopToast != null) {
+ mStopToast.cancel();
+ mStopToast = null;
+ }
+ }
+
+ // lifecycle
+
+ public void onPause() {
+ // FIXME: This removes the active tabs page and resets the menu to
+ // MAIN_MENU. A better solution might be to do this work in onNewIntent
+ // but then we would need to save it in onSaveInstanceState and restore
+ // it in onCreate/onRestoreInstanceState
+ if (mActiveTabsPage != null) {
+ mUiController.removeActiveTabsPage(true);
+ }
+ if (isCustomViewShowing()) {
+ onHideCustomView();
+ }
+ cancelStopToast();
+ mActivityPaused = true;
+ }
+
+ public void onResume() {
+ mActivityPaused = false;
+ }
+
+ public void onDestroy() {
+ hideFakeTitleBar();
+ }
+
+ public void onConfigurationChanged(Configuration config) {
+ }
+
+ // key handling
+
+ @Override
+ public boolean onBackKey() {
+ if (mActiveTabsPage != null) {
+ // if tab page is showing, hide it
+ mUiController.removeActiveTabsPage(true);
+ return true;
+ }
+ if (mComboView != null) {
+ if (!mComboView.onBackPressed()) {
+ mUiController.removeComboView();
+ }
+ return true;
+ }
+ if (mCustomView != null) {
+ mUiController.hideCustomView();
+ return true;
+ }
+ return false;
+ }
+
+ // WebView callbacks
+
+ @Override
+ public void onPageStarted(Tab tab, String url, Bitmap favicon) {
+ if (tab.inForeground()) {
+ resetLockIcon(tab, url);
+ setUrlTitle(tab, url, null);
+ setFavicon(tab, favicon);
+ }
+ if (mXLargeScreenSize) {
+ mTabBar.onPageStarted(tab, url, favicon);
+ }
+ }
+
+ @Override
+ public void bookmarkedStatusHasChanged(Tab tab) {
+ if (tab.inForeground() && mXLargeScreenSize) {
+ boolean isBookmark = tab.isBookmarkedSite();
+ ((TitleBarXLarge) mTitleBar).setCurrentUrlIsBookmark(isBookmark);
+ ((TitleBarXLarge) mFakeTitleBar).setCurrentUrlIsBookmark(isBookmark);
+ }
+ }
+
+ @Override
+ public void onPageFinished(Tab tab, String url) {
+ if (mXLargeScreenSize) {
+ mTabBar.onPageFinished(tab);
+ }
+ if (tab.inForeground()) {
+ // Reset the title and icon in case we stopped a provisional load.
+ resetTitleAndIcon(tab);
+ // Update the lock icon image only once we are done loading
+ updateLockIconToLatest(tab);
+ }
+ }
+
+ @Override
+ public void onPageStopped(Tab tab) {
+ cancelStopToast();
+ if (tab.inForeground()) {
+ mStopToast = Toast
+ .makeText(mActivity, R.string.stopping, Toast.LENGTH_SHORT);
+ mStopToast.show();
+ }
+ }
+
+ @Override
+ public void onProgressChanged(Tab tab, int progress) {
+ if (mXLargeScreenSize) {
+ mTabBar.onProgress(tab, progress);
+ }
+ if (tab.inForeground()) {
+ mFakeTitleBar.setProgress(progress);
+ if (progress == 100) {
+ if (!mOptionsMenuOpen || !mExtendedMenuOpen) {
+ hideFakeTitleBar();
+ }
+ } else {
+ if (!mOptionsMenuOpen || mExtendedMenuOpen) {
+ showFakeTitleBar();
+ }
+ }
+ }
+ }
+
+ @Override
+ public boolean needsRestoreAllTabs() {
+ return mXLargeScreenSize;
+ }
+
+ @Override
+ public void addTab(Tab tab) {
+ if (mXLargeScreenSize) {
+ mTabBar.onNewTab(tab);
+ }
+ }
+
+ @Override
+ public void setActiveTab(Tab tab) {
+ if ((tab != mActiveTab) && (mActiveTab != null)) {
+ removeTabFromContentView(mActiveTab);
+ }
+ mActiveTab = tab;
+ attachTabToContentView(tab);
+ setShouldShowErrorConsole(tab, mUiController.shouldShowErrorConsole());
+
+ WebView view = 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(mTitleBar);
+ if (tab.isInVoiceSearchMode()) {
+ showVoiceTitleBar(tab.getVoiceDisplayTitle());
+ } else {
+ revertVoiceTitleBar(tab);
+ }
+
+ if (mXLargeScreenSize) {
+ // Request focus on the top window.
+ mTabBar.onSetActiveTab(tab);
+ }
+ bookmarkedStatusHasChanged(tab);
+ resetTitleIconAndProgress(tab);
+ updateLockIconToLatest(tab);
+ tab.getTopWindow().requestFocus();
+ }
+
+ @Override
+ public void updateTabs(List<Tab> tabs) {
+ if (mXLargeScreenSize) {
+ mTabBar.updateTabs(tabs);
+ }
+ }
+
+ @Override
+ public void removeTab(Tab tab) {
+ if (mActiveTab == tab) {
+ removeTabFromContentView(tab);
+ mActiveTab = null;
+ }
+ if (mXLargeScreenSize) {
+ mTabBar.onRemoveTab(tab);
+ }
+ }
+
+ @Override
+ public void detachTab(Tab tab) {
+ removeTabFromContentView(tab);
+ }
+
+ @Override
+ public void attachTab(Tab tab) {
+ attachTabToContentView(tab);
+ }
+
+ private void attachTabToContentView(Tab tab) {
+ if (tab.getWebView() == null) {
+ return;
+ }
+ View container = tab.getViewContainer();
+ WebView mainView = tab.getWebView();
+ // Attach the WebView to the container and then attach the
+ // container to the content view.
+ FrameLayout wrapper =
+ (FrameLayout) container.findViewById(R.id.webview_wrapper);
+ ViewGroup parent = (ViewGroup) mainView.getParent();
+ if (parent != wrapper) {
+ if (parent != null) {
+ Log.w(LOGTAG, "mMainView already has a parent in"
+ + " attachTabToContentView!");
+ parent.removeView(mainView);
+ }
+ wrapper.addView(mainView);
+ } else {
+ Log.w(LOGTAG, "mMainView is already attached to wrapper in"
+ + " attachTabToContentView!");
+ }
+ parent = (ViewGroup) container.getParent();
+ if (parent != mContentView) {
+ if (parent != null) {
+ Log.w(LOGTAG, "mContainer already has a parent in"
+ + " attachTabToContentView!");
+ parent.removeView(container);
+ }
+ mContentView.addView(container, COVER_SCREEN_PARAMS);
+ } else {
+ Log.w(LOGTAG, "mContainer is already attached to content in"
+ + " attachTabToContentView!");
+ }
+ mUiController.attachSubWindow(tab);
+ }
+
+ private void removeTabFromContentView(Tab tab) {
+ // Remove the container that contains the main WebView.
+ WebView mainView = tab.getWebView();
+ View container = tab.getViewContainer();
+ if (mainView == null) {
+ return;
+ }
+ // Remove the container from the content and then remove the
+ // WebView from the container. This will trigger a focus change
+ // needed by WebView.
+ FrameLayout wrapper =
+ (FrameLayout) container.findViewById(R.id.webview_wrapper);
+ wrapper.removeView(mainView);
+ mContentView.removeView(container);
+ mUiController.endActionMode();
+ mUiController.removeSubWindow(tab);
+ ErrorConsoleView errorConsole = tab.getErrorConsole(false);
+ if (errorConsole != null) {
+ mErrorConsoleContainer.removeView(errorConsole);
+ }
+ mainView.setEmbeddedTitleBar(null);
+ }
+
+ @Override
+ public void onSetWebView(Tab tab, WebView webView) {
+ View container = tab.getViewContainer();
+ if (container == null) {
+ // The tab consists of a container view, which contains the main
+ // WebView, as well as any other UI elements associated with the tab.
+ container = mActivity.getLayoutInflater().inflate(R.layout.tab,
+ null);
+ tab.setViewContainer(container);
+ }
+ if (tab.getWebView() != webView) {
+ // Just remove the old one.
+ FrameLayout wrapper =
+ (FrameLayout) container.findViewById(R.id.webview_wrapper);
+ wrapper.removeView(tab.getWebView());
+ }
+ }
+
+ /**
+ * create a sub window container and webview for the tab
+ * Note: this methods operates through side-effects for now
+ * it sets both the subView and subViewContainer for the given tab
+ * @param tab tab to create the sub window for
+ * @param subView webview to be set as a subwindow for the tab
+ */
+ @Override
+ public void createSubWindow(Tab tab, WebView subView) {
+ View subViewContainer = mActivity.getLayoutInflater().inflate(
+ R.layout.browser_subwindow, null);
+ ViewGroup inner = (ViewGroup) subViewContainer
+ .findViewById(R.id.inner_container);
+ inner.addView(subView, new LayoutParams(LayoutParams.MATCH_PARENT,
+ LayoutParams.MATCH_PARENT));
+ final ImageButton cancel = (ImageButton) subViewContainer
+ .findViewById(R.id.subwindow_close);
+ final WebView cancelSubView = subView;
+ cancel.setOnClickListener(new OnClickListener() {
+ public void onClick(View v) {
+ cancelSubView.getWebChromeClient().onCloseWindow(cancelSubView);
+ }
+ });
+ tab.setSubWebView(subView);
+ tab.setSubViewContainer(subViewContainer);
+ }
+
+ /**
+ * Remove the sub window from the content view.
+ */
+ @Override
+ public void removeSubWindow(View subviewContainer) {
+ mContentView.removeView(subviewContainer);
+ mUiController.endActionMode();
+ }
+
+ /**
+ * Attach the sub window to the content view.
+ */
+ @Override
+ public void attachSubWindow(View container) {
+ if (container.getParent() != null) {
+ // already attached, remove first
+ ((ViewGroup) container.getParent()).removeView(container);
+ }
+ mContentView.addView(container, COVER_SCREEN_PARAMS);
+ }
+
+ void showFakeTitleBar() {
+ if (!isFakeTitleBarShowing() && mActiveTabsPage == null &&
+ !mActivityPaused) {
+ WebView mainView = mUiController.getCurrentWebView();
+ // if there is no current WebView, don't show the faked title bar;
+ if (mainView == null) {
+ return;
+ }
+ // Do not need to check for null, since the current tab will have
+ // at least a main WebView, or we would have returned above.
+ if (mUiController.isInCustomActionMode()) {
+ // Do not show the fake title bar, while a custom ActionMode
+ // (i.e. find or select) is showing.
+ return;
+ }
+ if (mXLargeScreenSize) {
+ mContentView.addView(mFakeTitleBar);
+ mTabBar.onShowTitleBar();
+ } else {
+ WindowManager manager = (WindowManager)
+ mActivity.getSystemService(Context.WINDOW_SERVICE);
+
+ // Add the title bar to the window manager so it can receive
+ // touches
+ // while the menu is up
+ WindowManager.LayoutParams params =
+ new WindowManager.LayoutParams(
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT,
+ WindowManager.LayoutParams.TYPE_APPLICATION,
+ WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
+ PixelFormat.TRANSLUCENT);
+ params.gravity = Gravity.TOP;
+ boolean atTop = mainView.getScrollY() == 0;
+ params.windowAnimations = atTop ? 0 : R.style.TitleBar;
+ manager.addView(mFakeTitleBar, params);
+ }
+ }
+ }
+
+ void hideFakeTitleBar() {
+ if (!isFakeTitleBarShowing()) return;
+ if (mXLargeScreenSize) {
+ mContentView.removeView(mFakeTitleBar);
+ mTabBar.onHideTitleBar();
+ } else {
+ WindowManager.LayoutParams params =
+ (WindowManager.LayoutParams) mFakeTitleBar.getLayoutParams();
+ WebView mainView = mUiController.getCurrentWebView();
+ // Although we decided whether or not to animate based on the
+ // current
+ // scroll position, the scroll position may have changed since the
+ // fake title bar was displayed. Make sure it has the appropriate
+ // animation/lack thereof before removing.
+ params.windowAnimations =
+ mainView != null && mainView.getScrollY() == 0 ?
+ 0 : R.style.TitleBar;
+ WindowManager manager = (WindowManager) mActivity
+ .getSystemService(Context.WINDOW_SERVICE);
+ manager.updateViewLayout(mFakeTitleBar, params);
+ manager.removeView(mFakeTitleBar);
+ }
+ }
+
+ boolean isFakeTitleBarShowing() {
+ return (mFakeTitleBar.getParent() != null);
+ }
+
+ @Override
+ public void showComboView(boolean startWithHistory, Bundle extras) {
+ mComboView = new CombinedBookmarkHistoryView(mActivity,
+ mUiController,
+ startWithHistory ?
+ CombinedBookmarkHistoryView.FRAGMENT_ID_HISTORY
+ : CombinedBookmarkHistoryView.FRAGMENT_ID_BOOKMARKS,
+ extras);
+ mTitleBar.setVisibility(View.GONE);
+ hideFakeTitleBar();
+ dismissIME();
+ if (mActiveTab != null) {
+ WebView web = mActiveTab.getWebView();
+ mActiveTab.putInBackground();
+ }
+ mContentView.addView(mComboView, COVER_SCREEN_PARAMS);
+ }
+
+ /**
+ * dismiss the ComboPage
+ */
+ @Override
+ public void hideComboView() {
+ if (mComboView != null) {
+ mContentView.removeView(mComboView);
+ mTitleBar.setVisibility(View.VISIBLE);
+ mComboView = null;
+ }
+ if (mActiveTab != null) {
+ mActiveTab.putInForeground();
+ }
+ }
+
+ @Override
+ public void showCustomView(View view,
+ WebChromeClient.CustomViewCallback callback) {
+ // if a view already exists then immediately terminate the new one
+ if (mCustomView != null) {
+ callback.onCustomViewHidden();
+ return;
+ }
+
+ // Add the custom view to its container.
+ mCustomViewContainer.addView(view, COVER_SCREEN_GRAVITY_CENTER);
+ mCustomView = view;
+ mCustomViewCallback = callback;
+ // Hide the content view.
+ mContentView.setVisibility(View.GONE);
+ // Finally show the custom view container.
+ setStatusBarVisibility(false);
+ mCustomViewContainer.setVisibility(View.VISIBLE);
+ mCustomViewContainer.bringToFront();
+ }
+
+ @Override
+ public void onHideCustomView() {
+ if (mCustomView == null)
+ return;
+
+ // Hide the custom view.
+ mCustomView.setVisibility(View.GONE);
+ // Remove the custom view from its container.
+ mCustomViewContainer.removeView(mCustomView);
+ mCustomView = null;
+ mCustomViewContainer.setVisibility(View.GONE);
+ mCustomViewCallback.onCustomViewHidden();
+ // Show the content view.
+ setStatusBarVisibility(true);
+ mContentView.setVisibility(View.VISIBLE);
+ }
+
+ @Override
+ public boolean isCustomViewShowing() {
+ return mCustomView != null;
+ }
+
+ @Override
+ public void showVoiceTitleBar(String title) {
+ mTitleBar.setInVoiceMode(true);
+ mTitleBar.setDisplayTitle(title);
+ mFakeTitleBar.setInVoiceMode(true);
+ mFakeTitleBar.setDisplayTitle(title);
+ }
+
+ @Override
+ public void revertVoiceTitleBar(Tab tab) {
+ mTitleBar.setInVoiceMode(false);
+ String url = tab.getCurrentUrl();
+ mTitleBar.setDisplayTitle(url);
+ mFakeTitleBar.setInVoiceMode(false);
+ mFakeTitleBar.setDisplayTitle(url);
+ }
+
+ private void dismissIME() {
+ if (mInputManager.isActive()) {
+ mInputManager.hideSoftInputFromWindow(mContentView.getWindowToken(),
+ 0);
+ }
+ }
+
+ // -------------------------------------------------------------------------
+
+ @Override
+ public void resetTitleAndRevertLockIcon(Tab tab) {
+ tab.revertLockIcon();
+ updateLockIconToLatest(tab);
+ resetTitleIconAndProgress(tab);
+ }
+
+ /**
+ * Resets the lock icon. This method is called when we start a new load and
+ * know the url to be loaded.
+ */
+ private void resetLockIcon(Tab tab, String url) {
+ // Save the lock-icon state (we revert to it if the load gets cancelled)
+ tab.resetLockIcon(url);
+ updateLockIconImage(Tab.LOCK_ICON_UNSECURE);
+ }
+
+ /**
+ * Update the lock icon to correspond to our latest state.
+ */
+ private void updateLockIconToLatest(Tab t) {
+ if (t != null) {
+ updateLockIconImage(t.getLockIconType());
+ }
+ }
+
+ /**
+ * Reset the title, favicon, and progress.
+ */
+ private void resetTitleIconAndProgress(Tab tab) {
+ WebView current = tab.getWebView();
+ if (current == null) {
+ return;
+ }
+ resetTitleAndIcon(tab, current);
+ int progress = current.getProgress();
+ current.getWebChromeClient().onProgressChanged(current, progress);
+ }
+
+ @Override
+ public void resetTitleAndIcon(Tab tab) {
+ WebView current = tab.getWebView();
+ if (current != null) {
+ resetTitleAndIcon(tab, current);
+ }
+ }
+
+ // Reset the title and the icon based on the given item.
+ private void resetTitleAndIcon(Tab tab, WebView view) {
+ WebHistoryItem item = view.copyBackForwardList().getCurrentItem();
+ if (item != null) {
+ setUrlTitle(tab, item.getUrl(), item.getTitle());
+ setFavicon(tab, item.getFavicon());
+ } else {
+ setUrlTitle(tab, null, mActivity.getString(R.string.new_tab));
+ setFavicon(tab, null);
+ }
+ }
+
+ /**
+ * Updates the lock-icon image in the title-bar.
+ */
+ private void updateLockIconImage(int lockIconType) {
+ Drawable d = null;
+ if (lockIconType == Tab.LOCK_ICON_SECURE) {
+ d = mSecLockIcon;
+ } else if (lockIconType == Tab.LOCK_ICON_MIXED) {
+ d = mMixLockIcon;
+ }
+ mTitleBar.setLock(d);
+ mFakeTitleBar.setLock(d);
+ }
+
+ // active tabs page
+
+ public void showActiveTabsPage() {
+ mActiveTabsPage = new ActiveTabsPage(mActivity, mUiController);
+ mTitleBar.setVisibility(View.GONE);
+ hideFakeTitleBar();
+ mContentView.addView(mActiveTabsPage, COVER_SCREEN_PARAMS);
+ mActiveTabsPage.requestFocus();
+ }
+
+ /**
+ * Remove the active tabs page.
+ */
+ public void removeActiveTabsPage() {
+ mContentView.removeView(mActiveTabsPage);
+ mTitleBar.setVisibility(View.VISIBLE);
+ mActiveTabsPage = null;
+ }
+
+ // action mode callbacks
+
+ @Override
+ public void onActionModeStarted(ActionMode mode) {
+ // hide the fake title bar when CAB is shown
+ hideFakeTitleBar();
+ }
+
+ @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
+ showFakeTitleBar();
+ }
+ }
+
+ // menu handling callbacks
+
+ @Override
+ public void onOptionsMenuOpened() {
+ mOptionsMenuOpen = true;
+ // options menu opened, show fake title bar
+ showFakeTitleBar();
+ }
+
+ @Override
+ public void onExtendedMenuOpened() {
+ // Switching the menu to expanded view, so hide the
+ // title bar.
+ mExtendedMenuOpen = true;
+ hideFakeTitleBar();
+ }
+
+ @Override
+ public void onOptionsMenuClosed(boolean inLoad) {
+ mOptionsMenuOpen = false;
+ if (!inLoad) {
+ hideFakeTitleBar();
+ }
+ }
+
+ @Override
+ public void onExtendedMenuClosed(boolean inLoad) {
+ mExtendedMenuOpen = false;
+ if (inLoad) {
+ showFakeTitleBar();
+ }
+ }
+
+ @Override
+ public void onContextMenuCreated(Menu menu) {
+ hideFakeTitleBar();
+ }
+
+ @Override
+ public void onContextMenuClosed(Menu menu, boolean inLoad) {
+ if (inLoad) {
+ showFakeTitleBar();
+ }
+ }
+
+ @Override
+ public void onScroll(boolean titleVisible) {
+ if (mTabBar != null) {
+ mTabBar.onScroll(titleVisible);
+ }
+ }
+
+ // error console
+
+ @Override
+ public void setShouldShowErrorConsole(Tab tab, boolean flag) {
+ ErrorConsoleView errorConsole = tab.getErrorConsole(true);
+ if (flag) {
+ // Setting the show state of the console will cause it's the layout
+ // to be inflated.
+ if (errorConsole.numberOfErrors() > 0) {
+ errorConsole.showConsole(ErrorConsoleView.SHOW_MINIMIZED);
+ } else {
+ errorConsole.showConsole(ErrorConsoleView.SHOW_NONE);
+ }
+ if (errorConsole.getParent() != null) {
+ mErrorConsoleContainer.removeView(errorConsole);
+ }
+ // Now we can add it to the main view.
+ mErrorConsoleContainer.addView(errorConsole,
+ new LinearLayout.LayoutParams(
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT));
+ } else {
+ mErrorConsoleContainer.removeView(errorConsole);
+ }
+ }
+
+ private void setStatusBarVisibility(boolean visible) {
+ int flag = visible ? 0 : WindowManager.LayoutParams.FLAG_FULLSCREEN;
+ mActivity.getWindow().setFlags(flag,
+ WindowManager.LayoutParams.FLAG_FULLSCREEN);
+ }
+
+ @Override
+ public void setUrlTitle(Tab tab, String url, String title) {
+ if (TextUtils.isEmpty(title)) {
+ title = url;
+ }
+ if (tab.isInVoiceSearchMode()) return;
+ if (tab.inForeground()) {
+ mTitleBar.setDisplayTitle(url);
+ mFakeTitleBar.setDisplayTitle(url);
+ }
+ if (mXLargeScreenSize) {
+ mTabBar.onUrlAndTitle(tab, url, title);
+ }
+ }
+
+ // Set the favicon in the title bar.
+ @Override
+ public void setFavicon(Tab tab, Bitmap icon) {
+ mTitleBar.setFavicon(icon);
+ mFakeTitleBar.setFavicon(icon);
+ if (mXLargeScreenSize) {
+ mTabBar.onFavicon(tab, icon);
+ }
+ }
+ @Override
+ public boolean showsWeb() {
+ return mCustomView == null && mActiveTabsPage == null
+ && mComboView == null;
+ }
+
+ @Override
+ public void onPrepareOptionsMenu(Menu menu) {
+ if (!mXLargeScreenSize) {
+ final MenuItem newtab = menu.findItem(R.id.new_tab_menu_id);
+ newtab.setEnabled(mUiController.getTabControl().canCreateNewTab());
+ }
+ }
+
+ // -------------------------------------------------------------------------
+ // Helper function for WebChromeClient
+ // -------------------------------------------------------------------------
+
+ @Override
+ public Bitmap getDefaultVideoPoster() {
+ if (mDefaultVideoPoster == null) {
+ mDefaultVideoPoster = BitmapFactory.decodeResource(
+ mActivity.getResources(), R.drawable.default_video_poster);
+ }
+ return mDefaultVideoPoster;
+ }
+
+ @Override
+ public View getVideoLoadingProgressView() {
+ if (mVideoProgressView == null) {
+ LayoutInflater inflater = LayoutInflater.from(mActivity);
+ mVideoProgressView = inflater.inflate(
+ R.layout.video_loading_progress, null);
+ }
+ return mVideoProgressView;
+ }
+
+}
diff --git a/src/com/android/browser/BookmarkUtils.java b/src/com/android/browser/BookmarkUtils.java
new file mode 100644
index 0000000..c72cbd1
--- /dev/null
+++ b/src/com/android/browser/BookmarkUtils.java
@@ -0,0 +1,185 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.Path;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuffXfermode;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.net.Uri;
+import android.preference.PreferenceManager;
+import android.provider.Browser;
+import android.provider.BrowserContract;
+import android.text.TextUtils;
+
+class BookmarkUtils {
+ private final static String LOGTAG = "BookmarkUtils";
+
+ // XXX: There is no public string defining this intent so if Home changes the value, we
+ // have to update this string.
+ private static final String INSTALL_SHORTCUT = "com.android.launcher.action.INSTALL_SHORTCUT";
+
+ enum BookmarkIconType {
+ ICON_INSTALLABLE_WEB_APP, // Icon for an installable web app (launches WebAppRuntime).
+ ICON_HOME_SHORTCUT // Icon for a shortcut on the home screen (launches Browser).
+ };
+
+ /**
+ * Creates an icon to be associated with this bookmark. If available, the apple touch icon
+ * will be used, else we draw our own depending on the type of "bookmark" being created.
+ */
+ static Bitmap createIcon(Context context, Bitmap touchIcon, Bitmap favicon,
+ BookmarkIconType type) {
+ int iconDimension = context.getResources().getDimensionPixelSize(
+ android.R.dimen.app_icon_size);
+
+ Bitmap bm = Bitmap.createBitmap(iconDimension, iconDimension, Bitmap.Config.ARGB_8888);
+ Canvas canvas = new Canvas(bm);
+ Rect iconBounds = new Rect(0, 0, bm.getWidth(), bm.getHeight());
+
+ // Use the apple-touch-icon if available
+ if (touchIcon != null) {
+ drawTouchIconToCanvas(touchIcon, canvas, iconBounds);
+ } else {
+ // No touch icon so create our own.
+ // Set the background based on the type of shortcut (either webapp or home shortcut).
+ Bitmap icon = getIconBackground(context, type);
+
+ if (icon != null) {
+ // Now draw the correct icon background into our new bitmap.
+ Paint p = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
+ canvas.drawBitmap(icon, null, iconBounds, p);
+ }
+
+ // If we have a favicon, overlay it in a nice rounded white box on top of the
+ // background.
+ if (favicon != null) {
+ drawFaviconToCanvas(context, favicon, canvas, iconBounds);
+ }
+ }
+ return bm;
+ }
+
+ /**
+ * Convenience method for creating an intent that will add a shortcut to the home screen.
+ */
+ static Intent createAddToHomeIntent(Context context, String url, String title,
+ Bitmap touchIcon, Bitmap favicon) {
+ Intent i = new Intent(INSTALL_SHORTCUT);
+ Intent shortcutIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
+ long urlHash = url.hashCode();
+ long uniqueId = (urlHash << 32) | shortcutIntent.hashCode();
+ shortcutIntent.putExtra(Browser.EXTRA_APPLICATION_ID, Long.toString(uniqueId));
+ i.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
+ i.putExtra(Intent.EXTRA_SHORTCUT_NAME, title);
+ i.putExtra(Intent.EXTRA_SHORTCUT_ICON, createIcon(context, touchIcon, favicon,
+ BookmarkIconType.ICON_HOME_SHORTCUT));
+
+ // Do not allow duplicate items
+ i.putExtra("duplicate", false);
+ return i;
+ }
+
+ private static Bitmap getIconBackground(Context context, BookmarkIconType type) {
+ if (type == BookmarkIconType.ICON_HOME_SHORTCUT) {
+ // Want to create a shortcut icon on the homescreen, so the icon
+ // background is the red bookmark.
+ return BitmapFactory.decodeResource(context.getResources(),
+ R.mipmap.ic_launcher_shortcut_browser_bookmark);
+ } else if (type == BookmarkIconType.ICON_INSTALLABLE_WEB_APP) {
+ // Use the web browser icon as the background for the icon for an installable
+ // web app.
+ return BitmapFactory.decodeResource(context.getResources(),
+ R.mipmap.ic_launcher_browser);
+ }
+ return null;
+ }
+
+ private static void drawTouchIconToCanvas(Bitmap touchIcon, Canvas canvas, Rect iconBounds) {
+ Rect src = new Rect(0, 0, touchIcon.getWidth(), touchIcon.getHeight());
+
+ // Paint used for scaling the bitmap and drawing the rounded rect.
+ Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
+ paint.setFilterBitmap(true);
+ canvas.drawBitmap(touchIcon, src, iconBounds, paint);
+
+ // Construct a path from a round rect. This will allow drawing with
+ // an inverse fill so we can punch a hole using the round rect.
+ Path path = new Path();
+ path.setFillType(Path.FillType.INVERSE_WINDING);
+ RectF rect = new RectF(iconBounds);
+ rect.inset(1, 1);
+ path.addRoundRect(rect, 8f, 8f, Path.Direction.CW);
+
+ // Reuse the paint and clear the outside of the rectangle.
+ paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
+ canvas.drawPath(path, paint);
+ }
+
+ private static void drawFaviconToCanvas(Context context, Bitmap favicon, Canvas canvas,
+ Rect iconBounds) {
+ // Make a Paint for the white background rectangle and for
+ // filtering the favicon.
+ Paint p = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
+ p.setStyle(Paint.Style.FILL_AND_STROKE);
+ p.setColor(Color.WHITE);
+
+ // Create a rectangle that is slightly wider than the favicon
+ int faviconDimension = context.getResources().getDimensionPixelSize(R.dimen.favicon_size);
+ int faviconPaddedRectDimension = context.getResources().getDimensionPixelSize(
+ R.dimen.favicon_padded_size);
+ float padding = (faviconPaddedRectDimension - faviconDimension) / 2;
+ final float x = iconBounds.exactCenterX() - (faviconPaddedRectDimension / 2);
+ // Note: Subtract from the y position since the box is
+ // slightly higher than center. Use padding since it is already
+ // device independent.
+ final float y = iconBounds.exactCenterY() - (faviconPaddedRectDimension / 2) - padding;
+ RectF r = new RectF(x, y, x + faviconPaddedRectDimension, y + faviconPaddedRectDimension);
+
+ // Draw a white rounded rectangle behind the favicon
+ canvas.drawRoundRect(r, 2, 2, p);
+
+ // Draw the favicon in the same rectangle as the rounded
+ // rectangle but inset by the padding
+ // (results in a 16x16 favicon).
+ r.inset(padding, padding);
+ canvas.drawBitmap(favicon, null, r, null);
+ }
+
+ /* package */ static Uri getBookmarksUri(Context context) {
+ Uri uri = BrowserContract.Bookmarks.CONTENT_URI;
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+ String accountType = prefs.getString(BrowserBookmarksPage.PREF_ACCOUNT_TYPE, null);
+ String accountName = prefs.getString(BrowserBookmarksPage.PREF_ACCOUNT_NAME, null);
+ if (!TextUtils.isEmpty(accountName) && !TextUtils.isEmpty(accountType)) {
+ uri = uri.buildUpon()
+ .appendQueryParameter(BrowserContract.Bookmarks.PARAM_ACCOUNT_NAME, accountName)
+ .appendQueryParameter(BrowserContract.Bookmarks.PARAM_ACCOUNT_TYPE, accountType)
+ .build();
+ }
+ return uri;
+ }
+};
diff --git a/src/com/android/browser/Bookmarks.java b/src/com/android/browser/Bookmarks.java
index 5ada9dc..383ae7f 100644
--- a/src/com/android/browser/Bookmarks.java
+++ b/src/com/android/browser/Bookmarks.java
@@ -20,16 +20,20 @@
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
+import android.content.SharedPreferences;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
-import android.provider.Browser;
+import android.os.AsyncTask;
+import android.preference.PreferenceManager;
+import android.provider.BrowserContract;
+import android.provider.BrowserContract.Combined;
+import android.provider.BrowserContract.Images;
import android.util.Log;
import android.webkit.WebIconDatabase;
import android.widget.Toast;
import java.io.ByteArrayOutputStream;
-import java.util.Date;
/**
* This class is purely to have a common place for adding/deleting bookmarks.
@@ -53,89 +57,38 @@
* @param context Context of the calling Activity. This is used to make
* Toast confirming that the bookmark has been added. If the
* caller provides null, the Toast will not be shown.
- * @param cr The ContentResolver being used to add the bookmark to the db.
* @param url URL of the website to be bookmarked.
* @param name Provided name for the bookmark.
* @param thumbnail A thumbnail for the bookmark.
* @param retainIcon Whether to retain the page's icon in the icon database.
* This will usually be <code>true</code> except when bookmarks are
* added by a settings restore agent.
+ * @param parent ID of the parent folder.
*/
- /* package */ static void addBookmark(Context context,
- ContentResolver cr, String url, String name,
- Bitmap thumbnail, boolean retainIcon) {
+ /* package */ static void addBookmark(Context context, boolean showToast, String url,
+ String name, Bitmap thumbnail, boolean retainIcon, long parent) {
// Want to append to the beginning of the list
- long creationTime = new Date().getTime();
- ContentValues map = new ContentValues();
- Cursor cursor = null;
+ ContentValues values = new ContentValues();
try {
- cursor = Browser.getVisitedLike(cr, url);
- if (cursor.moveToFirst() && cursor.getInt(
- Browser.HISTORY_PROJECTION_BOOKMARK_INDEX) == 0) {
- // This means we have been to this site but not bookmarked
- // it, so convert the history item to a bookmark
- map.put(Browser.BookmarkColumns.CREATED, creationTime);
- map.put(Browser.BookmarkColumns.TITLE, name);
- map.put(Browser.BookmarkColumns.BOOKMARK, 1);
- map.put(Browser.BookmarkColumns.THUMBNAIL,
- bitmapToBytes(thumbnail));
- cr.update(Browser.BOOKMARKS_URI, map,
- "_id = " + cursor.getInt(0), null);
- } else {
- int count = cursor.getCount();
- boolean matchedTitle = false;
- for (int i = 0; i < count; i++) {
- // One or more bookmarks already exist for this site.
- // Check the names of each
- cursor.moveToPosition(i);
- if (cursor.getString(Browser.HISTORY_PROJECTION_TITLE_INDEX)
- .equals(name)) {
- // The old bookmark has the same name.
- // Update its creation time.
- map.put(Browser.BookmarkColumns.CREATED,
- creationTime);
- cr.update(Browser.BOOKMARKS_URI, map,
- "_id = " + cursor.getInt(0), null);
- matchedTitle = true;
- break;
- }
- }
- if (!matchedTitle) {
- // Adding a bookmark for a site the user has visited,
- // or a new bookmark (with a different name) for a site
- // the user has visited
- map.put(Browser.BookmarkColumns.TITLE, name);
- map.put(Browser.BookmarkColumns.URL, url);
- map.put(Browser.BookmarkColumns.CREATED, creationTime);
- map.put(Browser.BookmarkColumns.BOOKMARK, 1);
- map.put(Browser.BookmarkColumns.DATE, 0);
- map.put(Browser.BookmarkColumns.THUMBNAIL,
- bitmapToBytes(thumbnail));
- int visits = 0;
- if (count > 0) {
- // The user has already bookmarked, and possibly
- // visited this site. However, they are creating
- // a new bookmark with the same url but a different
- // name. The new bookmark should have the same
- // number of visits as the already created bookmark.
- visits = cursor.getInt(
- Browser.HISTORY_PROJECTION_VISITS_INDEX);
- }
- // Bookmark starts with 3 extra visits so that it will
- // bubble up in the most visited and goto search box
- map.put(Browser.BookmarkColumns.VISITS, visits + 3);
- cr.insert(Browser.BOOKMARKS_URI, map);
- }
- }
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+ String accountType = prefs.getString(BrowserBookmarksPage.PREF_ACCOUNT_TYPE, null);
+ String accountName = prefs.getString(BrowserBookmarksPage.PREF_ACCOUNT_NAME, null);
+ values.put(BrowserContract.Bookmarks.ACCOUNT_TYPE, accountType);
+ values.put(BrowserContract.Bookmarks.ACCOUNT_NAME, accountName);
+ values.put(BrowserContract.Bookmarks.TITLE, name);
+ values.put(BrowserContract.Bookmarks.URL, url);
+ values.put(BrowserContract.Bookmarks.IS_FOLDER, 0);
+ values.put(BrowserContract.Bookmarks.THUMBNAIL,
+ bitmapToBytes(thumbnail));
+ values.put(BrowserContract.Bookmarks.PARENT, parent);
+ context.getContentResolver().insert(BrowserContract.Bookmarks.CONTENT_URI, values);
} catch (IllegalStateException e) {
Log.e(LOGTAG, "addBookmark", e);
- } finally {
- if (cursor != null) cursor.close();
}
if (retainIcon) {
WebIconDatabase.getInstance().retainIconForPageUrl(url);
}
- if (context != null) {
+ if (showToast) {
Toast.makeText(context, R.string.added_to_bookmarks,
Toast.LENGTH_LONG).show();
}
@@ -155,40 +108,26 @@
ContentResolver cr, String url, String title) {
Cursor cursor = null;
try {
- cursor = cr.query(
- Browser.BOOKMARKS_URI,
- Browser.HISTORY_PROJECTION,
- "url = ? AND title = ?",
+ cursor = cr.query(BrowserContract.Bookmarks.CONTENT_URI,
+ new String[] { BrowserContract.Bookmarks._ID },
+ BrowserContract.Bookmarks.URL + " = ? AND " +
+ BrowserContract.Bookmarks.TITLE + " = ?",
new String[] { url, title },
null);
- boolean first = cursor.moveToFirst();
+
// Should be in the database no matter what
- if (!first) {
+ if (!cursor.moveToFirst()) {
throw new AssertionError("URL is not in the database! " + url
+ " " + title);
}
+
// Remove from bookmarks
WebIconDatabase.getInstance().releaseIconForPageUrl(url);
- Uri uri = ContentUris.withAppendedId(Browser.BOOKMARKS_URI,
- cursor.getInt(Browser.HISTORY_PROJECTION_ID_INDEX));
- int numVisits = cursor.getInt(
- Browser.HISTORY_PROJECTION_VISITS_INDEX);
- if (0 == numVisits) {
- cr.delete(uri, null, null);
- } else {
- // It is no longer a bookmark, but it is still a visited
- // site.
- ContentValues values = new ContentValues();
- values.put(Browser.BookmarkColumns.BOOKMARK, 0);
- try {
- cr.update(uri, values, null, null);
- } catch (IllegalStateException e) {
- Log.e("removeFromBookmarks", "no database!");
- }
- }
+ Uri uri = ContentUris.withAppendedId(BrowserContract.Bookmarks.CONTENT_URI,
+ cursor.getLong(0));
+ cr.delete(uri, null, null);
if (context != null) {
- Toast.makeText(context, R.string.removed_from_bookmarks,
- Toast.LENGTH_LONG).show();
+ Toast.makeText(context, R.string.removed_from_bookmarks, Toast.LENGTH_LONG).show();
}
} catch (IllegalStateException e) {
Log.e(LOGTAG, "removeFromBookmarks", e);
@@ -219,4 +158,86 @@
}
return false;
}
+
+ static final String QUERY_BOOKMARKS_WHERE =
+ Combined.URL + " == ? OR " +
+ Combined.URL + " == ? OR " +
+ Combined.URL + " LIKE ? || '%' OR " +
+ Combined.URL + " LIKE ? || '%'";
+
+ /* package */ static Cursor queryCombinedForUrl(ContentResolver cr,
+ String originalUrl, String url) {
+ if (cr == null || url == null) {
+ return null;
+ }
+
+ // If originalUrl is null, just set it to url.
+ if (originalUrl == null) {
+ originalUrl = url;
+ }
+
+ // Look for both the original url and the actual url. This takes in to
+ // account redirects.
+ String originalUrlNoQuery = removeQuery(originalUrl);
+ String urlNoQuery = removeQuery(url);
+ originalUrl = originalUrlNoQuery + '?';
+ url = urlNoQuery + '?';
+
+ // Use NoQuery to search for the base url (i.e. if the url is
+ // http://www.yahoo.com/?rs=1, search for http://www.yahoo.com)
+ // Use url to match the base url with other queries (i.e. if the url is
+ // http://www.google.com/m, search for
+ // http://www.google.com/m?some_query)
+ final String[] selArgs = new String[] { originalUrlNoQuery, urlNoQuery, originalUrl, url };
+ final String[] projection = new String[] { Combined.URL };
+ return cr.query(Combined.CONTENT_URI, projection, QUERY_BOOKMARKS_WHERE, selArgs, null);
+ }
+
+ // Strip the query from the given url.
+ static String removeQuery(String url) {
+ if (url == null) {
+ return null;
+ }
+ int query = url.indexOf('?');
+ String noQuery = url;
+ if (query != -1) {
+ noQuery = url.substring(0, query);
+ }
+ return noQuery;
+ }
+
+ /**
+ * Update the bookmark's favicon. This is a convenience method for updating
+ * a bookmark favicon for the originalUrl and url of the passed in WebView.
+ * @param cr The ContentResolver to use.
+ * @param originalUrl The original url before any redirects.
+ * @param url The current url.
+ * @param favicon The favicon bitmap to write to the db.
+ */
+ /* package */ static void updateFavicon(final ContentResolver cr,
+ final String originalUrl, final String url, final Bitmap favicon) {
+ new AsyncTask<Void, Void, Void>() {
+ @Override
+ protected Void doInBackground(Void... unused) {
+ Cursor cursor = queryCombinedForUrl(cr, originalUrl, url);
+ try {
+ if (cursor.moveToFirst()) {
+ final ByteArrayOutputStream os = new ByteArrayOutputStream();
+ favicon.compress(Bitmap.CompressFormat.PNG, 100, os);
+
+ ContentValues values = new ContentValues();
+ values.put(Images.FAVICON, os.toByteArray());
+ values.put(Images.URL, cursor.getString(0));
+
+ do {
+ cr.update(Images.CONTENT_URI, values, null, null);
+ } while (cursor.moveToNext());
+ }
+ } finally {
+ if (cursor != null) cursor.close();
+ }
+ return null;
+ }
+ }.execute();
+ }
}
diff --git a/src/com/android/browser/BookmarksLoader.java b/src/com/android/browser/BookmarksLoader.java
new file mode 100644
index 0000000..770ca60
--- /dev/null
+++ b/src/com/android/browser/BookmarksLoader.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.browser;
+
+import android.content.Context;
+import android.content.CursorLoader;
+import android.net.Uri;
+import android.provider.BrowserContract.Bookmarks;
+import android.text.TextUtils;
+
+public class BookmarksLoader extends CursorLoader {
+ public static final String ARG_ACCOUNT_TYPE = "acct_type";
+ public static final String ARG_ACCOUNT_NAME = "acct_name";
+
+ public static final int COLUMN_INDEX_ID = 0;
+ public static final int COLUMN_INDEX_URL = 1;
+ public static final int COLUMN_INDEX_TITLE = 2;
+ public static final int COLUMN_INDEX_FAVICON = 3;
+ public static final int COLUMN_INDEX_THUMBNAIL = 4;
+ public static final int COLUMN_INDEX_TOUCH_ICON = 5;
+ public static final int COLUMN_INDEX_IS_FOLDER = 6;
+ public static final int COLUMN_INDEX_PARENT = 8;
+
+ public static final String[] PROJECTION = new String[] {
+ Bookmarks._ID, // 0
+ Bookmarks.URL, // 1
+ Bookmarks.TITLE, // 2
+ Bookmarks.FAVICON, // 3
+ Bookmarks.THUMBNAIL, // 4
+ Bookmarks.TOUCH_ICON, // 5
+ Bookmarks.IS_FOLDER, // 6
+ Bookmarks.POSITION, // 7
+ Bookmarks.PARENT, // 8
+ };
+
+ private String mAccountType;
+ private String mAccountName;
+
+ public BookmarksLoader(Context context, String accountType, String accountName) {
+ super(context, addAccount(Bookmarks.CONTENT_URI_DEFAULT_FOLDER, accountType, accountName),
+ PROJECTION, null, null, null);
+ mAccountType = accountType;
+ mAccountName = accountName;
+ }
+
+ @Override
+ public void setUri(Uri uri) {
+ super.setUri(addAccount(uri, mAccountType, mAccountName));
+ }
+
+ private static Uri addAccount(Uri uri, String accountType, String accountName) {
+ if (!TextUtils.isEmpty(accountType) && !TextUtils.isEmpty(accountName)) {
+ return uri.buildUpon().appendQueryParameter(Bookmarks.PARAM_ACCOUNT_TYPE, accountType).
+ appendQueryParameter(Bookmarks.PARAM_ACCOUNT_NAME, accountName).build();
+ }
+ return uri;
+ }
+}
diff --git a/src/com/android/browser/BreadCrumbView.java b/src/com/android/browser/BreadCrumbView.java
new file mode 100644
index 0000000..e4940e9
--- /dev/null
+++ b/src/com/android/browser/BreadCrumbView.java
@@ -0,0 +1,349 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.view.Gravity;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.ImageButton;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Simple bread crumb view
+ * Use setController to receive callbacks from user interactions
+ * Use pushView, popView, clear, and getTopData to change/access the view stack
+ */
+public class BreadCrumbView extends LinearLayout implements OnClickListener {
+
+ interface Controller {
+ public void onTop(int level, Object data);
+ }
+
+ private ImageButton mBackButton;
+ private Controller mController;
+ private List<Crumb> mCrumbs;
+ private boolean mUseBackButton;
+ private Drawable mSeparatorDrawable;
+ private int mMaxVisible = -1;
+
+ /**
+ * @param context
+ * @param attrs
+ * @param defStyle
+ */
+ public BreadCrumbView(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ init(context);
+ }
+
+ /**
+ * @param context
+ * @param attrs
+ */
+ public BreadCrumbView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ init(context);
+ }
+
+ /**
+ * @param context
+ */
+ public BreadCrumbView(Context context) {
+ super(context);
+ init(context);
+ }
+
+ private void init(Context ctx) {
+ mUseBackButton = false;
+ mCrumbs = new ArrayList<Crumb>();
+ mSeparatorDrawable = ctx.getResources().getDrawable(
+ R.drawable.crumb_divider);
+ addBackButton();
+ }
+
+ public void setUseBackButton(boolean useflag) {
+ mUseBackButton = useflag;
+ updateVisible();
+ }
+
+ public void setController(Controller ctl) {
+ mController = ctl;
+ }
+
+ public int getMaxVisible() {
+ return mMaxVisible;
+ }
+
+ public void setMaxVisible(int max) {
+ mMaxVisible = max;
+ updateVisible();
+ }
+
+ public int getTopLevel() {
+ return mCrumbs.size();
+ }
+
+ public Object getTopData() {
+ Crumb c = getTopCrumb();
+ if (c != null) {
+ return c.data;
+ }
+ return null;
+ }
+
+ public int size() {
+ return mCrumbs.size();
+ }
+
+ public void clear() {
+ while (mCrumbs.size() > 1) {
+ pop(false);
+ }
+ pop(true);
+ }
+
+ public void notifyController() {
+ if (mController != null) {
+ if (mCrumbs.size() > 0) {
+ mController.onTop(mCrumbs.size(), getTopCrumb().data);
+ } else {
+ mController.onTop(0, null);
+ }
+ }
+ }
+
+ public void pushView(String name, Object data) {
+ pushView(name, true, data);
+ }
+
+ public void pushView(String name, boolean canGoBack, Object data) {
+ Crumb crumb = new Crumb(name, canGoBack, data);
+ pushCrumb(crumb);
+ }
+
+ public void pushView(View view, Object data) {
+ Crumb crumb = new Crumb(view, true, data);
+ pushCrumb(crumb);
+ }
+
+ public void popView() {
+ pop(true);
+ }
+
+ private void addBackButton() {
+ mBackButton = new ImageButton(mContext);
+ mBackButton.setImageResource(R.drawable.ic_back_normal);
+ mBackButton.setBackgroundResource(R.drawable.browserbarbutton);
+ mBackButton.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
+ LayoutParams.MATCH_PARENT));
+ mBackButton.setOnClickListener(this);
+ mBackButton.setVisibility(View.INVISIBLE);
+ addView(mBackButton, 0);
+ }
+
+ private void pushCrumb(Crumb crumb) {
+ if (mCrumbs.size() > 0) {
+ addSeparator();
+ }
+ mCrumbs.add(crumb);
+ addView(crumb.crumbView);
+ updateVisible();
+ crumb.crumbView.setOnClickListener(this);
+ }
+
+ private void addSeparator() {
+ ImageView sep = new ImageView(mContext);
+ sep.setImageDrawable(mSeparatorDrawable);
+ sep.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
+ LayoutParams.MATCH_PARENT));
+ addView(sep);
+ }
+
+ private void pop(boolean notify) {
+ int n = mCrumbs.size();
+ if (n > 0) {
+ removeLastView();
+ if (!mUseBackButton || (n > 1)) {
+ // remove separator
+ removeLastView();
+ }
+ mCrumbs.remove(n - 1);
+ if (mUseBackButton) {
+ Crumb top = getTopCrumb();
+ if (top != null && top.canGoBack) {
+ mBackButton.setVisibility(View.VISIBLE);
+ } else {
+ mBackButton.setVisibility(View.INVISIBLE);
+ }
+ }
+ updateVisible();
+ if (notify) {
+ notifyController();
+ }
+ }
+ }
+
+ private void updateVisible() {
+ // start at index 1 (0 == back button)
+ int childIndex = 1;
+ if (mMaxVisible >= 0) {
+ int invisibleCrumbs = size() - mMaxVisible;
+ if (invisibleCrumbs > 0) {
+ int crumbIndex = 0;
+ while (crumbIndex < invisibleCrumbs) {
+ // Set the crumb to GONE.
+ getChildAt(childIndex).setVisibility(View.GONE);
+ childIndex++;
+ // Each crumb is followed by a separator (except the last
+ // one). Also make it GONE
+ if (getChildAt(childIndex) != null) {
+ getChildAt(childIndex).setVisibility(View.GONE);
+ }
+ childIndex++;
+ // Move to the next crumb.
+ crumbIndex++;
+ }
+ }
+ // Make sure the last two are visible.
+ int childCount = getChildCount();
+ while (childIndex < childCount) {
+ getChildAt(childIndex).setVisibility(View.VISIBLE);
+ childIndex++;
+ }
+ } else {
+ int count = getChildCount();
+ for (int i = childIndex; i < count ; i++) {
+ getChildAt(i).setVisibility(View.VISIBLE);
+ }
+ }
+ if (mUseBackButton) {
+ boolean canGoBack = getTopCrumb() != null ? getTopCrumb().canGoBack : false;
+ mBackButton.setVisibility(canGoBack ? View.VISIBLE : View.INVISIBLE);
+ } else {
+ mBackButton.setVisibility(View.GONE);
+ }
+ }
+
+ private void removeLastView() {
+ int ix = getChildCount();
+ if (ix > 0) {
+ removeViewAt(ix-1);
+ }
+ }
+
+ private Crumb getTopCrumb() {
+ Crumb crumb = null;
+ if (mCrumbs.size() > 0) {
+ crumb = mCrumbs.get(mCrumbs.size() - 1);
+ }
+ return crumb;
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (mBackButton == v) {
+ popView();
+ notifyController();
+ } else {
+ // pop until view matches crumb view
+ while (v != getTopCrumb().crumbView) {
+ pop(false);
+ }
+ notifyController();
+ }
+ }
+ @Override
+ public int getBaseline() {
+ int ix = getChildCount();
+ if (ix > 0) {
+ // If there is at least one crumb, the baseline will be its
+ // baseline.
+ return getChildAt(ix-1).getBaseline();
+ }
+ return super.getBaseline();
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ int height = mSeparatorDrawable.getIntrinsicHeight();
+ if (getMeasuredHeight() < height) {
+ // This should only be an issue if there are currently no separators
+ // showing; i.e. if there is one crumb and no back button.
+ int mode = View.MeasureSpec.getMode(heightMeasureSpec);
+ switch(mode) {
+ case View.MeasureSpec.AT_MOST:
+ if (View.MeasureSpec.getSize(heightMeasureSpec) < height) {
+ return;
+ }
+ break;
+ case View.MeasureSpec.EXACTLY:
+ return;
+ default:
+ break;
+ }
+ setMeasuredDimension(getMeasuredWidth(), height);
+ }
+ }
+
+ class Crumb {
+
+ public View crumbView;
+ public boolean canGoBack;
+ public Object data;
+
+ public Crumb(String title, boolean backEnabled, Object tag) {
+ init(makeCrumbView(title), backEnabled, tag);
+ }
+
+ public Crumb(View view, boolean backEnabled, Object tag) {
+ init(view, backEnabled, tag);
+ }
+
+ private void init(View view, boolean back, Object tag) {
+ canGoBack = back;
+ crumbView = view;
+ data = tag;
+ }
+
+ private TextView makeCrumbView(String name) {
+ TextView tv = new TextView(mContext);
+ tv.setTextAppearance(mContext, android.R.style.TextAppearance_Medium);
+ tv.setPadding(16, 0, 16, 0);
+ tv.setGravity(Gravity.CENTER_VERTICAL);
+ tv.setText(name);
+ tv.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
+ LayoutParams.MATCH_PARENT));
+ tv.setMaxWidth(mContext.getResources().getInteger(
+ R.integer.max_width_crumb));
+ tv.setMaxLines(1);
+ tv.setEllipsize(TextUtils.TruncateAt.END);
+ return tv;
+ }
+
+ }
+
+}
diff --git a/src/com/android/browser/Browser.java b/src/com/android/browser/Browser.java
index 7822ec8..12c0c41 100644
--- a/src/com/android/browser/Browser.java
+++ b/src/com/android/browser/Browser.java
@@ -16,6 +16,7 @@
package com.android.browser;
+import android.os.FileUtils;
import android.util.Log;
import android.app.Application;
@@ -47,7 +48,11 @@
public Browser() {
}
+ @Override
public void 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);
// Fix heap utilization for better heap size characteristics.
@@ -57,7 +62,7 @@
CookieSyncManager.createInstance(this);
// remove all expired cookies
CookieManager.getInstance().removeExpiredCookie();
- BrowserSettings.getInstance().loadFromDb(this);
+ BrowserSettings.getInstance().asyncLoadFromDb(this);
}
static Intent createBrowserViewIntent() {
diff --git a/src/com/android/browser/BrowserActivity.java b/src/com/android/browser/BrowserActivity.java
index 44ab307..7c0f7c8 100644
--- a/src/com/android/browser/BrowserActivity.java
+++ b/src/com/android/browser/BrowserActivity.java
@@ -16,155 +16,39 @@
package com.android.browser;
+import com.google.common.annotations.VisibleForTesting;
+
import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.DownloadManager;
-import android.app.ProgressDialog;
-import android.app.SearchManager;
-import android.content.ActivityNotFoundException;
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
-import android.content.ContentProvider;
-import android.content.ContentProviderClient;
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.DialogInterface;
import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.database.Cursor;
-import android.database.DatabaseUtils;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
-import android.graphics.Canvas;
-import android.graphics.Picture;
import android.graphics.PixelFormat;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-import android.net.ConnectivityManager;
-import android.net.NetworkInfo;
-import android.net.Uri;
-import android.net.WebAddress;
-import android.net.http.SslCertificate;
-import android.net.http.SslError;
-import android.os.AsyncTask;
import android.os.Bundle;
-import android.os.Debug;
-import android.os.Environment;
-import android.os.Handler;
-import android.os.Message;
-import android.os.PowerManager;
-import android.os.Process;
-import android.os.ServiceManager;
-import android.os.SystemClock;
-import android.provider.Browser;
-import android.provider.ContactsContract;
-import android.provider.ContactsContract.Intents.Insert;
-import android.provider.Downloads;
-import android.provider.MediaStore;
-import android.speech.RecognizerResultsIntent;
-import android.text.IClipboard;
-import android.text.TextUtils;
-import android.text.format.DateFormat;
-import android.util.AttributeSet;
import android.util.Log;
-import android.util.Patterns;
+import android.view.ActionMode;
import android.view.ContextMenu;
-import android.view.Gravity;
+import android.view.ContextMenu.ContextMenuInfo;
import android.view.KeyEvent;
-import android.view.LayoutInflater;
import android.view.Menu;
-import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
-import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
-import android.view.ContextMenu.ContextMenuInfo;
-import android.view.MenuItem.OnMenuItemClickListener;
-import android.webkit.CookieManager;
-import android.webkit.CookieSyncManager;
-import android.webkit.DownloadListener;
-import android.webkit.HttpAuthHandler;
-import android.webkit.PluginManager;
-import android.webkit.SslErrorHandler;
-import android.webkit.URLUtil;
-import android.webkit.ValueCallback;
-import android.webkit.WebChromeClient;
-import android.webkit.WebHistoryItem;
-import android.webkit.WebIconDatabase;
-import android.webkit.WebView;
-import android.widget.EditText;
-import android.widget.FrameLayout;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-import android.widget.Toast;
-import android.accounts.Account;
-import android.accounts.AccountManager;
-import android.accounts.AccountManagerFuture;
-import android.accounts.AuthenticatorException;
-import android.accounts.OperationCanceledException;
-import android.accounts.AccountManagerCallback;
+import android.view.accessibility.AccessibilityManager;
-import com.android.browser.search.SearchEngine;
-import com.android.common.Search;
-import com.android.common.speech.LoggingEvents;
+public class BrowserActivity extends Activity {
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.net.URLEncoder;
-import java.text.ParseException;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
+ public static final String ACTION_RESTART = "--restart--";
+ private static final String EXTRA_STATE = "state";
-public class BrowserActivity extends Activity
- implements View.OnCreateContextMenuListener, DownloadListener {
+ private final static String LOGTAG = "browser";
- /* Define some aliases to make these debugging flags easier to refer to.
- * This file imports android.provider.Browser, so we can't just refer to "Browser.DEBUG".
- */
- private final static boolean DEBUG = com.android.browser.Browser.DEBUG;
- private final static boolean LOGV_ENABLED = com.android.browser.Browser.LOGV_ENABLED;
- private final static boolean LOGD_ENABLED = com.android.browser.Browser.LOGD_ENABLED;
+ private final static boolean LOGV_ENABLED =
+ com.android.browser.Browser.LOGV_ENABLED;
- private static class ClearThumbnails extends AsyncTask<File, Void, Void> {
- @Override
- public Void doInBackground(File... files) {
- if (files != null) {
- for (File f : files) {
- if (!f.delete()) {
- Log.e(LOGTAG, f.getPath() + " was not deleted");
- }
- }
- }
- return null;
- }
- }
-
- /**
- * This layout holds everything you see below the status bar, including the
- * error console, the custom view container, and the webviews.
- */
- private FrameLayout mBrowserFrameLayout;
+ private Controller mController;
+ private UI mUi;
@Override
public void onCreate(Bundle icicle) {
@@ -172,8 +56,21 @@
Log.v(LOGTAG, this + " onStart");
}
super.onCreate(icicle);
- // test the browser in OpenGL
- // requestWindowFeature(Window.FEATURE_OPENGL);
+
+ // 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. :(
+ BrowserSettings.getInstance().waitForLoadFromDbToComplete();
+
+ // render the browser in OpenGL
+ if (BrowserSettings.getInstance().isHardwareAccelerated()) {
+ // Set the flag in the activity's window
+ this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
+ WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
+ } else {
+ // Clear the flag in the activity's window
+ this.getWindow().setFlags(0, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
+ }
// enable this to test the browser in 32bit
if (false) {
@@ -181,543 +78,50 @@
BitmapFactory.setDefaultConfig(Bitmap.Config.ARGB_8888);
}
- setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL);
-
- mResolver = getContentResolver();
-
- // Keep a settings instance handy.
- mSettings = BrowserSettings.getInstance();
-
// If this was a web search request, pass it on to the default web
// search provider and finish this activity.
- if (handleWebSearchIntent(getIntent())) {
+ if (IntentHandler.handleWebSearchIntent(this, null, getIntent())) {
finish();
return;
}
- mSecLockIcon = Resources.getSystem().getDrawable(
- android.R.drawable.ic_secure);
- mMixLockIcon = Resources.getSystem().getDrawable(
- android.R.drawable.ic_partial_secure);
-
- FrameLayout frameLayout = (FrameLayout) getWindow().getDecorView()
- .findViewById(com.android.internal.R.id.content);
- mBrowserFrameLayout = (FrameLayout) LayoutInflater.from(this)
- .inflate(R.layout.custom_screen, null);
- mContentView = (FrameLayout) mBrowserFrameLayout.findViewById(
- R.id.main_content);
- mErrorConsoleContainer = (LinearLayout) mBrowserFrameLayout
- .findViewById(R.id.error_console);
- mCustomViewContainer = (FrameLayout) mBrowserFrameLayout
- .findViewById(R.id.fullscreen_custom_content);
- frameLayout.addView(mBrowserFrameLayout, COVER_SCREEN_PARAMS);
- mTitleBar = new TitleBar(this);
- // mTitleBar will be always shown in the fully loaded mode
- mTitleBar.setProgress(100);
- mFakeTitleBar = new TitleBar(this);
-
- // Create the tab control and our initial tab
- mTabControl = new TabControl(this);
-
- // Open the icon database and retain all the bookmark urls for favicons
- retainIconsOnStartup();
-
- mSettings.setTabControl(mTabControl);
-
- PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
- mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Browser");
-
- // Find out if the network is currently up.
- ConnectivityManager cm = (ConnectivityManager) getSystemService(
- Context.CONNECTIVITY_SERVICE);
- NetworkInfo info = cm.getActiveNetworkInfo();
- if (info != null) {
- mIsNetworkUp = info.isAvailable();
- }
-
- /* enables registration for changes in network status from
- http stack */
- mNetworkStateChangedFilter = new IntentFilter();
- mNetworkStateChangedFilter.addAction(
- ConnectivityManager.CONNECTIVITY_ACTION);
- mNetworkStateIntentReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (intent.getAction().equals(
- ConnectivityManager.CONNECTIVITY_ACTION)) {
-
- NetworkInfo info = intent.getParcelableExtra(
- ConnectivityManager.EXTRA_NETWORK_INFO);
- String typeName = info.getTypeName();
- String subtypeName = info.getSubtypeName();
- sendNetworkType(typeName.toLowerCase(),
- (subtypeName != null ? subtypeName.toLowerCase() : ""));
-
- onNetworkToggle(info.isAvailable());
- }
- }
- };
-
- IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
- filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
- filter.addDataScheme("package");
- mPackageInstallationReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- final String action = intent.getAction();
- final String packageName = intent.getData()
- .getSchemeSpecificPart();
- final boolean replacing = intent.getBooleanExtra(
- Intent.EXTRA_REPLACING, false);
- if (Intent.ACTION_PACKAGE_REMOVED.equals(action) && replacing) {
- // if it is replacing, refreshPlugins() when adding
- return;
- }
-
- if (sGoogleApps.contains(packageName)) {
- BrowserActivity.this.packageChanged(packageName,
- Intent.ACTION_PACKAGE_ADDED.equals(action));
- }
-
- PackageManager pm = BrowserActivity.this.getPackageManager();
- PackageInfo pkgInfo = null;
- try {
- pkgInfo = pm.getPackageInfo(packageName,
- PackageManager.GET_PERMISSIONS);
- } catch (PackageManager.NameNotFoundException e) {
- return;
- }
- if (pkgInfo != null) {
- String permissions[] = pkgInfo.requestedPermissions;
- if (permissions == null) {
- return;
- }
- boolean permissionOk = false;
- for (String permit : permissions) {
- if (PluginManager.PLUGIN_PERMISSION.equals(permit)) {
- permissionOk = true;
- break;
- }
- }
- if (permissionOk) {
- PluginManager.getInstance(BrowserActivity.this)
- .refreshPlugins(
- Intent.ACTION_PACKAGE_ADDED
- .equals(action));
- }
- }
- }
- };
- registerReceiver(mPackageInstallationReceiver, filter);
-
- if (!mTabControl.restoreState(icicle)) {
- // clear up the thumbnail directory if we can't restore the state as
- // none of the files in the directory are referenced any more.
- new ClearThumbnails().execute(
- mTabControl.getThumbnailDir().listFiles());
- // there is no quit on Android. But if we can't restore the state,
- // we can treat it as a new Browser, remove the old session cookies.
- CookieManager.getInstance().removeSessionCookie();
- final Intent intent = getIntent();
- final Bundle extra = intent.getExtras();
- // Create an initial tab.
- // If the intent is ACTION_VIEW and data is not null, the Browser is
- // invoked to view the content by another application. In this case,
- // the tab will be close when exit.
- UrlData urlData = getUrlDataFromIntent(intent);
-
- String action = intent.getAction();
- final Tab t = mTabControl.createNewTab(
- (Intent.ACTION_VIEW.equals(action) &&
- intent.getData() != null)
- || RecognizerResultsIntent.ACTION_VOICE_SEARCH_RESULTS
- .equals(action),
- intent.getStringExtra(Browser.EXTRA_APPLICATION_ID), urlData.mUrl);
- mTabControl.setCurrentTab(t);
- attachTabToContentView(t);
- WebView webView = t.getWebView();
- if (extra != null) {
- int scale = extra.getInt(Browser.INITIAL_ZOOM_LEVEL, 0);
- if (scale > 0 && scale <= 1000) {
- webView.setInitialScale(scale);
- }
- }
-
- if (urlData.isEmpty()) {
- loadUrl(webView, mSettings.getHomePage());
- } else {
- loadUrlDataIn(t, urlData);
- }
+ if (((AccessibilityManager) getSystemService(ACCESSIBILITY_SERVICE))
+ .isEnabled()) {
+ setDefaultKeyMode(DEFAULT_KEYS_DISABLE);
} else {
- // TabControl.restoreState() will create a new tab even if
- // restoring the state fails.
- attachTabToContentView(mTabControl.getCurrentTab());
+ setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL);
}
- // Delete old thumbnails to save space
- File dir = mTabControl.getThumbnailDir();
- if (dir.exists()) {
- for (String child : dir.list()) {
- File f = new File(dir, child);
- f.delete();
- }
- }
+ mController = new Controller(this);
+ mUi = new BaseUi(this, mController);
+ mController.setUi(mUi);
+ mController.setWebViewFactory((BaseUi) mUi);
- // Read JavaScript flags if it exists.
- String jsFlags = mSettings.getJsFlags();
- if (jsFlags.trim().length() != 0) {
- mTabControl.getCurrentWebView().setJsFlags(jsFlags);
+ Bundle state = getIntent().getBundleExtra(EXTRA_STATE);
+ if (state != null && icicle == null) {
+ icicle = state;
}
- // Work out which packages are installed on the system.
- getInstalledPackages();
-
- // Start watching the default geolocation permissions
- mSystemAllowGeolocationOrigins
- = new SystemAllowGeolocationOrigins(getApplicationContext());
- mSystemAllowGeolocationOrigins.start();
+ mController.start(icicle, getIntent());
}
- /**
- * Feed the previously stored results strings to the BrowserProvider so that
- * the SearchDialog will show them instead of the standard searches.
- * @param result String to show on the editable line of the SearchDialog.
- */
- /* package */ void showVoiceSearchResults(String result) {
- ContentProviderClient client = mResolver.acquireContentProviderClient(
- Browser.BOOKMARKS_URI);
- ContentProvider prov = client.getLocalContentProvider();
- BrowserProvider bp = (BrowserProvider) prov;
- bp.setQueryResults(mTabControl.getCurrentTab().getVoiceSearchResults());
- client.release();
-
- Bundle bundle = createGoogleSearchSourceBundle(
- GOOGLE_SEARCH_SOURCE_SEARCHKEY);
- bundle.putBoolean(SearchManager.CONTEXT_IS_VOICE, true);
- startSearch(result, false, bundle, false);
+ @VisibleForTesting
+ Controller getController() {
+ return mController;
}
@Override
protected void onNewIntent(Intent intent) {
- Tab current = mTabControl.getCurrentTab();
- // When a tab is closed on exit, the current tab index is set to -1.
- // Reset before proceed as Browser requires the current tab to be set.
- if (current == null) {
- // Try to reset the tab in case the index was incorrect.
- current = mTabControl.getTab(0);
- if (current == null) {
- // No tabs at all so just ignore this intent.
- return;
- }
- mTabControl.setCurrentTab(current);
- attachTabToContentView(current);
- resetTitleAndIcon(current.getWebView());
- }
- final String action = intent.getAction();
- final int flags = intent.getFlags();
- if (Intent.ACTION_MAIN.equals(action) ||
- (flags & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0) {
- // just resume the browser
+ if (ACTION_RESTART.equals(intent.getAction())) {
+ Bundle outState = new Bundle();
+ mController.onSaveInstanceState(outState);
+ finish();
+ getApplicationContext().startActivity(
+ new Intent(getApplicationContext(), BrowserActivity.class)
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ .putExtra(EXTRA_STATE, outState));
return;
}
- // In case the SearchDialog is open.
- ((SearchManager) getSystemService(Context.SEARCH_SERVICE))
- .stopSearch();
- boolean activateVoiceSearch = RecognizerResultsIntent
- .ACTION_VOICE_SEARCH_RESULTS.equals(action);
- if (Intent.ACTION_VIEW.equals(action)
- || Intent.ACTION_SEARCH.equals(action)
- || MediaStore.INTENT_ACTION_MEDIA_SEARCH.equals(action)
- || Intent.ACTION_WEB_SEARCH.equals(action)
- || activateVoiceSearch) {
- if (current.isInVoiceSearchMode()) {
- String title = current.getVoiceDisplayTitle();
- if (title != null && title.equals(intent.getStringExtra(
- SearchManager.QUERY))) {
- // The user submitted the same search as the last voice
- // search, so do nothing.
- return;
- }
- if (Intent.ACTION_SEARCH.equals(action)
- && current.voiceSearchSourceIsGoogle()) {
- Intent logIntent = new Intent(
- LoggingEvents.ACTION_LOG_EVENT);
- logIntent.putExtra(LoggingEvents.EXTRA_EVENT,
- LoggingEvents.VoiceSearch.QUERY_UPDATED);
- logIntent.putExtra(
- LoggingEvents.VoiceSearch.EXTRA_QUERY_UPDATED_VALUE,
- intent.getDataString());
- sendBroadcast(logIntent);
- // Note, onPageStarted will revert the voice title bar
- // When http://b/issue?id=2379215 is fixed, we should update
- // the title bar here.
- }
- }
- // If this was a search request (e.g. search query directly typed into the address bar),
- // pass it on to the default web search provider.
- if (handleWebSearchIntent(intent)) {
- return;
- }
-
- UrlData urlData = getUrlDataFromIntent(intent);
- if (urlData.isEmpty()) {
- urlData = new UrlData(mSettings.getHomePage());
- }
-
- final String appId = intent
- .getStringExtra(Browser.EXTRA_APPLICATION_ID);
- if ((Intent.ACTION_VIEW.equals(action)
- // If a voice search has no appId, it means that it came
- // from the browser. In that case, reuse the current tab.
- || (activateVoiceSearch && appId != null))
- && !getPackageName().equals(appId)
- && (flags & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {
- Tab appTab = mTabControl.getTabFromId(appId);
- if (appTab != null) {
- Log.i(LOGTAG, "Reusing tab for " + appId);
- // Dismiss the subwindow if applicable.
- dismissSubWindow(appTab);
- // Since we might kill the WebView, remove it from the
- // content view first.
- removeTabFromContentView(appTab);
- // Recreate the main WebView after destroying the old one.
- // If the WebView has the same original url and is on that
- // page, it can be reused.
- boolean needsLoad =
- mTabControl.recreateWebView(appTab, urlData);
-
- if (current != appTab) {
- switchToTab(mTabControl.getTabIndex(appTab));
- if (needsLoad) {
- loadUrlDataIn(appTab, urlData);
- }
- } else {
- // If the tab was the current tab, we have to attach
- // it to the view system again.
- attachTabToContentView(appTab);
- if (needsLoad) {
- loadUrlDataIn(appTab, urlData);
- }
- }
- return;
- } else {
- // No matching application tab, try to find a regular tab
- // with a matching url.
- appTab = mTabControl.findUnusedTabWithUrl(urlData.mUrl);
- if (appTab != null) {
- if (current != appTab) {
- switchToTab(mTabControl.getTabIndex(appTab));
- }
- // Otherwise, we are already viewing the correct tab.
- } else {
- // if FLAG_ACTIVITY_BROUGHT_TO_FRONT flag is on, the url
- // will be opened in a new tab unless we have reached
- // MAX_TABS. Then the url will be opened in the current
- // tab. If a new tab is created, it will have "true" for
- // exit on close.
- openTabAndShow(urlData, true, appId);
- }
- }
- } else {
- if (!urlData.isEmpty()
- && urlData.mUrl.startsWith("about:debug")) {
- if ("about:debug.dom".equals(urlData.mUrl)) {
- current.getWebView().dumpDomTree(false);
- } else if ("about:debug.dom.file".equals(urlData.mUrl)) {
- current.getWebView().dumpDomTree(true);
- } else if ("about:debug.render".equals(urlData.mUrl)) {
- current.getWebView().dumpRenderTree(false);
- } else if ("about:debug.render.file".equals(urlData.mUrl)) {
- current.getWebView().dumpRenderTree(true);
- } else if ("about:debug.display".equals(urlData.mUrl)) {
- current.getWebView().dumpDisplayTree();
- } else if (urlData.mUrl.startsWith("about:debug.drag")) {
- int index = urlData.mUrl.codePointAt(16) - '0';
- if (index <= 0 || index > 9) {
- current.getWebView().setDragTracker(null);
- } else {
- current.getWebView().setDragTracker(new MeshTracker(index));
- }
- } else {
- mSettings.toggleDebugSettings();
- }
- return;
- }
- // Get rid of the subwindow if it exists
- dismissSubWindow(current);
- // If the current Tab is being used as an application tab,
- // remove the association, since the new Intent means that it is
- // no longer associated with that application.
- current.setAppId(null);
- loadUrlDataIn(current, urlData);
- }
- }
- }
-
- /**
- * Launches the default web search activity with the query parameters if the given intent's data
- * are identified as plain search terms and not URLs/shortcuts.
- * @return true if the intent was handled and web search activity was launched, false if not.
- */
- private boolean handleWebSearchIntent(Intent intent) {
- if (intent == null) return false;
-
- String url = null;
- final String action = intent.getAction();
- if (RecognizerResultsIntent.ACTION_VOICE_SEARCH_RESULTS.equals(
- action)) {
- return false;
- }
- if (Intent.ACTION_VIEW.equals(action)) {
- Uri data = intent.getData();
- if (data != null) url = data.toString();
- } else if (Intent.ACTION_SEARCH.equals(action)
- || MediaStore.INTENT_ACTION_MEDIA_SEARCH.equals(action)
- || Intent.ACTION_WEB_SEARCH.equals(action)) {
- url = intent.getStringExtra(SearchManager.QUERY);
- }
- return handleWebSearchRequest(url, intent.getBundleExtra(SearchManager.APP_DATA),
- intent.getStringExtra(SearchManager.EXTRA_DATA_KEY));
- }
-
- /**
- * Launches the default web search activity with the query parameters if the given url string
- * was identified as plain search terms and not URL/shortcut.
- * @return true if the request was handled and web search activity was launched, false if not.
- */
- private boolean handleWebSearchRequest(String inUrl, Bundle appData, String extraData) {
- if (inUrl == null) return false;
-
- // In general, we shouldn't modify URL from Intent.
- // But currently, we get the user-typed URL from search box as well.
- String url = fixUrl(inUrl).trim();
-
- // URLs are handled by the regular flow of control, so
- // return early.
- if (Patterns.WEB_URL.matcher(url).matches()
- || ACCEPTED_URI_SCHEMA.matcher(url).matches()) {
- return false;
- }
-
- final ContentResolver cr = mResolver;
- final String newUrl = url;
- new AsyncTask<Void, Void, Void>() {
- protected Void doInBackground(Void... unused) {
- Browser.updateVisitedHistory(cr, newUrl, false);
- Browser.addSearchUrl(cr, newUrl);
- return null;
- }
- }.execute();
-
- SearchEngine searchEngine = mSettings.getSearchEngine();
- if (searchEngine == null) return false;
- searchEngine.startSearch(this, url, appData, extraData);
-
- return true;
- }
-
- private UrlData getUrlDataFromIntent(Intent intent) {
- String url = "";
- Map<String, String> headers = null;
- if (intent != null) {
- final String action = intent.getAction();
- if (Intent.ACTION_VIEW.equals(action)) {
- url = smartUrlFilter(intent.getData());
- if (url != null && url.startsWith("content:")) {
- /* Append mimetype so webview knows how to display */
- String mimeType = intent.resolveType(getContentResolver());
- if (mimeType != null) {
- url += "?" + mimeType;
- }
- }
- if (url != null && url.startsWith("http")) {
- final Bundle pairs = intent
- .getBundleExtra(Browser.EXTRA_HEADERS);
- if (pairs != null && !pairs.isEmpty()) {
- Iterator<String> iter = pairs.keySet().iterator();
- headers = new HashMap<String, String>();
- while (iter.hasNext()) {
- String key = iter.next();
- headers.put(key, pairs.getString(key));
- }
- }
- }
- } else if (Intent.ACTION_SEARCH.equals(action)
- || MediaStore.INTENT_ACTION_MEDIA_SEARCH.equals(action)
- || Intent.ACTION_WEB_SEARCH.equals(action)) {
- url = intent.getStringExtra(SearchManager.QUERY);
- if (url != null) {
- mLastEnteredUrl = url;
- // In general, we shouldn't modify URL from Intent.
- // But currently, we get the user-typed URL from search box as well.
- url = fixUrl(url);
- url = smartUrlFilter(url);
- final ContentResolver cr = mResolver;
- final String newUrl = url;
- new AsyncTask<Void, Void, Void>() {
- protected Void doInBackground(Void... unused) {
- Browser.updateVisitedHistory(cr, newUrl, false);
- return null;
- }
- }.execute();
- String searchSource = "&source=android-" + GOOGLE_SEARCH_SOURCE_SUGGEST + "&";
- if (url.contains(searchSource)) {
- String source = null;
- final Bundle appData = intent.getBundleExtra(SearchManager.APP_DATA);
- if (appData != null) {
- source = appData.getString(Search.SOURCE);
- }
- if (TextUtils.isEmpty(source)) {
- source = GOOGLE_SEARCH_SOURCE_UNKNOWN;
- }
- url = url.replace(searchSource, "&source=android-"+source+"&");
- }
- }
- }
- }
- return new UrlData(url, headers, intent);
- }
- /* package */ void showVoiceTitleBar(String title) {
- mTitleBar.setInVoiceMode(true);
- mFakeTitleBar.setInVoiceMode(true);
-
- mTitleBar.setDisplayTitle(title);
- mFakeTitleBar.setDisplayTitle(title);
- }
- /* package */ void revertVoiceTitleBar() {
- mTitleBar.setInVoiceMode(false);
- mFakeTitleBar.setInVoiceMode(false);
-
- mTitleBar.setDisplayTitle(mUrl);
- mFakeTitleBar.setDisplayTitle(mUrl);
- }
- /* package */ static String fixUrl(String inUrl) {
- // FIXME: Converting the url to lower case
- // duplicates functionality in smartUrlFilter().
- // However, changing all current callers of fixUrl to
- // call smartUrlFilter in addition may have unwanted
- // consequences, and is deferred for now.
- int colon = inUrl.indexOf(':');
- boolean allLower = true;
- for (int index = 0; index < colon; index++) {
- char ch = inUrl.charAt(index);
- if (!Character.isLetter(ch)) {
- break;
- }
- allLower &= Character.isLowerCase(ch);
- if (index == colon - 1 && !allLower) {
- inUrl = inUrl.substring(0, colon).toLowerCase()
- + inUrl.substring(colon);
- }
- }
- if (inUrl.startsWith("http://") || inUrl.startsWith("https://"))
- return inUrl;
- if (inUrl.startsWith("http:") ||
- inUrl.startsWith("https:")) {
- if (inUrl.startsWith("http:/") || inUrl.startsWith("https:/")) {
- inUrl = inUrl.replaceFirst("/", "//");
- } else inUrl = inUrl.replaceFirst(":", "://");
- }
- return inUrl;
+ mController.handleNewIntent(intent);
}
@Override
@@ -726,170 +130,28 @@
if (LOGV_ENABLED) {
Log.v(LOGTAG, "BrowserActivity.onResume: this=" + this);
}
-
- if (!mActivityInPause) {
- Log.e(LOGTAG, "BrowserActivity is already resumed.");
- return;
+ if (mController != null) {
+ mController.onResume();
}
-
- mTabControl.resumeCurrentTab();
- mActivityInPause = false;
- resumeWebViewTimers();
-
- if (mWakeLock.isHeld()) {
- mHandler.removeMessages(RELEASE_WAKELOCK);
- mWakeLock.release();
- }
-
- registerReceiver(mNetworkStateIntentReceiver,
- mNetworkStateChangedFilter);
- WebView.enablePlatformNotifications();
}
- /**
- * Since the actual title bar is embedded in the WebView, and removing it
- * would change its appearance, use a different TitleBar to show overlayed
- * at the top of the screen, when the menu is open or the page is loading.
- */
- private TitleBar mFakeTitleBar;
-
- /**
- * Keeps track of whether the options menu is open. This is important in
- * determining whether to show or hide the title bar overlay.
- */
- private boolean mOptionsMenuOpen;
-
- /**
- * Only meaningful when mOptionsMenuOpen is true. This variable keeps track
- * of whether the configuration has changed. The first onMenuOpened call
- * after a configuration change is simply a reopening of the same menu
- * (i.e. mIconView did not change).
- */
- private boolean mConfigChanged;
-
- /**
- * Whether or not the options menu is in its smaller, icon menu form. When
- * true, we want the title bar overlay to be up. When false, we do not.
- * Only meaningful if mOptionsMenuOpen is true.
- */
- private boolean mIconView;
-
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
if (Window.FEATURE_OPTIONS_PANEL == featureId) {
- if (mOptionsMenuOpen) {
- if (mConfigChanged) {
- // We do not need to make any changes to the state of the
- // title bar, since the only thing that happened was a
- // change in orientation
- mConfigChanged = false;
- } else {
- if (mIconView) {
- // Switching the menu to expanded view, so hide the
- // title bar.
- hideFakeTitleBar();
- mIconView = false;
- } else {
- // Switching the menu back to icon view, so show the
- // title bar once again.
- showFakeTitleBar();
- mIconView = true;
- }
- }
- } else {
- // The options menu is closed, so open it, and show the title
- showFakeTitleBar();
- mOptionsMenuOpen = true;
- mConfigChanged = false;
- mIconView = true;
- }
+ mController.onMenuOpened(featureId, menu);
}
return true;
}
- private void showFakeTitleBar() {
- if (mFakeTitleBar.getParent() == null && mActiveTabsPage == null
- && !mActivityInPause) {
- WebView mainView = mTabControl.getCurrentWebView();
- // if there is no current WebView, don't show the faked title bar;
- if (mainView == null) {
- return;
- }
- // Do not need to check for null, since the current tab will have
- // at least a main WebView, or we would have returned above.
- if (dialogIsUp()) {
- // Do not show the fake title bar, which would cover up the
- // find or select dialog.
- return;
- }
-
- WindowManager manager
- = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
-
- // Add the title bar to the window manager so it can receive touches
- // while the menu is up
- WindowManager.LayoutParams params
- = new WindowManager.LayoutParams(
- ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.WRAP_CONTENT,
- WindowManager.LayoutParams.TYPE_APPLICATION,
- WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
- PixelFormat.TRANSLUCENT);
- params.gravity = Gravity.TOP;
- boolean atTop = mainView.getScrollY() == 0;
- params.windowAnimations = atTop ? 0 : R.style.TitleBar;
- manager.addView(mFakeTitleBar, params);
- }
- }
-
@Override
public void onOptionsMenuClosed(Menu menu) {
- mOptionsMenuOpen = false;
- if (!mInLoad) {
- hideFakeTitleBar();
- } else if (!mIconView) {
- // The page is currently loading, and we are in expanded mode, so
- // we were not showing the menu. Show it once again. It will be
- // removed when the page finishes.
- showFakeTitleBar();
- }
- }
-
- private void hideFakeTitleBar() {
- if (mFakeTitleBar.getParent() == null) return;
- WindowManager.LayoutParams params = (WindowManager.LayoutParams)
- mFakeTitleBar.getLayoutParams();
- WebView mainView = mTabControl.getCurrentWebView();
- // Although we decided whether or not to animate based on the current
- // scroll position, the scroll position may have changed since the
- // fake title bar was displayed. Make sure it has the appropriate
- // animation/lack thereof before removing.
- params.windowAnimations = mainView != null && mainView.getScrollY() == 0
- ? 0 : R.style.TitleBar;
- WindowManager manager
- = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
- manager.updateViewLayout(mFakeTitleBar, params);
- manager.removeView(mFakeTitleBar);
- }
-
- /**
- * Special method for the fake title bar to call when displaying its context
- * menu, since it is in its own Window, and its parent does not show a
- * context menu.
- */
- /* package */ void showTitleBarContextMenu() {
- if (null == mTitleBar.getParent()) {
- return;
- }
- openContextMenu(mTitleBar);
+ mController.onOptionsMenuClosed(menu);
}
@Override
public void onContextMenuClosed(Menu menu) {
super.onContextMenuClosed(menu);
- if (mInLoad) {
- showFakeTitleBar();
- }
+ mController.onContextMenuClosed(menu);
}
/**
@@ -902,50 +164,15 @@
if (LOGV_ENABLED) {
Log.v(LOGTAG, "BrowserActivity.onSaveInstanceState: this=" + this);
}
- // the default implementation requires each view to have an id. As the
- // browser handles the state itself and it doesn't use id for the views,
- // don't call the default implementation. Otherwise it will trigger the
- // warning like this, "couldn't save which view has focus because the
- // focused view XXX has no id".
-
- // Save all the tabs
- mTabControl.saveState(outState);
+ mController.onSaveInstanceState(outState);
}
@Override
protected void onPause() {
+ if (mController != null) {
+ mController.onPause();
+ }
super.onPause();
-
- if (mActivityInPause) {
- Log.e(LOGTAG, "BrowserActivity is already paused.");
- return;
- }
-
- mTabControl.pauseCurrentTab();
- mActivityInPause = true;
- if (mTabControl.getCurrentIndex() >= 0 && !pauseWebViewTimers()) {
- mWakeLock.acquire();
- mHandler.sendMessageDelayed(mHandler
- .obtainMessage(RELEASE_WAKELOCK), WAKELOCK_TIMEOUT);
- }
-
- // FIXME: This removes the active tabs page and resets the menu to
- // MAIN_MENU. A better solution might be to do this work in onNewIntent
- // but then we would need to save it in onSaveInstanceState and restore
- // it in onCreate/onRestoreInstanceState
- if (mActiveTabsPage != null) {
- removeActiveTabPage(true);
- }
-
- cancelStopToast();
-
- // unregister network state listener
- unregisterReceiver(mNetworkStateIntentReceiver);
- WebView.disablePlatformNotifications();
-
- if (mCustomView != null) {
- mTabControl.getCurrentWebView().getWebChromeClient().onHideCustomView();
- }
}
@Override
@@ -954,3069 +181,85 @@
Log.v(LOGTAG, "BrowserActivity.onDestroy: this=" + this);
}
super.onDestroy();
-
- if (mUploadMessage != null) {
- mUploadMessage.onReceiveValue(null);
- mUploadMessage = null;
+ if (mController != null) {
+ mController.onDestroy();
}
-
- if (mTabControl == null) return;
-
- // Remove the fake title bar if it is there
- hideFakeTitleBar();
-
- // Remove the current tab and sub window
- Tab t = mTabControl.getCurrentTab();
- if (t != null) {
- dismissSubWindow(t);
- removeTabFromContentView(t);
- }
- // Destroy all the tabs
- mTabControl.destroy();
- WebIconDatabase.getInstance().close();
-
- unregisterReceiver(mPackageInstallationReceiver);
-
- // Stop watching the default geolocation permissions
- mSystemAllowGeolocationOrigins.stop();
- mSystemAllowGeolocationOrigins = null;
+ mUi = null;
+ mController = null;
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
- mConfigChanged = true;
super.onConfigurationChanged(newConfig);
-
- if (mPageInfoDialog != null) {
- mPageInfoDialog.dismiss();
- showPageInfo(
- mPageInfoView,
- mPageInfoFromShowSSLCertificateOnError);
- }
- if (mSSLCertificateDialog != null) {
- mSSLCertificateDialog.dismiss();
- showSSLCertificate(
- mSSLCertificateView);
- }
- if (mSSLCertificateOnErrorDialog != null) {
- mSSLCertificateOnErrorDialog.dismiss();
- showSSLCertificateOnError(
- mSSLCertificateOnErrorView,
- mSSLCertificateOnErrorHandler,
- mSSLCertificateOnErrorError);
- }
- if (mHttpAuthenticationDialog != null) {
- String title = ((TextView) mHttpAuthenticationDialog
- .findViewById(com.android.internal.R.id.alertTitle)).getText()
- .toString();
- String name = ((TextView) mHttpAuthenticationDialog
- .findViewById(R.id.username_edit)).getText().toString();
- String password = ((TextView) mHttpAuthenticationDialog
- .findViewById(R.id.password_edit)).getText().toString();
- int focusId = mHttpAuthenticationDialog.getCurrentFocus()
- .getId();
- mHttpAuthenticationDialog.dismiss();
- showHttpAuthentication(mHttpAuthHandler, null, null, title,
- name, password, focusId);
- }
+ mController.onConfgurationChanged(newConfig);
}
@Override
public void onLowMemory() {
super.onLowMemory();
- mTabControl.freeMemory();
- }
-
- private void resumeWebViewTimers() {
- Tab tab = mTabControl.getCurrentTab();
- if (tab == null) return; // monkey can trigger this
- boolean inLoad = tab.inLoad();
- if ((!mActivityInPause && !inLoad) || (mActivityInPause && inLoad)) {
- CookieSyncManager.getInstance().startSync();
- WebView w = tab.getWebView();
- if (w != null) {
- w.resumeTimers();
- }
- }
- }
-
- private boolean pauseWebViewTimers() {
- Tab tab = mTabControl.getCurrentTab();
- boolean inLoad = tab.inLoad();
- if (mActivityInPause && !inLoad) {
- CookieSyncManager.getInstance().stopSync();
- WebView w = mTabControl.getCurrentWebView();
- if (w != null) {
- w.pauseTimers();
- }
- return true;
- } else {
- return false;
- }
- }
-
- // Open the icon database and retain all the icons for visited sites.
- private void retainIconsOnStartup() {
- final WebIconDatabase db = WebIconDatabase.getInstance();
- db.open(getDir("icons", 0).getPath());
- Cursor c = null;
- try {
- c = Browser.getAllBookmarks(mResolver);
- if (c.moveToFirst()) {
- int urlIndex = c.getColumnIndex(Browser.BookmarkColumns.URL);
- do {
- String url = c.getString(urlIndex);
- db.retainIconForPageUrl(url);
- } while (c.moveToNext());
- }
- } catch (IllegalStateException e) {
- Log.e(LOGTAG, "retainIconsOnStartup", e);
- } finally {
- if (c!= null) c.close();
- }
- }
-
- // Helper method for getting the top window.
- WebView getTopWindow() {
- return mTabControl.getCurrentTopWebView();
- }
-
- TabControl getTabControl() {
- return mTabControl;
+ mController.onLowMemory();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
-
- MenuInflater inflater = getMenuInflater();
- inflater.inflate(R.menu.browser, menu);
- mMenu = menu;
- updateInLoadMenuItems();
- return true;
- }
-
- /**
- * As the menu can be open when loading state changes
- * we must manually update the state of the stop/reload menu
- * item
- */
- private void updateInLoadMenuItems() {
- if (mMenu == null) {
- return;
- }
- MenuItem src = mInLoad ?
- mMenu.findItem(R.id.stop_menu_id):
- mMenu.findItem(R.id.reload_menu_id);
- MenuItem dest = mMenu.findItem(R.id.stop_reload_menu_id);
- dest.setIcon(src.getIcon());
- dest.setTitle(src.getTitle());
- }
-
- @Override
- public boolean onContextItemSelected(MenuItem item) {
- // chording is not an issue with context menus, but we use the same
- // options selector, so set mCanChord to true so we can access them.
- mCanChord = true;
- int id = item.getItemId();
- boolean result = true;
- switch (id) {
- // For the context menu from the title bar
- case R.id.title_bar_copy_page_url:
- Tab currentTab = mTabControl.getCurrentTab();
- if (null == currentTab) {
- result = false;
- break;
- }
- WebView mainView = currentTab.getWebView();
- if (null == mainView) {
- result = false;
- break;
- }
- copy(mainView.getUrl());
- break;
- // -- Browser context menu
- case R.id.open_context_menu_id:
- case R.id.open_newtab_context_menu_id:
- case R.id.bookmark_context_menu_id:
- case R.id.save_link_context_menu_id:
- case R.id.share_link_context_menu_id:
- case R.id.copy_link_context_menu_id:
- final WebView webView = getTopWindow();
- if (null == webView) {
- result = false;
- break;
- }
- final HashMap hrefMap = new HashMap();
- hrefMap.put("webview", webView);
- final Message msg = mHandler.obtainMessage(
- FOCUS_NODE_HREF, id, 0, hrefMap);
- webView.requestFocusNodeHref(msg);
- break;
-
- default:
- // For other context menus
- result = onOptionsItemSelected(item);
- }
- mCanChord = false;
- return result;
- }
-
- private Bundle createGoogleSearchSourceBundle(String source) {
- Bundle bundle = new Bundle();
- bundle.putString(Search.SOURCE, source);
- return bundle;
- }
-
- /* package */ void editUrl() {
- if (mOptionsMenuOpen) closeOptionsMenu();
- String url = (getTopWindow() == null) ? null : getTopWindow().getUrl();
- startSearch(mSettings.getHomePage().equals(url) ? null : url, true,
- null, false);
- }
-
- /**
- * Overriding this to insert a local information bundle
- */
- @Override
- public void startSearch(String initialQuery, boolean selectInitialQuery,
- Bundle appSearchData, boolean globalSearch) {
- if (appSearchData == null) {
- appSearchData = createGoogleSearchSourceBundle(GOOGLE_SEARCH_SOURCE_TYPE);
- }
-
- SearchEngine searchEngine = mSettings.getSearchEngine();
- if (searchEngine != null && !searchEngine.supportsVoiceSearch()) {
- appSearchData.putBoolean(SearchManager.DISABLE_VOICE_SEARCH, true);
- }
-
- super.startSearch(initialQuery, selectInitialQuery, appSearchData, globalSearch);
- }
-
- /**
- * Switch tabs. Called by the TitleBarSet when sliding the title bar
- * results in changing tabs.
- * @param index Index of the tab to change to, as defined by
- * mTabControl.getTabIndex(Tab t).
- * @return boolean True if we successfully switched to a different tab. If
- * the indexth tab is null, or if that tab is the same as
- * the current one, return false.
- */
- /* package */ boolean switchToTab(int index) {
- Tab tab = mTabControl.getTab(index);
- Tab currentTab = mTabControl.getCurrentTab();
- if (tab == null || tab == currentTab) {
- return false;
- }
- if (currentTab != null) {
- // currentTab may be null if it was just removed. In that case,
- // we do not need to remove it
- removeTabFromContentView(currentTab);
- }
- mTabControl.setCurrentTab(tab);
- attachTabToContentView(tab);
- resetTitleIconAndProgress();
- updateLockIconToLatest();
- return true;
- }
-
- /* package */ Tab openTabToHomePage() {
- return openTabAndShow(mSettings.getHomePage(), false, null);
- }
-
- /* package */ void closeCurrentWindow() {
- final Tab current = mTabControl.getCurrentTab();
- if (mTabControl.getTabCount() == 1) {
- // This is the last tab. Open a new one, with the home
- // page and close the current one.
- openTabToHomePage();
- closeTab(current);
- return;
- }
- final Tab parent = current.getParentTab();
- int indexToShow = -1;
- if (parent != null) {
- indexToShow = mTabControl.getTabIndex(parent);
- } else {
- final int currentIndex = mTabControl.getCurrentIndex();
- // Try to move to the tab to the right
- indexToShow = currentIndex + 1;
- if (indexToShow > mTabControl.getTabCount() - 1) {
- // Try to move to the tab to the left
- indexToShow = currentIndex - 1;
- }
- }
- if (switchToTab(indexToShow)) {
- // Close window
- closeTab(current);
- }
- }
-
- private ActiveTabsPage mActiveTabsPage;
-
- /**
- * Remove the active tabs page.
- * @param needToAttach If true, the active tabs page did not attach a tab
- * to the content view, so we need to do that here.
- */
- /* package */ void removeActiveTabPage(boolean needToAttach) {
- mContentView.removeView(mActiveTabsPage);
- mActiveTabsPage = null;
- mMenuState = R.id.MAIN_MENU;
- if (needToAttach) {
- attachTabToContentView(mTabControl.getCurrentTab());
- }
- getTopWindow().requestFocus();
- }
-
- private WebView showDialog(WebDialog dialog) {
- Tab tab = mTabControl.getCurrentTab();
- if (tab.getSubWebView() == null) {
- // If the find or select is being performed on the main webview,
- // remove the embedded title bar.
- WebView mainView = tab.getWebView();
- if (mainView != null) {
- mainView.setEmbeddedTitleBar(null);
- }
- }
- hideFakeTitleBar();
- mMenuState = EMPTY_MENU;
- return tab.showDialog(dialog);
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- if (!mCanChord) {
- // The user has already fired a shortcut with this hold down of the
- // menu key.
- return false;
- }
- if (null == getTopWindow()) {
- return false;
- }
- if (mMenuIsDown) {
- // The shortcut action consumes the MENU. Even if it is still down,
- // it won't trigger the next shortcut action. In the case of the
- // shortcut action triggering a new activity, like Bookmarks, we
- // won't get onKeyUp for MENU. So it is important to reset it here.
- mMenuIsDown = false;
- }
- switch (item.getItemId()) {
- // -- Main menu
- case R.id.new_tab_menu_id:
- openTabToHomePage();
- break;
-
- case R.id.goto_menu_id:
- editUrl();
- break;
-
- case R.id.bookmarks_menu_id:
- bookmarksOrHistoryPicker(false);
- break;
-
- case R.id.active_tabs_menu_id:
- mActiveTabsPage = new ActiveTabsPage(this, mTabControl);
- removeTabFromContentView(mTabControl.getCurrentTab());
- hideFakeTitleBar();
- mContentView.addView(mActiveTabsPage, COVER_SCREEN_PARAMS);
- mActiveTabsPage.requestFocus();
- mMenuState = EMPTY_MENU;
- break;
-
- case R.id.add_bookmark_menu_id:
- Intent i = new Intent(BrowserActivity.this,
- AddBookmarkPage.class);
- WebView w = getTopWindow();
- i.putExtra("url", w.getUrl());
- i.putExtra("title", w.getTitle());
- i.putExtra("touch_icon_url", w.getTouchIconUrl());
- i.putExtra("thumbnail", createScreenshot(w));
- startActivity(i);
- break;
-
- case R.id.stop_reload_menu_id:
- if (mInLoad) {
- stopLoading();
- } else {
- getTopWindow().reload();
- }
- break;
-
- case R.id.back_menu_id:
- getTopWindow().goBack();
- break;
-
- case R.id.forward_menu_id:
- getTopWindow().goForward();
- break;
-
- case R.id.close_menu_id:
- // Close the subwindow if it exists.
- if (mTabControl.getCurrentSubWindow() != null) {
- dismissSubWindow(mTabControl.getCurrentTab());
- break;
- }
- closeCurrentWindow();
- break;
-
- case R.id.homepage_menu_id:
- Tab current = mTabControl.getCurrentTab();
- if (current != null) {
- dismissSubWindow(current);
- loadUrl(current.getWebView(), mSettings.getHomePage());
- }
- break;
-
- case R.id.preferences_menu_id:
- Intent intent = new Intent(this,
- BrowserPreferencesPage.class);
- intent.putExtra(BrowserPreferencesPage.CURRENT_PAGE,
- getTopWindow().getUrl());
- startActivityForResult(intent, PREFERENCES_PAGE);
- break;
-
- case R.id.find_menu_id:
- showFindDialog();
- break;
-
- case R.id.select_text_id:
- if (true) {
- Tab currentTab = mTabControl.getCurrentTab();
- if (currentTab != null) {
- currentTab.getWebView().setUpSelect();
- }
- } else {
- showSelectDialog();
- }
- break;
-
- case R.id.page_info_menu_id:
- showPageInfo(mTabControl.getCurrentTab(), false);
- break;
-
- case R.id.classic_history_menu_id:
- bookmarksOrHistoryPicker(true);
- break;
-
- case R.id.title_bar_share_page_url:
- case R.id.share_page_menu_id:
- Tab currentTab = mTabControl.getCurrentTab();
- if (null == currentTab) {
- mCanChord = false;
- return false;
- }
- currentTab.populatePickerData();
- sharePage(this, currentTab.getTitle(),
- currentTab.getUrl(), currentTab.getFavicon(),
- createScreenshot(currentTab.getWebView()));
- break;
-
- case R.id.dump_nav_menu_id:
- getTopWindow().debugDump();
- break;
-
- case R.id.dump_counters_menu_id:
- getTopWindow().dumpV8Counters();
- break;
-
- case R.id.zoom_in_menu_id:
- getTopWindow().zoomIn();
- break;
-
- case R.id.zoom_out_menu_id:
- getTopWindow().zoomOut();
- break;
-
- case R.id.view_downloads_menu_id:
- viewDownloads();
- break;
-
- case R.id.window_one_menu_id:
- case R.id.window_two_menu_id:
- case R.id.window_three_menu_id:
- case R.id.window_four_menu_id:
- case R.id.window_five_menu_id:
- case R.id.window_six_menu_id:
- case R.id.window_seven_menu_id:
- case R.id.window_eight_menu_id:
- {
- int menuid = item.getItemId();
- for (int id = 0; id < WINDOW_SHORTCUT_ID_ARRAY.length; id++) {
- if (WINDOW_SHORTCUT_ID_ARRAY[id] == menuid) {
- Tab desiredTab = mTabControl.getTab(id);
- if (desiredTab != null &&
- desiredTab != mTabControl.getCurrentTab()) {
- switchToTab(id);
- }
- break;
- }
- }
- }
- break;
-
- default:
- if (!super.onOptionsItemSelected(item)) {
- return false;
- }
- // Otherwise fall through.
- }
- mCanChord = false;
- return true;
- }
-
- private boolean dialogIsUp() {
- return null != mFindDialog && mFindDialog.isVisible() ||
- null != mSelectDialog && mSelectDialog.isVisible();
- }
-
- private boolean closeDialog(WebDialog dialog) {
- if (null == dialog || !dialog.isVisible()) return false;
- Tab currentTab = mTabControl.getCurrentTab();
- currentTab.closeDialog(dialog);
- dialog.dismiss();
- return true;
- }
-
- /*
- * Remove the find dialog or select dialog.
- */
- public void closeDialogs() {
- if (!(closeDialog(mFindDialog) || closeDialog(mSelectDialog))) return;
- // If the Find was being performed in the main WebView, replace the
- // embedded title bar.
- Tab currentTab = mTabControl.getCurrentTab();
- if (currentTab.getSubWebView() == null) {
- WebView mainView = currentTab.getWebView();
- if (mainView != null) {
- mainView.setEmbeddedTitleBar(mTitleBar);
- }
- }
- mMenuState = R.id.MAIN_MENU;
- if (mInLoad) {
- // The title bar was hidden, because otherwise it would cover up the
- // find or select dialog. Now that the dialog has been removed,
- // show the fake title bar once again.
- showFakeTitleBar();
- }
- }
-
- public void showFindDialog() {
- if (null == mFindDialog) {
- mFindDialog = new FindDialog(this);
- }
- showDialog(mFindDialog).setFindIsUp(true);
- }
-
- public void setFindDialogText(String text) {
- mFindDialog.setText(text);
- }
-
- public void showSelectDialog() {
- if (null == mSelectDialog) {
- mSelectDialog = new SelectDialog(this);
- }
- showDialog(mSelectDialog).setUpSelect();
- mSelectDialog.hideSoftInput();
+ return mController.onCreateOptionsMenu(menu);
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
- // This happens when the user begins to hold down the menu key, so
- // allow them to chord to get a shortcut.
- mCanChord = true;
- // Note: setVisible will decide whether an item is visible; while
- // setEnabled() will decide whether an item is enabled, which also means
- // whether the matching shortcut key will function.
super.onPrepareOptionsMenu(menu);
- switch (mMenuState) {
- case EMPTY_MENU:
- if (mCurrentMenuState != mMenuState) {
- menu.setGroupVisible(R.id.MAIN_MENU, false);
- menu.setGroupEnabled(R.id.MAIN_MENU, false);
- menu.setGroupEnabled(R.id.MAIN_SHORTCUT_MENU, false);
- }
- break;
- default:
- if (mCurrentMenuState != mMenuState) {
- menu.setGroupVisible(R.id.MAIN_MENU, true);
- menu.setGroupEnabled(R.id.MAIN_MENU, true);
- menu.setGroupEnabled(R.id.MAIN_SHORTCUT_MENU, true);
- }
- final WebView w = getTopWindow();
- boolean canGoBack = false;
- boolean canGoForward = false;
- boolean isHome = false;
- if (w != null) {
- canGoBack = w.canGoBack();
- canGoForward = w.canGoForward();
- isHome = mSettings.getHomePage().equals(w.getUrl());
- }
- final MenuItem back = menu.findItem(R.id.back_menu_id);
- back.setEnabled(canGoBack);
+ return mController.prepareOptionsMenu(menu);
+ }
- final MenuItem home = menu.findItem(R.id.homepage_menu_id);
- home.setEnabled(!isHome);
-
- menu.findItem(R.id.forward_menu_id)
- .setEnabled(canGoForward);
-
- menu.findItem(R.id.new_tab_menu_id).setEnabled(
- mTabControl.canCreateNewTab());
-
- // decide whether to show the share link option
- PackageManager pm = getPackageManager();
- Intent send = new Intent(Intent.ACTION_SEND);
- send.setType("text/plain");
- ResolveInfo ri = pm.resolveActivity(send, PackageManager.MATCH_DEFAULT_ONLY);
- menu.findItem(R.id.share_page_menu_id).setVisible(ri != null);
-
- boolean isNavDump = mSettings.isNavDump();
- final MenuItem nav = menu.findItem(R.id.dump_nav_menu_id);
- nav.setVisible(isNavDump);
- nav.setEnabled(isNavDump);
-
- boolean showDebugSettings = mSettings.showDebugSettings();
- final MenuItem counter = menu.findItem(R.id.dump_counters_menu_id);
- counter.setVisible(showDebugSettings);
- counter.setEnabled(showDebugSettings);
-
- break;
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ if (!mController.onOptionsItemSelected(item)) {
+ return super.onOptionsItemSelected(item);
}
- mCurrentMenuState = mMenuState;
return true;
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
- if (v instanceof TitleBar) {
- return;
- }
- WebView webview = (WebView) v;
- WebView.HitTestResult result = webview.getHitTestResult();
- if (result == null) {
- return;
- }
-
- int type = result.getType();
- if (type == WebView.HitTestResult.UNKNOWN_TYPE) {
- Log.w(LOGTAG,
- "We should not show context menu when nothing is touched");
- return;
- }
- if (type == WebView.HitTestResult.EDIT_TEXT_TYPE) {
- // let TextView handles context menu
- return;
- }
-
- // Note, http://b/issue?id=1106666 is requesting that
- // an inflated menu can be used again. This is not available
- // yet, so inflate each time (yuk!)
- MenuInflater inflater = getMenuInflater();
- inflater.inflate(R.menu.browsercontext, menu);
-
- // Show the correct menu group
- String extra = result.getExtra();
- menu.setGroupVisible(R.id.PHONE_MENU,
- type == WebView.HitTestResult.PHONE_TYPE);
- menu.setGroupVisible(R.id.EMAIL_MENU,
- type == WebView.HitTestResult.EMAIL_TYPE);
- menu.setGroupVisible(R.id.GEO_MENU,
- type == WebView.HitTestResult.GEO_TYPE);
- menu.setGroupVisible(R.id.IMAGE_MENU,
- type == WebView.HitTestResult.IMAGE_TYPE
- || type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE);
- menu.setGroupVisible(R.id.ANCHOR_MENU,
- type == WebView.HitTestResult.SRC_ANCHOR_TYPE
- || type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE);
-
- // Setup custom handling depending on the type
- switch (type) {
- case WebView.HitTestResult.PHONE_TYPE:
- menu.setHeaderTitle(Uri.decode(extra));
- menu.findItem(R.id.dial_context_menu_id).setIntent(
- new Intent(Intent.ACTION_VIEW, Uri
- .parse(WebView.SCHEME_TEL + extra)));
- Intent addIntent = new Intent(Intent.ACTION_INSERT_OR_EDIT);
- addIntent.putExtra(Insert.PHONE, Uri.decode(extra));
- addIntent.setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE);
- menu.findItem(R.id.add_contact_context_menu_id).setIntent(
- addIntent);
- menu.findItem(R.id.copy_phone_context_menu_id).setOnMenuItemClickListener(
- new Copy(extra));
- break;
-
- case WebView.HitTestResult.EMAIL_TYPE:
- menu.setHeaderTitle(extra);
- menu.findItem(R.id.email_context_menu_id).setIntent(
- new Intent(Intent.ACTION_VIEW, Uri
- .parse(WebView.SCHEME_MAILTO + extra)));
- menu.findItem(R.id.copy_mail_context_menu_id).setOnMenuItemClickListener(
- new Copy(extra));
- break;
-
- case WebView.HitTestResult.GEO_TYPE:
- menu.setHeaderTitle(extra);
- menu.findItem(R.id.map_context_menu_id).setIntent(
- new Intent(Intent.ACTION_VIEW, Uri
- .parse(WebView.SCHEME_GEO
- + URLEncoder.encode(extra))));
- menu.findItem(R.id.copy_geo_context_menu_id).setOnMenuItemClickListener(
- new Copy(extra));
- break;
-
- case WebView.HitTestResult.SRC_ANCHOR_TYPE:
- case WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE:
- TextView titleView = (TextView) LayoutInflater.from(this)
- .inflate(android.R.layout.browser_link_context_header,
- null);
- titleView.setText(extra);
- menu.setHeaderView(titleView);
- // decide whether to show the open link in new tab option
- menu.findItem(R.id.open_newtab_context_menu_id).setVisible(
- mTabControl.canCreateNewTab());
- menu.findItem(R.id.bookmark_context_menu_id).setVisible(
- Bookmarks.urlHasAcceptableScheme(extra));
- PackageManager pm = getPackageManager();
- Intent send = new Intent(Intent.ACTION_SEND);
- send.setType("text/plain");
- ResolveInfo ri = pm.resolveActivity(send, PackageManager.MATCH_DEFAULT_ONLY);
- menu.findItem(R.id.share_link_context_menu_id).setVisible(ri != null);
- if (type == WebView.HitTestResult.SRC_ANCHOR_TYPE) {
- break;
- }
- // otherwise fall through to handle image part
- case WebView.HitTestResult.IMAGE_TYPE:
- if (type == WebView.HitTestResult.IMAGE_TYPE) {
- menu.setHeaderTitle(extra);
- }
- menu.findItem(R.id.view_image_context_menu_id).setIntent(
- new Intent(Intent.ACTION_VIEW, Uri.parse(extra)));
- menu.findItem(R.id.download_context_menu_id).
- setOnMenuItemClickListener(new Download(extra));
- menu.findItem(R.id.set_wallpaper_context_menu_id).
- setOnMenuItemClickListener(new SetAsWallpaper(extra));
- break;
-
- default:
- Log.w(LOGTAG, "We should not get here.");
- break;
- }
- hideFakeTitleBar();
+ mController.onCreateContextMenu(menu, v, menuInfo);
}
- // Attach the given tab to the content view.
- // this should only be called for the current tab.
- private void attachTabToContentView(Tab t) {
- // Attach the container that contains the main WebView and any other UI
- // associated with the tab.
- t.attachTabToContentView(mContentView);
-
- if (mShouldShowErrorConsole) {
- ErrorConsoleView errorConsole = t.getErrorConsole(true);
- if (errorConsole.numberOfErrors() == 0) {
- errorConsole.showConsole(ErrorConsoleView.SHOW_NONE);
- } else {
- errorConsole.showConsole(ErrorConsoleView.SHOW_MINIMIZED);
- }
-
- mErrorConsoleContainer.addView(errorConsole,
- new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.WRAP_CONTENT));
- }
-
- WebView view = t.getWebView();
- view.setEmbeddedTitleBar(mTitleBar);
- if (t.isInVoiceSearchMode()) {
- showVoiceTitleBar(t.getVoiceDisplayTitle());
- } else {
- revertVoiceTitleBar();
- }
- // Request focus on the top window.
- t.getTopWindow().requestFocus();
- }
-
- // Attach a sub window to the main WebView of the given tab.
- void attachSubWindow(Tab t) {
- t.attachSubWindow(mContentView);
- getTopWindow().requestFocus();
- }
-
- // Remove the given tab from the content view.
- private void removeTabFromContentView(Tab t) {
- // Remove the container that contains the main WebView.
- t.removeTabFromContentView(mContentView);
-
- ErrorConsoleView errorConsole = t.getErrorConsole(false);
- if (errorConsole != null) {
- mErrorConsoleContainer.removeView(errorConsole);
- }
-
- WebView view = t.getWebView();
- if (view != null) {
- view.setEmbeddedTitleBar(null);
- }
- }
-
- // Remove the sub window if it exists. Also called by TabControl when the
- // user clicks the 'X' to dismiss a sub window.
- /* package */ void dismissSubWindow(Tab t) {
- t.removeSubWindow(mContentView);
- // dismiss the subwindow. This will destroy the WebView.
- t.dismissSubWindow();
- getTopWindow().requestFocus();
- }
-
- // A wrapper function of {@link #openTabAndShow(UrlData, boolean, String)}
- // that accepts url as string.
- private Tab openTabAndShow(String url, boolean closeOnExit, String appId) {
- return openTabAndShow(new UrlData(url), closeOnExit, appId);
- }
-
- // This method does a ton of stuff. It will attempt to create a new tab
- // if we haven't reached MAX_TABS. Otherwise it uses the current tab. If
- // url isn't null, it will load the given url.
- /* package */Tab openTabAndShow(UrlData urlData, boolean closeOnExit,
- String appId) {
- final Tab currentTab = mTabControl.getCurrentTab();
- if (mTabControl.canCreateNewTab()) {
- final Tab tab = mTabControl.createNewTab(closeOnExit, appId,
- urlData.mUrl);
- WebView webview = tab.getWebView();
- // If the last tab was removed from the active tabs page, currentTab
- // will be null.
- if (currentTab != null) {
- removeTabFromContentView(currentTab);
- }
- // We must set the new tab as the current tab to reflect the old
- // animation behavior.
- mTabControl.setCurrentTab(tab);
- attachTabToContentView(tab);
- if (!urlData.isEmpty()) {
- loadUrlDataIn(tab, urlData);
- }
- return tab;
- } else {
- // Get rid of the subwindow if it exists
- dismissSubWindow(currentTab);
- if (!urlData.isEmpty()) {
- // Load the given url.
- loadUrlDataIn(currentTab, urlData);
- }
- return currentTab;
- }
- }
-
- private Tab openTab(String url) {
- if (mSettings.openInBackground()) {
- Tab t = mTabControl.createNewTab();
- if (t != null) {
- WebView view = t.getWebView();
- loadUrl(view, url);
- }
- return t;
- } else {
- return openTabAndShow(url, false, null);
- }
- }
-
- private class Copy implements OnMenuItemClickListener {
- private CharSequence mText;
-
- public boolean onMenuItemClick(MenuItem item) {
- copy(mText);
- return true;
- }
-
- public Copy(CharSequence toCopy) {
- mText = toCopy;
- }
- }
-
- private class Download implements OnMenuItemClickListener {
- private String mText;
-
- public boolean onMenuItemClick(MenuItem item) {
- onDownloadStartNoStream(mText, null, null, null, -1);
- return true;
- }
-
- public Download(String toDownload) {
- mText = toDownload;
- }
- }
-
- private class SetAsWallpaper extends Thread implements
- OnMenuItemClickListener, DialogInterface.OnCancelListener {
- private URL mUrl;
- private ProgressDialog mWallpaperProgress;
- private boolean mCanceled = false;
-
- public SetAsWallpaper(String url) {
- try {
- mUrl = new URL(url);
- } catch (MalformedURLException e) {
- mUrl = null;
- }
- }
-
- public void onCancel(DialogInterface dialog) {
- mCanceled = true;
- }
-
- public boolean onMenuItemClick(MenuItem item) {
- if (mUrl != null) {
- // The user may have tried to set a image with a large file size as their
- // background so it may take a few moments to perform the operation. Display
- // a progress spinner while it is working.
- mWallpaperProgress = new ProgressDialog(BrowserActivity.this);
- mWallpaperProgress.setIndeterminate(true);
- mWallpaperProgress.setMessage(getText(R.string.progress_dialog_setting_wallpaper));
- mWallpaperProgress.setCancelable(true);
- mWallpaperProgress.setOnCancelListener(this);
- mWallpaperProgress.show();
- start();
- }
- return true;
- }
-
- public void run() {
- Drawable oldWallpaper = BrowserActivity.this.getWallpaper();
- try {
- // TODO: This will cause the resource to be downloaded again, when we
- // should in most cases be able to grab it from the cache. To fix this
- // we should query WebCore to see if we can access a cached version and
- // instead open an input stream on that. This pattern could also be used
- // in the download manager where the same problem exists.
- InputStream inputstream = mUrl.openStream();
- if (inputstream != null) {
- setWallpaper(inputstream);
- }
- } catch (IOException e) {
- Log.e(LOGTAG, "Unable to set new wallpaper");
- // Act as though the user canceled the operation so we try to
- // restore the old wallpaper.
- mCanceled = true;
- }
-
- if (mCanceled) {
- // Restore the old wallpaper if the user cancelled whilst we were setting
- // the new wallpaper.
- int width = oldWallpaper.getIntrinsicWidth();
- int height = oldWallpaper.getIntrinsicHeight();
- Bitmap bm = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
- Canvas canvas = new Canvas(bm);
- oldWallpaper.setBounds(0, 0, width, height);
- oldWallpaper.draw(canvas);
- try {
- setWallpaper(bm);
- } catch (IOException e) {
- Log.e(LOGTAG, "Unable to restore old wallpaper.");
- }
- mCanceled = false;
- }
-
- if (mWallpaperProgress.isShowing()) {
- mWallpaperProgress.dismiss();
- }
- }
- }
-
- private void copy(CharSequence text) {
- try {
- IClipboard clip = IClipboard.Stub.asInterface(ServiceManager.getService("clipboard"));
- if (clip != null) {
- clip.setClipboardText(text);
- }
- } catch (android.os.RemoteException e) {
- Log.e(LOGTAG, "Copy failed", e);
- }
- }
-
- /**
- * Resets the browser title-view to whatever it must be
- * (for example, if we had a loading error)
- * When we have a new page, we call resetTitle, when we
- * have to reset the titlebar to whatever it used to be
- * (for example, if the user chose to stop loading), we
- * call resetTitleAndRevertLockIcon.
- */
- /* package */ void resetTitleAndRevertLockIcon() {
- mTabControl.getCurrentTab().revertLockIcon();
- updateLockIconToLatest();
- resetTitleIconAndProgress();
- }
-
- /**
- * Reset the title, favicon, and progress.
- */
- private void resetTitleIconAndProgress() {
- WebView current = mTabControl.getCurrentWebView();
- if (current == null) {
- return;
- }
- resetTitleAndIcon(current);
- int progress = current.getProgress();
- current.getWebChromeClient().onProgressChanged(current, progress);
- }
-
- // Reset the title and the icon based on the given item.
- private void resetTitleAndIcon(WebView view) {
- WebHistoryItem item = view.copyBackForwardList().getCurrentItem();
- if (item != null) {
- setUrlTitle(item.getUrl(), item.getTitle());
- setFavicon(item.getFavicon());
- } else {
- setUrlTitle(null, null);
- setFavicon(null);
- }
- }
-
- /**
- * Sets a title composed of the URL and the title string.
- * @param url The URL of the site being loaded.
- * @param title The title of the site being loaded.
- */
- void setUrlTitle(String url, String title) {
- mUrl = url;
- mTitle = title;
-
- // If we are in voice search mode, the title has already been set.
- if (mTabControl.getCurrentTab().isInVoiceSearchMode()) return;
- mTitleBar.setDisplayTitle(url);
- mFakeTitleBar.setDisplayTitle(url);
- }
-
- /**
- * @param url The URL to build a title version of the URL from.
- * @return The title version of the URL or null if fails.
- * The title version of the URL can be either the URL hostname,
- * or the hostname with an "https://" prefix (for secure URLs),
- * or an empty string if, for example, the URL in question is a
- * file:// URL with no hostname.
- */
- /* package */ static String buildTitleUrl(String url) {
- String titleUrl = null;
-
- if (url != null) {
- try {
- // parse the url string
- URL urlObj = new URL(url);
- if (urlObj != null) {
- titleUrl = "";
-
- String protocol = urlObj.getProtocol();
- String host = urlObj.getHost();
-
- if (host != null && 0 < host.length()) {
- titleUrl = host;
- if (protocol != null) {
- // if a secure site, add an "https://" prefix!
- if (protocol.equalsIgnoreCase("https")) {
- titleUrl = protocol + "://" + host;
- }
- }
- }
- }
- } catch (MalformedURLException e) {}
- }
-
- return titleUrl;
- }
-
- // Set the favicon in the title bar.
- void setFavicon(Bitmap icon) {
- mTitleBar.setFavicon(icon);
- mFakeTitleBar.setFavicon(icon);
- }
-
- /**
- * Close the tab, remove its associated title bar, and adjust mTabControl's
- * current tab to a valid value.
- */
- /* package */ void closeTab(Tab t) {
- int currentIndex = mTabControl.getCurrentIndex();
- int removeIndex = mTabControl.getTabIndex(t);
- mTabControl.removeTab(t);
- if (currentIndex >= removeIndex && currentIndex != 0) {
- currentIndex--;
- }
- mTabControl.setCurrentTab(mTabControl.getTab(currentIndex));
- resetTitleIconAndProgress();
- }
-
- /* package */ void goBackOnePageOrQuit() {
- Tab current = mTabControl.getCurrentTab();
- if (current == null) {
- /*
- * Instead of finishing the activity, simply push this to the back
- * of the stack and let ActivityManager to choose the foreground
- * activity. As BrowserActivity is singleTask, it will be always the
- * root of the task. So we can use either true or false for
- * moveTaskToBack().
- */
- moveTaskToBack(true);
- return;
- }
- WebView w = current.getWebView();
- if (w.canGoBack()) {
- w.goBack();
- } else {
- // Check to see if we are closing a window that was created by
- // another window. If so, we switch back to that window.
- Tab parent = current.getParentTab();
- if (parent != null) {
- switchToTab(mTabControl.getTabIndex(parent));
- // Now we close the other tab
- closeTab(current);
- } else {
- if (current.closeOnExit()) {
- // force the tab's inLoad() to be false as we are going to
- // either finish the activity or remove the tab. This will
- // ensure pauseWebViewTimers() taking action.
- mTabControl.getCurrentTab().clearInLoad();
- if (mTabControl.getTabCount() == 1) {
- finish();
- return;
- }
- // call pauseWebViewTimers() now, we won't be able to call
- // it in onPause() as the WebView won't be valid.
- // Temporarily change mActivityInPause to be true as
- // pauseWebViewTimers() will do nothing if mActivityInPause
- // is false.
- boolean savedState = mActivityInPause;
- if (savedState) {
- Log.e(LOGTAG, "BrowserActivity is already paused "
- + "while handing goBackOnePageOrQuit.");
- }
- mActivityInPause = true;
- pauseWebViewTimers();
- mActivityInPause = savedState;
- removeTabFromContentView(current);
- mTabControl.removeTab(current);
- }
- /*
- * Instead of finishing the activity, simply push this to the back
- * of the stack and let ActivityManager to choose the foreground
- * activity. As BrowserActivity is singleTask, it will be always the
- * root of the task. So we can use either true or false for
- * moveTaskToBack().
- */
- moveTaskToBack(true);
- }
- }
- }
-
- boolean isMenuDown() {
- return mMenuIsDown;
+ @Override
+ public boolean onContextItemSelected(MenuItem item) {
+ return mController.onContextItemSelected(item);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
- // Even if MENU is already held down, we need to call to super to open
- // the IME on long press.
- if (KeyEvent.KEYCODE_MENU == keyCode) {
- mMenuIsDown = true;
- return super.onKeyDown(keyCode, event);
- }
- // The default key mode is DEFAULT_KEYS_SEARCH_LOCAL. As the MENU is
- // still down, we don't want to trigger the search. Pretend to consume
- // the key and do nothing.
- if (mMenuIsDown) return true;
-
- switch(keyCode) {
- case KeyEvent.KEYCODE_SPACE:
- // WebView/WebTextView handle the keys in the KeyDown. As
- // the Activity's shortcut keys are only handled when WebView
- // doesn't, have to do it in onKeyDown instead of onKeyUp.
- if (event.isShiftPressed()) {
- getTopWindow().pageUp(false);
- } else {
- getTopWindow().pageDown(false);
- }
- return true;
- case KeyEvent.KEYCODE_BACK:
- if (event.getRepeatCount() == 0) {
- event.startTracking();
- return true;
- } else if (mCustomView == null && mActiveTabsPage == null
- && event.isLongPress()) {
- bookmarksOrHistoryPicker(true);
- return true;
- }
- break;
- }
- return super.onKeyDown(keyCode, event);
+ return mController.onKeyDown(keyCode, event) ||
+ super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
- switch(keyCode) {
- case KeyEvent.KEYCODE_MENU:
- mMenuIsDown = false;
- break;
- case KeyEvent.KEYCODE_BACK:
- if (event.isTracking() && !event.isCanceled()) {
- if (mCustomView != null) {
- // if a custom view is showing, hide it
- mTabControl.getCurrentWebView().getWebChromeClient()
- .onHideCustomView();
- } else if (mActiveTabsPage != null) {
- // if tab page is showing, hide it
- removeActiveTabPage(true);
- } else {
- WebView subwindow = mTabControl.getCurrentSubWindow();
- if (subwindow != null) {
- if (subwindow.canGoBack()) {
- subwindow.goBack();
- } else {
- dismissSubWindow(mTabControl.getCurrentTab());
- }
- } else {
- goBackOnePageOrQuit();
- }
- }
- return true;
- }
- break;
- }
- return super.onKeyUp(keyCode, event);
+ return mController.onKeyUp(keyCode, event) ||
+ super.onKeyUp(keyCode, event);
}
- /* package */ void stopLoading() {
- mDidStopLoad = true;
- resetTitleAndRevertLockIcon();
- WebView w = getTopWindow();
- w.stopLoading();
- // FIXME: before refactor, it is using mWebViewClient. So I keep the
- // same logic here. But for subwindow case, should we call into the main
- // WebView's onPageFinished as we never call its onPageStarted and if
- // the page finishes itself, we don't call onPageFinished.
- mTabControl.getCurrentWebView().getWebViewClient().onPageFinished(w,
- w.getUrl());
-
- cancelStopToast();
- mStopToast = Toast
- .makeText(this, R.string.stopping, Toast.LENGTH_SHORT);
- mStopToast.show();
+ @Override
+ public void onActionModeStarted(ActionMode mode) {
+ super.onActionModeStarted(mode);
+ mController.onActionModeStarted(mode);
}
- boolean didUserStopLoading() {
- return mDidStopLoad;
- }
-
- private void cancelStopToast() {
- if (mStopToast != null) {
- mStopToast.cancel();
- mStopToast = null;
- }
- }
-
- // called by a UI or non-UI thread to post the message
- public void postMessage(int what, int arg1, int arg2, Object obj,
- long delayMillis) {
- mHandler.sendMessageDelayed(mHandler.obtainMessage(what, arg1, arg2,
- obj), delayMillis);
- }
-
- // called by a UI or non-UI thread to remove the message
- void removeMessages(int what, Object object) {
- mHandler.removeMessages(what, object);
- }
-
- // public message ids
- public final static int LOAD_URL = 1001;
- public final static int STOP_LOAD = 1002;
-
- // Message Ids
- private static final int FOCUS_NODE_HREF = 102;
- private static final int RELEASE_WAKELOCK = 107;
-
- static final int UPDATE_BOOKMARK_THUMBNAIL = 108;
-
- // Private handler for handling javascript and saving passwords
- private Handler mHandler = new Handler() {
-
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case FOCUS_NODE_HREF:
- {
- String url = (String) msg.getData().get("url");
- String title = (String) msg.getData().get("title");
- if (url == null || url.length() == 0) {
- break;
- }
- HashMap focusNodeMap = (HashMap) msg.obj;
- WebView view = (WebView) focusNodeMap.get("webview");
- // Only apply the action if the top window did not change.
- if (getTopWindow() != view) {
- break;
- }
- switch (msg.arg1) {
- case R.id.open_context_menu_id:
- case R.id.view_image_context_menu_id:
- loadUrlFromContext(getTopWindow(), url);
- break;
- case R.id.open_newtab_context_menu_id:
- final Tab parent = mTabControl.getCurrentTab();
- final Tab newTab = openTab(url);
- if (newTab != parent) {
- parent.addChildTab(newTab);
- }
- break;
- case R.id.bookmark_context_menu_id:
- Intent intent = new Intent(BrowserActivity.this,
- AddBookmarkPage.class);
- intent.putExtra("url", url);
- intent.putExtra("title", title);
- startActivity(intent);
- break;
- case R.id.share_link_context_menu_id:
- // See if this site has been visited before
- StringBuilder sb = new StringBuilder(
- Browser.BookmarkColumns.URL + " = ");
- DatabaseUtils.appendEscapedSQLString(sb, url);
- Cursor c = null;
- try {
- c = mResolver.query(Browser.BOOKMARKS_URI,
- Browser.HISTORY_PROJECTION,
- sb.toString(),
- null,
- null);
- if (c.moveToFirst()) {
- // The site has been visited before, so grab the
- // info from the database.
- Bitmap favicon = null;
- Bitmap thumbnail = null;
- String linkTitle = c.getString(Browser.
- HISTORY_PROJECTION_TITLE_INDEX);
- byte[] data = c.getBlob(Browser.
- HISTORY_PROJECTION_FAVICON_INDEX);
- if (data != null) {
- favicon = BitmapFactory.decodeByteArray(
- data, 0, data.length);
- }
- data = c.getBlob(Browser.
- HISTORY_PROJECTION_THUMBNAIL_INDEX);
- if (data != null) {
- thumbnail = BitmapFactory.decodeByteArray(
- data, 0, data.length);
- }
- sharePage(BrowserActivity.this,
- linkTitle, url, favicon, thumbnail);
- } else {
- Browser.sendString(BrowserActivity.this, url,
- getString(
- R.string.choosertitle_sharevia));
- }
- } finally {
- if (c != null) c.close();
- }
- // close the cursor after its used
- if (c != null) {
- c.close();
- }
- break;
- case R.id.copy_link_context_menu_id:
- copy(url);
- break;
- case R.id.save_link_context_menu_id:
- case R.id.download_context_menu_id:
- onDownloadStartNoStream(url, null, null, null, -1);
- break;
- }
- break;
- }
-
- case LOAD_URL:
- loadUrlFromContext(getTopWindow(), (String) msg.obj);
- break;
-
- case STOP_LOAD:
- stopLoading();
- break;
-
- case RELEASE_WAKELOCK:
- if (mWakeLock.isHeld()) {
- mWakeLock.release();
- // if we reach here, Browser should be still in the
- // background loading after WAKELOCK_TIMEOUT (5-min).
- // To avoid burning the battery, stop loading.
- mTabControl.stopAllLoading();
- }
- break;
-
- case UPDATE_BOOKMARK_THUMBNAIL:
- WebView view = (WebView) msg.obj;
- if (view != null) {
- updateScreenshot(view);
- }
- break;
- }
- }
- };
-
- /**
- * Share a page, providing the title, url, favicon, and a screenshot. Uses
- * an {@link Intent} to launch the Activity chooser.
- * @param c Context used to launch a new Activity.
- * @param title Title of the page. Stored in the Intent with
- * {@link Intent#EXTRA_SUBJECT}
- * @param url URL of the page. Stored in the Intent with
- * {@link Intent#EXTRA_TEXT}
- * @param favicon Bitmap of the favicon for the page. Stored in the Intent
- * with {@link Browser#EXTRA_SHARE_FAVICON}
- * @param screenshot Bitmap of a screenshot of the page. Stored in the
- * Intent with {@link Browser#EXTRA_SHARE_SCREENSHOT}
- */
- public static final void sharePage(Context c, String title, String url,
- Bitmap favicon, Bitmap screenshot) {
- Intent send = new Intent(Intent.ACTION_SEND);
- send.setType("text/plain");
- send.putExtra(Intent.EXTRA_TEXT, url);
- send.putExtra(Intent.EXTRA_SUBJECT, title);
- send.putExtra(Browser.EXTRA_SHARE_FAVICON, favicon);
- send.putExtra(Browser.EXTRA_SHARE_SCREENSHOT, screenshot);
- try {
- c.startActivity(Intent.createChooser(send, c.getString(
- R.string.choosertitle_sharevia)));
- } catch(android.content.ActivityNotFoundException ex) {
- // if no app handles it, do nothing
- }
- }
-
- private void updateScreenshot(WebView view) {
- // If this is a bookmarked site, add a screenshot to the database.
- // FIXME: When should we update? Every time?
- // FIXME: Would like to make sure there is actually something to
- // draw, but the API for that (WebViewCore.pictureReady()) is not
- // currently accessible here.
-
- final Bitmap bm = createScreenshot(view);
- if (bm == null) {
- return;
- }
-
- final ContentResolver cr = getContentResolver();
- final String url = view.getUrl();
- final String originalUrl = view.getOriginalUrl();
-
- new AsyncTask<Void, Void, Void>() {
- @Override
- protected Void doInBackground(Void... unused) {
- Cursor c = null;
- try {
- c = BrowserBookmarksAdapter.queryBookmarksForUrl(
- cr, originalUrl, url, true);
- if (c != null) {
- if (c.moveToFirst()) {
- ContentValues values = new ContentValues();
- final ByteArrayOutputStream os
- = new ByteArrayOutputStream();
- bm.compress(Bitmap.CompressFormat.PNG, 100, os);
- values.put(Browser.BookmarkColumns.THUMBNAIL,
- os.toByteArray());
- do {
- cr.update(ContentUris.withAppendedId(
- Browser.BOOKMARKS_URI, c.getInt(0)),
- values, null, null);
- } while (c.moveToNext());
- }
- }
- } catch (IllegalStateException e) {
- // Ignore
- } finally {
- if (c != null) c.close();
- }
- return null;
- }
- }.execute();
- }
-
- /**
- * Values for the size of the thumbnail created when taking a screenshot.
- * Lazily initialized. Instead of using these directly, use
- * getDesiredThumbnailWidth() or getDesiredThumbnailHeight().
- */
- private static int THUMBNAIL_WIDTH = 0;
- private static int THUMBNAIL_HEIGHT = 0;
-
- /**
- * Return the desired width for thumbnail screenshots, which are stored in
- * the database, and used on the bookmarks screen.
- * @param context Context for finding out the density of the screen.
- * @return int desired width for thumbnail screenshot.
- */
- /* package */ static int getDesiredThumbnailWidth(Context context) {
- if (THUMBNAIL_WIDTH == 0) {
- float density = context.getResources().getDisplayMetrics().density;
- THUMBNAIL_WIDTH = (int) (90 * density);
- THUMBNAIL_HEIGHT = (int) (80 * density);
- }
- return THUMBNAIL_WIDTH;
- }
-
- /**
- * Return the desired height for thumbnail screenshots, which are stored in
- * the database, and used on the bookmarks screen.
- * @param context Context for finding out the density of the screen.
- * @return int desired height for thumbnail screenshot.
- */
- /* package */ static int getDesiredThumbnailHeight(Context context) {
- // To ensure that they are both initialized.
- getDesiredThumbnailWidth(context);
- return THUMBNAIL_HEIGHT;
- }
-
- private Bitmap createScreenshot(WebView view) {
- Picture thumbnail = view.capturePicture();
- if (thumbnail == null) {
- return null;
- }
- Bitmap bm = Bitmap.createBitmap(getDesiredThumbnailWidth(this),
- getDesiredThumbnailHeight(this), Bitmap.Config.RGB_565);
- Canvas canvas = new Canvas(bm);
- // May need to tweak these values to determine what is the
- // best scale factor
- int thumbnailWidth = thumbnail.getWidth();
- int thumbnailHeight = thumbnail.getHeight();
- float scaleFactorX = 1.0f;
- float scaleFactorY = 1.0f;
- if (thumbnailWidth > 0) {
- scaleFactorX = (float) getDesiredThumbnailWidth(this) /
- (float)thumbnailWidth;
- } else {
- return null;
- }
-
- if (view.getWidth() > view.getHeight() &&
- thumbnailHeight < view.getHeight() && thumbnailHeight > 0) {
- // If the device is in landscape and the page is shorter
- // than the height of the view, stretch the thumbnail to fill the
- // space.
- scaleFactorY = (float) getDesiredThumbnailHeight(this) /
- (float)thumbnailHeight;
- } else {
- // In the portrait case, this looks nice.
- scaleFactorY = scaleFactorX;
- }
-
- canvas.scale(scaleFactorX, scaleFactorY);
-
- thumbnail.draw(canvas);
- return bm;
- }
-
- // -------------------------------------------------------------------------
- // Helper function for WebViewClient.
- //-------------------------------------------------------------------------
-
- // Use in overrideUrlLoading
- /* package */ final static String SCHEME_WTAI = "wtai://wp/";
- /* package */ final static String SCHEME_WTAI_MC = "wtai://wp/mc;";
- /* package */ final static String SCHEME_WTAI_SD = "wtai://wp/sd;";
- /* package */ final static String SCHEME_WTAI_AP = "wtai://wp/ap;";
-
- // Keep this initial progress in sync with initialProgressValue (* 100)
- // in ProgressTracker.cpp
- private final static int INITIAL_PROGRESS = 10;
-
- void onPageStarted(WebView view, String url, Bitmap favicon) {
- // when BrowserActivity just starts, onPageStarted may be called before
- // onResume as it is triggered from onCreate. Call resumeWebViewTimers
- // to start the timer. As we won't switch tabs while an activity is in
- // pause state, we can ensure calling resume and pause in pair.
- if (mActivityInPause) resumeWebViewTimers();
-
- resetLockIcon(url);
- setUrlTitle(url, null);
- setFavicon(favicon);
- // Show some progress so that the user knows the page is beginning to
- // load
- onProgressChanged(view, INITIAL_PROGRESS);
- mDidStopLoad = false;
- if (!mIsNetworkUp) createAndShowNetworkDialog();
- closeDialogs();
- if (mSettings.isTracing()) {
- String host;
- try {
- WebAddress uri = new WebAddress(url);
- host = uri.mHost;
- } catch (android.net.ParseException ex) {
- host = "browser";
- }
- host = host.replace('.', '_');
- host += ".trace";
- mInTrace = true;
- Debug.startMethodTracing(host, 20 * 1024 * 1024);
- }
-
- // Performance probe
- if (false) {
- mStart = SystemClock.uptimeMillis();
- mProcessStart = Process.getElapsedCpuTime();
- long[] sysCpu = new long[7];
- if (Process.readProcFile("/proc/stat", SYSTEM_CPU_FORMAT, null,
- sysCpu, null)) {
- mUserStart = sysCpu[0] + sysCpu[1];
- mSystemStart = sysCpu[2];
- mIdleStart = sysCpu[3];
- mIrqStart = sysCpu[4] + sysCpu[5] + sysCpu[6];
- }
- mUiStart = SystemClock.currentThreadTimeMillis();
- }
- }
-
- void onPageFinished(WebView view, String url) {
- // Reset the title and icon in case we stopped a provisional load.
- resetTitleAndIcon(view);
- // Update the lock icon image only once we are done loading
- updateLockIconToLatest();
- // pause the WebView timer and release the wake lock if it is finished
- // while BrowserActivity is in pause state.
- if (mActivityInPause && pauseWebViewTimers()) {
- if (mWakeLock.isHeld()) {
- mHandler.removeMessages(RELEASE_WAKELOCK);
- mWakeLock.release();
- }
- }
-
- // Performance probe
- if (false) {
- long[] sysCpu = new long[7];
- if (Process.readProcFile("/proc/stat", SYSTEM_CPU_FORMAT, null,
- sysCpu, null)) {
- String uiInfo = "UI thread used "
- + (SystemClock.currentThreadTimeMillis() - mUiStart)
- + " ms";
- if (LOGD_ENABLED) {
- Log.d(LOGTAG, uiInfo);
- }
- //The string that gets written to the log
- String performanceString = "It took total "
- + (SystemClock.uptimeMillis() - mStart)
- + " ms clock time to load the page."
- + "\nbrowser process used "
- + (Process.getElapsedCpuTime() - mProcessStart)
- + " ms, user processes used "
- + (sysCpu[0] + sysCpu[1] - mUserStart) * 10
- + " ms, kernel used "
- + (sysCpu[2] - mSystemStart) * 10
- + " ms, idle took " + (sysCpu[3] - mIdleStart) * 10
- + " ms and irq took "
- + (sysCpu[4] + sysCpu[5] + sysCpu[6] - mIrqStart)
- * 10 + " ms, " + uiInfo;
- if (LOGD_ENABLED) {
- Log.d(LOGTAG, performanceString + "\nWebpage: " + url);
- }
- if (url != null) {
- // strip the url to maintain consistency
- String newUrl = new String(url);
- if (newUrl.startsWith("http://www.")) {
- newUrl = newUrl.substring(11);
- } else if (newUrl.startsWith("http://")) {
- newUrl = newUrl.substring(7);
- } else if (newUrl.startsWith("https://www.")) {
- newUrl = newUrl.substring(12);
- } else if (newUrl.startsWith("https://")) {
- newUrl = newUrl.substring(8);
- }
- if (LOGD_ENABLED) {
- Log.d(LOGTAG, newUrl + " loaded");
- }
- }
- }
- }
-
- if (mInTrace) {
- mInTrace = false;
- Debug.stopMethodTracing();
- }
- }
-
- boolean shouldOverrideUrlLoading(WebView view, String url) {
- if (url.startsWith(SCHEME_WTAI)) {
- // wtai://wp/mc;number
- // number=string(phone-number)
- if (url.startsWith(SCHEME_WTAI_MC)) {
- Intent intent = new Intent(Intent.ACTION_VIEW,
- Uri.parse(WebView.SCHEME_TEL +
- url.substring(SCHEME_WTAI_MC.length())));
- startActivity(intent);
- return true;
- }
- // wtai://wp/sd;dtmf
- // dtmf=string(dialstring)
- if (url.startsWith(SCHEME_WTAI_SD)) {
- // TODO: only send when there is active voice connection
- return false;
- }
- // wtai://wp/ap;number;name
- // number=string(phone-number)
- // name=string
- if (url.startsWith(SCHEME_WTAI_AP)) {
- // TODO
- return false;
- }
- }
-
- // The "about:" schemes are internal to the browser; don't want these to
- // be dispatched to other apps.
- if (url.startsWith("about:")) {
- return false;
- }
-
- Intent intent;
- // perform generic parsing of the URI to turn it into an Intent.
- try {
- intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
- } catch (URISyntaxException ex) {
- Log.w("Browser", "Bad URI " + url + ": " + ex.getMessage());
- return false;
- }
-
- // check whether the intent can be resolved. If not, we will see
- // whether we can download it from the Market.
- if (getPackageManager().resolveActivity(intent, 0) == null) {
- String packagename = intent.getPackage();
- if (packagename != null) {
- intent = new Intent(Intent.ACTION_VIEW, Uri
- .parse("market://search?q=pname:" + packagename));
- intent.addCategory(Intent.CATEGORY_BROWSABLE);
- startActivity(intent);
- return true;
- } else {
- return false;
- }
- }
-
- // sanitize the Intent, ensuring web pages can not bypass browser
- // security (only access to BROWSABLE activities).
- intent.addCategory(Intent.CATEGORY_BROWSABLE);
- intent.setComponent(null);
- try {
- if (startActivityIfNeeded(intent, -1)) {
- return true;
- }
- } catch (ActivityNotFoundException ex) {
- // ignore the error. If no application can handle the URL,
- // eg about:blank, assume the browser can handle it.
- }
-
- if (mMenuIsDown) {
- openTab(url);
- closeOptionsMenu();
- return true;
- }
- return false;
- }
-
- // -------------------------------------------------------------------------
- // Helper function for WebChromeClient
- // -------------------------------------------------------------------------
-
- void onProgressChanged(WebView view, int newProgress) {
- mFakeTitleBar.setProgress(newProgress);
-
- if (newProgress == 100) {
- // onProgressChanged() may continue to be called after the main
- // frame has finished loading, as any remaining sub frames continue
- // to load. We'll only get called once though with newProgress as
- // 100 when everything is loaded. (onPageFinished is called once
- // when the main frame completes loading regardless of the state of
- // any sub frames so calls to onProgressChanges may continue after
- // onPageFinished has executed)
- if (mInLoad) {
- mInLoad = false;
- updateInLoadMenuItems();
- // If the options menu is open, leave the title bar
- if (!mOptionsMenuOpen || !mIconView) {
- hideFakeTitleBar();
- }
- }
- } else {
- if (!mInLoad) {
- // onPageFinished may have already been called but a subframe is
- // still loading and updating the progress. Reset mInLoad and
- // update the menu items.
- mInLoad = true;
- updateInLoadMenuItems();
- }
- // When the page first begins to load, the Activity may still be
- // paused, in which case showFakeTitleBar will do nothing. Call
- // again as the page continues to load so that it will be shown.
- // (Calling it will the fake title bar is already showing will also
- // do nothing.
- if (!mOptionsMenuOpen || mIconView) {
- // This page has begun to load, so show the title bar
- showFakeTitleBar();
- }
- }
- }
-
- void onShowCustomView(View view, WebChromeClient.CustomViewCallback callback) {
- // if a view already exists then immediately terminate the new one
- if (mCustomView != null) {
- callback.onCustomViewHidden();
- return;
- }
-
- // Add the custom view to its container.
- mCustomViewContainer.addView(view, COVER_SCREEN_GRAVITY_CENTER);
- mCustomView = view;
- mCustomViewCallback = callback;
- // Save the menu state and set it to empty while the custom
- // view is showing.
- mOldMenuState = mMenuState;
- mMenuState = EMPTY_MENU;
- // Hide the content view.
- mContentView.setVisibility(View.GONE);
- // Finally show the custom view container.
- setStatusBarVisibility(false);
- mCustomViewContainer.setVisibility(View.VISIBLE);
- mCustomViewContainer.bringToFront();
- }
-
- void onHideCustomView() {
- if (mCustomView == null)
- return;
- // Hide the custom view.
- mCustomView.setVisibility(View.GONE);
- // Remove the custom view from its container.
- mCustomViewContainer.removeView(mCustomView);
- mCustomView = null;
- // Reset the old menu state.
- mMenuState = mOldMenuState;
- mOldMenuState = EMPTY_MENU;
- mCustomViewContainer.setVisibility(View.GONE);
- mCustomViewCallback.onCustomViewHidden();
- // Show the content view.
- setStatusBarVisibility(true);
- mContentView.setVisibility(View.VISIBLE);
- }
-
- Bitmap getDefaultVideoPoster() {
- if (mDefaultVideoPoster == null) {
- mDefaultVideoPoster = BitmapFactory.decodeResource(
- getResources(), R.drawable.default_video_poster);
- }
- return mDefaultVideoPoster;
- }
-
- View getVideoLoadingProgressView() {
- if (mVideoProgressView == null) {
- LayoutInflater inflater = LayoutInflater.from(BrowserActivity.this);
- mVideoProgressView = inflater.inflate(
- R.layout.video_loading_progress, null);
- }
- return mVideoProgressView;
- }
-
- /*
- * The Object used to inform the WebView of the file to upload.
- */
- private ValueCallback<Uri> mUploadMessage;
-
- void openFileChooser(ValueCallback<Uri> uploadMsg) {
- if (mUploadMessage != null) return;
- mUploadMessage = uploadMsg;
- Intent i = new Intent(Intent.ACTION_GET_CONTENT);
- i.addCategory(Intent.CATEGORY_OPENABLE);
- i.setType("*/*");
- BrowserActivity.this.startActivityForResult(Intent.createChooser(i,
- getString(R.string.choose_upload)), FILE_SELECTED);
- }
-
- // -------------------------------------------------------------------------
- // Implement functions for DownloadListener
- // -------------------------------------------------------------------------
-
- /**
- * Notify the host application a download should be done, or that
- * the data should be streamed if a streaming viewer is available.
- * @param url The full url to the content that should be downloaded
- * @param contentDisposition Content-disposition http header, if
- * present.
- * @param mimetype The mimetype of the content reported by the server
- * @param contentLength The file size reported by the server
- */
- public void onDownloadStart(String url, String userAgent,
- String contentDisposition, String mimetype, long contentLength) {
- // if we're dealing wih A/V content that's not explicitly marked
- // for download, check if it's streamable.
- if (contentDisposition == null
- || !contentDisposition.regionMatches(
- true, 0, "attachment", 0, 10)) {
- // query the package manager to see if there's a registered handler
- // that matches.
- Intent intent = new Intent(Intent.ACTION_VIEW);
- intent.setDataAndType(Uri.parse(url), mimetype);
- ResolveInfo info = getPackageManager().resolveActivity(intent,
- PackageManager.MATCH_DEFAULT_ONLY);
- if (info != null) {
- ComponentName myName = getComponentName();
- // If we resolved to ourselves, we don't want to attempt to
- // load the url only to try and download it again.
- if (!myName.getPackageName().equals(
- info.activityInfo.packageName)
- || !myName.getClassName().equals(
- info.activityInfo.name)) {
- // someone (other than us) knows how to handle this mime
- // type with this scheme, don't download.
- try {
- startActivity(intent);
- return;
- } catch (ActivityNotFoundException ex) {
- if (LOGD_ENABLED) {
- Log.d(LOGTAG, "activity not found for " + mimetype
- + " over " + Uri.parse(url).getScheme(),
- ex);
- }
- // Best behavior is to fall back to a download in this
- // case
- }
- }
- }
- }
- onDownloadStartNoStream(url, userAgent, contentDisposition, mimetype, contentLength);
- }
-
- // This is to work around the fact that java.net.URI throws Exceptions
- // instead of just encoding URL's properly
- // Helper method for onDownloadStartNoStream
- private static String encodePath(String path) {
- char[] chars = path.toCharArray();
-
- boolean needed = false;
- for (char c : chars) {
- if (c == '[' || c == ']') {
- needed = true;
- break;
- }
- }
- if (needed == false) {
- return path;
- }
-
- StringBuilder sb = new StringBuilder("");
- for (char c : chars) {
- if (c == '[' || c == ']') {
- sb.append('%');
- sb.append(Integer.toHexString(c));
- } else {
- sb.append(c);
- }
- }
-
- return sb.toString();
- }
-
- /**
- * Notify the host application a download should be done, even if there
- * is a streaming viewer available for thise type.
- * @param url The full url to the content that should be downloaded
- * @param contentDisposition Content-disposition http header, if
- * present.
- * @param mimetype The mimetype of the content reported by the server
- * @param contentLength The file size reported by the server
- */
- /*package */ void onDownloadStartNoStream(String url, String userAgent,
- String contentDisposition, String mimetype, long contentLength) {
-
- String filename = URLUtil.guessFileName(url,
- contentDisposition, mimetype);
-
- // Check to see if we have an SDCard
- String status = Environment.getExternalStorageState();
- if (!status.equals(Environment.MEDIA_MOUNTED)) {
- int title;
- String msg;
-
- // Check to see if the SDCard is busy, same as the music app
- if (status.equals(Environment.MEDIA_SHARED)) {
- msg = getString(R.string.download_sdcard_busy_dlg_msg);
- title = R.string.download_sdcard_busy_dlg_title;
- } else {
- msg = getString(R.string.download_no_sdcard_dlg_msg, filename);
- title = R.string.download_no_sdcard_dlg_title;
- }
-
- new AlertDialog.Builder(this)
- .setTitle(title)
- .setIcon(android.R.drawable.ic_dialog_alert)
- .setMessage(msg)
- .setPositiveButton(R.string.ok, null)
- .show();
- return;
- }
-
- // java.net.URI is a lot stricter than KURL so we have to encode some
- // extra characters. Fix for b 2538060 and b 1634719
- WebAddress webAddress;
- try {
- webAddress = new WebAddress(url);
- webAddress.mPath = encodePath(webAddress.mPath);
- } catch (Exception e) {
- // This only happens for very bad urls, we want to chatch the
- // exception here
- Log.e(LOGTAG, "Exception trying to parse url:" + url);
- return;
- }
-
- // XXX: Have to use the old url since the cookies were stored using the
- // old percent-encoded url.
- String cookies = CookieManager.getInstance().getCookie(url);
-
- ContentValues values = new ContentValues();
- values.put(Downloads.Impl.COLUMN_URI, webAddress.toString());
- values.put(Downloads.Impl.COLUMN_COOKIE_DATA, cookies);
- values.put(Downloads.Impl.COLUMN_USER_AGENT, userAgent);
- values.put(Downloads.Impl.COLUMN_NOTIFICATION_PACKAGE,
- getPackageName());
- values.put(Downloads.Impl.COLUMN_NOTIFICATION_CLASS,
- OpenDownloadReceiver.class.getCanonicalName());
- values.put(Downloads.Impl.COLUMN_VISIBILITY,
- Downloads.Impl.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
- values.put(Downloads.Impl.COLUMN_MIME_TYPE, mimetype);
- values.put(Downloads.Impl.COLUMN_FILE_NAME_HINT, filename);
- values.put(Downloads.Impl.COLUMN_DESCRIPTION, webAddress.mHost);
- if (contentLength > 0) {
- values.put(Downloads.Impl.COLUMN_TOTAL_BYTES, contentLength);
- }
- if (mimetype == null) {
- // We must have long pressed on a link or image to download it. We
- // are not sure of the mimetype in this case, so do a head request
- new FetchUrlMimeType(this).execute(values);
- } else {
- final Uri contentUri =
- getContentResolver().insert(Downloads.Impl.CONTENT_URI, values);
- }
- Toast.makeText(this, R.string.download_pending, Toast.LENGTH_SHORT)
- .show();
- }
-
- // -------------------------------------------------------------------------
-
- /**
- * Resets the lock icon. This method is called when we start a new load and
- * know the url to be loaded.
- */
- private void resetLockIcon(String url) {
- // Save the lock-icon state (we revert to it if the load gets cancelled)
- mTabControl.getCurrentTab().resetLockIcon(url);
- updateLockIconImage(LOCK_ICON_UNSECURE);
- }
-
- /**
- * Update the lock icon to correspond to our latest state.
- */
- private void updateLockIconToLatest() {
- updateLockIconImage(mTabControl.getCurrentTab().getLockIconType());
- }
-
- /**
- * Updates the lock-icon image in the title-bar.
- */
- private void updateLockIconImage(int lockIconType) {
- Drawable d = null;
- if (lockIconType == LOCK_ICON_SECURE) {
- d = mSecLockIcon;
- } else if (lockIconType == LOCK_ICON_MIXED) {
- d = mMixLockIcon;
- }
- mTitleBar.setLock(d);
- mFakeTitleBar.setLock(d);
- }
-
- /**
- * Displays a page-info dialog.
- * @param tab The tab to show info about
- * @param fromShowSSLCertificateOnError The flag that indicates whether
- * this dialog was opened from the SSL-certificate-on-error dialog or
- * not. This is important, since we need to know whether to return to
- * the parent dialog or simply dismiss.
- */
- private void showPageInfo(final Tab tab,
- final boolean fromShowSSLCertificateOnError) {
- final LayoutInflater factory = LayoutInflater
- .from(this);
-
- final View pageInfoView = factory.inflate(R.layout.page_info, null);
-
- final WebView view = tab.getWebView();
-
- String url = null;
- String title = null;
-
- if (view == null) {
- url = tab.getUrl();
- title = tab.getTitle();
- } else if (view == mTabControl.getCurrentWebView()) {
- // Use the cached title and url if this is the current WebView
- url = mUrl;
- title = mTitle;
- } else {
- url = view.getUrl();
- title = view.getTitle();
- }
-
- if (url == null) {
- url = "";
- }
- if (title == null) {
- title = "";
- }
-
- ((TextView) pageInfoView.findViewById(R.id.address)).setText(url);
- ((TextView) pageInfoView.findViewById(R.id.title)).setText(title);
-
- mPageInfoView = tab;
- mPageInfoFromShowSSLCertificateOnError = fromShowSSLCertificateOnError;
-
- AlertDialog.Builder alertDialogBuilder =
- new AlertDialog.Builder(this)
- .setTitle(R.string.page_info).setIcon(android.R.drawable.ic_dialog_info)
- .setView(pageInfoView)
- .setPositiveButton(
- R.string.ok,
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog,
- int whichButton) {
- mPageInfoDialog = null;
- mPageInfoView = null;
-
- // if we came here from the SSL error dialog
- if (fromShowSSLCertificateOnError) {
- // go back to the SSL error dialog
- showSSLCertificateOnError(
- mSSLCertificateOnErrorView,
- mSSLCertificateOnErrorHandler,
- mSSLCertificateOnErrorError);
- }
- }
- })
- .setOnCancelListener(
- new DialogInterface.OnCancelListener() {
- public void onCancel(DialogInterface dialog) {
- mPageInfoDialog = null;
- mPageInfoView = null;
-
- // if we came here from the SSL error dialog
- if (fromShowSSLCertificateOnError) {
- // go back to the SSL error dialog
- showSSLCertificateOnError(
- mSSLCertificateOnErrorView,
- mSSLCertificateOnErrorHandler,
- mSSLCertificateOnErrorError);
- }
- }
- });
-
- // if we have a main top-level page SSL certificate set or a certificate
- // error
- if (fromShowSSLCertificateOnError ||
- (view != null && view.getCertificate() != null)) {
- // add a 'View Certificate' button
- alertDialogBuilder.setNeutralButton(
- R.string.view_certificate,
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog,
- int whichButton) {
- mPageInfoDialog = null;
- mPageInfoView = null;
-
- // if we came here from the SSL error dialog
- if (fromShowSSLCertificateOnError) {
- // go back to the SSL error dialog
- showSSLCertificateOnError(
- mSSLCertificateOnErrorView,
- mSSLCertificateOnErrorHandler,
- mSSLCertificateOnErrorError);
- } else {
- // otherwise, display the top-most certificate from
- // the chain
- if (view.getCertificate() != null) {
- showSSLCertificate(tab);
- }
- }
- }
- });
- }
-
- mPageInfoDialog = alertDialogBuilder.show();
- }
-
- /**
- * Displays the main top-level page SSL certificate dialog
- * (accessible from the Page-Info dialog).
- * @param tab The tab to show certificate for.
- */
- private void showSSLCertificate(final Tab tab) {
- final View certificateView =
- inflateCertificateView(tab.getWebView().getCertificate());
- if (certificateView == null) {
- return;
- }
-
- LayoutInflater factory = LayoutInflater.from(this);
-
- final LinearLayout placeholder =
- (LinearLayout)certificateView.findViewById(R.id.placeholder);
-
- LinearLayout ll = (LinearLayout) factory.inflate(
- R.layout.ssl_success, placeholder);
- ((TextView)ll.findViewById(R.id.success))
- .setText(R.string.ssl_certificate_is_valid);
-
- mSSLCertificateView = tab;
- mSSLCertificateDialog =
- new AlertDialog.Builder(this)
- .setTitle(R.string.ssl_certificate).setIcon(
- R.drawable.ic_dialog_browser_certificate_secure)
- .setView(certificateView)
- .setPositiveButton(R.string.ok,
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog,
- int whichButton) {
- mSSLCertificateDialog = null;
- mSSLCertificateView = null;
-
- showPageInfo(tab, false);
- }
- })
- .setOnCancelListener(
- new DialogInterface.OnCancelListener() {
- public void onCancel(DialogInterface dialog) {
- mSSLCertificateDialog = null;
- mSSLCertificateView = null;
-
- showPageInfo(tab, false);
- }
- })
- .show();
- }
-
- /**
- * Displays the SSL error certificate dialog.
- * @param view The target web-view.
- * @param handler The SSL error handler responsible for cancelling the
- * connection that resulted in an SSL error or proceeding per user request.
- * @param error The SSL error object.
- */
- void showSSLCertificateOnError(
- final WebView view, final SslErrorHandler handler, final SslError error) {
-
- final View certificateView =
- inflateCertificateView(error.getCertificate());
- if (certificateView == null) {
- return;
- }
-
- LayoutInflater factory = LayoutInflater.from(this);
-
- final LinearLayout placeholder =
- (LinearLayout)certificateView.findViewById(R.id.placeholder);
-
- if (error.hasError(SslError.SSL_UNTRUSTED)) {
- LinearLayout ll = (LinearLayout)factory
- .inflate(R.layout.ssl_warning, placeholder);
- ((TextView)ll.findViewById(R.id.warning))
- .setText(R.string.ssl_untrusted);
- }
-
- if (error.hasError(SslError.SSL_IDMISMATCH)) {
- LinearLayout ll = (LinearLayout)factory
- .inflate(R.layout.ssl_warning, placeholder);
- ((TextView)ll.findViewById(R.id.warning))
- .setText(R.string.ssl_mismatch);
- }
-
- if (error.hasError(SslError.SSL_EXPIRED)) {
- LinearLayout ll = (LinearLayout)factory
- .inflate(R.layout.ssl_warning, placeholder);
- ((TextView)ll.findViewById(R.id.warning))
- .setText(R.string.ssl_expired);
- }
-
- if (error.hasError(SslError.SSL_NOTYETVALID)) {
- LinearLayout ll = (LinearLayout)factory
- .inflate(R.layout.ssl_warning, placeholder);
- ((TextView)ll.findViewById(R.id.warning))
- .setText(R.string.ssl_not_yet_valid);
- }
-
- mSSLCertificateOnErrorHandler = handler;
- mSSLCertificateOnErrorView = view;
- mSSLCertificateOnErrorError = error;
- mSSLCertificateOnErrorDialog =
- new AlertDialog.Builder(this)
- .setTitle(R.string.ssl_certificate).setIcon(
- R.drawable.ic_dialog_browser_certificate_partially_secure)
- .setView(certificateView)
- .setPositiveButton(R.string.ok,
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog,
- int whichButton) {
- mSSLCertificateOnErrorDialog = null;
- mSSLCertificateOnErrorView = null;
- mSSLCertificateOnErrorHandler = null;
- mSSLCertificateOnErrorError = null;
-
- view.getWebViewClient().onReceivedSslError(
- view, handler, error);
- }
- })
- .setNeutralButton(R.string.page_info_view,
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog,
- int whichButton) {
- mSSLCertificateOnErrorDialog = null;
-
- // do not clear the dialog state: we will
- // need to show the dialog again once the
- // user is done exploring the page-info details
-
- showPageInfo(mTabControl.getTabFromView(view),
- true);
- }
- })
- .setOnCancelListener(
- new DialogInterface.OnCancelListener() {
- public void onCancel(DialogInterface dialog) {
- mSSLCertificateOnErrorDialog = null;
- mSSLCertificateOnErrorView = null;
- mSSLCertificateOnErrorHandler = null;
- mSSLCertificateOnErrorError = null;
-
- view.getWebViewClient().onReceivedSslError(
- view, handler, error);
- }
- })
- .show();
- }
-
- /**
- * Inflates the SSL certificate view (helper method).
- * @param certificate The SSL certificate.
- * @return The resultant certificate view with issued-to, issued-by,
- * issued-on, expires-on, and possibly other fields set.
- * If the input certificate is null, returns null.
- */
- private View inflateCertificateView(SslCertificate certificate) {
- if (certificate == null) {
- return null;
- }
-
- LayoutInflater factory = LayoutInflater.from(this);
-
- View certificateView = factory.inflate(
- R.layout.ssl_certificate, null);
-
- // issued to:
- SslCertificate.DName issuedTo = certificate.getIssuedTo();
- if (issuedTo != null) {
- ((TextView) certificateView.findViewById(R.id.to_common))
- .setText(issuedTo.getCName());
- ((TextView) certificateView.findViewById(R.id.to_org))
- .setText(issuedTo.getOName());
- ((TextView) certificateView.findViewById(R.id.to_org_unit))
- .setText(issuedTo.getUName());
- }
-
- // issued by:
- SslCertificate.DName issuedBy = certificate.getIssuedBy();
- if (issuedBy != null) {
- ((TextView) certificateView.findViewById(R.id.by_common))
- .setText(issuedBy.getCName());
- ((TextView) certificateView.findViewById(R.id.by_org))
- .setText(issuedBy.getOName());
- ((TextView) certificateView.findViewById(R.id.by_org_unit))
- .setText(issuedBy.getUName());
- }
-
- // issued on:
- String issuedOn = formatCertificateDate(
- certificate.getValidNotBeforeDate());
- ((TextView) certificateView.findViewById(R.id.issued_on))
- .setText(issuedOn);
-
- // expires on:
- String expiresOn = formatCertificateDate(
- certificate.getValidNotAfterDate());
- ((TextView) certificateView.findViewById(R.id.expires_on))
- .setText(expiresOn);
-
- return certificateView;
- }
-
- /**
- * Formats the certificate date to a properly localized date string.
- * @return Properly localized version of the certificate date string and
- * the "" if it fails to localize.
- */
- private String formatCertificateDate(Date certificateDate) {
- if (certificateDate == null) {
- return "";
- }
- String formattedDate = DateFormat.getDateFormat(this).format(certificateDate);
- if (formattedDate == null) {
- return "";
- }
- return formattedDate;
- }
-
- /**
- * Displays an http-authentication dialog.
- */
- void showHttpAuthentication(final HttpAuthHandler handler,
- final String host, final String realm, final String title,
- final String name, final String password, int focusId) {
- LayoutInflater factory = LayoutInflater.from(this);
- final View v = factory
- .inflate(R.layout.http_authentication, null);
- if (name != null) {
- ((EditText) v.findViewById(R.id.username_edit)).setText(name);
- }
- if (password != null) {
- ((EditText) v.findViewById(R.id.password_edit)).setText(password);
- }
-
- String titleText = title;
- if (titleText == null) {
- titleText = getText(R.string.sign_in_to).toString().replace(
- "%s1", host).replace("%s2", realm);
- }
-
- mHttpAuthHandler = handler;
- AlertDialog dialog = new AlertDialog.Builder(this)
- .setTitle(titleText)
- .setIcon(android.R.drawable.ic_dialog_alert)
- .setView(v)
- .setPositiveButton(R.string.action,
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog,
- int whichButton) {
- String nm = ((EditText) v
- .findViewById(R.id.username_edit))
- .getText().toString();
- String pw = ((EditText) v
- .findViewById(R.id.password_edit))
- .getText().toString();
- BrowserActivity.this.setHttpAuthUsernamePassword
- (host, realm, nm, pw);
- handler.proceed(nm, pw);
- mHttpAuthenticationDialog = null;
- mHttpAuthHandler = null;
- }})
- .setNegativeButton(R.string.cancel,
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog,
- int whichButton) {
- handler.cancel();
- BrowserActivity.this.resetTitleAndRevertLockIcon();
- mHttpAuthenticationDialog = null;
- mHttpAuthHandler = null;
- }})
- .setOnCancelListener(new DialogInterface.OnCancelListener() {
- public void onCancel(DialogInterface dialog) {
- handler.cancel();
- BrowserActivity.this.resetTitleAndRevertLockIcon();
- mHttpAuthenticationDialog = null;
- mHttpAuthHandler = null;
- }})
- .create();
- // Make the IME appear when the dialog is displayed if applicable.
- dialog.getWindow().setSoftInputMode(
- WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
- dialog.show();
- if (focusId != 0) {
- dialog.findViewById(focusId).requestFocus();
- } else {
- v.findViewById(R.id.username_edit).requestFocus();
- }
- mHttpAuthenticationDialog = dialog;
- }
-
- public int getProgress() {
- WebView w = mTabControl.getCurrentWebView();
- if (w != null) {
- return w.getProgress();
- } else {
- return 100;
- }
- }
-
- /**
- * Set HTTP authentication password.
- *
- * @param host The host for the password
- * @param realm The realm for the password
- * @param username The username for the password. If it is null, it means
- * password can't be saved.
- * @param password The password
- */
- public void setHttpAuthUsernamePassword(String host, String realm,
- String username,
- String password) {
- WebView w = getTopWindow();
- if (w != null) {
- w.setHttpAuthUsernamePassword(host, realm, username, password);
- }
- }
-
- /**
- * connectivity manager says net has come or gone... inform the user
- * @param up true if net has come up, false if net has gone down
- */
- public void onNetworkToggle(boolean up) {
- if (up == mIsNetworkUp) {
- return;
- } else if (up) {
- mIsNetworkUp = true;
- if (mAlertDialog != null) {
- mAlertDialog.cancel();
- mAlertDialog = null;
- }
- } else {
- mIsNetworkUp = false;
- if (mInLoad) {
- createAndShowNetworkDialog();
- }
- }
- WebView w = mTabControl.getCurrentWebView();
- if (w != null) {
- w.setNetworkAvailable(up);
- }
- }
-
- boolean isNetworkUp() {
- return mIsNetworkUp;
- }
-
- // This method shows the network dialog alerting the user that the net is
- // down. It will only show the dialog if mAlertDialog is null.
- private void createAndShowNetworkDialog() {
- if (mAlertDialog == null) {
- mAlertDialog = new AlertDialog.Builder(this)
- .setTitle(R.string.loadSuspendedTitle)
- .setMessage(R.string.loadSuspended)
- .setPositiveButton(R.string.ok, null)
- .show();
- }
+ @Override
+ public void onActionModeFinished(ActionMode mode) {
+ super.onActionModeFinished(mode);
+ mController.onActionModeFinished(mode);
}
@Override
protected void onActivityResult(int requestCode, int resultCode,
- Intent intent) {
- if (getTopWindow() == null) return;
-
- switch (requestCode) {
- case COMBO_PAGE:
- if (resultCode == RESULT_OK && intent != null) {
- String data = intent.getAction();
- Bundle extras = intent.getExtras();
- if (extras != null && extras.getBoolean("new_window", false)) {
- openTab(data);
- } else {
- final Tab currentTab =
- mTabControl.getCurrentTab();
- dismissSubWindow(currentTab);
- if (data != null && data.length() != 0) {
- loadUrl(getTopWindow(), data);
- }
- }
- }
- // Deliberately fall through to PREFERENCES_PAGE, since the
- // same extra may be attached to the COMBO_PAGE
- case PREFERENCES_PAGE:
- if (resultCode == RESULT_OK && intent != null) {
- String action = intent.getStringExtra(Intent.EXTRA_TEXT);
- if (BrowserSettings.PREF_CLEAR_HISTORY.equals(action)) {
- mTabControl.removeParentChildRelationShips();
- }
- }
- break;
- // Choose a file from the file picker.
- case FILE_SELECTED:
- if (null == mUploadMessage) break;
- Uri result = intent == null || resultCode != RESULT_OK ? null
- : intent.getData();
- mUploadMessage.onReceiveValue(result);
- mUploadMessage = null;
- break;
- default:
- break;
- }
- getTopWindow().requestFocus();
- }
-
- /*
- * This method is called as a result of the user selecting the options
- * menu to see the download window. It shows the download window on top of
- * the current window.
- */
- private void viewDownloads() {
- Intent intent = new Intent(DownloadManager.ACTION_VIEW_DOWNLOADS);
- startActivity(intent);
- }
-
- /**
- * Open the Go page.
- * @param startWithHistory If true, open starting on the history tab.
- * Otherwise, start with the bookmarks tab.
- */
- /* package */ void bookmarksOrHistoryPicker(boolean startWithHistory) {
- WebView current = mTabControl.getCurrentWebView();
- if (current == null) {
- return;
- }
- Intent intent = new Intent(this,
- CombinedBookmarkHistoryActivity.class);
- String title = current.getTitle();
- String url = current.getUrl();
- Bitmap thumbnail = createScreenshot(current);
-
- // Just in case the user opens bookmarks before a page finishes loading
- // so the current history item, and therefore the page, is null.
- if (null == url) {
- url = mLastEnteredUrl;
- // This can happen.
- if (null == url) {
- url = mSettings.getHomePage();
- }
- }
- // In case the web page has not yet received its associated title.
- if (title == null) {
- title = url;
- }
- intent.putExtra("title", title);
- intent.putExtra("url", url);
- intent.putExtra("thumbnail", thumbnail);
- // Disable opening in a new window if we have maxed out the windows
- intent.putExtra("disable_new_window", !mTabControl.canCreateNewTab());
- intent.putExtra("touch_icon_url", current.getTouchIconUrl());
- if (startWithHistory) {
- intent.putExtra(CombinedBookmarkHistoryActivity.STARTING_TAB,
- CombinedBookmarkHistoryActivity.HISTORY_TAB);
- }
- startActivityForResult(intent, COMBO_PAGE);
- }
-
- // Called when loading from context menu or LOAD_URL message
- private void loadUrlFromContext(WebView view, String url) {
- // In case the user enters nothing.
- if (url != null && url.length() != 0 && view != null) {
- url = smartUrlFilter(url);
- if (!view.getWebViewClient().shouldOverrideUrlLoading(view, url)) {
- loadUrl(view, url);
- }
- }
- }
-
- /**
- * Load the URL into the given WebView and update the title bar
- * to reflect the new load. Call this instead of WebView.loadUrl
- * directly.
- * @param view The WebView used to load url.
- * @param url The URL to load.
- */
- private void loadUrl(WebView view, String url) {
- updateTitleBarForNewLoad(view, url);
- view.loadUrl(url);
- }
-
- /**
- * Load UrlData into a Tab and update the title bar to reflect the new
- * load. Call this instead of UrlData.loadIn directly.
- * @param t The Tab used to load.
- * @param data The UrlData being loaded.
- */
- private void loadUrlDataIn(Tab t, UrlData data) {
- updateTitleBarForNewLoad(t.getWebView(), data.mUrl);
- data.loadIn(t);
- }
-
- /**
- * If the WebView is the top window, update the title bar to reflect
- * loading the new URL. i.e. set its text, clear the favicon (which
- * will be set once the page begins loading), and set the progress to
- * INITIAL_PROGRESS to show that the page has begun to load. Called
- * by loadUrl and loadUrlDataIn.
- * @param view The WebView that is starting a load.
- * @param url The URL that is being loaded.
- */
- private void updateTitleBarForNewLoad(WebView view, String url) {
- if (view == getTopWindow()) {
- setUrlTitle(url, null);
- setFavicon(null);
- onProgressChanged(view, INITIAL_PROGRESS);
- }
- }
-
- private String smartUrlFilter(Uri inUri) {
- if (inUri != null) {
- return smartUrlFilter(inUri.toString());
- }
- return null;
- }
-
- protected static final Pattern ACCEPTED_URI_SCHEMA = Pattern.compile(
- "(?i)" + // switch on case insensitive matching
- "(" + // begin group for schema
- "(?:http|https|file):\\/\\/" +
- "|(?:inline|data|about|content|javascript):" +
- ")" +
- "(.*)" );
-
- /**
- * Attempts to determine whether user input is a URL or search
- * terms. Anything with a space is passed to search.
- *
- * Converts to lowercase any mistakenly uppercased schema (i.e.,
- * "Http://" converts to "http://"
- *
- * @return Original or modified URL
- *
- */
- String smartUrlFilter(String url) {
-
- String inUrl = url.trim();
- boolean hasSpace = inUrl.indexOf(' ') != -1;
-
- Matcher matcher = ACCEPTED_URI_SCHEMA.matcher(inUrl);
- if (matcher.matches()) {
- // force scheme to lowercase
- String scheme = matcher.group(1);
- String lcScheme = scheme.toLowerCase();
- if (!lcScheme.equals(scheme)) {
- inUrl = lcScheme + matcher.group(2);
- }
- if (hasSpace) {
- inUrl = inUrl.replace(" ", "%20");
- }
- return inUrl;
- }
- if (!hasSpace) {
- if (Patterns.WEB_URL.matcher(inUrl).matches()) {
- return URLUtil.guessUrl(inUrl);
- }
- }
-
- // FIXME: Is this the correct place to add to searches?
- // what if someone else calls this function?
-
- Browser.addSearchUrl(mResolver, inUrl);
- return URLUtil.composeSearchUrl(inUrl, QuickSearch_G, QUERY_PLACE_HOLDER);
- }
-
- /* package */ void setShouldShowErrorConsole(boolean flag) {
- if (flag == mShouldShowErrorConsole) {
- // Nothing to do.
- return;
- }
- Tab t = mTabControl.getCurrentTab();
- if (t == null) {
- // There is no current tab so we cannot toggle the error console
- return;
- }
-
- mShouldShowErrorConsole = flag;
-
- ErrorConsoleView errorConsole = t.getErrorConsole(true);
-
- if (flag) {
- // Setting the show state of the console will cause it's the layout to be inflated.
- if (errorConsole.numberOfErrors() > 0) {
- errorConsole.showConsole(ErrorConsoleView.SHOW_MINIMIZED);
- } else {
- errorConsole.showConsole(ErrorConsoleView.SHOW_NONE);
- }
-
- // Now we can add it to the main view.
- mErrorConsoleContainer.addView(errorConsole,
- new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.WRAP_CONTENT));
- } else {
- mErrorConsoleContainer.removeView(errorConsole);
- }
-
- }
-
- boolean shouldShowErrorConsole() {
- return mShouldShowErrorConsole;
- }
-
- private void setStatusBarVisibility(boolean visible) {
- int flag = visible ? 0 : WindowManager.LayoutParams.FLAG_FULLSCREEN;
- getWindow().setFlags(flag, WindowManager.LayoutParams.FLAG_FULLSCREEN);
+ Intent intent) {
+ mController.onActivityResult(requestCode, resultCode, intent);
}
- private void sendNetworkType(String type, String subtype) {
- WebView w = mTabControl.getCurrentWebView();
- if (w != null) {
- w.setNetworkType(type, subtype);
- }
- }
-
- private void packageChanged(String packageName, boolean wasAdded) {
- WebView w = mTabControl.getCurrentWebView();
- if (w == null) {
- return;
- }
-
- if (wasAdded) {
- w.addPackageName(packageName);
- } else {
- w.removePackageName(packageName);
- }
- }
-
- private void addPackageNames(Set<String> packageNames) {
- WebView w = mTabControl.getCurrentWebView();
- if (w == null) {
- return;
- }
-
- w.addPackageNames(packageNames);
- }
-
- private void getInstalledPackages() {
- AsyncTask<Void, Void, Set<String> > task =
- new AsyncTask<Void, Void, Set<String> >() {
- protected Set<String> doInBackground(Void... unused) {
- Set<String> installedPackages = new HashSet<String>();
- PackageManager pm = BrowserActivity.this.getPackageManager();
- if (pm != null) {
- List<PackageInfo> packages = pm.getInstalledPackages(0);
- for (PackageInfo p : packages) {
- if (BrowserActivity.this.sGoogleApps.contains(p.packageName)) {
- installedPackages.add(p.packageName);
- }
- }
- }
-
- return installedPackages;
- }
-
- // Executes on the UI thread
- protected void onPostExecute(Set<String> installedPackages) {
- addPackageNames(installedPackages);
- }
- };
- task.execute();
- }
-
- final static int LOCK_ICON_UNSECURE = 0;
- final static int LOCK_ICON_SECURE = 1;
- final static int LOCK_ICON_MIXED = 2;
-
- private BrowserSettings mSettings;
- private TabControl mTabControl;
- private ContentResolver mResolver;
- private FrameLayout mContentView;
- private View mCustomView;
- private FrameLayout mCustomViewContainer;
- private WebChromeClient.CustomViewCallback mCustomViewCallback;
-
- // FIXME, temp address onPrepareMenu performance problem. When we move everything out of
- // view, we should rewrite this.
- private int mCurrentMenuState = 0;
- private int mMenuState = R.id.MAIN_MENU;
- private int mOldMenuState = EMPTY_MENU;
- private static final int EMPTY_MENU = -1;
- private Menu mMenu;
-
- private FindDialog mFindDialog;
- private SelectDialog mSelectDialog;
- // Used to prevent chording to result in firing two shortcuts immediately
- // one after another. Fixes bug 1211714.
- boolean mCanChord;
-
- private boolean mInLoad;
- private boolean mIsNetworkUp;
- private boolean mDidStopLoad;
-
- /* package */ boolean mActivityInPause = true;
-
- private boolean mMenuIsDown;
-
- private static boolean mInTrace;
-
- // Performance probe
- private static final int[] SYSTEM_CPU_FORMAT = new int[] {
- Process.PROC_SPACE_TERM | Process.PROC_COMBINE,
- Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 1: user time
- Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 2: nice time
- Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 3: sys time
- Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 4: idle time
- Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 5: iowait time
- Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 6: irq time
- Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG // 7: softirq time
- };
-
- private long mStart;
- private long mProcessStart;
- private long mUserStart;
- private long mSystemStart;
- private long mIdleStart;
- private long mIrqStart;
-
- private long mUiStart;
-
- private Drawable mMixLockIcon;
- private Drawable mSecLockIcon;
-
- /* hold a ref so we can auto-cancel if necessary */
- private AlertDialog mAlertDialog;
-
- // The up-to-date URL and title (these can be different from those stored
- // in WebView, since it takes some time for the information in WebView to
- // get updated)
- private String mUrl;
- private String mTitle;
-
- // As PageInfo has different style for landscape / portrait, we have
- // to re-open it when configuration changed
- private AlertDialog mPageInfoDialog;
- private Tab mPageInfoView;
- // If the Page-Info dialog is launched from the SSL-certificate-on-error
- // dialog, we should not just dismiss it, but should get back to the
- // SSL-certificate-on-error dialog. This flag is used to store this state
- private boolean mPageInfoFromShowSSLCertificateOnError;
-
- // as SSLCertificateOnError has different style for landscape / portrait,
- // we have to re-open it when configuration changed
- private AlertDialog mSSLCertificateOnErrorDialog;
- private WebView mSSLCertificateOnErrorView;
- private SslErrorHandler mSSLCertificateOnErrorHandler;
- private SslError mSSLCertificateOnErrorError;
-
- // as SSLCertificate has different style for landscape / portrait, we
- // have to re-open it when configuration changed
- private AlertDialog mSSLCertificateDialog;
- private Tab mSSLCertificateView;
-
- // as HttpAuthentication has different style for landscape / portrait, we
- // have to re-open it when configuration changed
- private AlertDialog mHttpAuthenticationDialog;
- private HttpAuthHandler mHttpAuthHandler;
-
- /*package*/ static final FrameLayout.LayoutParams COVER_SCREEN_PARAMS =
- new FrameLayout.LayoutParams(
- ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.MATCH_PARENT);
- /*package*/ static final FrameLayout.LayoutParams COVER_SCREEN_GRAVITY_CENTER =
- new FrameLayout.LayoutParams(
- ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.MATCH_PARENT,
- Gravity.CENTER);
- // Google search
- final static String QuickSearch_G = "http://www.google.com/m?q=%s";
-
- final static String QUERY_PLACE_HOLDER = "%s";
-
- // "source" parameter for Google search through search key
- final static String GOOGLE_SEARCH_SOURCE_SEARCHKEY = "browser-key";
- // "source" parameter for Google search through goto menu
- final static String GOOGLE_SEARCH_SOURCE_GOTO = "browser-goto";
- // "source" parameter for Google search through simplily type
- final static String GOOGLE_SEARCH_SOURCE_TYPE = "browser-type";
- // "source" parameter for Google search suggested by the browser
- final static String GOOGLE_SEARCH_SOURCE_SUGGEST = "browser-suggest";
- // "source" parameter for Google search from unknown source
- final static String GOOGLE_SEARCH_SOURCE_UNKNOWN = "unknown";
-
- private final static String LOGTAG = "browser";
-
- private String mLastEnteredUrl;
-
- private PowerManager.WakeLock mWakeLock;
- private final static int WAKELOCK_TIMEOUT = 5 * 60 * 1000; // 5 minutes
-
- private Toast mStopToast;
-
- private TitleBar mTitleBar;
-
- private LinearLayout mErrorConsoleContainer = null;
- private boolean mShouldShowErrorConsole = false;
-
- // As the ids are dynamically created, we can't guarantee that they will
- // be in sequence, so this static array maps ids to a window number.
- final static private int[] WINDOW_SHORTCUT_ID_ARRAY =
- { R.id.window_one_menu_id, R.id.window_two_menu_id, R.id.window_three_menu_id,
- R.id.window_four_menu_id, R.id.window_five_menu_id, R.id.window_six_menu_id,
- R.id.window_seven_menu_id, R.id.window_eight_menu_id };
-
- // monitor platform changes
- private IntentFilter mNetworkStateChangedFilter;
- private BroadcastReceiver mNetworkStateIntentReceiver;
-
- private BroadcastReceiver mPackageInstallationReceiver;
-
- private SystemAllowGeolocationOrigins mSystemAllowGeolocationOrigins;
-
- // activity requestCode
- final static int COMBO_PAGE = 1;
- final static int PREFERENCES_PAGE = 3;
- final static int FILE_SELECTED = 4;
-
- // the default <video> poster
- private Bitmap mDefaultVideoPoster;
- // the video progress view
- private View mVideoProgressView;
-
- // The Google packages we monitor for the navigator.isApplicationInstalled()
- // API. Add as needed.
- private static Set<String> sGoogleApps;
- static {
- sGoogleApps = new HashSet<String>();
- sGoogleApps.add("com.google.android.youtube");
- }
-
- /**
- * A UrlData class to abstract how the content will be set to WebView.
- * This base class uses loadUrl to show the content.
- */
- /* package */ static class UrlData {
- final String mUrl;
- final Map<String, String> mHeaders;
- final Intent mVoiceIntent;
-
- UrlData(String url) {
- this.mUrl = url;
- this.mHeaders = null;
- this.mVoiceIntent = null;
- }
-
- UrlData(String url, Map<String, String> headers, Intent intent) {
- this.mUrl = url;
- this.mHeaders = headers;
- if (RecognizerResultsIntent.ACTION_VOICE_SEARCH_RESULTS
- .equals(intent.getAction())) {
- this.mVoiceIntent = intent;
- } else {
- this.mVoiceIntent = null;
- }
- }
-
- boolean isEmpty() {
- return mVoiceIntent == null && (mUrl == null || mUrl.length() == 0);
- }
-
- /**
- * Load this UrlData into the given Tab. Use loadUrlDataIn to update
- * the title bar as well.
- */
- public void loadIn(Tab t) {
- if (mVoiceIntent != null) {
- t.activateVoiceSearchMode(mVoiceIntent);
- } else {
- t.getWebView().loadUrl(mUrl, mHeaders);
- }
- }
- };
-
- /* package */ static final UrlData EMPTY_URL_DATA = new UrlData(null);
}
diff --git a/src/com/android/browser/BrowserBackupAgent.java b/src/com/android/browser/BrowserBackupAgent.java
index c968ce5..9c5d65b 100644
--- a/src/com/android/browser/BrowserBackupAgent.java
+++ b/src/com/android/browser/BrowserBackupAgent.java
@@ -166,8 +166,11 @@
if (DEBUG) Log.v(TAG, "Did not see url: " + mark.url);
// Right now we do not reconstruct the db entry in its
// entirety; we just add a new bookmark with the same data
- Bookmarks.addBookmark(null, getContentResolver(),
- mark.url, mark.title, null, false);
+ // FIXME: This file needs to be reworked
+ // anyway For now, add the bookmark at
+ // the root level.
+ Bookmarks.addBookmark(this, false,
+ mark.url, mark.title, null, false, 0);
nUnique++;
} else {
if (DEBUG) Log.v(TAG, "Skipping extant url: " + mark.url);
diff --git a/src/com/android/browser/BrowserBookmarksAdapter.java b/src/com/android/browser/BrowserBookmarksAdapter.java
index 241b33b..f587f01 100644
--- a/src/com/android/browser/BrowserBookmarksAdapter.java
+++ b/src/com/android/browser/BrowserBookmarksAdapter.java
@@ -16,567 +16,106 @@
package com.android.browser;
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.database.ContentObserver;
+import android.content.Context;
import android.database.Cursor;
-import android.database.DataSetObserver;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
-import android.net.Uri;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Looper;
-import android.provider.Browser;
-import android.provider.Browser.BookmarkColumns;
-import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.webkit.WebIconDatabase;
-import android.webkit.WebView;
-import android.widget.BaseAdapter;
+import android.widget.CursorAdapter;
import android.widget.ImageView;
import android.widget.TextView;
-import java.io.ByteArrayOutputStream;
-
-class BrowserBookmarksAdapter extends BaseAdapter {
-
- private String mCurrentPage;
- private String mCurrentTitle;
- private Bitmap mCurrentThumbnail;
- private Cursor mCursor;
- private int mCount;
- private BrowserBookmarksPage mBookmarksPage;
- private ContentResolver mContentResolver;
- private boolean mDataValid;
- private BookmarkViewMode mViewMode;
- private boolean mMostVisited;
- private boolean mNeedsOffset;
- private int mExtraOffset;
+class BrowserBookmarksAdapter extends CursorAdapter {
+ LayoutInflater mInflater;
+ int mCurrentView;
/**
* Create a new BrowserBookmarksAdapter.
- * @param b BrowserBookmarksPage that instantiated this.
- * Necessary so it will adjust its focus
- * appropriately after a search.
*/
- public BrowserBookmarksAdapter(BrowserBookmarksPage b, String curPage,
- String curTitle, Bitmap curThumbnail, boolean createShortcut,
- boolean mostVisited) {
- mNeedsOffset = !(createShortcut || mostVisited);
- mMostVisited = mostVisited;
- mExtraOffset = mNeedsOffset ? 1 : 0;
- mBookmarksPage = b;
- mCurrentPage = b.getResources().getString(R.string.current_page)
- + curPage;
- mCurrentTitle = curTitle;
- mCurrentThumbnail = curThumbnail;
- mContentResolver = b.getContentResolver();
- mViewMode = BookmarkViewMode.LIST;
+ public BrowserBookmarksAdapter(Context context, int defaultView) {
+ // Make sure to tell the CursorAdapter to avoid the observer and auto-requery
+ // since the Loader will do that for us.
+ super(context, null);
+ mInflater = LayoutInflater.from(context);
+ selectView(defaultView);
+ }
- String whereClause;
- // FIXME: Should have a default sort order that the user selects.
- String orderBy = Browser.BookmarkColumns.VISITS + " DESC";
- if (mostVisited) {
- whereClause = Browser.BookmarkColumns.VISITS + " != 0";
+ @Override
+ public void bindView(View view, Context context, Cursor cursor) {
+ if (mCurrentView == BrowserBookmarksPage.VIEW_LIST) {
+ bindListView(view, context, cursor);
} else {
- whereClause = Browser.BookmarkColumns.BOOKMARK + " = 1";
- }
- mCursor = b.managedQuery(Browser.BOOKMARKS_URI,
- Browser.HISTORY_PROJECTION, whereClause, null, orderBy);
- mCursor.registerContentObserver(new ChangeObserver());
- mCursor.registerDataSetObserver(new MyDataSetObserver());
-
- mDataValid = true;
- notifyDataSetChanged();
-
- mCount = mCursor.getCount() + mExtraOffset;
- }
-
- /**
- * Return a hashmap with one row's Title, Url, and favicon.
- * @param position Position in the list.
- * @return Bundle Stores title, url of row position, favicon, and id
- * for the url. Return a blank map if position is out of
- * range.
- */
- public Bundle getRow(int position) {
- Bundle map = new Bundle();
- if (position < mExtraOffset || position >= mCount) {
- return map;
- }
- mCursor.moveToPosition(position- mExtraOffset);
- String url = mCursor.getString(Browser.HISTORY_PROJECTION_URL_INDEX);
- map.putString(Browser.BookmarkColumns.TITLE,
- mCursor.getString(Browser.HISTORY_PROJECTION_TITLE_INDEX));
- map.putString(Browser.BookmarkColumns.URL, url);
- byte[] data = mCursor.getBlob(Browser.HISTORY_PROJECTION_FAVICON_INDEX);
- if (data != null) {
- map.putParcelable(Browser.BookmarkColumns.FAVICON,
- BitmapFactory.decodeByteArray(data, 0, data.length));
- }
- map.putInt("id", mCursor.getInt(Browser.HISTORY_PROJECTION_ID_INDEX));
- return map;
- }
-
- /**
- * Update a row in the database with new information.
- * Requeries the database if the information has changed.
- * @param map Bundle storing id, title and url of new information
- */
- public void updateRow(Bundle map) {
-
- // Find the record
- int id = map.getInt("id");
- int position = -1;
- for (mCursor.moveToFirst(); !mCursor.isAfterLast(); mCursor.moveToNext()) {
- if (mCursor.getInt(Browser.HISTORY_PROJECTION_ID_INDEX) == id) {
- position = mCursor.getPosition();
- break;
- }
- }
- if (position < 0) {
- return;
- }
-
- mCursor.moveToPosition(position);
- ContentValues values = new ContentValues();
- String title = map.getString(Browser.BookmarkColumns.TITLE);
- if (!title.equals(mCursor
- .getString(Browser.HISTORY_PROJECTION_TITLE_INDEX))) {
- values.put(Browser.BookmarkColumns.TITLE, title);
- }
- String url = map.getString(Browser.BookmarkColumns.URL);
- if (!url.equals(mCursor.
- getString(Browser.HISTORY_PROJECTION_URL_INDEX))) {
- values.put(Browser.BookmarkColumns.URL, url);
- }
-
- if (map.getBoolean("invalidateThumbnail") == true) {
- values.put(Browser.BookmarkColumns.THUMBNAIL, new byte[0]);
- }
- if (values.size() > 0
- && mContentResolver.update(Browser.BOOKMARKS_URI, values,
- "_id = " + id, null) != -1) {
- refreshList();
+ bindGridView(view, context, cursor);
}
}
- /**
- * Delete a row from the database. Requeries the database.
- * Does nothing if the provided position is out of range.
- * @param position Position in the list.
- */
- public void deleteRow(int position) {
- if (position < mExtraOffset || position >= getCount()) {
- return;
- }
- mCursor.moveToPosition(position- mExtraOffset);
- String url = mCursor.getString(Browser.HISTORY_PROJECTION_URL_INDEX);
- String title = mCursor.getString(Browser.HISTORY_PROJECTION_TITLE_INDEX);
- Bookmarks.removeFromBookmarks(null, mContentResolver, url, title);
- refreshList();
- }
-
- /**
- * Delete all bookmarks from the db. Requeries the database.
- * All bookmarks with become visited URLs or if never visited
- * are removed
- */
- public void deleteAllRows() {
- StringBuilder deleteIds = null;
- StringBuilder convertIds = null;
-
- for (mCursor.moveToFirst(); !mCursor.isAfterLast(); mCursor.moveToNext()) {
- String url = mCursor.getString(Browser.HISTORY_PROJECTION_URL_INDEX);
- WebIconDatabase.getInstance().releaseIconForPageUrl(url);
- int id = mCursor.getInt(Browser.HISTORY_PROJECTION_ID_INDEX);
- int numVisits = mCursor.getInt(Browser.HISTORY_PROJECTION_VISITS_INDEX);
- if (0 == numVisits) {
- if (deleteIds == null) {
- deleteIds = new StringBuilder();
- deleteIds.append("( ");
- } else {
- deleteIds.append(" OR ( ");
- }
- deleteIds.append(BookmarkColumns._ID);
- deleteIds.append(" = ");
- deleteIds.append(id);
- deleteIds.append(" )");
- } else {
- // It is no longer a bookmark, but it is still a visited site.
- if (convertIds == null) {
- convertIds = new StringBuilder();
- convertIds.append("( ");
- } else {
- convertIds.append(" OR ( ");
- }
- convertIds.append(BookmarkColumns._ID);
- convertIds.append(" = ");
- convertIds.append(id);
- convertIds.append(" )");
- }
- }
-
- if (deleteIds != null) {
- mContentResolver.delete(Browser.BOOKMARKS_URI, deleteIds.toString(),
- null);
- }
- if (convertIds != null) {
- ContentValues values = new ContentValues();
- values.put(Browser.BookmarkColumns.BOOKMARK, 0);
- mContentResolver.update(Browser.BOOKMARKS_URI, values,
- convertIds.toString(), null);
- }
- refreshList();
- }
+ void bindGridView(View view, Context context, Cursor cursor) {
+ ImageView thumb = (ImageView) view.findViewById(R.id.thumb);
+ TextView tv = (TextView) view.findViewById(R.id.label);
- /**
- * Refresh list to recognize a change in the database.
- */
- public void refreshList() {
- mCursor.requery();
- mCount = mCursor.getCount() + mExtraOffset;
- notifyDataSetChanged();
- }
-
- /**
- * Update the bookmark's favicon. This is a convenience method for updating
- * a bookmark favicon for the originalUrl and url of the passed in WebView.
- * @param cr The ContentResolver to use.
- * @param originalUrl The original url before any redirects.
- * @param url The current url.
- * @param favicon The favicon bitmap to write to the db.
- */
- /* package */ static void updateBookmarkFavicon(final ContentResolver cr,
- final String originalUrl, final String url, final Bitmap favicon) {
- new AsyncTask<Void, Void, Void>() {
- protected Void doInBackground(Void... unused) {
- final Cursor c =
- queryBookmarksForUrl(cr, originalUrl, url, true);
- if (c == null) {
- return null;
- }
- if (c.moveToFirst()) {
- ContentValues values = new ContentValues();
- final ByteArrayOutputStream os =
- new ByteArrayOutputStream();
- favicon.compress(Bitmap.CompressFormat.PNG, 100, os);
- values.put(Browser.BookmarkColumns.FAVICON,
- os.toByteArray());
- do {
- cr.update(ContentUris.withAppendedId(
- Browser.BOOKMARKS_URI, c.getInt(0)),
- values, null, null);
- } while (c.moveToNext());
- }
- c.close();
- return null;
- }
- }.execute();
- }
-
- /* package */ static Cursor queryBookmarksForUrl(ContentResolver cr,
- String originalUrl, String url, boolean onlyBookmarks) {
- if (cr == null || url == null) {
- return null;
- }
-
- // If originalUrl is null, just set it to url.
- if (originalUrl == null) {
- originalUrl = url;
- }
-
- // Look for both the original url and the actual url. This takes in to
- // account redirects.
- String originalUrlNoQuery = removeQuery(originalUrl);
- String urlNoQuery = removeQuery(url);
- originalUrl = originalUrlNoQuery + '?';
- url = urlNoQuery + '?';
-
- // Use NoQuery to search for the base url (i.e. if the url is
- // http://www.yahoo.com/?rs=1, search for http://www.yahoo.com)
- // Use url to match the base url with other queries (i.e. if the url is
- // http://www.google.com/m, search for
- // http://www.google.com/m?some_query)
- final String[] selArgs = new String[] {
- originalUrlNoQuery, urlNoQuery, originalUrl, url };
- String where = BookmarkColumns.URL + " == ? OR "
- + BookmarkColumns.URL + " == ? OR "
- + BookmarkColumns.URL + " LIKE ? || '%' OR "
- + BookmarkColumns.URL + " LIKE ? || '%'";
- if (onlyBookmarks) {
- where = "(" + where + ") AND " + BookmarkColumns.BOOKMARK + " == 1";
- }
- final String[] projection =
- new String[] { Browser.BookmarkColumns._ID };
- return cr.query(Browser.BOOKMARKS_URI, projection, where, selArgs,
- null);
- }
-
- // Strip the query from the given url.
- private static String removeQuery(String url) {
- if (url == null) {
- return null;
- }
- int query = url.indexOf('?');
- String noQuery = url;
- if (query != -1) {
- noQuery = url.substring(0, query);
- }
- return noQuery;
- }
-
- /**
- * How many items should be displayed in the list.
- * @return Count of items.
- */
- public int getCount() {
- if (mDataValid) {
- return mCount;
+ tv.setText(cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE));
+ if (cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) != 0) {
+ // folder
+ thumb.setImageResource(R.drawable.ic_folder);
} else {
- return 0;
- }
- }
-
- public boolean areAllItemsEnabled() {
- return true;
- }
-
- public boolean isEnabled(int position) {
- return true;
- }
-
- /**
- * Get the data associated with the specified position in the list.
- * @param position Index of the item whose data we want.
- * @return The data at the specified position.
- */
- public Object getItem(int position) {
- return null;
- }
-
- /**
- * Get the row id associated with the specified position in the list.
- * @param position Index of the item whose row id we want.
- * @return The id of the item at the specified position.
- */
- public long getItemId(int position) {
- return position;
- }
-
- /* package */ void switchViewMode(BookmarkViewMode viewMode) {
- mViewMode = viewMode;
- }
-
- /* package */ void populateBookmarkItem(BookmarkItem b, int position) {
- mCursor.moveToPosition(position - mExtraOffset);
- String url = mCursor.getString(Browser.HISTORY_PROJECTION_URL_INDEX);
- b.setUrl(url);
- b.setName(mCursor.getString(Browser.HISTORY_PROJECTION_TITLE_INDEX));
- byte[] data = mCursor.getBlob(Browser.HISTORY_PROJECTION_FAVICON_INDEX);
- Bitmap bitmap = null;
- if (data == null) {
- bitmap = CombinedBookmarkHistoryActivity.getIconListenerSet()
- .getFavicon(url);
- } else {
- bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
- }
- b.setFavicon(bitmap);
- }
-
- /**
- * Get a View that displays the data at the specified position
- * in the list.
- * @param position Index of the item whose view we want.
- * @return A View corresponding to the data at the specified position.
- */
- public View getView(int position, View convertView, ViewGroup parent) {
- if (!mDataValid) {
- throw new IllegalStateException(
- "this should only be called when the cursor is valid");
- }
- if (position < 0 || position > mCount) {
- throw new AssertionError(
- "BrowserBookmarksAdapter tried to get a view out of range");
- }
- if (mViewMode == BookmarkViewMode.GRID) {
- if (convertView == null || convertView instanceof AddNewBookmark
- || convertView instanceof BookmarkItem) {
- LayoutInflater factory = LayoutInflater.from(mBookmarksPage);
- convertView
- = factory.inflate(R.layout.bookmark_thumbnail, null);
+ byte[] thumbData = cursor.getBlob(BookmarksLoader.COLUMN_INDEX_THUMBNAIL);
+ Bitmap thumbBitmap = null;
+ if (thumbData != null) {
+ thumbBitmap = BitmapFactory.decodeByteArray(thumbData, 0, thumbData.length);
}
- View holder = convertView.findViewById(R.id.holder);
- ImageView thumb = (ImageView) convertView.findViewById(R.id.thumb);
- TextView tv = (TextView) convertView.findViewById(R.id.label);
- if (0 == position && mNeedsOffset) {
- // This is to create a bookmark for the current page.
- holder.setVisibility(View.VISIBLE);
- tv.setText(mCurrentTitle);
-
- if (mCurrentThumbnail != null) {
- thumb.setImageBitmap(mCurrentThumbnail);
- } else {
- thumb.setImageResource(
- R.drawable.browser_thumbnail);
- }
- return convertView;
- }
- holder.setVisibility(View.GONE);
- mCursor.moveToPosition(position - mExtraOffset);
- tv.setText(mCursor.getString(
- Browser.HISTORY_PROJECTION_TITLE_INDEX));
- Bitmap thumbnail = getScreenshot(position);
- if (thumbnail == null) {
+ if (thumbBitmap == null) {
thumb.setImageResource(R.drawable.browser_thumbnail);
} else {
- thumb.setImageBitmap(thumbnail);
+ thumb.setImageBitmap(thumbBitmap);
+ }
+ }
+ }
+
+ void bindListView(View view, Context context, Cursor cursor) {
+ ImageView favicon = (ImageView) view.findViewById(R.id.favicon);
+ TextView tv = (TextView) view.findViewById(R.id.label);
+
+ tv.setText(cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE));
+ if (cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) != 0) {
+ // folder
+ favicon.setImageResource(R.drawable.ic_folder);
+ } else {
+ byte[] faviconData = cursor.getBlob(BookmarksLoader.COLUMN_INDEX_FAVICON);
+ Bitmap faviconBitmap = null;
+ if (faviconData != null) {
+ faviconBitmap = BitmapFactory.decodeByteArray(faviconData, 0, faviconData.length);
}
- return convertView;
-
- }
- if (position == 0 && mNeedsOffset) {
- AddNewBookmark b;
- if (convertView instanceof AddNewBookmark) {
- b = (AddNewBookmark) convertView;
+ if (faviconBitmap == null) {
+ favicon.setImageResource(R.drawable.app_web_browser_sm);
} else {
- b = new AddNewBookmark(mBookmarksPage);
+ favicon.setImageBitmap(faviconBitmap);
}
- b.setUrl(mCurrentPage);
- return b;
}
- if (mMostVisited) {
- if (convertView == null || !(convertView instanceof HistoryItem)) {
- convertView = new HistoryItem(mBookmarksPage);
- }
+ }
+
+ @Override
+ public View newView(Context context, Cursor cursor, ViewGroup parent) {
+ if (mCurrentView == BrowserBookmarksPage.VIEW_LIST) {
+ return mInflater.inflate(R.layout.bookmark_list, parent, false);
} else {
- if (convertView == null || !(convertView instanceof BookmarkItem)) {
- convertView = new BookmarkItem(mBookmarksPage);
- }
- }
- bind((BookmarkItem) convertView, position);
- if (mMostVisited) {
- ((HistoryItem) convertView).setIsBookmark(
- getIsBookmark(position));
- }
- return convertView;
- }
-
- /**
- * Return the title for this item in the list.
- */
- public String getTitle(int position) {
- return getString(Browser.HISTORY_PROJECTION_TITLE_INDEX, position);
- }
-
- /**
- * Return the Url for this item in the list.
- */
- public String getUrl(int position) {
- return getString(Browser.HISTORY_PROJECTION_URL_INDEX, position);
- }
-
- /**
- * Return the screenshot for this item in the list.
- */
- public Bitmap getScreenshot(int position) {
- return getBitmap(Browser.HISTORY_PROJECTION_THUMBNAIL_INDEX, position);
- }
-
- /**
- * Return the favicon for this item in the list.
- */
- public Bitmap getFavicon(int position) {
- return getBitmap(Browser.HISTORY_PROJECTION_FAVICON_INDEX, position);
- }
-
- public Bitmap getTouchIcon(int position) {
- return getBitmap(Browser.HISTORY_PROJECTION_TOUCH_ICON_INDEX, position);
- }
-
- private Bitmap getBitmap(int cursorIndex, int position) {
- if (position < mExtraOffset || position > mCount) {
- return null;
- }
- mCursor.moveToPosition(position - mExtraOffset);
- byte[] data = mCursor.getBlob(cursorIndex);
- if (data == null) {
- return null;
- }
- return BitmapFactory.decodeByteArray(data, 0, data.length);
- }
-
- /**
- * Return whether or not this item represents a bookmarked site.
- */
- public boolean getIsBookmark(int position) {
- if (position < mExtraOffset || position > mCount) {
- return false;
- }
- mCursor.moveToPosition(position - mExtraOffset);
- return (1 == mCursor.getInt(Browser.HISTORY_PROJECTION_BOOKMARK_INDEX));
- }
-
- /**
- * Private helper function to return the title or url.
- */
- private String getString(int cursorIndex, int position) {
- if (position < mExtraOffset || position > mCount) {
- return "";
- }
- mCursor.moveToPosition(position- mExtraOffset);
- return mCursor.getString(cursorIndex);
- }
-
- private void bind(BookmarkItem b, int position) {
- mCursor.moveToPosition(position- mExtraOffset);
-
- b.setName(mCursor.getString(Browser.HISTORY_PROJECTION_TITLE_INDEX));
- String url = mCursor.getString(Browser.HISTORY_PROJECTION_URL_INDEX);
- b.setUrl(url);
- byte[] data = mCursor.getBlob(Browser.HISTORY_PROJECTION_FAVICON_INDEX);
- if (data != null) {
- b.setFavicon(BitmapFactory.decodeByteArray(data, 0, data.length));
- } else {
- b.setFavicon(CombinedBookmarkHistoryActivity.getIconListenerSet()
- .getFavicon(url));
+ return mInflater.inflate(R.layout.bookmark_thumbnail, parent, false);
}
}
- private class ChangeObserver extends ContentObserver {
- public ChangeObserver() {
- super(new Handler(Looper.getMainLooper()));
+ public void selectView(int view) {
+ if (view != BrowserBookmarksPage.VIEW_LIST
+ && view != BrowserBookmarksPage.VIEW_THUMBNAILS) {
+ throw new IllegalArgumentException("Unknown view specified: " + view);
}
-
- @Override
- public boolean deliverSelfNotifications() {
- return true;
- }
-
- @Override
- public void onChange(boolean selfChange) {
- refreshList();
- }
+ mCurrentView = view;
}
-
- private class MyDataSetObserver extends DataSetObserver {
- @Override
- public void onChanged() {
- mDataValid = true;
- notifyDataSetChanged();
- }
- @Override
- public void onInvalidated() {
- mDataValid = false;
- notifyDataSetInvalidated();
- }
+ @Override
+ public Cursor getItem(int position) {
+ return (Cursor) super.getItem(position);
}
}
diff --git a/src/com/android/browser/BrowserBookmarksPage.java b/src/com/android/browser/BrowserBookmarksPage.java
index dd01009..1410ce8 100644
--- a/src/com/android/browser/BrowserBookmarksPage.java
+++ b/src/com/android/browser/BrowserBookmarksPage.java
@@ -18,89 +18,248 @@
import android.app.Activity;
import android.app.AlertDialog;
+import android.app.Fragment;
+import android.app.LoaderManager;
+import android.content.ClipData;
+import android.content.ClipboardManager;
+import android.content.ContentResolver;
+import android.content.ContentUris;
+import android.content.Context;
+import android.content.CursorLoader;
import android.content.DialogInterface;
import android.content.Intent;
+import android.content.Loader;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
+import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.graphics.Path;
-import android.graphics.PorterDuff;
-import android.graphics.PorterDuffXfermode;
-import android.graphics.Rect;
-import android.graphics.RectF;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.os.ServiceManager;
-import android.provider.Browser;
-import android.text.IClipboard;
-import android.util.Log;
+import android.preference.PreferenceManager;
+import android.provider.BrowserContract;
+import android.provider.BrowserContract.Accounts;
+import android.text.TextUtils;
import android.view.ContextMenu;
-import android.view.Menu;
+import android.view.ContextMenu.ContextMenuInfo;
+import android.view.LayoutInflater;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
+import android.view.View.OnClickListener;
import android.view.ViewGroup;
-import android.view.ContextMenu.ContextMenuInfo;
import android.webkit.WebIconDatabase.IconListener;
+import android.widget.Adapter;
import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.GridView;
import android.widget.ListView;
+import android.widget.PopupMenu.OnMenuItemClickListener;
+import android.widget.TextView;
import android.widget.Toast;
-/*package*/ enum BookmarkViewMode { NONE, GRID, LIST }
+interface BookmarksPageCallbacks {
+ // Return true if handled
+ boolean onBookmarkSelected(Cursor c, boolean isFolder);
+ // Return true if handled
+ boolean onOpenInNewWindow(Cursor c);
+ void onFolderChanged(int level, Uri uri);
+}
+
/**
* View showing the user's bookmarks in the browser.
*/
-public class BrowserBookmarksPage extends Activity implements
- View.OnCreateContextMenuListener {
+public class BrowserBookmarksPage extends Fragment implements View.OnCreateContextMenuListener,
+ LoaderManager.LoaderCallbacks<Cursor>, OnItemClickListener, IconListener,
+ OnItemSelectedListener, BreadCrumbView.Controller, OnClickListener, OnMenuItemClickListener {
- private BookmarkViewMode mViewMode = BookmarkViewMode.NONE;
- private GridView mGridPage;
- private ListView mVerticalList;
- private BrowserBookmarksAdapter mBookmarksAdapter;
- private static final int BOOKMARKS_SAVE = 1;
- private boolean mDisableNewWindow;
- private BookmarkItem mContextHeader;
- private AddNewBookmark mAddHeader;
- private boolean mCanceled = false;
- private boolean mCreateShortcut;
- private boolean mMostVisited;
- private View mEmptyView;
- private int mIconSize;
- // XXX: There is no public string defining this intent so if Home changes
- // the value, we have to update this string.
- private static final String INSTALL_SHORTCUT =
- "com.android.launcher.action.INSTALL_SHORTCUT";
+ static final String LOGTAG = "browser";
- private final static String LOGTAG = "browser";
- private final static String PREF_BOOKMARK_VIEW_MODE = "pref_bookmark_view_mode";
- private final static String PREF_MOST_VISITED_VIEW_MODE = "pref_most_visited_view_mode";
+ static final int LOADER_BOOKMARKS = 1;
+ static final int LOADER_ACCOUNTS_THEN_BOOKMARKS = 2;
+
+ static final String EXTRA_DISABLE_WINDOW = "disable_new_window";
+
+ static final String ACCOUNT_NAME_UNSYNCED = "Unsynced";
+
+ public static final String PREF_ACCOUNT_TYPE = "acct_type";
+ public static final String PREF_ACCOUNT_NAME = "acct_name";
+
+ static final String DEFAULT_ACCOUNT = "local";
+ static final int VIEW_THUMBNAILS = 1;
+ static final int VIEW_LIST = 2;
+ static final String PREF_SELECTED_VIEW = "bookmarks_view";
+
+ BookmarksPageCallbacks mCallbacks;
+ GridView mGrid;
+ ListView mList;
+ BrowserBookmarksAdapter mAdapter;
+ boolean mDisableNewWindow;
+ boolean mCanceled = false;
+ boolean mEnableContextMenu = true;
+ boolean mShowRootFolder = false;
+ View mEmptyView;
+ int mCurrentView;
+ View mHeader;
+ ViewGroup mHeaderContainer;
+ BreadCrumbView mCrumbs;
+ TextView mSelectBookmarkView;
+ int mCrumbVisibility = View.VISIBLE;
+ int mCrumbMaxVisible = -1;
+ boolean mCrumbBackButton = false;
+
+ static BrowserBookmarksPage newInstance(BookmarksPageCallbacks cb,
+ Bundle args, ViewGroup headerContainer) {
+ BrowserBookmarksPage bbp = new BrowserBookmarksPage();
+ bbp.mCallbacks = cb;
+ bbp.mHeaderContainer = headerContainer;
+ bbp.setArguments(args);
+ return bbp;
+ }
+
+ @Override
+ public Loader<Cursor> onCreateLoader(int id, Bundle args) {
+ switch (id) {
+ case LOADER_BOOKMARKS: {
+ String accountType = null;
+ String accountName = null;
+ if (args != null) {
+ accountType = args.getString(BookmarksLoader.ARG_ACCOUNT_TYPE);
+ accountName = args.getString(BookmarksLoader.ARG_ACCOUNT_NAME);
+ }
+ BookmarksLoader bl = new BookmarksLoader(getActivity(), accountType, accountName);
+ if (mCrumbs != null) {
+ Uri uri = (Uri) mCrumbs.getTopData();
+ if (uri != null) {
+ bl.setUri(uri);
+ }
+ }
+ return bl;
+ }
+ case LOADER_ACCOUNTS_THEN_BOOKMARKS: {
+ return new CursorLoader(getActivity(), Accounts.CONTENT_URI,
+ new String[] { Accounts.ACCOUNT_TYPE, Accounts.ACCOUNT_NAME }, null, null,
+ null);
+ }
+ }
+ throw new UnsupportedOperationException("Unknown loader id " + id);
+ }
+
+ @Override
+ public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
+ switch (loader.getId()) {
+ case LOADER_BOOKMARKS: {
+ // Set the visibility of the empty vs. content views
+ if (cursor == null || cursor.getCount() == 0) {
+ mEmptyView.setVisibility(View.VISIBLE);
+ mGrid.setVisibility(View.GONE);
+ mList.setVisibility(View.GONE);
+ } else {
+ mEmptyView.setVisibility(View.GONE);
+ setupBookmarkView();
+ }
+
+ // Give the new data to the adapter
+ mAdapter.changeCursor(cursor);
+ break;
+ }
+
+ case LOADER_ACCOUNTS_THEN_BOOKMARKS: {
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(
+ getActivity());
+ String storedAccountType = prefs.getString(PREF_ACCOUNT_TYPE, null);
+ String storedAccountName = prefs.getString(PREF_ACCOUNT_NAME, null);
+ String accountType =
+ TextUtils.isEmpty(storedAccountType) ? DEFAULT_ACCOUNT : storedAccountType;
+ String accountName =
+ TextUtils.isEmpty(storedAccountName) ? DEFAULT_ACCOUNT : storedAccountName;
+
+ Bundle args = null;
+ if (cursor == null || !cursor.moveToFirst()) {
+ // No accounts, set the prefs to the default
+ accountType = DEFAULT_ACCOUNT;
+ accountName = DEFAULT_ACCOUNT;
+ } else {
+ int accountPosition = -1;
+
+ if (!DEFAULT_ACCOUNT.equals(accountType) &&
+ !DEFAULT_ACCOUNT.equals(accountName)) {
+ // Check to see if the account in prefs still exists
+ cursor.moveToFirst();
+ do {
+ if (accountType.equals(cursor.getString(0))
+ && accountName.equals(cursor.getString(1))) {
+ accountPosition = cursor.getPosition();
+ break;
+ }
+ } while (cursor.moveToNext());
+ }
+
+ if (accountPosition == -1) {
+ if (!(DEFAULT_ACCOUNT.equals(accountType)
+ && DEFAULT_ACCOUNT.equals(accountName))) {
+ // No account is set in prefs and there is at least one,
+ // so pick the first one as the default
+ cursor.moveToFirst();
+ accountType = cursor.getString(0);
+ accountName = cursor.getString(1);
+ }
+ }
+
+ args = new Bundle();
+ args.putString(BookmarksLoader.ARG_ACCOUNT_TYPE, accountType);
+ args.putString(BookmarksLoader.ARG_ACCOUNT_NAME, accountName);
+ }
+
+ // The stored account name wasn't found, update the stored account with a valid one
+ if (!accountType.equals(storedAccountType)
+ || !accountName.equals(storedAccountName)) {
+ prefs.edit()
+ .putString(PREF_ACCOUNT_TYPE, accountType)
+ .putString(PREF_ACCOUNT_NAME, accountName)
+ .apply();
+ }
+ getLoaderManager().initLoader(LOADER_BOOKMARKS, args, this);
+
+ break;
+ }
+ }
+ }
+
+ long getFolderId() {
+ LoaderManager manager = getLoaderManager();
+ BookmarksLoader loader =
+ (BookmarksLoader) ((Loader<?>)manager.getLoader(LOADER_BOOKMARKS));
+
+ Uri uri = loader.getUri();
+ if (uri != null) {
+ try {
+ return ContentUris.parseId(uri);
+ } catch (NumberFormatException nfx) {
+ return -1;
+ }
+ }
+ return -1;
+ }
@Override
public boolean onContextItemSelected(MenuItem item) {
+ final Activity activity = getActivity();
// It is possible that the view has been canceled when we get to
// this point as back has a higher priority
if (mCanceled) {
- return true;
+ return false;
}
AdapterView.AdapterContextMenuInfo i =
(AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
// If we have no menu info, we can't tell which item was selected.
if (i == null) {
- return true;
+ return false;
}
switch (item.getItemId()) {
- case R.id.new_context_menu_id:
- saveCurrentPage();
- break;
case R.id.open_context_menu_id:
loadUrl(i.position);
break;
@@ -108,652 +267,519 @@
editBookmark(i.position);
break;
case R.id.shortcut_context_menu_id:
- final Intent send = createShortcutIntent(i.position);
- send.setAction(INSTALL_SHORTCUT);
- sendBroadcast(send);
+ Cursor c = mAdapter.getItem(i.position);
+ activity.sendBroadcast(createShortcutIntent(getActivity(), c));
break;
case R.id.delete_context_menu_id:
- if (mMostVisited) {
- Browser.deleteFromHistory(getContentResolver(),
- getUrl(i.position));
- refreshList();
- } else {
- displayRemoveBookmarkDialog(i.position);
- }
+ displayRemoveBookmarkDialog(i.position);
break;
case R.id.new_window_context_menu_id:
openInNewWindow(i.position);
break;
- case R.id.share_link_context_menu_id:
- BrowserActivity.sharePage(BrowserBookmarksPage.this,
- mBookmarksAdapter.getTitle(i.position), getUrl(i.position),
- getFavicon(i.position),
- mBookmarksAdapter.getScreenshot(i.position));
+ case R.id.share_link_context_menu_id: {
+ Cursor cursor = mAdapter.getItem(i.position);
+ Controller.sharePage(activity,
+ cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE),
+ cursor.getString(BookmarksLoader.COLUMN_INDEX_URL),
+ getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_FAVICON),
+ getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_THUMBNAIL));
break;
+ }
case R.id.copy_url_context_menu_id:
copy(getUrl(i.position));
break;
- case R.id.homepage_context_menu_id:
- BrowserSettings.getInstance().setHomePage(this,
- getUrl(i.position));
- Toast.makeText(this, R.string.homepage_set,
- Toast.LENGTH_LONG).show();
+ case R.id.homepage_context_menu_id: {
+ BrowserSettings.getInstance().setHomePage(activity, getUrl(i.position));
+ Toast.makeText(activity, R.string.homepage_set, Toast.LENGTH_LONG).show();
break;
+ }
// Only for the Most visited page
- case R.id.save_to_bookmarks_menu_id:
- boolean isBookmark;
- String name;
- String url;
- if (mViewMode == BookmarkViewMode.GRID) {
- isBookmark = mBookmarksAdapter.getIsBookmark(i.position);
- name = mBookmarksAdapter.getTitle(i.position);
- url = mBookmarksAdapter.getUrl(i.position);
- } else {
- HistoryItem historyItem = ((HistoryItem) i.targetView);
- isBookmark = historyItem.isBookmark();
- name = historyItem.getName();
- url = historyItem.getUrl();
- }
+ case R.id.save_to_bookmarks_menu_id: {
+ Cursor cursor = mAdapter.getItem(i.position);
+ String name = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
+ String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
// If the site is bookmarked, the item becomes remove from
// bookmarks.
- if (isBookmark) {
- Bookmarks.removeFromBookmarks(this, getContentResolver(), url, name);
- } else {
- Browser.saveBookmark(this, name, url);
- }
+ Bookmarks.removeFromBookmarks(activity, activity.getContentResolver(), url, name);
break;
+ }
default:
return super.onContextItemSelected(item);
}
return true;
}
- @Override
- public void onCreateContextMenu(ContextMenu menu, View v,
- ContextMenuInfo menuInfo) {
- AdapterView.AdapterContextMenuInfo i =
- (AdapterView.AdapterContextMenuInfo) menuInfo;
-
- MenuInflater inflater = getMenuInflater();
- if (mMostVisited) {
- inflater.inflate(R.menu.historycontext, menu);
- } else {
- inflater.inflate(R.menu.bookmarkscontext, menu);
- }
-
- if (0 == i.position && !mMostVisited) {
- menu.setGroupVisible(R.id.CONTEXT_MENU, false);
- if (mAddHeader == null) {
- mAddHeader = new AddNewBookmark(BrowserBookmarksPage.this);
- } else if (mAddHeader.getParent() != null) {
- ((ViewGroup) mAddHeader.getParent()).
- removeView(mAddHeader);
- }
- mAddHeader.setUrl(getIntent().getStringExtra("url"));
- menu.setHeaderView(mAddHeader);
- return;
- }
- if (mMostVisited) {
- if ((mViewMode == BookmarkViewMode.LIST
- && ((HistoryItem) i.targetView).isBookmark())
- || mBookmarksAdapter.getIsBookmark(i.position)) {
- MenuItem item = menu.findItem(
- R.id.save_to_bookmarks_menu_id);
- item.setTitle(R.string.remove_from_bookmarks);
- }
- } else {
- // The historycontext menu has no ADD_MENU group.
- menu.setGroupVisible(R.id.ADD_MENU, false);
- }
- if (mDisableNewWindow) {
- menu.findItem(R.id.new_window_context_menu_id).setVisible(
- false);
- }
- if (mContextHeader == null) {
- mContextHeader = new BookmarkItem(BrowserBookmarksPage.this);
- } else if (mContextHeader.getParent() != null) {
- ((ViewGroup) mContextHeader.getParent()).
- removeView(mContextHeader);
- }
- if (mViewMode == BookmarkViewMode.GRID) {
- mBookmarksAdapter.populateBookmarkItem(mContextHeader,
- i.position);
- } else {
- BookmarkItem b = (BookmarkItem) i.targetView;
- b.copyTo(mContextHeader);
- }
- menu.setHeaderView(mContextHeader);
+ static Bitmap getBitmap(Cursor cursor, int columnIndex) {
+ byte[] data = cursor.getBlob(columnIndex);
+ if (data == null) {
+ return null;
}
+ return BitmapFactory.decodeByteArray(data, 0, data.length);
+ }
+
+ private MenuItem.OnMenuItemClickListener mContextItemClickListener =
+ new MenuItem.OnMenuItemClickListener() {
+ @Override
+ public boolean onMenuItemClick(MenuItem item) {
+ return onContextItemSelected(item);
+ }
+ };
+
+ @Override
+ public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
+ AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
+ Cursor cursor = mAdapter.getItem(info.position);
+ boolean isFolder
+ = cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) != 0;
+
+ final Activity activity = getActivity();
+ MenuInflater inflater = activity.getMenuInflater();
+ inflater.inflate(R.menu.bookmarkscontext, menu);
+ if (isFolder) {
+ menu.setGroupVisible(R.id.FOLDER_CONTEXT_MENU, true);
+ } else {
+ menu.setGroupVisible(R.id.BOOKMARK_CONTEXT_MENU, true);
+ if (mDisableNewWindow) {
+ menu.findItem(R.id.new_window_context_menu_id).setVisible(false);
+ }
+ }
+ BookmarkItem header = new BookmarkItem(activity);
+ populateBookmarkItem(cursor, header, isFolder);
+ menu.setHeaderView(header);
+
+ int count = menu.size();
+ for (int i = 0; i < count; i++) {
+ menu.getItem(i).setOnMenuItemClickListener(mContextItemClickListener);
+ }
+ }
+
+ private void populateBookmarkItem(Cursor cursor, BookmarkItem item, boolean isFolder) {
+ item.setName(cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE));
+ if (isFolder) {
+ item.setUrl(null);
+ Bitmap bitmap =
+ BitmapFactory.decodeResource(getResources(), R.drawable.ic_folder);
+ item.setFavicon(bitmap);
+ new LookupBookmarkCount(getActivity(), item)
+ .execute(cursor.getLong(BookmarksLoader.COLUMN_INDEX_ID));
+ } else {
+ String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
+ item.setUrl(url);
+ Bitmap bitmap = getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_FAVICON);
+ if (bitmap == null) {
+ bitmap = CombinedBookmarkHistoryView.getIconListenerSet().getFavicon(url);
+ }
+ item.setFavicon(bitmap);
+ }
+ }
/**
* Create a new BrowserBookmarksPage.
*/
@Override
- protected void onCreate(Bundle icicle) {
+ public void onCreate(Bundle icicle) {
super.onCreate(icicle);
- // Grab the app icon size as a resource.
- mIconSize = getResources().getDimensionPixelSize(
- android.R.dimen.app_icon_size);
-
- Intent intent = getIntent();
- if (Intent.ACTION_CREATE_SHORTCUT.equals(intent.getAction())) {
- mCreateShortcut = true;
- }
- mDisableNewWindow = intent.getBooleanExtra("disable_new_window",
- false);
- mMostVisited = intent.getBooleanExtra("mostVisited", false);
-
- if (mCreateShortcut) {
- setTitle(R.string.browser_bookmarks_page_bookmarks_text);
- }
-
- setContentView(R.layout.empty_history);
- mEmptyView = findViewById(R.id.empty_view);
- mEmptyView.setVisibility(View.GONE);
-
- SharedPreferences p = getPreferences(MODE_PRIVATE);
-
- // See if the user has set a preference for the view mode of their
- // bookmarks. Otherwise default to grid mode.
- BookmarkViewMode preference = BookmarkViewMode.NONE;
- if (mMostVisited) {
- // For the most visited page, only use list mode.
- preference = BookmarkViewMode.LIST;
- } else {
- preference = BookmarkViewMode.values()[p.getInt(
- PREF_BOOKMARK_VIEW_MODE, BookmarkViewMode.GRID.ordinal())];
- }
- switchViewMode(preference);
-
- final boolean createShortcut = mCreateShortcut;
- final boolean mostVisited = mMostVisited;
- final String url = intent.getStringExtra("url");
- final String title = intent.getStringExtra("title");
- final Bitmap thumbnail =
- (Bitmap) intent.getParcelableExtra("thumbnail");
- new AsyncTask<Void, Void, Void>() {
- @Override
- protected Void doInBackground(Void... unused) {
- BrowserBookmarksAdapter adapter = new BrowserBookmarksAdapter(
- BrowserBookmarksPage.this,
- url,
- title,
- thumbnail,
- createShortcut,
- mostVisited);
- mHandler.obtainMessage(ADAPTER_CREATED, adapter).sendToTarget();
- return null;
- }
- }.execute();
+ Bundle args = getArguments();
+ mDisableNewWindow = args == null ? false : args.getBoolean(EXTRA_DISABLE_WINDOW, false);
}
@Override
- protected void onDestroy() {
- mHandler.removeCallbacksAndMessages(null);
- super.onDestroy();
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ Context context = getActivity();
+
+ View root = inflater.inflate(R.layout.bookmarks, container, false);
+ mEmptyView = root.findViewById(android.R.id.empty);
+
+ mGrid = (GridView) root.findViewById(R.id.grid);
+ mGrid.setOnItemClickListener(this);
+ mGrid.setColumnWidth(Controller.getDesiredThumbnailWidth(getActivity()));
+ mList = (ListView) root.findViewById(R.id.list);
+ mList.setOnItemClickListener(this);
+ setEnableContextMenu(mEnableContextMenu);
+
+ // Prep the header
+ ViewGroup hc = mHeaderContainer;
+ if (hc == null) {
+ hc = (ViewGroup) root.findViewById(R.id.header_container);
+ hc.setVisibility(View.VISIBLE);
+ }
+ mHeader = inflater.inflate(R.layout.bookmarks_header, hc, false);
+ hc.addView(mHeader);
+ mCrumbs = (BreadCrumbView) mHeader.findViewById(R.id.crumbs);
+ mCrumbs.setController(this);
+ mCrumbs.setUseBackButton(mCrumbBackButton);
+ mCrumbs.setMaxVisible(mCrumbMaxVisible);
+ mCrumbs.setVisibility(mCrumbVisibility);
+ String name = getString(R.string.bookmarks);
+ mCrumbs.pushView(name, false, BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER);
+ if (mCallbacks != null) {
+ mCallbacks.onFolderChanged(1, BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER);
+ }
+ mSelectBookmarkView = (TextView) mHeader.findViewById(R.id.select_bookmark_view);
+ mSelectBookmarkView.setOnClickListener(this);
+
+ // Start the loaders
+ LoaderManager lm = getLoaderManager();
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+ mCurrentView =
+ prefs.getInt(PREF_SELECTED_VIEW, BrowserBookmarksPage.VIEW_THUMBNAILS);
+ if (mCurrentView == BrowserBookmarksPage.VIEW_THUMBNAILS) {
+ mSelectBookmarkView.setText(R.string.bookmark_list_view);
+ } else {
+ mSelectBookmarkView.setText(R.string.bookmark_thumbnail_view);
+ }
+ mAdapter = new BrowserBookmarksAdapter(getActivity(), mCurrentView);
+ String accountType = prefs.getString(PREF_ACCOUNT_TYPE, DEFAULT_ACCOUNT);
+ String accountName = prefs.getString(PREF_ACCOUNT_NAME, DEFAULT_ACCOUNT);
+ if (!TextUtils.isEmpty(accountType) && !TextUtils.isEmpty(accountName)) {
+ // There is an account set, load up that one
+ Bundle args = null;
+ if (!DEFAULT_ACCOUNT.equals(accountType) && !DEFAULT_ACCOUNT.equals(accountName)) {
+ args = new Bundle();
+ args.putString(BookmarksLoader.ARG_ACCOUNT_TYPE, accountType);
+ args.putString(BookmarksLoader.ARG_ACCOUNT_NAME, accountName);
+ }
+ lm.restartLoader(LOADER_BOOKMARKS, args, this);
+ } else {
+ // No account set, load the account list first
+ lm.restartLoader(LOADER_ACCOUNTS_THEN_BOOKMARKS, null, this);
+ }
+
+ // Add our own listener in case there are favicons that have yet to be loaded.
+ CombinedBookmarkHistoryView.getIconListenerSet().addListener(this);
+
+ return root;
}
- /**
- * Set the ContentView to be either the grid of thumbnails or the vertical
- * list.
- */
- private void switchViewMode(BookmarkViewMode viewMode) {
- if (mViewMode == viewMode) {
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ if (mHeaderContainer != null) {
+ mHeaderContainer.removeView(mHeader);
+ }
+ mCrumbs.setController(null);
+ mCrumbs = null;
+ }
+
+ @Override
+ public void onReceivedIcon(String url, Bitmap icon) {
+ // A new favicon has been loaded, so let anything attached to the adapter know about it
+ // so new icons will be loaded.
+ mAdapter.notifyDataSetChanged();
+ }
+
+ @Override
+ public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
+ // It is possible that the view has been canceled when we get to
+ // this point as back has a higher priority
+ if (mCanceled) {
+ android.util.Log.e(LOGTAG, "item clicked when dismissing");
return;
}
- mViewMode = viewMode;
-
- // Update the preferences to make the new view mode sticky.
- Editor ed = getPreferences(MODE_PRIVATE).edit();
- if (mMostVisited) {
- ed.putInt(PREF_MOST_VISITED_VIEW_MODE, mViewMode.ordinal());
- } else {
- ed.putInt(PREF_BOOKMARK_VIEW_MODE, mViewMode.ordinal());
+ Cursor cursor = mAdapter.getItem(position);
+ boolean isFolder = cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) != 0;
+ if (mCallbacks != null &&
+ mCallbacks.onBookmarkSelected(cursor, isFolder)) {
+ return;
}
- ed.apply();
- if (mBookmarksAdapter != null) {
- mBookmarksAdapter.switchViewMode(viewMode);
- }
- if (mViewMode == BookmarkViewMode.GRID) {
- if (mGridPage == null) {
- mGridPage = new GridView(this);
- if (mBookmarksAdapter != null) {
- mGridPage.setAdapter(mBookmarksAdapter);
- }
- mGridPage.setOnItemClickListener(mListener);
- mGridPage.setNumColumns(GridView.AUTO_FIT);
- mGridPage.setColumnWidth(
- BrowserActivity.getDesiredThumbnailWidth(this));
- mGridPage.setFocusable(true);
- mGridPage.setFocusableInTouchMode(true);
- mGridPage.setSelector(android.R.drawable.gallery_thumb);
- float density = getResources().getDisplayMetrics().density;
- mGridPage.setVerticalSpacing((int) (14 * density));
- mGridPage.setHorizontalSpacing((int) (8 * density));
- mGridPage.setStretchMode(GridView.STRETCH_SPACING);
- mGridPage.setScrollBarStyle(View.SCROLLBARS_INSIDE_INSET);
- mGridPage.setDrawSelectorOnTop(true);
- if (mMostVisited) {
- mGridPage.setEmptyView(mEmptyView);
- }
- if (!mCreateShortcut) {
- mGridPage.setOnCreateContextMenuListener(this);
- }
+ if (isFolder) {
+ String title = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
+ Uri uri = ContentUris.withAppendedId(
+ BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER, id);
+ if (mCrumbs != null) {
+ // update crumbs
+ mCrumbs.pushView(title, uri);
}
- addContentView(mGridPage, FULL_SCREEN_PARAMS);
- if (mVerticalList != null) {
- ViewGroup parent = (ViewGroup) mVerticalList.getParent();
- if (parent != null) {
- parent.removeView(mVerticalList);
- }
- }
- } else {
- if (null == mVerticalList) {
- ListView listView = new ListView(this);
- if (mBookmarksAdapter != null) {
- listView.setAdapter(mBookmarksAdapter);
- }
- listView.setDrawSelectorOnTop(false);
- listView.setVerticalScrollBarEnabled(true);
- listView.setOnItemClickListener(mListener);
- if (mMostVisited) {
- listView.setEmptyView(mEmptyView);
- }
- if (!mCreateShortcut) {
- listView.setOnCreateContextMenuListener(this);
- }
- mVerticalList = listView;
- }
- addContentView(mVerticalList, FULL_SCREEN_PARAMS);
- if (mGridPage != null) {
- ViewGroup parent = (ViewGroup) mGridPage.getParent();
- if (parent != null) {
- parent.removeView(mGridPage);
- }
- }
+ loadFolder(uri);
}
}
- private static final ViewGroup.LayoutParams FULL_SCREEN_PARAMS
- = new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.MATCH_PARENT);
+ @Override
+ public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
+ Adapter adapter = parent.getAdapter();
+ String accountType = "com.google";
+ String accountName = adapter.getItem(position).toString();
- private static final int SAVE_CURRENT_PAGE = 1000;
- private static final int ADAPTER_CREATED = 1001;
- private final Handler mHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case SAVE_CURRENT_PAGE:
- saveCurrentPage();
- break;
- case ADAPTER_CREATED:
- mBookmarksAdapter = (BrowserBookmarksAdapter) msg.obj;
- mBookmarksAdapter.switchViewMode(mViewMode);
- if (mGridPage != null) {
- mGridPage.setAdapter(mBookmarksAdapter);
- }
- if (mVerticalList != null) {
- mVerticalList.setAdapter(mBookmarksAdapter);
- }
- // Add our own listener in case there are favicons that
- // have yet to be loaded.
- if (mMostVisited) {
- IconListener listener = new IconListener() {
- public void onReceivedIcon(String url,
- Bitmap icon) {
- if (mGridPage != null) {
- mGridPage.setAdapter(mBookmarksAdapter);
- }
- if (mVerticalList != null) {
- mVerticalList.setAdapter(mBookmarksAdapter);
- }
- }
- };
- CombinedBookmarkHistoryActivity.getIconListenerSet()
- .addListener(listener);
- }
- break;
- }
- }
- };
-
- private AdapterView.OnItemClickListener mListener = new AdapterView.OnItemClickListener() {
- public void onItemClick(AdapterView parent, View v, int position, long id) {
- // It is possible that the view has been canceled when we get to
- // this point as back has a higher priority
- if (mCanceled) {
- android.util.Log.e(LOGTAG, "item clicked when dismissing");
- return;
- }
- if (!mCreateShortcut) {
- if (0 == position && !mMostVisited) {
- // XXX: Work-around for a framework issue.
- mHandler.sendEmptyMessage(SAVE_CURRENT_PAGE);
- } else {
- loadUrl(position);
- }
- } else {
- final Intent intent = createShortcutIntent(position);
- setResultToParent(RESULT_OK, intent);
- finish();
- }
- }
- };
-
- private Intent createShortcutIntent(int position) {
- String url = getUrl(position);
- String title = getBookmarkTitle(position);
- Bitmap touchIcon = getTouchIcon(position);
-
- final Intent i = new Intent();
- final Intent shortcutIntent = new Intent(Intent.ACTION_VIEW,
- Uri.parse(url));
- long urlHash = url.hashCode();
- long uniqueId = (urlHash << 32) | shortcutIntent.hashCode();
- shortcutIntent.putExtra(Browser.EXTRA_APPLICATION_ID,
- Long.toString(uniqueId));
- i.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
- i.putExtra(Intent.EXTRA_SHORTCUT_NAME, title);
- // Use the apple-touch-icon if available
- if (touchIcon != null) {
- // Make a copy so we can modify the pixels. We can't use
- // createScaledBitmap or copy since they will preserve the config
- // and lose the ability to add alpha.
- Bitmap bm = Bitmap.createBitmap(mIconSize, mIconSize,
- Bitmap.Config.ARGB_8888);
- Canvas canvas = new Canvas(bm);
- Rect src = new Rect(0, 0, touchIcon.getWidth(),
- touchIcon.getHeight());
- Rect dest = new Rect(0, 0, bm.getWidth(), bm.getHeight());
-
- // Paint used for scaling the bitmap and drawing the rounded rect.
- Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
- paint.setFilterBitmap(true);
- canvas.drawBitmap(touchIcon, src, dest, paint);
-
- // Construct a path from a round rect. This will allow drawing with
- // an inverse fill so we can punch a hole using the round rect.
- Path path = new Path();
- path.setFillType(Path.FillType.INVERSE_WINDING);
- RectF rect = new RectF(0, 0, bm.getWidth(), bm.getHeight());
- rect.inset(1, 1);
- path.addRoundRect(rect, 8f, 8f, Path.Direction.CW);
-
- // Reuse the paint and clear the outside of the rectangle.
- paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
- canvas.drawPath(path, paint);
-
- i.putExtra(Intent.EXTRA_SHORTCUT_ICON, bm);
+ Bundle args = null;
+ if (ACCOUNT_NAME_UNSYNCED.equals(accountName)) {
+ accountType = DEFAULT_ACCOUNT;
+ accountName = DEFAULT_ACCOUNT;
} else {
- Bitmap favicon = getFavicon(position);
- if (favicon == null) {
- i.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
- Intent.ShortcutIconResource.fromContext(
- BrowserBookmarksPage.this,
- R.drawable.ic_launcher_shortcut_browser_bookmark));
- } else {
- Bitmap icon = BitmapFactory.decodeResource(getResources(),
- R.drawable.ic_launcher_shortcut_browser_bookmark_icon);
-
- // Make a copy of the regular icon so we can modify the pixels.
- Bitmap copy = icon.copy(Bitmap.Config.ARGB_8888, true);
- Canvas canvas = new Canvas(copy);
-
- // Make a Paint for the white background rectangle and for
- // filtering the favicon.
- Paint p = new Paint(Paint.ANTI_ALIAS_FLAG
- | Paint.FILTER_BITMAP_FLAG);
- p.setStyle(Paint.Style.FILL_AND_STROKE);
- p.setColor(Color.WHITE);
-
- final float density =
- getResources().getDisplayMetrics().density;
- // Create a rectangle that is slightly wider than the favicon
- final float iconSize = 16 * density; // 16x16 favicon
- final float padding = 2 * density; // white padding around icon
- final float rectSize = iconSize + 2 * padding;
-
- final Rect iconBounds =
- new Rect(0, 0, icon.getWidth(), icon.getHeight());
- final float x = iconBounds.exactCenterX() - (rectSize / 2);
- // Note: Subtract 2 dip from the y position since the box is
- // slightly higher than center. Use padding since it is already
- // 2 * density.
- final float y = iconBounds.exactCenterY() - (rectSize / 2)
- - padding;
- RectF r = new RectF(x, y, x + rectSize, y + rectSize);
-
- // Draw a white rounded rectangle behind the favicon
- canvas.drawRoundRect(r, 2, 2, p);
-
- // Draw the favicon in the same rectangle as the rounded
- // rectangle but inset by the padding
- // (results in a 16x16 favicon).
- r.inset(padding, padding);
- canvas.drawBitmap(favicon, null, r, p);
- i.putExtra(Intent.EXTRA_SHORTCUT_ICON, copy);
- }
+ args = new Bundle();
+ args.putString(BookmarksLoader.ARG_ACCOUNT_TYPE, accountType);
+ args.putString(BookmarksLoader.ARG_ACCOUNT_NAME, accountName);
}
- // Do not allow duplicate items
- i.putExtra("duplicate", false);
- return i;
+
+ // Remember the selection for later
+ PreferenceManager.getDefaultSharedPreferences(getActivity()).edit()
+ .putString(PREF_ACCOUNT_TYPE, accountType)
+ .putString(PREF_ACCOUNT_NAME, accountName)
+ .apply();
+
+ getLoaderManager().restartLoader(LOADER_BOOKMARKS, args, this);
}
- private void saveCurrentPage() {
- Intent i = new Intent(BrowserBookmarksPage.this,
- AddBookmarkPage.class);
- i.putExtras(getIntent());
- startActivityForResult(i, BOOKMARKS_SAVE);
+ @Override
+ public void onNothingSelected(AdapterView<?> parent) {
+ // Do nothing
+ }
+
+ /* package */ static Intent createShortcutIntent(Context context, Cursor cursor) {
+ String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
+ String title = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
+ Bitmap touchIcon = getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_TOUCH_ICON);
+ Bitmap favicon = getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_FAVICON);
+ return BookmarkUtils.createAddToHomeIntent(context, url, title, touchIcon, favicon);
}
private void loadUrl(int position) {
- Intent intent = (new Intent()).setAction(getUrl(position));
- setResultToParent(RESULT_OK, intent);
- finish();
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- boolean result = super.onCreateOptionsMenu(menu);
- if (!mCreateShortcut && !mMostVisited) {
- MenuInflater inflater = getMenuInflater();
- inflater.inflate(R.menu.bookmarks, menu);
- return true;
+ if (mCallbacks != null) {
+ mCallbacks.onBookmarkSelected(mAdapter.getItem(position), false);
}
- return result;
- }
-
- @Override
- public boolean onPrepareOptionsMenu(Menu menu) {
- boolean result = super.onPrepareOptionsMenu(menu);
- if (mCreateShortcut || mMostVisited || mBookmarksAdapter == null
- || mBookmarksAdapter.getCount() == 0) {
- // No need to show the menu if there are no items.
- return result;
- }
- MenuItem switchItem = menu.findItem(R.id.switch_mode_menu_id);
- int titleResId;
- int iconResId;
- if (mViewMode == BookmarkViewMode.GRID) {
- titleResId = R.string.switch_to_list;
- iconResId = R.drawable.ic_menu_list;
- } else {
- titleResId = R.string.switch_to_thumbnails;
- iconResId = R.drawable.ic_menu_thumbnail;
- }
- switchItem.setTitle(titleResId);
- switchItem.setIcon(iconResId);
- return true;
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.new_context_menu_id:
- saveCurrentPage();
- break;
-
- case R.id.switch_mode_menu_id:
- if (mViewMode == BookmarkViewMode.GRID) {
- switchViewMode(BookmarkViewMode.LIST);
- } else {
- switchViewMode(BookmarkViewMode.GRID);
- }
- break;
-
- default:
- return super.onOptionsItemSelected(item);
- }
- return true;
}
private void openInNewWindow(int position) {
- Bundle b = new Bundle();
- b.putBoolean("new_window", true);
- setResultToParent(RESULT_OK,
- (new Intent()).setAction(getUrl(position)).putExtras(b));
-
- finish();
- }
-
-
- private void editBookmark(int position) {
- Intent intent = new Intent(BrowserBookmarksPage.this,
- AddBookmarkPage.class);
- intent.putExtra("bookmark", getRow(position));
- startActivityForResult(intent, BOOKMARKS_SAVE);
- }
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode,
- Intent data) {
- switch(requestCode) {
- case BOOKMARKS_SAVE:
- if (resultCode == RESULT_OK) {
- Bundle extras;
- if (data != null && (extras = data.getExtras()) != null) {
- // If there are extras, then we need to save
- // the edited bookmark. This is done in updateRow()
- String title = extras.getString("title");
- String url = extras.getString("url");
- if (title != null && url != null) {
- mBookmarksAdapter.updateRow(extras);
- }
- } else {
- // extras == null then a new bookmark was added to
- // the database.
- refreshList();
- }
- }
- break;
- default:
- break;
+ if (mCallbacks != null) {
+ mCallbacks.onOpenInNewWindow(mAdapter.getItem(position));
}
}
- private void displayRemoveBookmarkDialog(int position) {
+ private void editBookmark(int position) {
+ Intent intent = new Intent(getActivity(), AddBookmarkPage.class);
+ Cursor cursor = mAdapter.getItem(position);
+ Bundle item = new Bundle();
+ item.putString(BrowserContract.Bookmarks.TITLE,
+ cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE));
+ item.putString(BrowserContract.Bookmarks.URL,
+ cursor.getString(BookmarksLoader.COLUMN_INDEX_URL));
+ byte[] data = cursor.getBlob(BookmarksLoader.COLUMN_INDEX_FAVICON);
+ if (data != null) {
+ item.putParcelable(BrowserContract.Bookmarks.FAVICON,
+ BitmapFactory.decodeByteArray(data, 0, data.length));
+ }
+ item.putLong(BrowserContract.Bookmarks._ID,
+ cursor.getLong(BookmarksLoader.COLUMN_INDEX_ID));
+ item.putLong(BrowserContract.Bookmarks.PARENT,
+ cursor.getLong(BookmarksLoader.COLUMN_INDEX_PARENT));
+ intent.putExtra(AddBookmarkPage.EXTRA_EDIT_BOOKMARK, item);
+ intent.putExtra(AddBookmarkPage.EXTRA_IS_FOLDER,
+ cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) == 1);
+ startActivity(intent);
+ }
+
+ private void displayRemoveBookmarkDialog(final int position) {
// Put up a dialog asking if the user really wants to
// delete the bookmark
- final int deletePos = position;
- new AlertDialog.Builder(this)
+ Cursor cursor = mAdapter.getItem(position);
+ Context context = getActivity();
+ final ContentResolver resolver = context.getContentResolver();
+ final Uri uri = ContentUris.withAppendedId(BrowserContract.Bookmarks.CONTENT_URI,
+ cursor.getLong(BookmarksLoader.COLUMN_INDEX_ID));
+
+ new AlertDialog.Builder(context)
.setTitle(R.string.delete_bookmark)
.setIcon(android.R.drawable.ic_dialog_alert)
- .setMessage(getText(R.string.delete_bookmark_warning).toString().replace(
- "%s", getBookmarkTitle(deletePos)))
+ .setMessage(context.getString(R.string.delete_bookmark_warning,
+ cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE)))
.setPositiveButton(R.string.ok,
new DialogInterface.OnClickListener() {
+ @Override
public void onClick(DialogInterface dialog, int whichButton) {
- deleteBookmark(deletePos);
+ resolver.delete(uri, null, null);
}
})
.setNegativeButton(R.string.cancel, null)
.show();
}
- /**
- * Refresh the shown list after the database has changed.
- */
- private void refreshList() {
- if (mBookmarksAdapter == null) return;
- mBookmarksAdapter.refreshList();
+ private String getUrl(int position) {
+ return getUrl(mAdapter.getItem(position));
}
- /**
- * Return a hashmap representing the currently highlighted row.
- */
- public Bundle getRow(int position) {
- return mBookmarksAdapter == null ? null
- : mBookmarksAdapter.getRow(position);
- }
-
- /**
- * Return the url of the currently highlighted row.
- */
- public String getUrl(int position) {
- return mBookmarksAdapter == null ? null
- : mBookmarksAdapter.getUrl(position);
- }
-
- /**
- * Return the favicon of the currently highlighted row.
- */
- public Bitmap getFavicon(int position) {
- return mBookmarksAdapter == null ? null
- : mBookmarksAdapter.getFavicon(position);
- }
-
- private Bitmap getTouchIcon(int position) {
- return mBookmarksAdapter == null ? null
- : mBookmarksAdapter.getTouchIcon(position);
+ /* package */ static String getUrl(Cursor c) {
+ return c.getString(BookmarksLoader.COLUMN_INDEX_URL);
}
private void copy(CharSequence text) {
- try {
- IClipboard clip = IClipboard.Stub.asInterface(ServiceManager.getService("clipboard"));
- if (clip != null) {
- clip.setClipboardText(text);
- }
- } catch (android.os.RemoteException e) {
- Log.e(LOGTAG, "Copy failed", e);
+ ClipboardManager cm = (ClipboardManager) getActivity().getSystemService(
+ Context.CLIPBOARD_SERVICE);
+ cm.setPrimaryClip(ClipData.newRawUri(null, null, Uri.parse(text.toString())));
+ }
+
+ void selectView(int view) {
+ if (view == mCurrentView) {
+ return;
+ }
+ mCurrentView = view;
+ if (mCurrentView == BrowserBookmarksPage.VIEW_THUMBNAILS) {
+ mSelectBookmarkView.setText(R.string.bookmark_list_view);
+ } else {
+ mSelectBookmarkView.setText(R.string.bookmark_thumbnail_view);
+ }
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
+ Editor edit = prefs.edit();
+ edit.putInt(PREF_SELECTED_VIEW, mCurrentView);
+ edit.apply();
+ if (mEmptyView.getVisibility() == View.VISIBLE) {
+ return;
+ }
+ setupBookmarkView();
+ }
+
+ private void setupBookmarkView() {
+ mAdapter.selectView(mCurrentView);
+ switch (mCurrentView) {
+ case VIEW_THUMBNAILS:
+ mList.setAdapter(null);
+ mGrid.setAdapter(mAdapter);
+ mGrid.setVisibility(View.VISIBLE);
+ mList.setVisibility(View.GONE);
+ break;
+ case VIEW_LIST:
+ mGrid.setAdapter(null);
+ mList.setAdapter(mAdapter);
+ mGrid.setVisibility(View.GONE);
+ mList.setVisibility(View.VISIBLE);
+ break;
}
}
- public String getBookmarkTitle(int position) {
- return mBookmarksAdapter == null ? null
- : mBookmarksAdapter.getTitle(position);
+ /**
+ * BreadCrumb controller callback
+ */
+ @Override
+ public void onTop(int level, Object data) {
+ Uri uri = (Uri) data;
+ if (uri == null) {
+ // top level
+ uri = BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER;
+ }
+ loadFolder(uri);
}
/**
- * Delete the currently highlighted row.
+ * @param uri
*/
- public void deleteBookmark(int position) {
- if (mBookmarksAdapter == null) return;
- mBookmarksAdapter.deleteRow(position);
+ private void loadFolder(Uri uri) {
+ LoaderManager manager = getLoaderManager();
+ BookmarksLoader loader =
+ (BookmarksLoader) ((Loader<?>) manager.getLoader(LOADER_BOOKMARKS));
+ loader.setUri(uri);
+ loader.forceLoad();
+ if (mCallbacks != null) {
+ mCallbacks.onFolderChanged(mCrumbs.getTopLevel(), uri);
+ }
}
@Override
- public void onBackPressed() {
- setResultToParent(RESULT_CANCELED, null);
- mCanceled = true;
- super.onBackPressed();
+ public void onClick(View view) {
+ if (mSelectBookmarkView == view) {
+ selectView(mCurrentView == BrowserBookmarksPage.VIEW_LIST
+ ? BrowserBookmarksPage.VIEW_THUMBNAILS
+ : BrowserBookmarksPage.VIEW_LIST);
+ }
}
- // This Activity is generally a sub-Activity of
- // CombinedBookmarkHistoryActivity. In that situation, we need to pass our
- // result code up to our parent. However, if someone calls this Activity
- // directly, then this has no parent, and it needs to set it on itself.
- private void setResultToParent(int resultCode, Intent data) {
- Activity parent = getParent();
- if (parent == null) {
- setResult(resultCode, data);
- } else {
- ((CombinedBookmarkHistoryActivity) parent).setResultFromChild(
- resultCode, data);
+ @Override
+ public boolean onMenuItemClick(MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.list_view:
+ selectView(BrowserBookmarksPage.VIEW_LIST);
+ return true;
+ case R.id.thumbnail_view:
+ selectView(BrowserBookmarksPage.VIEW_THUMBNAILS);
+ return true;
+ }
+ return false;
+ }
+
+ public boolean onBackPressed() {
+ if (mCrumbs != null &&
+ mCrumbs.size() > 0) {
+ mCrumbs.popView();
+ return true;
+ }
+ return false;
+ }
+
+ public void setCallbackListener(BookmarksPageCallbacks callbackListener) {
+ mCallbacks = callbackListener;
+ }
+
+ public void setEnableContextMenu(boolean enable) {
+ mEnableContextMenu = enable;
+ if (mGrid != null) {
+ if (mEnableContextMenu) {
+ registerForContextMenu(mGrid);
+ } else {
+ unregisterForContextMenu(mGrid);
+ mGrid.setLongClickable(false);
+ }
+ }
+ if (mList != null) {
+ if (mEnableContextMenu) {
+ registerForContextMenu(mList);
+ } else {
+ unregisterForContextMenu(mList);
+ mList.setLongClickable(false);
+ }
+ }
+ }
+
+ private static class LookupBookmarkCount extends AsyncTask<Long, Void, Integer> {
+ Context mContext;
+ BookmarkItem mHeader;
+
+ public LookupBookmarkCount(Context context, BookmarkItem header) {
+ mContext = context;
+ mHeader = header;
+ }
+
+ @Override
+ protected Integer doInBackground(Long... params) {
+ if (params.length != 1) {
+ throw new IllegalArgumentException("Missing folder id!");
+ }
+ Uri uri = BookmarkUtils.getBookmarksUri(mContext);
+ Cursor c = mContext.getContentResolver().query(uri,
+ null, BrowserContract.Bookmarks.PARENT + "=?",
+ new String[] {params[0].toString()}, null);
+ return c.getCount();
+ }
+
+ @Override
+ protected void onPostExecute(Integer result) {
+ if (result > 0) {
+ mHeader.setUrl(mContext.getString(R.string.contextheader_folder_bookmarkcount,
+ result));
+ } else if (result == 0) {
+ mHeader.setUrl(mContext.getString(R.string.contextheader_folder_empty));
+ }
+ }
+ }
+
+ public void setBreadCrumbVisibility(int visibility) {
+ mCrumbVisibility = visibility;
+ if (mCrumbs != null) {
+ mCrumbs.setVisibility(mCrumbVisibility);
+ }
+ }
+
+ public void setBreadCrumbUseBackButton(boolean use) {
+ mCrumbBackButton = use;
+ if (mCrumbs != null) {
+ mCrumbs.setUseBackButton(mCrumbBackButton);
+ }
+ }
+
+ public void setBreadCrumbMaxVisible(int max) {
+ mCrumbMaxVisible = max;
+ if (mCrumbs != null) {
+ mCrumbs.setMaxVisible(mCrumbMaxVisible);
}
}
}
diff --git a/src/com/android/browser/BrowserHistoryPage.java b/src/com/android/browser/BrowserHistoryPage.java
index 23080f8..2a095ad 100644
--- a/src/com/android/browser/BrowserHistoryPage.java
+++ b/src/com/android/browser/BrowserHistoryPage.java
@@ -17,198 +17,276 @@
package com.android.browser;
import android.app.Activity;
-import android.app.ExpandableListActivity;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.Fragment;
+import android.app.LoaderManager.LoaderCallbacks;
+import android.content.ClipboardManager;
+import android.content.ContentResolver;
import android.content.Context;
+import android.content.CursorLoader;
+import android.content.DialogInterface;
import android.content.Intent;
+import android.content.Loader;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
+import android.net.Uri;
+import android.os.AsyncTask;
import android.os.Bundle;
-import android.os.ServiceManager;
import android.provider.Browser;
-import android.text.IClipboard;
-import android.util.Log;
+import android.provider.BrowserContract;
+import android.provider.BrowserContract.History;
import android.view.ContextMenu;
+import android.view.ContextMenu.ContextMenuInfo;
+import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
-import android.view.ViewGroup.LayoutParams;
-import android.view.ContextMenu.ContextMenuInfo;
-import android.view.ViewStub;
import android.webkit.WebIconDatabase.IconListener;
-import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.ExpandableListContextMenuInfo;
+import android.widget.ExpandableListView.OnChildClickListener;
+import android.widget.TextView;
import android.widget.Toast;
/**
* Activity for displaying the browser's history, divided into
* days of viewing.
*/
-public class BrowserHistoryPage extends ExpandableListActivity {
- private HistoryAdapter mAdapter;
- private boolean mDisableNewWindow;
- private HistoryItem mContextHeader;
+public class BrowserHistoryPage extends Fragment
+ implements LoaderCallbacks<Cursor>, OnChildClickListener {
- private final static String LOGTAG = "browser";
+ static final int LOADER_HISTORY = 1;
+ static final int LOADER_MOST_VISITED = 2;
+
+ BookmarksHistoryCallbacks mCallbacks;
+ ExpandableListView mList;
+ View mEmptyView;
+ HistoryAdapter mAdapter;
+ boolean mDisableNewWindow;
+ HistoryItem mContextHeader;
+ String mMostVisitsLimit;
// Implementation of WebIconDatabase.IconListener
- private class IconReceiver implements IconListener {
+ class IconReceiver implements IconListener {
+ @Override
public void onReceivedIcon(String url, Bitmap icon) {
- setListAdapter(mAdapter);
+ mAdapter.notifyDataSetChanged();
}
}
- // Instance of IconReceiver
- private final IconReceiver mIconReceiver = new IconReceiver();
- /**
- * Report back to the calling activity to load a site.
- * @param url Site to load.
- * @param newWindow True if the URL should be loaded in a new window
- */
- private void loadUrl(String url, boolean newWindow) {
- Intent intent = new Intent().setAction(url);
- if (newWindow) {
- Bundle b = new Bundle();
- b.putBoolean("new_window", true);
- intent.putExtras(b);
- }
- setResultToParent(RESULT_OK, intent);
- finish();
+ // Instance of IconReceiver
+ final IconReceiver mIconReceiver = new IconReceiver();
+
+ static interface HistoryQuery {
+ static final String[] PROJECTION = new String[] {
+ History._ID, // 0
+ History.DATE_LAST_VISITED, // 1
+ History.TITLE, // 2
+ History.URL, // 3
+ History.FAVICON, // 4
+ History.VISITS // 5
+ };
+
+ static final int INDEX_ID = 0;
+ static final int INDEX_DATE_LAST_VISITED = 1;
+ static final int INDEX_TITE = 2;
+ static final int INDEX_URL = 3;
+ static final int INDEX_FAVICON = 4;
+ static final int INDEX_VISITS = 5;
}
-
+
private void copy(CharSequence text) {
- try {
- IClipboard clip = IClipboard.Stub.asInterface(ServiceManager.getService("clipboard"));
- if (clip != null) {
- clip.setClipboardText(text);
+ ClipboardManager cm = (ClipboardManager) getActivity().getSystemService(
+ Context.CLIPBOARD_SERVICE);
+ cm.setText(text);
+ }
+
+ static BrowserHistoryPage newInstance(BookmarksHistoryCallbacks cb, Bundle args) {
+ BrowserHistoryPage bhp = new BrowserHistoryPage();
+ bhp.mCallbacks = cb;
+ bhp.setArguments(args);
+ return bhp;
+ }
+
+ @Override
+ public Loader<Cursor> onCreateLoader(int id, Bundle args) {
+ switch (id) {
+ case LOADER_HISTORY: {
+ CursorLoader loader = new CursorLoader(getActivity(), History.CONTENT_URI,
+ HistoryQuery.PROJECTION, null, null, null);
+ return loader;
}
- } catch (android.os.RemoteException e) {
- Log.e(LOGTAG, "Copy failed", e);
+
+ case LOADER_MOST_VISITED: {
+ Uri uri = History.CONTENT_URI
+ .buildUpon()
+ .appendQueryParameter(BrowserContract.PARAM_LIMIT, mMostVisitsLimit)
+ .build();
+ CursorLoader loader = new CursorLoader(getActivity(), uri,
+ HistoryQuery.PROJECTION, null, null, History.VISITS + " DESC");
+ return loader;
+ }
+
+ default: {
+ throw new IllegalArgumentException();
+ }
}
}
@Override
- protected void onCreate(Bundle icicle) {
- super.onCreate(icicle);
- setTitle(R.string.browser_history);
+ public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
+ switch (loader.getId()) {
+ case LOADER_HISTORY: {
+ mAdapter.changeCursor(data);
- final String whereClause = Browser.BookmarkColumns.VISITS + " > 0"
- // In AddBookmarkPage, where we save new bookmarks, we add
- // three visits to newly created bookmarks, so that
- // bookmarks that have not been visited will show up in the
- // most visited, and higher in the goto search box.
- // However, this puts the site in the history, unless we
- // ignore sites with a DATE of 0, which the next line does.
- + " AND " + Browser.BookmarkColumns.DATE + " > 0";
- final String orderBy = Browser.BookmarkColumns.DATE + " DESC";
+ // Add an empty view late, so it does not claim an empty
+ // history before the adapter is present
+ mList.setEmptyView(mEmptyView);
+ break;
+ }
- Cursor cursor = managedQuery(
- Browser.BOOKMARKS_URI,
- Browser.HISTORY_PROJECTION,
- whereClause, null, orderBy);
+ case LOADER_MOST_VISITED: {
+ mAdapter.changeMostVisitedCursor(data);
- mAdapter = new HistoryAdapter(this, cursor,
- Browser.HISTORY_PROJECTION_DATE_INDEX);
- setListAdapter(mAdapter);
- final ExpandableListView list = getExpandableListView();
- list.setOnCreateContextMenuListener(this);
- View v = new ViewStub(this, R.layout.empty_history);
- addContentView(v, new LayoutParams(LayoutParams.MATCH_PARENT,
- LayoutParams.MATCH_PARENT));
- list.setEmptyView(v);
- // Do not post the runnable if there is nothing in the list.
- if (list.getExpandableListAdapter().getGroupCount() > 0) {
- list.post(new Runnable() {
- public void run() {
- // In case the history gets cleared before this event
- // happens.
- if (list.getExpandableListAdapter().getGroupCount() > 0) {
- list.expandGroup(0);
- }
- }
- });
+ // Add an empty view late, so it does not claim an empty
+ // history before the adapter is present
+ mList.setEmptyView(mEmptyView);
+ break;
+ }
+
+ default: {
+ throw new IllegalArgumentException();
+ }
}
- mDisableNewWindow = getIntent().getBooleanExtra("disable_new_window",
- false);
+ }
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ setHasOptionsMenu(true);
+
+ Bundle args = getArguments();
+ mDisableNewWindow = args.getBoolean(BrowserBookmarksPage.EXTRA_DISABLE_WINDOW, false);
+ int mvlimit = getResources().getInteger(R.integer.most_visits_limit);
+ mMostVisitsLimit = Integer.toString(mvlimit);
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ View root = inflater.inflate(R.layout.history, container, false);
+ mList = (ExpandableListView) root.findViewById(android.R.id.list);
+ mList.setCacheColorHint(0);
+ mList.setOnCreateContextMenuListener(this);
+ mList.setOnChildClickListener(this);
+ mAdapter = new HistoryAdapter(getActivity());
+ mList.setAdapter(mAdapter);
+
+ mEmptyView = root.findViewById(android.R.id.empty);
+
+ // Start the loader
+ getLoaderManager().initLoader(LOADER_HISTORY, null, this);
+ getLoaderManager().initLoader(LOADER_MOST_VISITED, null, this);
// Register to receive icons in case they haven't all been loaded.
- CombinedBookmarkHistoryActivity.getIconListenerSet()
- .addListener(mIconReceiver);
-
- Activity parent = getParent();
- if (null == parent
- || !(parent instanceof CombinedBookmarkHistoryActivity)) {
- throw new AssertionError("history page can only be viewed as a tab"
- + "in CombinedBookmarkHistoryActivity");
- }
- // initialize the result to canceled, so that if the user just presses
- // back then it will have the correct result
- setResultToParent(RESULT_CANCELED, null);
+ CombinedBookmarkHistoryView.getIconListenerSet().addListener(mIconReceiver);
+ return root;
}
@Override
- protected void onDestroy() {
+ public void onDestroy() {
super.onDestroy();
- CombinedBookmarkHistoryActivity.getIconListenerSet()
- .removeListener(mIconReceiver);
+ CombinedBookmarkHistoryView.getIconListenerSet().removeListener(mIconReceiver);
+ getLoaderManager().stopLoader(LOADER_HISTORY);
+ getLoaderManager().stopLoader(LOADER_MOST_VISITED);
}
@Override
- public boolean onCreateOptionsMenu(Menu menu) {
- super.onCreateOptionsMenu(menu);
- MenuInflater inflater = getMenuInflater();
+ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.history, menu);
- return true;
}
@Override
- public boolean onPrepareOptionsMenu(Menu menu) {
- menu.findItem(R.id.clear_history_menu_id).setVisible(Browser.canClearHistory(this.getContentResolver()));
- return true;
+ public void onPrepareOptionsMenu(Menu menu) {
+ menu.findItem(R.id.clear_history_menu_id).setVisible(
+ mAdapter != null && !mAdapter.isEmpty());
}
-
+
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.clear_history_menu_id:
- Browser.clearHistory(getContentResolver());
- // BrowserHistoryPage is always a child of
- // CombinedBookmarkHistoryActivity
- ((CombinedBookmarkHistoryActivity) getParent())
- .removeParentChildRelationShips();
- mAdapter.refreshData();
+ final ContentResolver resolver = getActivity().getContentResolver();
+ final ClearHistoryTask clear = new ClearHistoryTask(resolver, mCallbacks);
+ AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
+ .setTitle(R.string.clear)
+ .setMessage(R.string.pref_privacy_clear_history_dlg)
+ .setIcon(android.R.drawable.ic_dialog_alert)
+ .setNegativeButton(R.string.cancel, null)
+ .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ if (which == DialogInterface.BUTTON_POSITIVE) {
+ clear.execute();
+ }
+ }
+ });
+ final Dialog dialog = builder.create();
+ dialog.show();
return true;
-
+
default:
break;
- }
+ }
return super.onOptionsItemSelected(item);
}
+ static class ClearHistoryTask extends AsyncTask<Void, Void, Void> {
+ ContentResolver mResolver;
+ BookmarksHistoryCallbacks mCallbacks;
+
+ public ClearHistoryTask(ContentResolver resolver,
+ BookmarksHistoryCallbacks callbacks) {
+ mResolver = resolver;
+ mCallbacks = callbacks;
+ }
+ @Override
+ protected Void doInBackground(Void... params) {
+ Browser.clearHistory(mResolver);
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(Void result) {
+ mCallbacks.onRemoveParentChildRelationships();
+ }
+ }
+
@Override
- public void onCreateContextMenu(ContextMenu menu, View v,
- ContextMenuInfo menuInfo) {
- ExpandableListContextMenuInfo i =
- (ExpandableListContextMenuInfo) menuInfo;
+ public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
+ ExpandableListContextMenuInfo i = (ExpandableListContextMenuInfo) menuInfo;
// Do not allow a context menu to come up from the group views.
if (!(i.targetView instanceof HistoryItem)) {
return;
}
// Inflate the menu
- MenuInflater inflater = getMenuInflater();
+ 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(this);
+ mContextHeader = new HistoryItem(parent);
} else if (mContextHeader.getParent() != null) {
((ViewGroup) mContextHeader.getParent()).removeView(mContextHeader);
}
@@ -225,88 +303,177 @@
item.setTitle(R.string.remove_from_bookmarks);
}
// decide whether to show the share link option
- PackageManager pm = getPackageManager();
+ PackageManager pm = parent.getPackageManager();
Intent send = new Intent(Intent.ACTION_SEND);
send.setType("text/plain");
ResolveInfo ri = pm.resolveActivity(send, PackageManager.MATCH_DEFAULT_ONLY);
menu.findItem(R.id.share_link_context_menu_id).setVisible(ri != null);
-
+
super.onCreateContextMenu(menu, v, menuInfo);
}
-
+
@Override
public boolean onContextItemSelected(MenuItem item) {
- ExpandableListContextMenuInfo i =
+ ExpandableListContextMenuInfo i =
(ExpandableListContextMenuInfo) item.getMenuInfo();
+ if (i == null) {
+ return false;
+ }
HistoryItem historyItem = (HistoryItem) i.targetView;
String url = historyItem.getUrl();
String title = historyItem.getName();
+ Activity activity = getActivity();
switch (item.getItemId()) {
case R.id.open_context_menu_id:
- loadUrl(url, false);
+ mCallbacks.onUrlSelected(url, false);
return true;
case R.id.new_window_context_menu_id:
- loadUrl(url, true);
+ mCallbacks.onUrlSelected(url, true);
return true;
case R.id.save_to_bookmarks_menu_id:
if (historyItem.isBookmark()) {
- Bookmarks.removeFromBookmarks(this, getContentResolver(),
+ Bookmarks.removeFromBookmarks(activity, activity.getContentResolver(),
url, title);
} else {
- Browser.saveBookmark(this, title, url);
+ Browser.saveBookmark(activity, title, url);
}
return true;
case R.id.share_link_context_menu_id:
- Browser.sendString(this, url,
- getText(R.string.choosertitle_sharevia).toString());
+ Browser.sendString(activity, url,
+ activity.getText(R.string.choosertitle_sharevia).toString());
return true;
case R.id.copy_url_context_menu_id:
copy(url);
return true;
case R.id.delete_context_menu_id:
- Browser.deleteFromHistory(getContentResolver(), url);
- mAdapter.refreshData();
+ Browser.deleteFromHistory(activity.getContentResolver(), url);
return true;
case R.id.homepage_context_menu_id:
- BrowserSettings.getInstance().setHomePage(this, url);
- Toast.makeText(this, R.string.homepage_set,
- Toast.LENGTH_LONG).show();
+ BrowserSettings.getInstance().setHomePage(activity, url);
+ Toast.makeText(activity, R.string.homepage_set, Toast.LENGTH_LONG).show();
return true;
default:
break;
}
return super.onContextItemSelected(item);
}
-
+
@Override
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
if (v instanceof HistoryItem) {
- loadUrl(((HistoryItem) v).getUrl(), false);
+ mCallbacks.onUrlSelected(((HistoryItem) v).getUrl(), false);
return true;
}
return false;
}
- // This Activity is always a sub-Activity of
- // CombinedBookmarkHistoryActivity. Therefore, we need to pass our
- // result code up to our parent.
- private void setResultToParent(int resultCode, Intent data) {
- ((CombinedBookmarkHistoryActivity) getParent()).setResultFromChild(
- resultCode, data);
- }
-
private class HistoryAdapter extends DateSortedExpandableListAdapter {
- HistoryAdapter(Context context, Cursor cursor, int index) {
- super(context, cursor, index);
-
+ private Cursor mMostVisited, mHistoryCursor;
+
+ HistoryAdapter(Context context) {
+ super(context, HistoryQuery.INDEX_DATE_LAST_VISITED);
}
+ @Override
+ public void changeCursor(Cursor cursor) {
+ mHistoryCursor = cursor;
+ super.changeCursor(cursor);
+ }
+
+ void changeMostVisitedCursor(Cursor cursor) {
+ if (mMostVisited == cursor) {
+ return;
+ }
+ if (mMostVisited != null) {
+ mMostVisited.unregisterDataSetObserver(mDataSetObserver);
+ mMostVisited.close();
+ }
+ mMostVisited = cursor;
+ if (mMostVisited != null) {
+ mMostVisited.registerDataSetObserver(mDataSetObserver);
+ }
+ notifyDataSetChanged();
+ }
+
+ @Override
+ public long getChildId(int groupPosition, int childPosition) {
+ if (moveCursorToChildPosition(groupPosition, childPosition)) {
+ Cursor cursor = getCursor(groupPosition);
+ return cursor.getLong(HistoryQuery.INDEX_ID);
+ }
+ return 0;
+ }
+
+ @Override
+ public int getGroupCount() {
+ return super.getGroupCount() + (mMostVisited != null ? 1 : 0);
+ }
+
+ @Override
+ public int getChildrenCount(int groupPosition) {
+ if (groupPosition >= super.getGroupCount()) {
+ return mMostVisited.getCount();
+ }
+ return super.getChildrenCount(groupPosition);
+ }
+
+ @Override
+ public boolean isEmpty() {
+ if (!super.isEmpty()) {
+ return false;
+ }
+ return mMostVisited == null
+ || mMostVisited.isClosed()
+ || mMostVisited.getCount() == 0;
+ }
+
+ Cursor getCursor(int groupPosition) {
+ if (groupPosition >= super.getGroupCount()) {
+ return mMostVisited;
+ }
+ return mHistoryCursor;
+ }
+
+ @Override
+ public View getGroupView(int groupPosition, boolean isExpanded,
+ View convertView, ViewGroup parent) {
+ if (groupPosition >= super.getGroupCount()) {
+ if (mMostVisited == null || mMostVisited.isClosed()) {
+ throw new IllegalStateException("Data is not valid");
+ }
+ TextView item;
+ if (null == convertView || !(convertView instanceof TextView)) {
+ LayoutInflater factory = LayoutInflater.from(getContext());
+ item = (TextView) factory.inflate(R.layout.history_header, null);
+ } else {
+ item = (TextView) convertView;
+ }
+ item.setText(R.string.tab_most_visited);
+ return item;
+ }
+ return super.getGroupView(groupPosition, isExpanded, convertView, parent);
+ }
+
+ @Override
+ boolean moveCursorToChildPosition(
+ int groupPosition, int childPosition) {
+ if (groupPosition >= super.getGroupCount()) {
+ if (mMostVisited != null && !mMostVisited.isClosed()) {
+ mMostVisited.moveToPosition(childPosition);
+ return true;
+ }
+ return false;
+ }
+ return super.moveCursorToChildPosition(groupPosition, childPosition);
+ }
+
+ @Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
View convertView, ViewGroup parent) {
HistoryItem item;
if (null == convertView || !(convertView instanceof HistoryItem)) {
- item = new HistoryItem(BrowserHistoryPage.this);
+ item = new HistoryItem(getContext());
// Add padding on the left so it will be indented from the
// arrows on the group views.
item.setPadding(item.getPaddingLeft() + 10,
@@ -316,23 +483,24 @@
} else {
item = (HistoryItem) convertView;
}
+
// Bail early if the Cursor is closed.
if (!moveCursorToChildPosition(groupPosition, childPosition)) {
return item;
}
- item.setName(getString(Browser.HISTORY_PROJECTION_TITLE_INDEX));
- String url = getString(Browser.HISTORY_PROJECTION_URL_INDEX);
+
+ Cursor cursor = getCursor(groupPosition);
+ item.setName(cursor.getString(HistoryQuery.INDEX_TITE));
+ String url = cursor.getString(HistoryQuery.INDEX_URL);
item.setUrl(url);
- byte[] data = getBlob(Browser.HISTORY_PROJECTION_FAVICON_INDEX);
+ byte[] data = cursor.getBlob(HistoryQuery.INDEX_FAVICON);
if (data != null) {
item.setFavicon(BitmapFactory.decodeByteArray(data, 0,
data.length));
} else {
- item.setFavicon(CombinedBookmarkHistoryActivity
+ item.setFavicon(CombinedBookmarkHistoryView
.getIconListenerSet().getFavicon(url));
}
- item.setIsBookmark(1 ==
- getInt(Browser.HISTORY_PROJECTION_BOOKMARK_INDEX));
return item;
}
}
diff --git a/src/com/android/browser/BrowserHomepagePreference.java b/src/com/android/browser/BrowserHomepagePreference.java
index 4f18bd5..80f7ec2 100644
--- a/src/com/android/browser/BrowserHomepagePreference.java
+++ b/src/com/android/browser/BrowserHomepagePreference.java
@@ -18,17 +18,17 @@
import android.app.AlertDialog;
import android.content.Context;
+import android.content.DialogInterface;
import android.os.Bundle;
import android.preference.EditTextPreference;
-import android.widget.Button;
-import android.widget.EditText;
-import android.widget.LinearLayout;
-import android.view.Gravity;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
import android.view.View;
+import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
-import android.util.AttributeSet;
+import android.widget.EditText;
public class BrowserHomepagePreference extends EditTextPreference {
private String mCurrentPage;
@@ -52,42 +52,40 @@
super.onAddEditTextToDialogView(dialogView, editText);
// Now the EditText has a parent. Add a button to set to the current
// page.
- ViewGroup parent = (ViewGroup) editText.getParent();
- Button button = new Button(getContext());
- button.setText(R.string.pref_use_current);
- button.setOnClickListener(new View.OnClickListener() {
- public void onClick(View v) {
- getEditText().setText(mCurrentPage);
- }
- });
- if (parent instanceof LinearLayout) {
- ((LinearLayout) parent).setGravity(Gravity.CENTER_HORIZONTAL);
- }
- parent.addView(button, ViewGroup.LayoutParams.WRAP_CONTENT,
- ViewGroup.LayoutParams.WRAP_CONTENT);
+ createButtons((ViewGroup) editText.getParent());
}
+ void createButtons(ViewGroup parent) {
+ LayoutInflater inflater = (LayoutInflater) getContext()
+ .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ View v = inflater.inflate(R.layout.pref_homepage_buttons, parent);
+ v.findViewById(R.id.use_current).setOnClickListener(mOnClick);
+ v.findViewById(R.id.use_default).setOnClickListener(mOnClick);
+ }
+
+ OnClickListener mOnClick = new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ switch (v.getId()) {
+ case R.id.use_current:
+ getEditText().setText(mCurrentPage);
+ break;
+ case R.id.use_default:
+ getEditText().setText(
+ BrowserSettings.getFactoryResetHomeUrl(getContext()));
+ break;
+ }
+ }
+ };
+
@Override
protected void onDialogClosed(boolean positiveResult) {
if (positiveResult) {
- String url = getEditText().getText().toString();
- if (url.length() > 0
- && !BrowserActivity.ACCEPTED_URI_SCHEMA.matcher(url)
- .matches()) {
- int colon = url.indexOf(':');
- int space = url.indexOf(' ');
- if (colon == -1 && space == -1) {
- // if no colon, no space, add "http://" to make it a url
- getEditText().setText("http://" + url);
- } else {
- // show an error dialog and change the positiveResult to
- // false so that the bad url will not override the old url
- new AlertDialog.Builder(this.getContext()).setMessage(
- R.string.bookmark_url_not_valid).setPositiveButton(
- R.string.ok, null).show();
- positiveResult = false;
- }
+ String url = getEditText().getText().toString().trim();
+ if (url.length() > 0) {
+ url = UrlUtils.smartUrlFilter(url);
}
+ getEditText().setText(url);
}
super.onDialogClosed(positiveResult);
}
@@ -97,7 +95,7 @@
* @param currentPage This String will replace the text in the EditText
* when the user clicks the "Use current page" button.
*/
- /* package */ void setCurrentPage(String currentPage) {
+ public void setCurrentPage(String currentPage) {
mCurrentPage = currentPage;
}
diff --git a/src/com/android/browser/BrowserPreferencesPage.java b/src/com/android/browser/BrowserPreferencesPage.java
index 9af66f1..c47675d 100644
--- a/src/com/android/browser/BrowserPreferencesPage.java
+++ b/src/com/android/browser/BrowserPreferencesPage.java
@@ -16,96 +16,30 @@
package com.android.browser;
-import android.content.Intent;
-import android.net.Uri;
-import android.os.Bundle;
-import android.preference.EditTextPreference;
-import android.preference.Preference;
+import com.android.browser.preferences.DebugPreferencesFragment;
+
import android.preference.PreferenceActivity;
-import android.preference.PreferenceScreen;
-import android.webkit.GeolocationPermissions;
-import android.webkit.ValueCallback;
-import android.webkit.WebStorage;
+import android.preference.PreferenceManager;
-import java.util.Map;
-import java.util.Set;
+import java.util.List;
-public class BrowserPreferencesPage extends PreferenceActivity
- implements Preference.OnPreferenceChangeListener {
+public class BrowserPreferencesPage extends PreferenceActivity {
- private String LOGTAG = "BrowserPreferencesPage";
- /* package */ static final String CURRENT_PAGE = "currentPage";
+ public static final String CURRENT_PAGE = "currentPage";
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- // Load the XML preferences file
- addPreferencesFromResource(R.xml.browser_preferences);
-
- Preference e = findPreference(BrowserSettings.PREF_HOMEPAGE);
- e.setOnPreferenceChangeListener(this);
- e.setSummary(getPreferenceScreen().getSharedPreferences()
- .getString(BrowserSettings.PREF_HOMEPAGE, null));
- ((BrowserHomepagePreference) e).setCurrentPage(
- getIntent().getStringExtra(CURRENT_PAGE));
-
- e = findPreference(BrowserSettings.PREF_EXTRAS_RESET_DEFAULTS);
- e.setOnPreferenceChangeListener(this);
-
- 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);
- e.setOnPreferenceChangeListener(this);
- e.setSummary(getVisualDefaultZoomName(
- getPreferenceScreen().getSharedPreferences()
- .getString(BrowserSettings.PREF_DEFAULT_ZOOM, null)) );
-
- e = findPreference(BrowserSettings.PREF_DEFAULT_TEXT_ENCODING);
- e.setOnPreferenceChangeListener(this);
-
- e = findPreference(BrowserSettings.PREF_CLEAR_HISTORY);
- e.setOnPreferenceChangeListener(this);
-
- if (BrowserSettings.getInstance().showDebugSettings()) {
- addPreferencesFromResource(R.xml.debug_preferences);
- }
-
- PreferenceScreen websiteSettings = (PreferenceScreen)
- findPreference(BrowserSettings.PREF_WEBSITE_SETTINGS);
- Intent intent = new Intent(this, WebsiteSettingsActivity.class);
- websiteSettings.setIntent(intent);
- }
-
- /*
- * We need to set the PreferenceScreen state in onResume(), as the number of
- * origins with active features (WebStorage, Geolocation etc) could have
- * changed after calling the WebsiteSettingsActivity.
+ /**
+ * Populate the activity with the top-level headers.
*/
@Override
- protected void onResume() {
- super.onResume();
- final PreferenceScreen websiteSettings = (PreferenceScreen)
- findPreference(BrowserSettings.PREF_WEBSITE_SETTINGS);
- websiteSettings.setEnabled(false);
- WebStorage.getInstance().getOrigins(new ValueCallback<Map>() {
- public void onReceiveValue(Map webStorageOrigins) {
- if ((webStorageOrigins != null) && !webStorageOrigins.isEmpty()) {
- websiteSettings.setEnabled(true);
- }
- }
- });
- GeolocationPermissions.getInstance().getOrigins(new ValueCallback<Set<String> >() {
- public void onReceiveValue(Set<String> geolocationOrigins) {
- if ((geolocationOrigins != null) && !geolocationOrigins.isEmpty()) {
- websiteSettings.setEnabled(true);
- }
- }
- });
+ public void onBuildHeaders(List<Header> target) {
+ loadHeadersFromResource(R.xml.preference_headers, target);
+
+ if (BrowserSettings.DEV_BUILD || BrowserSettings.getInstance().showDebugSettings()) {
+ Header debug = new Header();
+ debug.title = getText(R.string.pref_development_title);
+ debug.fragment = DebugPreferencesFragment.class.getName();
+ target.add(debug);
+ }
}
@Override
@@ -115,98 +49,6 @@
// sync the shared preferences back to BrowserSettings
BrowserSettings.getInstance().syncSharedPreferences(
getApplicationContext(),
- getPreferenceScreen().getSharedPreferences());
- }
-
- public boolean onPreferenceChange(Preference pref, Object objValue) {
- if (pref.getKey().equals(BrowserSettings.PREF_EXTRAS_RESET_DEFAULTS)) {
- Boolean value = (Boolean) objValue;
- if (value.booleanValue() == true) {
- finish();
- }
- } else if (pref.getKey().equals(BrowserSettings.PREF_HOMEPAGE)) {
- String value = (String) objValue;
- boolean needUpdate = value.indexOf(' ') != -1;
- if (needUpdate) {
- value = value.trim().replace(" ", "%20");
- }
- if (value.length() != 0 && Uri.parse(value).getScheme() == null) {
- value = "http://" + value;
- needUpdate = true;
- }
- // Set the summary value.
- pref.setSummary(value);
- if (needUpdate) {
- // Update through the EditText control as it has a cached copy
- // of the string and it will handle persisting the value
- ((EditTextPreference) pref).setText(value);
-
- // as we update the value above, we need to return false
- // here so that setText() is not called by EditTextPref
- // with the old value.
- return false;
- } else {
- return true;
- }
- } else if (pref.getKey().equals(BrowserSettings.PREF_TEXT_SIZE)) {
- pref.setSummary(getVisualTextSizeName((String) objValue));
- return true;
- } else if (pref.getKey().equals(BrowserSettings.PREF_DEFAULT_ZOOM)) {
- pref.setSummary(getVisualDefaultZoomName((String) objValue));
- return true;
- } else if (pref.getKey().equals(
- BrowserSettings.PREF_DEFAULT_TEXT_ENCODING)) {
- pref.setSummary((String) objValue);
- return true;
- } else if (pref.getKey().equals(BrowserSettings.PREF_CLEAR_HISTORY)
- && ((Boolean) objValue).booleanValue() == true) {
- // Need to tell the browser to remove the parent/child relationship
- // between tabs
- setResult(RESULT_OK, (new Intent()).putExtra(Intent.EXTRA_TEXT,
- pref.getKey()));
- return true;
- }
-
- return false;
- }
-
- private CharSequence getVisualTextSizeName(String enumName) {
- CharSequence[] visualNames = getResources().getTextArray(
- R.array.pref_text_size_choices);
- CharSequence[] enumNames = getResources().getTextArray(
- R.array.pref_text_size_values);
-
- // Sanity check
- if (visualNames.length != enumNames.length) {
- return "";
- }
-
- for (int i = 0; i < enumNames.length; i++) {
- if (enumNames[i].equals(enumName)) {
- return visualNames[i];
- }
- }
-
- return "";
- }
-
- private CharSequence getVisualDefaultZoomName(String enumName) {
- CharSequence[] visualNames = getResources().getTextArray(
- R.array.pref_default_zoom_choices);
- CharSequence[] enumNames = getResources().getTextArray(
- R.array.pref_default_zoom_values);
-
- // Sanity check
- if (visualNames.length != enumNames.length) {
- return "";
- }
-
- for (int i = 0; i < enumNames.length; i++) {
- if (enumNames[i].equals(enumName)) {
- return visualNames[i];
- }
- }
-
- return "";
+ PreferenceManager.getDefaultSharedPreferences(this));
}
}
diff --git a/src/com/android/browser/BrowserProvider.java b/src/com/android/browser/BrowserProvider.java
index 72ec819..cba16a0 100644
--- a/src/com/android/browser/BrowserProvider.java
+++ b/src/com/android/browser/BrowserProvider.java
@@ -29,8 +29,10 @@
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.UriMatcher;
+import android.content.res.Configuration;
import android.database.AbstractCursor;
import android.database.Cursor;
+import android.database.DatabaseUtils;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.net.Uri;
@@ -38,6 +40,7 @@
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;
@@ -84,6 +87,17 @@
private static final int SUGGEST_COLUMN_QUERY_ID = 8;
private static final int SUGGEST_COLUMN_INTENT_EXTRA_DATA = 9;
+ // how many suggestions will be shown in dropdown
+ // 0..SHORT: filled by browser db
+ private static final int MAX_SUGGEST_SHORT_SMALL = 3;
+ // SHORT..LONG: filled by search suggestions
+ private static final int MAX_SUGGEST_LONG_SMALL = 6;
+
+ // large screen size shows more
+ private static final int MAX_SUGGEST_SHORT_LARGE = 6;
+ private static final int MAX_SUGGEST_LONG_LARGE = 9;
+
+
// shared suggestion columns
private static final String[] COLUMNS = new String[] {
"_id",
@@ -97,10 +111,6 @@
SearchManager.SUGGEST_COLUMN_QUERY,
SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA};
- private static final int MAX_SUGGESTION_SHORT_ENTRIES = 3;
- private static final int MAX_SUGGESTION_LONG_ENTRIES = 6;
- private static final String MAX_SUGGESTION_LONG_ENTRIES_STRING =
- Integer.valueOf(MAX_SUGGESTION_LONG_ENTRIES).toString();
// make sure that these match the index of TABLE_NAMES
private static final int URI_MATCH_BOOKMARKS = 0;
@@ -161,6 +171,9 @@
private BrowserSettings mSettings;
+ private int mMaxSuggestionShortSize;
+ private int mMaxSuggestionLongSize;
+
public BrowserProvider() {
}
@@ -365,6 +378,20 @@
@Override
public boolean onCreate() {
final Context context = getContext();
+ boolean xlargeScreenSize = (context.getResources().getConfiguration().screenLayout
+ & Configuration.SCREENLAYOUT_SIZE_MASK)
+ == Configuration.SCREENLAYOUT_SIZE_XLARGE;
+ boolean isPortrait = (context.getResources().getConfiguration().orientation
+ == Configuration.ORIENTATION_PORTRAIT);
+
+
+ if (xlargeScreenSize && isPortrait) {
+ mMaxSuggestionLongSize = MAX_SUGGEST_LONG_LARGE;
+ mMaxSuggestionShortSize = MAX_SUGGEST_SHORT_LARGE;
+ } else {
+ mMaxSuggestionLongSize = MAX_SUGGEST_LONG_SMALL;
+ mMaxSuggestionShortSize = MAX_SUGGEST_SHORT_SMALL;
+ }
mOpenHelper = new DatabaseHelper(context);
mBackupManager = new BackupManager(context);
// we added "picasa web album" into default bookmarks for version 19.
@@ -431,10 +458,10 @@
public MySuggestionCursor(Cursor hc, Cursor sc, String string) {
mHistoryCursor = hc;
mSuggestCursor = sc;
- mHistoryCount = hc.getCount();
+ mHistoryCount = hc != null ? hc.getCount() : 0;
mSuggestionCount = sc != null ? sc.getCount() : 0;
- if (mSuggestionCount > (MAX_SUGGESTION_LONG_ENTRIES - mHistoryCount)) {
- mSuggestionCount = MAX_SUGGESTION_LONG_ENTRIES - mHistoryCount;
+ if (mSuggestionCount > (mMaxSuggestionLongSize - mHistoryCount)) {
+ mSuggestionCount = mMaxSuggestionLongSize - mHistoryCount;
}
mString = string;
mIncludeWebSearch = string.length() > 0;
@@ -648,6 +675,7 @@
}
// TODO Temporary change, finalize after jq's changes go in
+ @Override
public void deactivate() {
if (mHistoryCursor != null) {
mHistoryCursor.deactivate();
@@ -658,12 +686,14 @@
super.deactivate();
}
+ @Override
public boolean requery() {
return (mHistoryCursor != null ? mHistoryCursor.requery() : false) |
(mSuggestCursor != null ? mSuggestCursor.requery() : false);
}
// TODO Temporary change, finalize after jq's changes go in
+ @Override
public void close() {
super.close();
if (mHistoryCursor != null) {
@@ -728,12 +758,15 @@
public ResultsCursor(ArrayList<String> results) {
mResults = results;
}
+ @Override
public int getCount() { return mResults.size(); }
+ @Override
public String[] getColumnNames() {
return RESULTS_COLUMNS;
}
+ @Override
public String getString(int column) {
switch (column) {
case RESULT_ACTION_ID:
@@ -755,30 +788,39 @@
return null;
}
}
+ @Override
public short getShort(int column) {
throw new UnsupportedOperationException();
}
+ @Override
public int getInt(int column) {
throw new UnsupportedOperationException();
}
+ @Override
public long getLong(int column) {
if ((mPos != -1) && column == 0) {
return mPos; // use row# as the _id
}
throw new UnsupportedOperationException();
}
+ @Override
public float getFloat(int column) {
throw new UnsupportedOperationException();
}
+ @Override
public double getDouble(int column) {
throw new UnsupportedOperationException();
}
+ @Override
public boolean isNull(int column) {
throw new UnsupportedOperationException();
}
}
+ /** Contains custom suggestions results set by the UI */
private ResultsCursor mResultsCursor;
+ /** Locks access to {@link #mResultsCursor} */
+ private Object mResultsCursorLock = new Object();
/**
* Provide a set of results to be returned to query, intended to be used
@@ -786,10 +828,12 @@
* @param results Strings to display in the dropdown from the SearchDialog
*/
/* package */ void setQueryResults(ArrayList<String> results) {
- if (results == null) {
- mResultsCursor = null;
- } else {
- mResultsCursor = new ResultsCursor(results);
+ synchronized (mResultsCursorLock) {
+ if (results == null) {
+ mResultsCursor = null;
+ } else {
+ mResultsCursor = new ResultsCursor(results);
+ }
}
}
@@ -801,57 +845,19 @@
if (match == -1) {
throw new IllegalArgumentException("Unknown URL");
}
- if (match == URI_MATCH_SUGGEST && mResultsCursor != null) {
- Cursor results = mResultsCursor;
- mResultsCursor = null;
- return results;
+
+ // If results for the suggestion are already ready just return them directly
+ synchronized (mResultsCursorLock) {
+ if (match == URI_MATCH_SUGGEST && mResultsCursor != null) {
+ Cursor results = mResultsCursor;
+ mResultsCursor = null;
+ return results;
+ }
}
- SQLiteDatabase db = mOpenHelper.getReadableDatabase();
if (match == URI_MATCH_SUGGEST || match == URI_MATCH_BOOKMARKS_SUGGEST) {
- String suggestSelection;
- String [] myArgs;
- if (selectionArgs[0] == null || selectionArgs[0].equals("")) {
- suggestSelection = null;
- myArgs = null;
- } else {
- String like = selectionArgs[0] + "%";
- if (selectionArgs[0].startsWith("http")
- || selectionArgs[0].startsWith("file")) {
- myArgs = new String[1];
- myArgs[0] = like;
- suggestSelection = selection;
- } else {
- SUGGEST_ARGS[0] = "http://" + like;
- SUGGEST_ARGS[1] = "http://www." + like;
- SUGGEST_ARGS[2] = "https://" + like;
- SUGGEST_ARGS[3] = "https://www." + like;
- // To match against titles.
- SUGGEST_ARGS[4] = like;
- myArgs = SUGGEST_ARGS;
- suggestSelection = SUGGEST_SELECTION;
- }
- }
-
- Cursor c = db.query(TABLE_NAMES[URI_MATCH_BOOKMARKS],
- SUGGEST_PROJECTION, suggestSelection, myArgs, null, null,
- ORDER_BY, MAX_SUGGESTION_LONG_ENTRIES_STRING);
-
- if (match == URI_MATCH_BOOKMARKS_SUGGEST
- || Patterns.WEB_URL.matcher(selectionArgs[0]).matches()) {
- return new MySuggestionCursor(c, null, "");
- } else {
- // get search suggestions if there is still space in the list
- if (myArgs != null && myArgs.length > 1
- && c.getCount() < (MAX_SUGGESTION_SHORT_ENTRIES - 1)) {
- SearchEngine searchEngine = mSettings.getSearchEngine();
- if (searchEngine != null && searchEngine.supportsSuggestions()) {
- Cursor sc = searchEngine.getSuggestions(getContext(), selectionArgs[0]);
- return new MySuggestionCursor(c, sc, selectionArgs[0]);
- }
- }
- return new MySuggestionCursor(c, null, selectionArgs[0]);
- }
+ // Handle suggestions
+ return doSuggestQuery(selection, selectionArgs, match == URI_MATCH_BOOKMARKS_SUGGEST);
}
String[] projection = null;
@@ -861,29 +867,62 @@
projection[projectionIn.length] = "_id AS _id";
}
- StringBuilder whereClause = new StringBuilder(256);
+ String whereClause = null;
if (match == URI_MATCH_BOOKMARKS_ID || match == URI_MATCH_SEARCHES_ID) {
- whereClause.append("(_id = ").append(url.getPathSegments().get(1))
- .append(")");
+ whereClause = "_id = " + url.getPathSegments().get(1);
}
- // Tack on the user's selection, if present
- if (selection != null && selection.length() > 0) {
- if (whereClause.length() > 0) {
- whereClause.append(" AND ");
- }
-
- whereClause.append('(');
- whereClause.append(selection);
- whereClause.append(')');
- }
- Cursor c = db.query(TABLE_NAMES[match % 10], projection,
- whereClause.toString(), selectionArgs, null, null, sortOrder,
- null);
+ Cursor c = mOpenHelper.getReadableDatabase().query(TABLE_NAMES[match % 10], projection,
+ DatabaseUtils.concatenateWhere(whereClause, selection), selectionArgs,
+ null, null, sortOrder, null);
c.setNotificationUri(getContext().getContentResolver(), url);
return c;
}
+ private Cursor doSuggestQuery(String selection, String[] selectionArgs, boolean bookmarksOnly) {
+ String suggestSelection;
+ String [] myArgs;
+ if (selectionArgs[0] == null || selectionArgs[0].equals("")) {
+ return new MySuggestionCursor(null, null, "");
+ } else {
+ String like = selectionArgs[0] + "%";
+ if (selectionArgs[0].startsWith("http")
+ || selectionArgs[0].startsWith("file")) {
+ myArgs = new String[1];
+ myArgs[0] = like;
+ suggestSelection = selection;
+ } else {
+ SUGGEST_ARGS[0] = "http://" + like;
+ SUGGEST_ARGS[1] = "http://www." + like;
+ SUGGEST_ARGS[2] = "https://" + like;
+ SUGGEST_ARGS[3] = "https://www." + like;
+ // To match against titles.
+ SUGGEST_ARGS[4] = like;
+ myArgs = SUGGEST_ARGS;
+ suggestSelection = SUGGEST_SELECTION;
+ }
+ }
+
+ Cursor c = mOpenHelper.getReadableDatabase().query(TABLE_NAMES[URI_MATCH_BOOKMARKS],
+ SUGGEST_PROJECTION, suggestSelection, myArgs, null, null,
+ ORDER_BY, Integer.toString(mMaxSuggestionLongSize));
+
+ if (bookmarksOnly || Patterns.WEB_URL.matcher(selectionArgs[0]).matches()) {
+ return new MySuggestionCursor(c, null, "");
+ } else {
+ // get search suggestions if there is still space in the list
+ if (myArgs != null && myArgs.length > 1
+ && c.getCount() < (MAX_SUGGEST_SHORT_SMALL - 1)) {
+ SearchEngine searchEngine = mSettings.getSearchEngine();
+ if (searchEngine != null && searchEngine.supportsSuggestions()) {
+ Cursor sc = searchEngine.getSuggestions(getContext(), selectionArgs[0]);
+ return new MySuggestionCursor(c, sc, selectionArgs[0]);
+ }
+ }
+ return new MySuggestionCursor(c, null, selectionArgs[0]);
+ }
+ }
+
@Override
public String getType(Uri url) {
int match = URI_MATCHER.match(url);
@@ -1089,4 +1128,10 @@
}
}
+ public static Cursor getBookmarksSuggestions(ContentResolver cr, String constraint) {
+ Uri uri = Uri.parse("content://browser/" + SearchManager.SUGGEST_URI_PATH_QUERY);
+ return cr.query(uri, SUGGEST_PROJECTION, SUGGEST_SELECTION,
+ new String[] { constraint }, ORDER_BY);
+ }
+
}
diff --git a/src/com/android/browser/BrowserSettings.java b/src/com/android/browser/BrowserSettings.java
index 3791eb0..1f091e2 100644
--- a/src/com/android/browser/BrowserSettings.java
+++ b/src/com/android/browser/BrowserSettings.java
@@ -24,13 +24,20 @@
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
+import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.content.pm.ActivityInfo;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.database.ContentObserver;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.AsyncTask;
import android.os.Handler;
+import android.os.Message;
import android.preference.PreferenceActivity;
+import android.preference.PreferenceManager;
import android.preference.PreferenceScreen;
+import android.provider.Browser;
import android.provider.Settings;
import android.util.Log;
import android.webkit.CookieManager;
@@ -40,9 +47,9 @@
import android.webkit.WebViewDatabase;
import android.webkit.WebIconDatabase;
import android.webkit.WebSettings;
+import android.webkit.WebSettings.AutoFillProfile;
import android.webkit.WebStorage;
-import android.preference.PreferenceManager;
-import android.provider.Browser;
+import android.widget.Toast;
import java.util.HashMap;
import java.util.Map;
@@ -62,8 +69,7 @@
* To remove an observer:
* s.deleteObserver(webView.getSettings());
*/
-class BrowserSettings extends Observable {
-
+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()
@@ -76,12 +82,12 @@
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 landscapeOnly;
private boolean loadsPageInOverviewMode;
private boolean showDebugSettings;
// HTML5 API flags
@@ -109,14 +115,15 @@
private boolean tracing = false;
private boolean lightTouch = false;
private boolean navDump = false;
+ private boolean hardwareAccelerated = true;
// 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 = 8;
- private static int minimumLogicalFontSize = 8;
+ 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 =
@@ -125,6 +132,15 @@
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";
@@ -145,6 +161,11 @@
"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_USER_AGENT = "user_agent";
private static final String DESKTOP_USERAGENT = "Mozilla/5.0 (Macintosh; " +
"U; Intel Mac OS X 10_6_3; en-us) AppleWebKit/533.16 (KHTML, " +
@@ -166,7 +187,14 @@
// a ListView
public final static int MAX_TEXTVIEW_LEN = 80;
- private TabControl mTabControl;
+ public static final String RLZ_PROVIDER = "com.google.android.partnersetup.rlzappprovider";
+
+ public static final Uri RLZ_PROVIDER_URI = Uri.parse("content://" + RLZ_PROVIDER + "/");
+
+ // Set to true to enable some of the about:debug options
+ public static final boolean DEV_BUILD = true;
+
+ private Controller mController;
// Single instance of the BrowserSettings for use in the Browser app.
private static BrowserSettings sSingleton;
@@ -176,6 +204,18 @@
private HashMap<WebSettings,Observer> mWebSettingsToObservers =
new HashMap<WebSettings,Observer>();
+ private boolean mLoadFromDbComplete;
+
+ public void waitForLoadFromDbToComplete() {
+ synchronized (sSingleton) {
+ while (!mLoadFromDbComplete) {
+ try {
+ sSingleton.wait();
+ } catch (InterruptedException e) { }
+ }
+ }
+ }
+
/*
* An observer wrapper for updating a WebSettings object with the new
* settings after a call to BrowserSettings.update().
@@ -221,6 +261,7 @@
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);
@@ -229,6 +270,9 @@
s.setNeedInitialFocus(false);
// Browser supports multiple windows
s.setSupportMultipleWindows(true);
+ // enable smooth transition for better performance during panning or
+ // zooming
+ s.setEnableSmoothTransition(true);
// HTML5 API flags
s.setAppCacheEnabled(b.appCacheEnabled);
@@ -243,56 +287,123 @@
s.setDatabasePath(b.databasePath);
s.setGeolocationDatabasePath(b.geolocationDatabasePath);
+ // Active AutoFill profile data.
+ s.setAutoFillProfile(b.autoFillProfile);
+
b.updateTabControlSettings();
}
}
/**
- * Load settings from the browser app's database.
+ * 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 browser_preferences.xml
+ * 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.
*/
- public void loadFromDb(final Context ctx) {
- SharedPreferences p =
- PreferenceManager.getDefaultSharedPreferences(ctx);
- // Set the default value for the Application Caches path.
- appCachePath = ctx.getDir("appcache", 0).getPath();
- // Determine the maximum size of the application cache.
- webStorageSizeManager = new WebStorageSizeManager(
- ctx,
- new WebStorageSizeManager.StatFsDiskInfo(appCachePath),
- new WebStorageSizeManager.WebKitAppCacheInfo(appCachePath));
- appCacheMaxSize = webStorageSizeManager.getAppCacheMaxSize();
- // Set the default value for the Database path.
- databasePath = ctx.getDir("databases", 0).getPath();
- // Set the default value for the Geolocation database path.
- geolocationDatabasePath = ctx.getDir("geolocation", 0).getPath();
+ 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();
+ }
- if (p.getString(PREF_HOMEPAGE, "") == "") {
- // No home page preferences is set, set it to default.
- setHomePage(ctx, getFactoryResetHomeUrl(ctx));
+ private class LoadFromDbTask extends AsyncTask<Void, Void, Void> {
+ private Context mContext;
+
+ public LoadFromDbTask(Context context) {
+ mContext = context;
}
- // 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) ctx
- .getSystemService(Context.ACTIVITY_SERVICE);
- if (am.getMemoryClass() > 16) {
- pageCacheCapacity = 5;
- } else {
- pageCacheCapacity = 1;
- }
+ 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();
- // Load the defaults from the xml
- // This call is TOO SLOW, need to manually keep the defaults
- // in sync
- //PreferenceManager.setDefaultValues(ctx, R.xml.browser_preferences);
- syncSharedPreferences(ctx, p);
+ if (p.getString(PREF_HOMEPAGE, null) == null) {
+ // No home page preferences is set, set it to default.
+ setHomePage(mContext, getFactoryResetHomeUrl(mContext));
+ }
+
+ // 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;
+ } else {
+ pageCacheCapacity = 1;
+ }
+
+ // 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;
+ }
}
/* package */ void syncSharedPreferences(Context ctx, SharedPreferences p) {
@@ -307,8 +418,8 @@
// 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.
- for (int i = 0; i < mTabControl.getTabCount(); i++) {
- mTabControl.getTab(i).revertVoiceSearchMode();
+ for (int i = 0; i < mController.getTabControl().getTabCount(); i++) {
+ mController.getTabControl().getTab(i).revertVoiceSearchMode();
}
}
searchEngine.close();
@@ -332,6 +443,7 @@
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);
@@ -343,11 +455,6 @@
autoFitPage = p.getBoolean("autofit_pages", autoFitPage);
loadsPageInOverviewMode = p.getBoolean("load_page",
loadsPageInOverviewMode);
- boolean landscapeOnlyTemp =
- p.getBoolean("landscape_only", landscapeOnly);
- if (landscapeOnlyTemp != landscapeOnly) {
- landscapeOnly = landscapeOnlyTemp;
- }
useWideViewPort = true; // use wide view port for either setting
if (autoFitPage) {
layoutAlgorithm = WebSettings.LayoutAlgorithm.NARROW_COLUMNS;
@@ -381,8 +488,14 @@
tracing = p.getBoolean("enable_tracing", tracing);
lightTouch = p.getBoolean("enable_light_touch", lightTouch);
navDump = p.getBoolean("enable_nav_dump", navDump);
- userAgent = Integer.parseInt(p.getString("user_agent", "0"));
}
+
+ // Only set these on startup if it is a dev build
+ if (DEV_BUILD) {
+ 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", "");
@@ -456,6 +569,10 @@
return navDump;
}
+ public boolean isHardwareAccelerated() {
+ return hardwareAccelerated;
+ }
+
public boolean showDebugSettings() {
return showDebugSettings;
}
@@ -466,6 +583,40 @@
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);
+ }
+ }
+ autoFillProfile = profile;
+ }
+
+ public AutoFillProfile getAutoFillProfile() {
+ return autoFillProfile;
+ }
+
+ 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();
+ }
+
+ /* 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.
@@ -497,10 +648,10 @@
}
/*
- * Package level method for obtaining a single app instance of the
+ * Application level method for obtaining a single app instance of the
* BrowserSettings.
*/
- /*package*/ static BrowserSettings getInstance() {
+ public static BrowserSettings getInstance() {
if (sSingleton == null ) {
sSingleton = new BrowserSettings();
}
@@ -510,8 +661,8 @@
/*
* Package level method for associating the BrowserSettings with TabControl
*/
- /* package */void setTabControl(TabControl tabControl) {
- mTabControl = tabControl;
+ /* package */void setController(Controller ctrl) {
+ mController = ctrl;
updateTabControlSettings();
}
@@ -525,8 +676,8 @@
/*package*/ void clearCache(Context context) {
WebIconDatabase.getInstance().removeAllIcons();
- if (mTabControl != null) {
- WebView current = mTabControl.getCurrentWebView();
+ if (mController != null) {
+ WebView current = mController.getCurrentWebView();
if (current != null) {
current.clearCache(true);
}
@@ -545,8 +696,8 @@
/* package */ void clearFormData(Context context) {
WebViewDatabase.getInstance(context).clearFormData();
- if (mTabControl != null) {
- WebView currentTopView = mTabControl.getCurrentTopWebView();
+ if (mController!= null) {
+ WebView currentTopView = mController.getCurrentTopWebView();
if (currentTopView != null) {
currentTopView.clearFormData();
}
@@ -561,59 +712,35 @@
private void updateTabControlSettings() {
// Enable/disable the error console.
- mTabControl.getBrowserActivity().setShouldShowErrorConsole(
+ mController.setShouldShowErrorConsole(
showDebugSettings && showConsole);
- mTabControl.getBrowserActivity().setRequestedOrientation(
- landscapeOnly ? ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
- : ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
- }
-
- private void maybeDisableWebsiteSettings(Context context) {
- PreferenceActivity activity = (PreferenceActivity) context;
- final PreferenceScreen screen = (PreferenceScreen)
- activity.findPreference(BrowserSettings.PREF_WEBSITE_SETTINGS);
- screen.setEnabled(false);
- WebStorage.getInstance().getOrigins(new ValueCallback<Map>() {
- public void onReceiveValue(Map webStorageOrigins) {
- if ((webStorageOrigins != null) && !webStorageOrigins.isEmpty()) {
- screen.setEnabled(true);
- }
- }
- });
-
- GeolocationPermissions.getInstance().getOrigins(new ValueCallback<Set<String> >() {
- public void onReceiveValue(Set<String> geolocationOrigins) {
- if ((geolocationOrigins != null) && !geolocationOrigins.isEmpty()) {
- screen.setEnabled(true);
- }
- }
- });
}
/*package*/ void clearDatabases(Context context) {
WebStorage.getInstance().deleteAllData();
- maybeDisableWebsiteSettings(context);
}
/*package*/ void clearLocationAccess(Context context) {
GeolocationPermissions.getInstance().clearAll();
- maybeDisableWebsiteSettings(context);
}
/*package*/ void resetDefaultPreferences(Context ctx) {
reset();
- SharedPreferences p =
- PreferenceManager.getDefaultSharedPreferences(ctx);
+ SharedPreferences p = PreferenceManager.getDefaultSharedPreferences(ctx);
p.edit().clear().apply();
- PreferenceManager.setDefaultValues(ctx, R.xml.browser_preferences,
- true);
+ PreferenceManager.setDefaultValues(ctx, R.xml.page_content_preferences, true);
+ PreferenceManager.setDefaultValues(ctx, R.xml.personal_preferences, true);
+ PreferenceManager.setDefaultValues(ctx, R.xml.privacy_preferences, true);
+ PreferenceManager.setDefaultValues(ctx, R.xml.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);
}
- private String getFactoryResetHomeUrl(Context context) {
+ /*package*/ static String getFactoryResetHomeUrl(Context context) {
String url = context.getResources().getString(R.string.homepage_base);
if (url.indexOf("{CID}") != -1) {
url = url.replace("{CID}",
@@ -639,9 +766,9 @@
showSecurityWarnings = true;
rememberPasswords = true;
saveFormData = true;
+ autoFillEnabled = true;
openInBackground = false;
autoFitPage = true;
- landscapeOnly = false;
loadsPageInOverviewMode = true;
showDebugSettings = false;
// HTML5 API flags
@@ -651,4 +778,64 @@
geolocationEnabled = true;
workersEnabled = true; // only affects V8. JSC does not have a similar setting
}
+
+ private abstract class AutoFillProfileDbTask<T> extends AsyncTask<T, Void, Void> {
+ Context mContext;
+ AutoFillProfileDatabase mAutoFillProfileDb;
+ Message mCompleteMessage;
+
+ 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);
+ }
+
+
+ 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;
+ }
+ }
+
+ 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;
+ }
+ }
+
+ @Override
+ public void onSharedPreferenceChanged(
+ SharedPreferences p, String key) {
+ if (PREF_HARDWARE_ACCEL.equals(key)) {
+ hardwareAccelerated = p.getBoolean(PREF_HARDWARE_ACCEL, hardwareAccelerated);
+ } else if (PREF_USER_AGENT.equals(key)) {
+ userAgent = Integer.parseInt(p.getString(PREF_USER_AGENT, "0"));
+ update();
+ }
+ }
}
diff --git a/src/com/android/browser/CombinedBookmarkHistoryActivity.java b/src/com/android/browser/CombinedBookmarkHistoryActivity.java
deleted file mode 100644
index 194956f..0000000
--- a/src/com/android/browser/CombinedBookmarkHistoryActivity.java
+++ /dev/null
@@ -1,192 +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.app.TabActivity;
-import android.content.Intent;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.provider.Browser;
-import android.webkit.WebIconDatabase;
-import android.webkit.WebIconDatabase.IconListener;
-import android.widget.TabHost;
-
-import java.util.HashMap;
-import java.util.Vector;
-
-public class CombinedBookmarkHistoryActivity extends TabActivity
- implements TabHost.OnTabChangeListener {
- /**
- * Used to inform BrowserActivity to remove the parent/child relationships
- * from all the tabs.
- */
- private String mExtraData;
- /**
- * Intent to be passed to calling Activity when finished. Keep a pointer to
- * it locally so mExtraData can be added.
- */
- private Intent mResultData;
- /**
- * Result code to pass back to calling Activity when finished.
- */
- private int mResultCode;
-
- /* package */ static String BOOKMARKS_TAB = "bookmark";
- /* package */ static String VISITED_TAB = "visited";
- /* package */ static String HISTORY_TAB = "history";
- /* package */ static String STARTING_TAB = "tab";
-
- static class IconListenerSet implements IconListener {
- // Used to store favicons as we get them from the database
- // FIXME: We use a different method to get the Favicons in
- // BrowserBookmarksAdapter. They should probably be unified.
- private HashMap<String, Bitmap> mUrlsToIcons;
- private Vector<IconListener> mListeners;
-
- public IconListenerSet() {
- mUrlsToIcons = new HashMap<String, Bitmap>();
- mListeners = new Vector<IconListener>();
- }
- public void onReceivedIcon(String url, Bitmap icon) {
- mUrlsToIcons.put(url, icon);
- for (IconListener listener : mListeners) {
- listener.onReceivedIcon(url, icon);
- }
- }
- public void addListener(IconListener listener) {
- mListeners.add(listener);
- }
- public void removeListener(IconListener listener) {
- mListeners.remove(listener);
- }
- public Bitmap getFavicon(String url) {
- return (Bitmap) mUrlsToIcons.get(url);
- }
- }
- private static IconListenerSet sIconListenerSet;
- static IconListenerSet getIconListenerSet() {
- if (null == sIconListenerSet) {
- sIconListenerSet = new IconListenerSet();
- }
- return sIconListenerSet;
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.tabs);
-
- setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL);
-
- getTabHost().setOnTabChangedListener(this);
-
- Bundle extras = getIntent().getExtras();
-
- Intent bookmarksIntent = new Intent(this, BrowserBookmarksPage.class);
- if (extras != null) {
- bookmarksIntent.putExtras(extras);
- }
- createTab(bookmarksIntent, R.string.tab_bookmarks,
- R.drawable.browser_bookmark_tab, BOOKMARKS_TAB);
-
- Intent visitedIntent = new Intent(this, BrowserBookmarksPage.class);
- // Need to copy extras so the bookmarks activity and this one will be
- // different
- Bundle visitedExtras = extras == null ? new Bundle() : new Bundle(extras);
- visitedExtras.putBoolean("mostVisited", true);
- visitedIntent.putExtras(visitedExtras);
- createTab(visitedIntent, R.string.tab_most_visited,
- R.drawable.browser_visited_tab, VISITED_TAB);
-
- Intent historyIntent = new Intent(this, BrowserHistoryPage.class);
- String defaultTab = null;
- if (extras != null) {
- historyIntent.putExtras(extras);
- defaultTab = extras.getString(STARTING_TAB);
- }
- createTab(historyIntent, R.string.tab_history,
- R.drawable.browser_history_tab, HISTORY_TAB);
-
- if (defaultTab != null) {
- getTabHost().setCurrentTab(2);
- }
-
- // XXX: Must do this before launching the AsyncTask to avoid a
- // potential crash if the icon database has not been created.
- WebIconDatabase.getInstance();
- // Do this every time we launch the activity in case a new favicon was
- // added to the webkit db.
- (new AsyncTask<Void, Void, Void>() {
- public Void doInBackground(Void... v) {
- Browser.requestAllIcons(getContentResolver(),
- Browser.BookmarkColumns.FAVICON + " is NULL",
- getIconListenerSet());
- return null;
- }
- }).execute();
- }
-
- private void createTab(Intent intent, int labelResId, int iconResId,
- String tab) {
- Resources resources = getResources();
- TabHost tabHost = getTabHost();
- tabHost.addTab(tabHost.newTabSpec(tab).setIndicator(
- resources.getText(labelResId), resources.getDrawable(iconResId))
- .setContent(intent));
- }
- // Copied from DialTacts Activity
- /** {@inheritDoc} */
- public void onTabChanged(String tabId) {
- Activity activity = getLocalActivityManager().getActivity(tabId);
- if (activity != null) {
- activity.onWindowFocusChanged(true);
- }
- }
-
- /**
- * Store extra data in the Intent to return to the calling Activity to tell
- * it to clear the parent/child relationships from all tabs.
- */
- /* package */ void removeParentChildRelationShips() {
- mExtraData = BrowserSettings.PREF_CLEAR_HISTORY;
- }
-
- /**
- * Custom setResult() method so that the Intent can have extra data attached
- * if necessary.
- * @param resultCode Uses same codes as Activity.setResult
- * @param data Intent returned to onActivityResult.
- */
- /* package */ void setResultFromChild(int resultCode, Intent data) {
- mResultCode = resultCode;
- mResultData = data;
- }
-
- @Override
- public void finish() {
- if (mExtraData != null) {
- mResultCode = RESULT_OK;
- if (mResultData == null) mResultData = new Intent();
- mResultData.putExtra(Intent.EXTRA_TEXT, mExtraData);
- }
- setResult(mResultCode, mResultData);
- super.finish();
- }
-}
diff --git a/src/com/android/browser/CombinedBookmarkHistoryView.java b/src/com/android/browser/CombinedBookmarkHistoryView.java
new file mode 100644
index 0000000..e63d126
--- /dev/null
+++ b/src/com/android/browser/CombinedBookmarkHistoryView.java
@@ -0,0 +1,260 @@
+/*
+ * 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.app.Fragment;
+import android.app.FragmentManager;
+import android.app.FragmentTransaction;
+import android.content.res.Resources;
+import android.database.Cursor;
+import android.graphics.Bitmap;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.provider.Browser;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.webkit.WebIconDatabase;
+import android.webkit.WebIconDatabase.IconListener;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import java.util.HashMap;
+import java.util.Vector;
+
+interface BookmarksHistoryCallbacks {
+ public void onUrlSelected(String url, boolean newWindow);
+ public void onRemoveParentChildRelationships();
+ public void onComboCanceled();
+}
+
+public class CombinedBookmarkHistoryView extends LinearLayout
+ implements OnClickListener {
+
+ final static String STARTING_FRAGMENT = "fragment";
+
+ final static int FRAGMENT_ID_BOOKMARKS = 1;
+ final static int FRAGMENT_ID_HISTORY = 2;
+
+ private UiController mUiController;
+ private Activity mActivity;
+
+ private Bundle mExtras;
+
+ long mCurrentFragment;
+
+ View mTabs;
+ TextView mTabBookmarks;
+ TextView mTabHistory;
+ TextView mAddBookmark;
+ View mSeperateSelectAdd;
+ ViewGroup mBookmarksHeader;
+ View mHome;
+
+ BrowserBookmarksPage mBookmarks;
+ BrowserHistoryPage mHistory;
+
+ static class IconListenerSet implements IconListener {
+ // Used to store favicons as we get them from the database
+ // FIXME: We use a different method to get the Favicons in
+ // BrowserBookmarksAdapter. They should probably be unified.
+ private HashMap<String, Bitmap> mUrlsToIcons;
+ private Vector<IconListener> mListeners;
+
+ public IconListenerSet() {
+ mUrlsToIcons = new HashMap<String, Bitmap>();
+ mListeners = new Vector<IconListener>();
+ }
+ @Override
+ public void onReceivedIcon(String url, Bitmap icon) {
+ mUrlsToIcons.put(url, icon);
+ for (IconListener listener : mListeners) {
+ listener.onReceivedIcon(url, icon);
+ }
+ }
+ public void addListener(IconListener listener) {
+ mListeners.add(listener);
+ }
+ public void removeListener(IconListener listener) {
+ mListeners.remove(listener);
+ }
+ public Bitmap getFavicon(String url) {
+ return mUrlsToIcons.get(url);
+ }
+ }
+
+ private static IconListenerSet sIconListenerSet;
+ static IconListenerSet getIconListenerSet() {
+ if (null == sIconListenerSet) {
+ sIconListenerSet = new IconListenerSet();
+ }
+ return sIconListenerSet;
+ }
+
+ public CombinedBookmarkHistoryView(Activity activity, UiController controller,
+ int startingFragment, Bundle extras) {
+ super(activity);
+ mUiController = controller;
+ mActivity = activity;
+ mExtras = extras;
+ View v = LayoutInflater.from(activity).inflate(R.layout.bookmarks_history, this);
+ Resources res = activity.getResources();
+
+// setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL);
+
+ mTabs = findViewById(R.id.tabs);
+ mBookmarksHeader = (ViewGroup) findViewById(R.id.header_container);
+
+ mTabBookmarks = (TextView) findViewById(R.id.bmtab);
+ mTabHistory = (TextView) findViewById(R.id.historytab);
+ mAddBookmark = (TextView) findViewById(R.id.addbm);
+ mSeperateSelectAdd = findViewById(R.id.seperate_select_add);
+ mHome = findViewById(R.id.home);
+ mAddBookmark.setOnClickListener(this);
+ mTabHistory.setOnClickListener(this);
+ mTabBookmarks.setOnClickListener(this);
+ mHome.setOnClickListener(this);
+ // Start up the default fragment
+ initFragments(mExtras);
+ loadFragment(startingFragment, mExtras, false);
+
+ // XXX: Must do this before launching the AsyncTask to avoid a
+ // potential crash if the icon database has not been created.
+ WebIconDatabase.getInstance();
+
+ // Do this every time the view is created in case a new favicon was
+ // added to the webkit db.
+ (new AsyncTask<Void, Void, Void>() {
+ @Override
+ public Void doInBackground(Void... v) {
+ Browser.requestAllIcons(mActivity.getContentResolver(),
+ Browser.BookmarkColumns.FAVICON + " is NULL", getIconListenerSet());
+ return null;
+ }
+ }).execute();
+
+ }
+
+ private BookmarksPageCallbacks mBookmarkCallbackWrapper = new BookmarksPageCallbacks() {
+ @Override
+ public boolean onOpenInNewWindow(Cursor c) {
+ mUiController.onUrlSelected(BrowserBookmarksPage.getUrl(c), true);
+ return true;
+ }
+
+ @Override
+ public boolean onBookmarkSelected(Cursor c, boolean isFolder) {
+ if (isFolder) {
+ return false;
+ }
+ mUiController.onUrlSelected(BrowserBookmarksPage.getUrl(c), false);
+ return true;
+ }
+
+ @Override
+ public void onFolderChanged(int level, Uri uri) {
+ // 1 is "bookmarks" root folder
+ if (level <= 1) {
+ mTabs.setVisibility(View.VISIBLE);
+ mBookmarks.setBreadCrumbVisibility(View.INVISIBLE);
+ } else {
+ mTabs.setVisibility(View.GONE);
+ mBookmarks.setBreadCrumbVisibility(View.VISIBLE);
+ }
+ }
+ };
+
+ private void initFragments(Bundle extras) {
+ mBookmarks = BrowserBookmarksPage.newInstance(mBookmarkCallbackWrapper,
+ extras, mBookmarksHeader);
+ mBookmarks.setBreadCrumbMaxVisible(2);
+ mBookmarks.setBreadCrumbUseBackButton(true);
+ mHistory = BrowserHistoryPage.newInstance(mUiController, extras);
+ }
+
+ private void loadFragment(int id, Bundle extras, boolean notify) {
+ String fragmentClassName;
+ Fragment fragment = null;
+ switch (id) {
+ case FRAGMENT_ID_BOOKMARKS:
+ fragment = mBookmarks;
+ mSeperateSelectAdd.setVisibility(View.VISIBLE);
+ mBookmarksHeader.setVisibility(View.VISIBLE);
+ mTabBookmarks.setActivated(true);
+ mTabHistory.setActivated(false);
+ break;
+ case FRAGMENT_ID_HISTORY:
+ fragment = mHistory;
+ mBookmarksHeader.setVisibility(View.INVISIBLE);
+ mSeperateSelectAdd.setVisibility(View.INVISIBLE);
+ mTabBookmarks.setActivated(false);
+ mTabHistory.setActivated(true);
+ break;
+ default:
+ throw new IllegalArgumentException();
+ }
+ mCurrentFragment = id;
+
+ FragmentManager fm = mActivity.getFragmentManager();
+ FragmentTransaction transaction = fm.openTransaction();
+ transaction.replace(R.id.fragment, fragment);
+ transaction.commit();
+ }
+
+ @Override
+ protected void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+ FragmentManager fm = mActivity.getFragmentManager();
+ FragmentTransaction transaction = fm.openTransaction();
+ if (mCurrentFragment == FRAGMENT_ID_BOOKMARKS) {
+ transaction.remove(mBookmarks);
+ } else if (mCurrentFragment == FRAGMENT_ID_HISTORY) {
+ transaction.remove(mHistory);
+ }
+ transaction.commit();
+ }
+
+ @Override
+ public void onClick(View view) {
+ if ((mTabHistory == view) && (mCurrentFragment != FRAGMENT_ID_HISTORY)) {
+ loadFragment(FRAGMENT_ID_HISTORY, mExtras, false);
+ } else if (mTabBookmarks == view) {
+ if (mCurrentFragment != FRAGMENT_ID_BOOKMARKS) {
+ loadFragment(FRAGMENT_ID_BOOKMARKS, mExtras, true);
+ }
+ } else if (mAddBookmark == view) {
+ mUiController.bookmarkCurrentPage(mBookmarks.getFolderId());
+ } else if (mHome == view) {
+ BrowserSettings settings = BrowserSettings.getInstance();
+ mUiController.onUrlSelected(settings.getHomePage(), false);
+ }
+ }
+
+ /**
+ * callback for back key presses
+ */
+ boolean onBackPressed() {
+ if (mCurrentFragment == FRAGMENT_ID_BOOKMARKS) {
+ return mBookmarks.onBackPressed();
+ }
+ return false;
+ }
+}
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
new file mode 100644
index 0000000..7acdfe5
--- /dev/null
+++ b/src/com/android/browser/Controller.java
@@ -0,0 +1,2455 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import com.android.browser.IntentHandler.UrlData;
+import com.android.browser.search.SearchEngine;
+import com.android.common.Search;
+
+import android.app.Activity;
+import android.app.DownloadManager;
+import android.app.SearchManager;
+import android.content.ClipboardManager;
+import android.content.ContentProvider;
+import android.content.ContentProviderClient;
+import android.content.ContentResolver;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.content.res.Configuration;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteException;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Picture;
+import android.net.Uri;
+import android.net.http.SslError;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.os.PowerManager;
+import android.os.PowerManager.WakeLock;
+import android.preference.PreferenceActivity;
+import android.provider.Browser;
+import android.provider.BrowserContract;
+import android.provider.BrowserContract.History;
+import android.provider.BrowserContract.Images;
+import android.provider.ContactsContract;
+import android.provider.ContactsContract.Intents.Insert;
+import android.speech.RecognizerResultsIntent;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.ActionMode;
+import android.view.ContextMenu;
+import android.view.ContextMenu.ContextMenuInfo;
+import android.view.Gravity;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.MenuItem.OnMenuItemClickListener;
+import android.view.View;
+import android.webkit.CookieManager;
+import android.webkit.CookieSyncManager;
+import android.webkit.HttpAuthHandler;
+import android.webkit.SslErrorHandler;
+import android.webkit.ValueCallback;
+import android.webkit.WebChromeClient;
+import android.webkit.WebIconDatabase;
+import android.webkit.WebSettings;
+import android.webkit.WebView;
+import android.widget.TextView;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.net.URLEncoder;
+import java.util.Calendar;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * Controller for browser
+ */
+public class Controller
+ implements WebViewController, UiController {
+
+ private static final String LOGTAG = "Controller";
+
+ // public message ids
+ public final static int LOAD_URL = 1001;
+ public final static int STOP_LOAD = 1002;
+
+ // Message Ids
+ private static final int FOCUS_NODE_HREF = 102;
+ private static final int RELEASE_WAKELOCK = 107;
+
+ static final int UPDATE_BOOKMARK_THUMBNAIL = 108;
+
+ private static final int OPEN_BOOKMARKS = 201;
+
+ private static final int EMPTY_MENU = -1;
+
+ // activity requestCode
+ final static int PREFERENCES_PAGE = 3;
+ final static int FILE_SELECTED = 4;
+ final static int AUTOFILL_SETUP = 5;
+
+ private final static int WAKELOCK_TIMEOUT = 5 * 60 * 1000; // 5 minutes
+
+ // As the ids are dynamically created, we can't guarantee that they will
+ // be in sequence, so this static array maps ids to a window number.
+ final static private int[] WINDOW_SHORTCUT_ID_ARRAY =
+ { R.id.window_one_menu_id, R.id.window_two_menu_id,
+ R.id.window_three_menu_id, R.id.window_four_menu_id,
+ R.id.window_five_menu_id, R.id.window_six_menu_id,
+ R.id.window_seven_menu_id, R.id.window_eight_menu_id };
+
+ // "source" parameter for Google search through search key
+ final static String GOOGLE_SEARCH_SOURCE_SEARCHKEY = "browser-key";
+ // "source" parameter for Google search through simplily type
+ final static String GOOGLE_SEARCH_SOURCE_TYPE = "browser-type";
+
+ private Activity mActivity;
+ private UI mUi;
+ private TabControl mTabControl;
+ private BrowserSettings mSettings;
+ private WebViewFactory mFactory;
+
+ private WakeLock mWakeLock;
+
+ private UrlHandler mUrlHandler;
+ private UploadHandler mUploadHandler;
+ private IntentHandler mIntentHandler;
+ private PageDialogsHandler mPageDialogsHandler;
+ private NetworkStateHandler mNetworkHandler;
+
+ private Message mAutoFillSetupMessage;
+
+ private boolean mShouldShowErrorConsole;
+
+ private SystemAllowGeolocationOrigins mSystemAllowGeolocationOrigins;
+
+ // FIXME, temp address onPrepareMenu performance problem.
+ // When we move everything out of view, we should rewrite this.
+ private int mCurrentMenuState = 0;
+ private int mMenuState = R.id.MAIN_MENU;
+ private int mOldMenuState = EMPTY_MENU;
+ private Menu mCachedMenu;
+
+ // Used to prevent chording to result in firing two shortcuts immediately
+ // one after another. Fixes bug 1211714.
+ boolean mCanChord;
+ private boolean mMenuIsDown;
+
+ // For select and find, we keep track of the ActionMode so that
+ // finish() can be called as desired.
+ private ActionMode mActionMode;
+
+ /**
+ * Only meaningful when mOptionsMenuOpen is true. This variable keeps track
+ * of whether the configuration has changed. The first onMenuOpened call
+ * after a configuration change is simply a reopening of the same menu
+ * (i.e. mIconView did not change).
+ */
+ private boolean mConfigChanged;
+
+ /**
+ * Keeps track of whether the options menu is open. This is important in
+ * determining whether to show or hide the title bar overlay
+ */
+ private boolean mOptionsMenuOpen;
+
+ /**
+ * Whether or not the options menu is in its bigger, popup menu form. When
+ * true, we want the title bar overlay to be gone. When false, we do not.
+ * Only meaningful if mOptionsMenuOpen is true.
+ */
+ private boolean mExtendedMenuOpen;
+
+ private boolean mInLoad;
+
+ private boolean mActivityPaused = true;
+ private boolean mLoadStopped;
+
+ private Handler mHandler;
+
+ private static class ClearThumbnails extends AsyncTask<File, Void, Void> {
+ @Override
+ public Void doInBackground(File... files) {
+ if (files != null) {
+ for (File f : files) {
+ if (!f.delete()) {
+ Log.e(LOGTAG, f.getPath() + " was not deleted");
+ }
+ }
+ }
+ return null;
+ }
+ }
+
+ public Controller(Activity browser) {
+ mActivity = browser;
+ mSettings = BrowserSettings.getInstance();
+ mTabControl = new TabControl(this);
+ mSettings.setController(this);
+
+ mUrlHandler = new UrlHandler(this);
+ mIntentHandler = new IntentHandler(mActivity, this);
+ mPageDialogsHandler = new PageDialogsHandler(mActivity, this);
+
+ PowerManager pm = (PowerManager) mActivity
+ .getSystemService(Context.POWER_SERVICE);
+ mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Browser");
+
+ startHandler();
+
+ mNetworkHandler = new NetworkStateHandler(mActivity, this);
+ // Start watching the default geolocation permissions
+ mSystemAllowGeolocationOrigins =
+ new SystemAllowGeolocationOrigins(mActivity.getApplicationContext());
+ mSystemAllowGeolocationOrigins.start();
+
+ retainIconsOnStartup();
+ }
+
+ void start(Bundle icicle, Intent intent) {
+ // Unless the last browser usage was within 24 hours, destroy any
+ // remaining incognito tabs.
+
+ Calendar lastActiveDate = icicle != null ?
+ (Calendar) icicle.getSerializable("lastActiveDate") : null;
+ Calendar today = Calendar.getInstance();
+ Calendar yesterday = Calendar.getInstance();
+ yesterday.add(Calendar.DATE, -1);
+
+ boolean restoreIncognitoTabs = !(lastActiveDate == null
+ || lastActiveDate.before(yesterday)
+ || lastActiveDate.after(today));
+
+ if (!mTabControl.restoreState(icicle, restoreIncognitoTabs,
+ mUi.needsRestoreAllTabs())) {
+ // there is no quit on Android. But if we can't restore the state,
+ // we can treat it as a new Browser, remove the old session cookies.
+ CookieManager.getInstance().removeSessionCookie();
+ // remove any incognito files
+ WebView.cleanupPrivateBrowsingFiles();
+ final Bundle extra = intent.getExtras();
+ // Create an initial tab.
+ // If the intent is ACTION_VIEW and data is not null, the Browser is
+ // invoked to view the content by another application. In this case,
+ // the tab will be close when exit.
+ UrlData urlData = mIntentHandler.getUrlDataFromIntent(intent);
+
+ String action = intent.getAction();
+ final Tab t = mTabControl.createNewTab(
+ (Intent.ACTION_VIEW.equals(action) &&
+ intent.getData() != null)
+ || RecognizerResultsIntent.ACTION_VOICE_SEARCH_RESULTS
+ .equals(action),
+ intent.getStringExtra(Browser.EXTRA_APPLICATION_ID),
+ urlData.mUrl, false);
+ addTab(t);
+ setActiveTab(t);
+ WebView webView = t.getWebView();
+ if (extra != null) {
+ int scale = extra.getInt(Browser.INITIAL_ZOOM_LEVEL, 0);
+ if (scale > 0 && scale <= 1000) {
+ webView.setInitialScale(scale);
+ }
+ }
+
+ if (urlData.isEmpty()) {
+ loadUrl(webView, mSettings.getHomePage());
+ } else {
+ loadUrlDataIn(t, urlData);
+ }
+ } else {
+ mUi.updateTabs(mTabControl.getTabs());
+ if (!restoreIncognitoTabs) {
+ WebView.cleanupPrivateBrowsingFiles();
+ }
+ // TabControl.restoreState() will create a new tab even if
+ // restoring the state fails.
+ setActiveTab(mTabControl.getCurrentTab());
+ }
+ // clear up the thumbnail directory, which is no longer used;
+ // ideally this should only be run once after an upgrade from
+ // a previous version of the browser
+ new ClearThumbnails().execute(mTabControl.getThumbnailDir()
+ .listFiles());
+ // Read JavaScript flags if it exists.
+ String jsFlags = getSettings().getJsFlags();
+ if (jsFlags.trim().length() != 0) {
+ getCurrentWebView().setJsFlags(jsFlags);
+ }
+ }
+
+ void setWebViewFactory(WebViewFactory factory) {
+ mFactory = factory;
+ }
+
+ @Override
+ public WebViewFactory getWebViewFactory() {
+ return mFactory;
+ }
+
+ @Override
+ public void onSetWebView(Tab tab, WebView view) {
+ mUi.onSetWebView(tab, view);
+ }
+
+ @Override
+ public void createSubWindow(Tab tab) {
+ endActionMode();
+ WebView mainView = tab.getWebView();
+ WebView subView = mFactory.createWebView((mainView == null)
+ ? false
+ : mainView.isPrivateBrowsingEnabled());
+ mUi.createSubWindow(tab, subView);
+ }
+
+ @Override
+ public Activity getActivity() {
+ return mActivity;
+ }
+
+ void setUi(UI ui) {
+ mUi = ui;
+ }
+
+ BrowserSettings getSettings() {
+ return mSettings;
+ }
+
+ IntentHandler getIntentHandler() {
+ return mIntentHandler;
+ }
+
+ @Override
+ public UI getUi() {
+ return mUi;
+ }
+
+ int getMaxTabs() {
+ return mActivity.getResources().getInteger(R.integer.max_tabs);
+ }
+
+ @Override
+ public TabControl getTabControl() {
+ return mTabControl;
+ }
+
+ @Override
+ public List<Tab> getTabs() {
+ return mTabControl.getTabs();
+ }
+
+ // Open the icon database and retain all the icons for visited sites.
+ // This is done on a background thread so as not to stall startup.
+ private void retainIconsOnStartup() {
+ // WebIconDatabase needs to be retrieved on the UI thread so that if
+ // it has not been created successfully yet the Handler is started on the
+ // UI thread.
+ new RetainIconsOnStartupTask(WebIconDatabase.getInstance()).execute();
+ }
+
+ private class RetainIconsOnStartupTask extends AsyncTask<Void, Void, Void> {
+ private WebIconDatabase mDb;
+
+ public RetainIconsOnStartupTask(WebIconDatabase db) {
+ mDb = db;
+ }
+
+ protected Void doInBackground(Void... unused) {
+ mDb.open(mActivity.getDir("icons", 0).getPath());
+ Cursor c = null;
+ try {
+ c = Browser.getAllBookmarks(mActivity.getContentResolver());
+ if (c.moveToFirst()) {
+ int urlIndex = c.getColumnIndex(Browser.BookmarkColumns.URL);
+ do {
+ String url = c.getString(urlIndex);
+ mDb.retainIconForPageUrl(url);
+ } while (c.moveToNext());
+ }
+ } catch (IllegalStateException e) {
+ Log.e(LOGTAG, "retainIconsOnStartup", e);
+ } finally {
+ if (c != null) c.close();
+ }
+
+ return null;
+ }
+ }
+
+ private void startHandler() {
+ mHandler = new Handler() {
+
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case OPEN_BOOKMARKS:
+ bookmarksOrHistoryPicker(false);
+ break;
+ case FOCUS_NODE_HREF:
+ {
+ String url = (String) msg.getData().get("url");
+ String title = (String) msg.getData().get("title");
+ if (TextUtils.isEmpty(url)) {
+ break;
+ }
+ HashMap focusNodeMap = (HashMap) msg.obj;
+ WebView view = (WebView) focusNodeMap.get("webview");
+ // Only apply the action if the top window did not change.
+ if (getCurrentTopWebView() != view) {
+ break;
+ }
+ switch (msg.arg1) {
+ case R.id.open_context_menu_id:
+ case R.id.view_image_context_menu_id:
+ loadUrlFromContext(getCurrentTopWebView(), url);
+ break;
+ case R.id.open_newtab_context_menu_id:
+ final Tab parent = mTabControl.getCurrentTab();
+ final Tab newTab = openTab(url, false);
+ if (newTab != null && newTab != parent) {
+ parent.addChildTab(newTab);
+ }
+ break;
+ case R.id.bookmark_context_menu_id:
+ Intent intent = new Intent(mActivity,
+ AddBookmarkPage.class);
+ intent.putExtra(BrowserContract.Bookmarks.URL, url);
+ intent.putExtra(BrowserContract.Bookmarks.TITLE,
+ title);
+ mActivity.startActivity(intent);
+ break;
+ case R.id.share_link_context_menu_id:
+ sharePage(mActivity, title, url, null,
+ null);
+ break;
+ case R.id.copy_link_context_menu_id:
+ copy(url);
+ break;
+ case R.id.save_link_context_menu_id:
+ case R.id.download_context_menu_id:
+ DownloadHandler.onDownloadStartNoStream(
+ mActivity, url, null, null, null);
+ break;
+ }
+ break;
+ }
+
+ case LOAD_URL:
+ loadUrlFromContext(getCurrentTopWebView(), (String) msg.obj);
+ break;
+
+ case STOP_LOAD:
+ stopLoading();
+ break;
+
+ case RELEASE_WAKELOCK:
+ if (mWakeLock.isHeld()) {
+ mWakeLock.release();
+ // if we reach here, Browser should be still in the
+ // background loading after WAKELOCK_TIMEOUT (5-min).
+ // To avoid burning the battery, stop loading.
+ mTabControl.stopAllLoading();
+ }
+ break;
+
+ case UPDATE_BOOKMARK_THUMBNAIL:
+ WebView view = (WebView) msg.obj;
+ if (view != null) {
+ updateScreenshot(view);
+ }
+ break;
+ }
+ }
+ };
+
+ }
+
+ @Override
+ public void shareCurrentPage() {
+ shareCurrentPage(mTabControl.getCurrentTab());
+ }
+
+ private void shareCurrentPage(Tab tab) {
+ if (tab != null) {
+ tab.populatePickerData();
+ sharePage(mActivity, tab.getTitle(),
+ tab.getUrl(), tab.getFavicon(),
+ createScreenshot(tab.getWebView(),
+ getDesiredThumbnailWidth(mActivity),
+ getDesiredThumbnailHeight(mActivity)));
+ }
+ }
+
+ /**
+ * Share a page, providing the title, url, favicon, and a screenshot. Uses
+ * an {@link Intent} to launch the Activity chooser.
+ * @param c Context used to launch a new Activity.
+ * @param title Title of the page. Stored in the Intent with
+ * {@link Intent#EXTRA_SUBJECT}
+ * @param url URL of the page. Stored in the Intent with
+ * {@link Intent#EXTRA_TEXT}
+ * @param favicon Bitmap of the favicon for the page. Stored in the Intent
+ * with {@link Browser#EXTRA_SHARE_FAVICON}
+ * @param screenshot Bitmap of a screenshot of the page. Stored in the
+ * Intent with {@link Browser#EXTRA_SHARE_SCREENSHOT}
+ */
+ static final void sharePage(Context c, String title, String url,
+ Bitmap favicon, Bitmap screenshot) {
+ Intent send = new Intent(Intent.ACTION_SEND);
+ send.setType("text/plain");
+ send.putExtra(Intent.EXTRA_TEXT, url);
+ send.putExtra(Intent.EXTRA_SUBJECT, title);
+ send.putExtra(Browser.EXTRA_SHARE_FAVICON, favicon);
+ send.putExtra(Browser.EXTRA_SHARE_SCREENSHOT, screenshot);
+ try {
+ c.startActivity(Intent.createChooser(send, c.getString(
+ R.string.choosertitle_sharevia)));
+ } catch(android.content.ActivityNotFoundException ex) {
+ // if no app handles it, do nothing
+ }
+ }
+
+ private void copy(CharSequence text) {
+ ClipboardManager cm = (ClipboardManager) mActivity
+ .getSystemService(Context.CLIPBOARD_SERVICE);
+ cm.setText(text);
+ }
+
+ // lifecycle
+
+ protected void onConfgurationChanged(Configuration config) {
+ mConfigChanged = true;
+ if (mPageDialogsHandler != null) {
+ mPageDialogsHandler.onConfigurationChanged(config);
+ }
+ mUi.onConfigurationChanged(config);
+ }
+
+ @Override
+ public void handleNewIntent(Intent intent) {
+ mIntentHandler.onNewIntent(intent);
+ }
+
+ protected void onPause() {
+ if (mActivityPaused) {
+ Log.e(LOGTAG, "BrowserActivity is already paused.");
+ return;
+ }
+ mActivityPaused = true;
+ Tab tab = mTabControl.getCurrentTab();
+ if (tab != null) {
+ tab.pause();
+ if (!pauseWebViewTimers(tab)) {
+ mWakeLock.acquire();
+ mHandler.sendMessageDelayed(mHandler
+ .obtainMessage(RELEASE_WAKELOCK), WAKELOCK_TIMEOUT);
+ }
+ }
+ mUi.onPause();
+ mNetworkHandler.onPause();
+
+ WebView.disablePlatformNotifications();
+ }
+
+ void onSaveInstanceState(Bundle outState) {
+ // the default implementation requires each view to have an id. As the
+ // browser handles the state itself and it doesn't use id for the views,
+ // don't call the default implementation. Otherwise it will trigger the
+ // warning like this, "couldn't save which view has focus because the
+ // focused view XXX has no id".
+
+ // Save all the tabs
+ mTabControl.saveState(outState);
+ // Save time so that we know how old incognito tabs (if any) are.
+ outState.putSerializable("lastActiveDate", Calendar.getInstance());
+ }
+
+ void onResume() {
+ if (!mActivityPaused) {
+ Log.e(LOGTAG, "BrowserActivity is already resumed.");
+ return;
+ }
+ mActivityPaused = false;
+ Tab current = mTabControl.getCurrentTab();
+ if (current != null) {
+ current.resume();
+ resumeWebViewTimers(current);
+ }
+ if (mWakeLock.isHeld()) {
+ mHandler.removeMessages(RELEASE_WAKELOCK);
+ mWakeLock.release();
+ }
+ mUi.onResume();
+ mNetworkHandler.onResume();
+ WebView.enablePlatformNotifications();
+ }
+
+ /**
+ * resume all WebView timers using the WebView instance of the given tab
+ * @param tab guaranteed non-null
+ */
+ private void resumeWebViewTimers(Tab tab) {
+ boolean inLoad = tab.inPageLoad();
+ if ((!mActivityPaused && !inLoad) || (mActivityPaused && inLoad)) {
+ CookieSyncManager.getInstance().startSync();
+ WebView w = tab.getWebView();
+ if (w != null) {
+ w.resumeTimers();
+ }
+ }
+ }
+
+ /**
+ * Pause all WebView timers using the WebView of the given tab
+ * @param tab
+ * @return true if the timers are paused or tab is null
+ */
+ private boolean pauseWebViewTimers(Tab tab) {
+ if (tab == null) {
+ return true;
+ } else if (!tab.inPageLoad()) {
+ CookieSyncManager.getInstance().stopSync();
+ WebView w = getCurrentWebView();
+ if (w != null) {
+ w.pauseTimers();
+ }
+ return true;
+ }
+ return false;
+ }
+
+ void onDestroy() {
+ if (mUploadHandler != null) {
+ mUploadHandler.onResult(Activity.RESULT_CANCELED, null);
+ mUploadHandler = null;
+ }
+ if (mTabControl == null) return;
+ mUi.onDestroy();
+ // Remove the current tab and sub window
+ Tab t = mTabControl.getCurrentTab();
+ if (t != null) {
+ dismissSubWindow(t);
+ removeTab(t);
+ }
+ // Destroy all the tabs
+ mTabControl.destroy();
+ WebIconDatabase.getInstance().close();
+ // Stop watching the default geolocation permissions
+ mSystemAllowGeolocationOrigins.stop();
+ mSystemAllowGeolocationOrigins = null;
+ }
+
+ protected boolean isActivityPaused() {
+ return mActivityPaused;
+ }
+
+ protected void onLowMemory() {
+ mTabControl.freeMemory();
+ }
+
+ @Override
+ public boolean shouldShowErrorConsole() {
+ return mShouldShowErrorConsole;
+ }
+
+ protected void setShouldShowErrorConsole(boolean show) {
+ if (show == mShouldShowErrorConsole) {
+ // Nothing to do.
+ return;
+ }
+ mShouldShowErrorConsole = show;
+ Tab t = mTabControl.getCurrentTab();
+ if (t == null) {
+ // There is no current tab so we cannot toggle the error console
+ return;
+ }
+ mUi.setShouldShowErrorConsole(t, show);
+ }
+
+ @Override
+ public void stopLoading() {
+ mLoadStopped = true;
+ Tab tab = mTabControl.getCurrentTab();
+ resetTitleAndRevertLockIcon(tab);
+ WebView w = getCurrentTopWebView();
+ w.stopLoading();
+ // FIXME: before refactor, it is using mWebViewClient. So I keep the
+ // same logic here. But for subwindow case, should we call into the main
+ // WebView's onPageFinished as we never call its onPageStarted and if
+ // the page finishes itself, we don't call onPageFinished.
+ mTabControl.getCurrentWebView().getWebViewClient().onPageFinished(w,
+ w.getUrl());
+ mUi.onPageStopped(tab);
+ }
+
+ boolean didUserStopLoading() {
+ return mLoadStopped;
+ }
+
+ // WebViewController
+
+ @Override
+ public void onPageStarted(Tab tab, WebView view, String url, Bitmap favicon) {
+
+ // We've started to load a new page. If there was a pending message
+ // to save a screenshot then we will now take the new page and save
+ // an incorrect screenshot. Therefore, remove any pending thumbnail
+ // messages from the queue.
+ mHandler.removeMessages(Controller.UPDATE_BOOKMARK_THUMBNAIL,
+ view);
+
+ // reset sync timer to avoid sync starts during loading a page
+ CookieSyncManager.getInstance().resetSync();
+
+ if (!mNetworkHandler.isNetworkUp()) {
+ view.setNetworkAvailable(false);
+ }
+
+ // when BrowserActivity just starts, onPageStarted may be called before
+ // onResume as it is triggered from onCreate. Call resumeWebViewTimers
+ // to start the timer. As we won't switch tabs while an activity is in
+ // pause state, we can ensure calling resume and pause in pair.
+ if (mActivityPaused) {
+ resumeWebViewTimers(tab);
+ }
+ mLoadStopped = false;
+ if (!mNetworkHandler.isNetworkUp()) {
+ mNetworkHandler.createAndShowNetworkDialog();
+ }
+ endActionMode();
+
+ mUi.onPageStarted(tab, url, favicon);
+
+ // update the bookmark database for favicon
+ maybeUpdateFavicon(tab, null, url, favicon);
+
+ Performance.tracePageStart(url);
+
+ // Performance probe
+ if (false) {
+ Performance.onPageStarted();
+ }
+
+ }
+
+ @Override
+ public void onPageFinished(Tab tab, String url) {
+ mUi.onPageFinished(tab, url);
+ if (!tab.isPrivateBrowsingEnabled()) {
+ if (tab.inForeground() && !didUserStopLoading()
+ || !tab.inForeground()) {
+ // Only update the bookmark screenshot if the user did not
+ // cancel the load early.
+ mHandler.sendMessageDelayed(mHandler.obtainMessage(
+ UPDATE_BOOKMARK_THUMBNAIL, 0, 0, tab.getWebView()),
+ 500);
+ }
+ }
+ // pause the WebView timer and release the wake lock if it is finished
+ // while BrowserActivity is in pause state.
+ if (mActivityPaused && pauseWebViewTimers(tab)) {
+ if (mWakeLock.isHeld()) {
+ mHandler.removeMessages(RELEASE_WAKELOCK);
+ mWakeLock.release();
+ }
+ }
+ // Performance probe
+ if (false) {
+ Performance.onPageFinished(url);
+ }
+
+ Performance.tracePageFinished();
+ }
+
+ @Override
+ public void onProgressChanged(Tab tab, int newProgress) {
+
+ if (newProgress == 100) {
+ CookieSyncManager.getInstance().sync();
+ // onProgressChanged() may continue to be called after the main
+ // frame has finished loading, as any remaining sub frames continue
+ // to load. We'll only get called once though with newProgress as
+ // 100 when everything is loaded. (onPageFinished is called once
+ // when the main frame completes loading regardless of the state of
+ // any sub frames so calls to onProgressChanges may continue after
+ // onPageFinished has executed)
+ if (mInLoad) {
+ mInLoad = false;
+ updateInLoadMenuItems(mCachedMenu);
+ }
+ } else {
+ if (!mInLoad) {
+ // onPageFinished may have already been called but a subframe is
+ // still loading and updating the progress. Reset mInLoad and
+ // update the menu items.
+ mInLoad = true;
+ updateInLoadMenuItems(mCachedMenu);
+ }
+ }
+ mUi.onProgressChanged(tab, newProgress);
+ }
+
+ @Override
+ public void onReceivedTitle(Tab tab, final String title) {
+ final String pageUrl = tab.getWebView().getUrl();
+ setUrlTitle(tab, pageUrl, title);
+ if (pageUrl == null || pageUrl.length()
+ >= SQLiteDatabase.SQLITE_MAX_LIKE_PATTERN_LENGTH) {
+ return;
+ }
+ // Update the title in the history database if not in private browsing mode
+ if (!tab.isPrivateBrowsingEnabled()) {
+ new AsyncTask<Void, Void, Void>() {
+ @Override
+ protected Void doInBackground(Void... unused) {
+ // See if we can find the current url in our history
+ // database and add the new title to it.
+ String url = pageUrl;
+ if (url.startsWith("http://www.")) {
+ url = url.substring(11);
+ } else if (url.startsWith("http://")) {
+ url = url.substring(4);
+ }
+ // Escape wildcards for LIKE operator.
+ url = url.replace("\\", "\\\\").replace("%", "\\%")
+ .replace("_", "\\_");
+ Cursor c = null;
+ try {
+ final ContentResolver cr =
+ getActivity().getContentResolver();
+ String selection = History.URL + " LIKE ? ESCAPE '\\'";
+ String [] selectionArgs = new String[] { "%" + url };
+ ContentValues values = new ContentValues();
+ values.put(History.TITLE, title);
+ cr.update(History.CONTENT_URI, values, selection,
+ selectionArgs);
+ } catch (IllegalStateException e) {
+ Log.e(LOGTAG, "Tab onReceived title", e);
+ } catch (SQLiteException ex) {
+ Log.e(LOGTAG,
+ "onReceivedTitle() caught SQLiteException: ",
+ ex);
+ } finally {
+ if (c != null) c.close();
+ }
+ return null;
+ }
+ }.execute();
+ }
+ }
+
+ @Override
+ public void onFavicon(Tab tab, WebView view, Bitmap icon) {
+ mUi.setFavicon(tab, icon);
+ maybeUpdateFavicon(tab, view.getOriginalUrl(), view.getUrl(), icon);
+ }
+
+ @Override
+ public boolean shouldOverrideUrlLoading(WebView view, String url) {
+ return mUrlHandler.shouldOverrideUrlLoading(view, url);
+ }
+
+ @Override
+ public boolean shouldOverrideKeyEvent(KeyEvent event) {
+ if (mMenuIsDown) {
+ // only check shortcut key when MENU is held
+ return mActivity.getWindow().isShortcutKey(event.getKeyCode(),
+ event);
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public void onUnhandledKeyEvent(KeyEvent event) {
+ if (!isActivityPaused()) {
+ if (event.getAction() == KeyEvent.ACTION_DOWN) {
+ mActivity.onKeyDown(event.getKeyCode(), event);
+ } else {
+ mActivity.onKeyUp(event.getKeyCode(), event);
+ }
+ }
+ }
+
+ @Override
+ public void doUpdateVisitedHistory(Tab tab, String url,
+ boolean isReload) {
+ // Don't save anything in private browsing mode
+ if (tab.isPrivateBrowsingEnabled()) return;
+
+ if (url.regionMatches(true, 0, "about:", 0, 6)) {
+ return;
+ }
+ // remove "client" before updating it to the history so that it wont
+ // show up in the auto-complete list.
+ int index = url.indexOf("client=ms-");
+ if (index > 0 && url.contains(".google.")) {
+ int end = url.indexOf('&', index);
+ if (end > 0) {
+ url = url.substring(0, index)
+ .concat(url.substring(end + 1));
+ } else {
+ // the url.charAt(index-1) should be either '?' or '&'
+ url = url.substring(0, index-1);
+ }
+ }
+ final ContentResolver cr = getActivity().getContentResolver();
+ final String newUrl = url;
+ new AsyncTask<Void, Void, Void>() {
+ @Override
+ protected Void doInBackground(Void... unused) {
+ Browser.updateVisitedHistory(cr, newUrl, true);
+ return null;
+ }
+ }.execute();
+ WebIconDatabase.getInstance().retainIconForPageUrl(url);
+ }
+
+ @Override
+ public void getVisitedHistory(final ValueCallback<String[]> callback) {
+ AsyncTask<Void, Void, String[]> task =
+ new AsyncTask<Void, Void, String[]>() {
+ @Override
+ public String[] doInBackground(Void... unused) {
+ return Browser.getVisitedHistory(mActivity.getContentResolver());
+ }
+ @Override
+ public void onPostExecute(String[] result) {
+ callback.onReceiveValue(result);
+ }
+ };
+ task.execute();
+ }
+
+ @Override
+ public void onReceivedHttpAuthRequest(Tab tab, WebView view,
+ final HttpAuthHandler handler, final String host,
+ final String realm) {
+ String username = null;
+ String password = null;
+
+ boolean reuseHttpAuthUsernamePassword
+ = handler.useHttpAuthUsernamePassword();
+
+ if (reuseHttpAuthUsernamePassword && view != null) {
+ String[] credentials = view.getHttpAuthUsernamePassword(host, realm);
+ if (credentials != null && credentials.length == 2) {
+ username = credentials[0];
+ password = credentials[1];
+ }
+ }
+
+ if (username != null && password != null) {
+ handler.proceed(username, password);
+ } else {
+ if (tab.inForeground()) {
+ mPageDialogsHandler.showHttpAuthentication(tab, handler, host, realm);
+ } else {
+ handler.cancel();
+ }
+ }
+ }
+
+ @Override
+ public void onDownloadStart(Tab tab, String url, String userAgent,
+ String contentDisposition, String mimetype, long contentLength) {
+ DownloadHandler.onDownloadStart(mActivity, url, userAgent,
+ contentDisposition, mimetype);
+ if (tab.getWebView().copyBackForwardList().getSize() == 0) {
+ // This Tab was opened for the sole purpose of downloading a
+ // file. Remove it.
+ if (tab == mTabControl.getCurrentTab()) {
+ // In this case, the Tab is still on top.
+ goBackOnePageOrQuit();
+ } else {
+ // In this case, it is not.
+ closeTab(tab);
+ }
+ }
+ }
+
+ @Override
+ public Bitmap getDefaultVideoPoster() {
+ return mUi.getDefaultVideoPoster();
+ }
+
+ @Override
+ public View getVideoLoadingProgressView() {
+ return mUi.getVideoLoadingProgressView();
+ }
+
+ @Override
+ public void showSslCertificateOnError(WebView view, SslErrorHandler handler,
+ SslError error) {
+ mPageDialogsHandler.showSSLCertificateOnError(view, handler, error);
+ }
+
+ // helper method
+
+ /*
+ * Update the favorites icon if the private browsing isn't enabled and the
+ * icon is valid.
+ */
+ private void maybeUpdateFavicon(Tab tab, final String originalUrl,
+ final String url, Bitmap favicon) {
+ if (favicon == null) {
+ return;
+ }
+ if (!tab.isPrivateBrowsingEnabled()) {
+ Bookmarks.updateFavicon(mActivity
+ .getContentResolver(), originalUrl, url, favicon);
+ }
+ }
+
+ @Override
+ public void bookmarkedStatusHasChanged(Tab tab) {
+ mUi.bookmarkedStatusHasChanged(tab);
+ }
+
+ // end WebViewController
+
+ protected void pageUp() {
+ getCurrentTopWebView().pageUp(false);
+ }
+
+ protected void pageDown() {
+ getCurrentTopWebView().pageDown(false);
+ }
+
+ // callback from phone title bar
+ public void editUrl() {
+ if (mOptionsMenuOpen) mActivity.closeOptionsMenu();
+ String url = (getCurrentTopWebView() == null) ? null : getCurrentTopWebView().getUrl();
+ startSearch(mSettings.getHomePage().equals(url) ? null : url, true,
+ null, false);
+ }
+
+ public void activateVoiceSearchMode(String title) {
+ mUi.showVoiceTitleBar(title);
+ }
+
+ public void revertVoiceSearchMode(Tab tab) {
+ mUi.revertVoiceTitleBar(tab);
+ }
+
+ public void showCustomView(Tab tab, View view,
+ WebChromeClient.CustomViewCallback callback) {
+ if (tab.inForeground()) {
+ if (mUi.isCustomViewShowing()) {
+ callback.onCustomViewHidden();
+ return;
+ }
+ mUi.showCustomView(view, callback);
+ // Save the menu state and set it to empty while the custom
+ // view is showing.
+ mOldMenuState = mMenuState;
+ mMenuState = EMPTY_MENU;
+ }
+ }
+
+ @Override
+ public void hideCustomView() {
+ if (mUi.isCustomViewShowing()) {
+ mUi.onHideCustomView();
+ // Reset the old menu state.
+ mMenuState = mOldMenuState;
+ mOldMenuState = EMPTY_MENU;
+ }
+ }
+
+ protected void onActivityResult(int requestCode, int resultCode,
+ Intent intent) {
+ if (getCurrentTopWebView() == null) return;
+ switch (requestCode) {
+ case PREFERENCES_PAGE:
+ if (resultCode == Activity.RESULT_OK && intent != null) {
+ String action = intent.getStringExtra(Intent.EXTRA_TEXT);
+ if (BrowserSettings.PREF_CLEAR_HISTORY.equals(action)) {
+ mTabControl.removeParentChildRelationShips();
+ }
+ }
+ break;
+ case FILE_SELECTED:
+ // Choose a file from the file picker.
+ if (null == mUploadHandler) break;
+ mUploadHandler.onResult(resultCode, intent);
+ mUploadHandler = null;
+ break;
+ case AUTOFILL_SETUP:
+ // Determine whether a profile was actually set up or not
+ // and if so, send the message back to the WebTextView to
+ // fill the form with the new profile.
+ if (getSettings().getAutoFillProfile() != null) {
+ mAutoFillSetupMessage.sendToTarget();
+ mAutoFillSetupMessage = null;
+ }
+ break;
+ default:
+ break;
+ }
+ getCurrentTopWebView().requestFocus();
+ }
+
+ /**
+ * Open the Go page.
+ * @param startWithHistory If true, open starting on the history tab.
+ * Otherwise, start with the bookmarks tab.
+ */
+ @Override
+ public void bookmarksOrHistoryPicker(boolean startWithHistory) {
+ if (mTabControl.getCurrentWebView() == null) {
+ return;
+ }
+ Bundle extras = new Bundle();
+ // Disable opening in a new window if we have maxed out the windows
+ extras.putBoolean(BrowserBookmarksPage.EXTRA_DISABLE_WINDOW,
+ !mTabControl.canCreateNewTab());
+ mUi.showComboView(startWithHistory, extras);
+ }
+
+ // combo view callbacks
+
+ /**
+ * callback from ComboPage when clear history is requested
+ */
+ public void onRemoveParentChildRelationships() {
+ mTabControl.removeParentChildRelationShips();
+ }
+
+ /**
+ * callback from ComboPage when bookmark/history selection
+ */
+ @Override
+ public void onUrlSelected(String url, boolean newTab) {
+ removeComboView();
+ if (!TextUtils.isEmpty(url)) {
+ if (newTab) {
+ openTab(url, false);
+ } else {
+ final Tab currentTab = mTabControl.getCurrentTab();
+ dismissSubWindow(currentTab);
+ loadUrl(getCurrentTopWebView(), url);
+ }
+ }
+ }
+
+ /**
+ * callback from ComboPage when dismissed
+ */
+ @Override
+ public void onComboCanceled() {
+ removeComboView();
+ }
+
+ /**
+ * dismiss the ComboPage
+ */
+ @Override
+ public void removeComboView() {
+ mUi.hideComboView();
+ }
+
+ // active tabs page handling
+
+ protected void showActiveTabsPage() {
+ mMenuState = EMPTY_MENU;
+ mUi.showActiveTabsPage();
+ }
+
+ /**
+ * Remove the active tabs page.
+ * @param needToAttach If true, the active tabs page did not attach a tab
+ * to the content view, so we need to do that here.
+ */
+ @Override
+ public void removeActiveTabsPage(boolean needToAttach) {
+ mMenuState = R.id.MAIN_MENU;
+ mUi.removeActiveTabsPage();
+ if (needToAttach) {
+ setActiveTab(mTabControl.getCurrentTab());
+ }
+ getCurrentTopWebView().requestFocus();
+ }
+
+ // key handling
+ protected void onBackKey() {
+ if (!mUi.onBackKey()) {
+ WebView subwindow = mTabControl.getCurrentSubWindow();
+ if (subwindow != null) {
+ if (subwindow.canGoBack()) {
+ subwindow.goBack();
+ } else {
+ dismissSubWindow(mTabControl.getCurrentTab());
+ }
+ } else {
+ goBackOnePageOrQuit();
+ }
+ }
+ }
+
+ // menu handling and state
+ // TODO: maybe put into separate handler
+
+ protected boolean onCreateOptionsMenu(Menu menu) {
+ MenuInflater inflater = mActivity.getMenuInflater();
+ inflater.inflate(R.menu.browser, menu);
+ updateInLoadMenuItems(menu);
+ // hold on to the menu reference here; it is used by the page callbacks
+ // to update the menu based on loading state
+ mCachedMenu = menu;
+ return true;
+ }
+
+ protected void onCreateContextMenu(ContextMenu menu, View v,
+ ContextMenuInfo menuInfo) {
+ if (v instanceof TitleBarBase) {
+ return;
+ }
+ if (!(v instanceof WebView)) {
+ return;
+ }
+ final WebView webview = (WebView) v;
+ WebView.HitTestResult result = webview.getHitTestResult();
+ if (result == null) {
+ return;
+ }
+
+ int type = result.getType();
+ if (type == WebView.HitTestResult.UNKNOWN_TYPE) {
+ Log.w(LOGTAG,
+ "We should not show context menu when nothing is touched");
+ return;
+ }
+ if (type == WebView.HitTestResult.EDIT_TEXT_TYPE) {
+ // let TextView handles context menu
+ return;
+ }
+
+ // Note, http://b/issue?id=1106666 is requesting that
+ // an inflated menu can be used again. This is not available
+ // yet, so inflate each time (yuk!)
+ MenuInflater inflater = mActivity.getMenuInflater();
+ inflater.inflate(R.menu.browsercontext, menu);
+
+ // Show the correct menu group
+ final String extra = result.getExtra();
+ menu.setGroupVisible(R.id.PHONE_MENU,
+ type == WebView.HitTestResult.PHONE_TYPE);
+ menu.setGroupVisible(R.id.EMAIL_MENU,
+ type == WebView.HitTestResult.EMAIL_TYPE);
+ menu.setGroupVisible(R.id.GEO_MENU,
+ type == WebView.HitTestResult.GEO_TYPE);
+ menu.setGroupVisible(R.id.IMAGE_MENU,
+ type == WebView.HitTestResult.IMAGE_TYPE
+ || type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE);
+ menu.setGroupVisible(R.id.ANCHOR_MENU,
+ type == WebView.HitTestResult.SRC_ANCHOR_TYPE
+ || type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE);
+ boolean hitText = type == WebView.HitTestResult.SRC_ANCHOR_TYPE
+ || type == WebView.HitTestResult.PHONE_TYPE
+ || type == WebView.HitTestResult.EMAIL_TYPE
+ || type == WebView.HitTestResult.GEO_TYPE;
+ menu.setGroupVisible(R.id.SELECT_TEXT_MENU, hitText);
+ if (hitText) {
+ menu.findItem(R.id.select_text_menu_id)
+ .setOnMenuItemClickListener(new SelectText(webview));
+ }
+ // Setup custom handling depending on the type
+ switch (type) {
+ case WebView.HitTestResult.PHONE_TYPE:
+ menu.setHeaderTitle(Uri.decode(extra));
+ menu.findItem(R.id.dial_context_menu_id).setIntent(
+ new Intent(Intent.ACTION_VIEW, Uri
+ .parse(WebView.SCHEME_TEL + extra)));
+ Intent addIntent = new Intent(Intent.ACTION_INSERT_OR_EDIT);
+ addIntent.putExtra(Insert.PHONE, Uri.decode(extra));
+ addIntent.setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE);
+ menu.findItem(R.id.add_contact_context_menu_id).setIntent(
+ addIntent);
+ menu.findItem(R.id.copy_phone_context_menu_id)
+ .setOnMenuItemClickListener(
+ new Copy(extra));
+ break;
+
+ case WebView.HitTestResult.EMAIL_TYPE:
+ menu.setHeaderTitle(extra);
+ menu.findItem(R.id.email_context_menu_id).setIntent(
+ new Intent(Intent.ACTION_VIEW, Uri
+ .parse(WebView.SCHEME_MAILTO + extra)));
+ menu.findItem(R.id.copy_mail_context_menu_id)
+ .setOnMenuItemClickListener(
+ new Copy(extra));
+ break;
+
+ case WebView.HitTestResult.GEO_TYPE:
+ menu.setHeaderTitle(extra);
+ menu.findItem(R.id.map_context_menu_id).setIntent(
+ new Intent(Intent.ACTION_VIEW, Uri
+ .parse(WebView.SCHEME_GEO
+ + URLEncoder.encode(extra))));
+ menu.findItem(R.id.copy_geo_context_menu_id)
+ .setOnMenuItemClickListener(
+ new Copy(extra));
+ break;
+
+ case WebView.HitTestResult.SRC_ANCHOR_TYPE:
+ case WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE:
+ TextView titleView = (TextView) LayoutInflater.from(mActivity)
+ .inflate(android.R.layout.browser_link_context_header,
+ null);
+ titleView.setText(extra);
+ menu.setHeaderView(titleView);
+ // decide whether to show the open link in new tab option
+ boolean showNewTab = mTabControl.canCreateNewTab();
+ MenuItem newTabItem
+ = menu.findItem(R.id.open_newtab_context_menu_id);
+ newTabItem.setVisible(showNewTab);
+ if (showNewTab) {
+ if (WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE == type) {
+ newTabItem.setOnMenuItemClickListener(
+ new MenuItem.OnMenuItemClickListener() {
+ @Override
+ public boolean onMenuItemClick(MenuItem item) {
+ final HashMap<String, WebView> hrefMap =
+ new HashMap<String, WebView>();
+ hrefMap.put("webview", webview);
+ final Message msg = mHandler.obtainMessage(
+ FOCUS_NODE_HREF,
+ R.id.open_newtab_context_menu_id,
+ 0, hrefMap);
+ webview.requestFocusNodeHref(msg);
+ return true;
+ }
+ });
+ } else {
+ newTabItem.setOnMenuItemClickListener(
+ new MenuItem.OnMenuItemClickListener() {
+ @Override
+ public boolean onMenuItemClick(MenuItem item) {
+ final Tab parent = mTabControl.getCurrentTab();
+ final Tab newTab = openTab(extra, false);
+ if (newTab != parent) {
+ parent.addChildTab(newTab);
+ }
+ return true;
+ }
+ });
+ }
+ }
+ menu.findItem(R.id.bookmark_context_menu_id).setVisible(
+ Bookmarks.urlHasAcceptableScheme(extra));
+ PackageManager pm = mActivity.getPackageManager();
+ Intent send = new Intent(Intent.ACTION_SEND);
+ send.setType("text/plain");
+ ResolveInfo ri = pm.resolveActivity(send,
+ PackageManager.MATCH_DEFAULT_ONLY);
+ menu.findItem(R.id.share_link_context_menu_id)
+ .setVisible(ri != null);
+ if (type == WebView.HitTestResult.SRC_ANCHOR_TYPE) {
+ break;
+ }
+ // otherwise fall through to handle image part
+ case WebView.HitTestResult.IMAGE_TYPE:
+ if (type == WebView.HitTestResult.IMAGE_TYPE) {
+ menu.setHeaderTitle(extra);
+ }
+ menu.findItem(R.id.view_image_context_menu_id).setIntent(
+ new Intent(Intent.ACTION_VIEW, Uri.parse(extra)));
+ menu.findItem(R.id.download_context_menu_id).
+ setOnMenuItemClickListener(new Download(mActivity, extra));
+ menu.findItem(R.id.set_wallpaper_context_menu_id).
+ setOnMenuItemClickListener(new WallpaperHandler(mActivity,
+ extra));
+ break;
+
+ default:
+ Log.w(LOGTAG, "We should not get here.");
+ break;
+ }
+ //update the ui
+ mUi.onContextMenuCreated(menu);
+ }
+
+ /**
+ * As the menu can be open when loading state changes
+ * we must manually update the state of the stop/reload menu
+ * item
+ */
+ private void updateInLoadMenuItems(Menu menu) {
+ if (menu == null) {
+ return;
+ }
+ MenuItem dest = menu.findItem(R.id.stop_reload_menu_id);
+ MenuItem src = mInLoad ?
+ menu.findItem(R.id.stop_menu_id):
+ menu.findItem(R.id.reload_menu_id);
+ if (src != null) {
+ dest.setIcon(src.getIcon());
+ dest.setTitle(src.getTitle());
+ }
+ }
+
+ boolean prepareOptionsMenu(Menu menu) {
+ // This happens when the user begins to hold down the menu key, so
+ // allow them to chord to get a shortcut.
+ mCanChord = true;
+ // Note: setVisible will decide whether an item is visible; while
+ // setEnabled() will decide whether an item is enabled, which also means
+ // whether the matching shortcut key will function.
+ switch (mMenuState) {
+ case EMPTY_MENU:
+ if (mCurrentMenuState != mMenuState) {
+ menu.setGroupVisible(R.id.MAIN_MENU, false);
+ menu.setGroupEnabled(R.id.MAIN_MENU, false);
+ menu.setGroupEnabled(R.id.MAIN_SHORTCUT_MENU, false);
+ }
+ break;
+ default:
+ if (mCurrentMenuState != mMenuState) {
+ menu.setGroupVisible(R.id.MAIN_MENU, true);
+ menu.setGroupEnabled(R.id.MAIN_MENU, true);
+ menu.setGroupEnabled(R.id.MAIN_SHORTCUT_MENU, true);
+ }
+ final WebView w = getCurrentTopWebView();
+ boolean canGoBack = false;
+ boolean canGoForward = false;
+ boolean isHome = false;
+ if (w != null) {
+ canGoBack = w.canGoBack();
+ canGoForward = w.canGoForward();
+ isHome = mSettings.getHomePage().equals(w.getUrl());
+ }
+ final MenuItem back = menu.findItem(R.id.back_menu_id);
+ back.setEnabled(canGoBack);
+
+ final MenuItem home = menu.findItem(R.id.homepage_menu_id);
+ home.setEnabled(!isHome);
+
+ final MenuItem forward = menu.findItem(R.id.forward_menu_id);
+ forward.setEnabled(canGoForward);
+
+ // decide whether to show the share link option
+ PackageManager pm = mActivity.getPackageManager();
+ Intent send = new Intent(Intent.ACTION_SEND);
+ send.setType("text/plain");
+ ResolveInfo ri = pm.resolveActivity(send,
+ PackageManager.MATCH_DEFAULT_ONLY);
+ menu.findItem(R.id.share_page_menu_id).setVisible(ri != null);
+
+ boolean isNavDump = mSettings.isNavDump();
+ final MenuItem nav = menu.findItem(R.id.dump_nav_menu_id);
+ nav.setVisible(isNavDump);
+ nav.setEnabled(isNavDump);
+
+ boolean showDebugSettings = mSettings.showDebugSettings();
+ final MenuItem counter = menu.findItem(R.id.dump_counters_menu_id);
+ counter.setVisible(showDebugSettings);
+ counter.setEnabled(showDebugSettings);
+
+ // allow the ui to adjust state based settings
+ mUi.onPrepareOptionsMenu(menu);
+
+ break;
+ }
+ mCurrentMenuState = mMenuState;
+ return true;
+ }
+
+ public boolean onOptionsItemSelected(MenuItem item) {
+ if (item.getGroupId() != R.id.CONTEXT_MENU) {
+ // menu remains active, so ensure comboview is dismissed
+ // if main menu option is selected
+ removeComboView();
+ }
+ // check the action bar button before mCanChord check, as the prepare call
+ // doesn't come for action bar buttons
+ if (item.getItemId() == R.id.newtab) {
+ openTabToHomePage();
+ return true;
+ }
+ if (!mCanChord) {
+ // The user has already fired a shortcut with this hold down of the
+ // menu key.
+ return false;
+ }
+ if (null == getCurrentTopWebView()) {
+ return false;
+ }
+ if (mMenuIsDown) {
+ // The shortcut action consumes the MENU. Even if it is still down,
+ // it won't trigger the next shortcut action. In the case of the
+ // shortcut action triggering a new activity, like Bookmarks, we
+ // won't get onKeyUp for MENU. So it is important to reset it here.
+ mMenuIsDown = false;
+ }
+ switch (item.getItemId()) {
+ // -- Main menu
+ case R.id.new_tab_menu_id:
+ openTabToHomePage();
+ break;
+
+ case R.id.incognito_menu_id:
+ openIncognitoTab();
+ break;
+
+ case R.id.goto_menu_id:
+ editUrl();
+ break;
+
+ case R.id.bookmarks_menu_id:
+ bookmarksOrHistoryPicker(false);
+ break;
+
+ case R.id.active_tabs_menu_id:
+ showActiveTabsPage();
+ break;
+
+ case R.id.add_bookmark_menu_id:
+ bookmarkCurrentPage(AddBookmarkPage.DEFAULT_FOLDER_ID);
+ break;
+
+ case R.id.stop_reload_menu_id:
+ if (mInLoad) {
+ stopLoading();
+ } else {
+ getCurrentTopWebView().reload();
+ }
+ break;
+
+ case R.id.back_menu_id:
+ getCurrentTopWebView().goBack();
+ break;
+
+ case R.id.forward_menu_id:
+ getCurrentTopWebView().goForward();
+ break;
+
+ case R.id.close_menu_id:
+ // Close the subwindow if it exists.
+ if (mTabControl.getCurrentSubWindow() != null) {
+ dismissSubWindow(mTabControl.getCurrentTab());
+ break;
+ }
+ closeCurrentTab();
+ break;
+
+ case R.id.homepage_menu_id:
+ Tab current = mTabControl.getCurrentTab();
+ if (current != null) {
+ dismissSubWindow(current);
+ loadUrl(current.getWebView(), mSettings.getHomePage());
+ }
+ break;
+
+ case R.id.preferences_menu_id:
+ Intent intent = new Intent(mActivity, BrowserPreferencesPage.class);
+ intent.putExtra(BrowserPreferencesPage.CURRENT_PAGE,
+ getCurrentTopWebView().getUrl());
+ mActivity.startActivityForResult(intent, PREFERENCES_PAGE);
+ break;
+
+ case R.id.find_menu_id:
+ getCurrentTopWebView().showFindDialog(null);
+ break;
+
+ case R.id.page_info_menu_id:
+ mPageDialogsHandler.showPageInfo(mTabControl.getCurrentTab(),
+ false);
+ break;
+
+ case R.id.classic_history_menu_id:
+ bookmarksOrHistoryPicker(true);
+ break;
+
+ case R.id.title_bar_share_page_url:
+ case R.id.share_page_menu_id:
+ Tab currentTab = mTabControl.getCurrentTab();
+ if (null == currentTab) {
+ mCanChord = false;
+ return false;
+ }
+ shareCurrentPage(currentTab);
+ break;
+
+ case R.id.dump_nav_menu_id:
+ getCurrentTopWebView().debugDump();
+ break;
+
+ case R.id.dump_counters_menu_id:
+ getCurrentTopWebView().dumpV8Counters();
+ break;
+
+ case R.id.zoom_in_menu_id:
+ getCurrentTopWebView().zoomIn();
+ break;
+
+ case R.id.zoom_out_menu_id:
+ getCurrentTopWebView().zoomOut();
+ break;
+
+ case R.id.view_downloads_menu_id:
+ viewDownloads();
+ break;
+
+ case R.id.window_one_menu_id:
+ case R.id.window_two_menu_id:
+ case R.id.window_three_menu_id:
+ case R.id.window_four_menu_id:
+ case R.id.window_five_menu_id:
+ case R.id.window_six_menu_id:
+ case R.id.window_seven_menu_id:
+ case R.id.window_eight_menu_id:
+ {
+ int menuid = item.getItemId();
+ for (int id = 0; id < WINDOW_SHORTCUT_ID_ARRAY.length; id++) {
+ if (WINDOW_SHORTCUT_ID_ARRAY[id] == menuid) {
+ Tab desiredTab = mTabControl.getTab(id);
+ if (desiredTab != null &&
+ desiredTab != mTabControl.getCurrentTab()) {
+ switchToTab(id);
+ }
+ break;
+ }
+ }
+ }
+ break;
+
+ default:
+ return false;
+ }
+ mCanChord = false;
+ return true;
+ }
+
+ public boolean onContextItemSelected(MenuItem item) {
+ // Let the History and Bookmark fragments handle menus they created.
+ if (item.getGroupId() == R.id.CONTEXT_MENU) {
+ return false;
+ }
+
+ // chording is not an issue with context menus, but we use the same
+ // options selector, so set mCanChord to true so we can access them.
+ mCanChord = true;
+ int id = item.getItemId();
+ boolean result = true;
+ switch (id) {
+ // For the context menu from the title bar
+ case R.id.title_bar_copy_page_url:
+ Tab currentTab = mTabControl.getCurrentTab();
+ if (null == currentTab) {
+ result = false;
+ break;
+ }
+ WebView mainView = currentTab.getWebView();
+ if (null == mainView) {
+ result = false;
+ break;
+ }
+ copy(mainView.getUrl());
+ break;
+ // -- Browser context menu
+ case R.id.open_context_menu_id:
+ case R.id.bookmark_context_menu_id:
+ case R.id.save_link_context_menu_id:
+ case R.id.share_link_context_menu_id:
+ case R.id.copy_link_context_menu_id:
+ final WebView webView = getCurrentTopWebView();
+ if (null == webView) {
+ result = false;
+ break;
+ }
+ final HashMap<String, WebView> hrefMap =
+ new HashMap<String, WebView>();
+ hrefMap.put("webview", webView);
+ final Message msg = mHandler.obtainMessage(
+ FOCUS_NODE_HREF, id, 0, hrefMap);
+ webView.requestFocusNodeHref(msg);
+ break;
+
+ default:
+ // For other context menus
+ result = onOptionsItemSelected(item);
+ }
+ mCanChord = false;
+ return result;
+ }
+
+ /**
+ * support programmatically opening the context menu
+ */
+ public void openContextMenu(View view) {
+ mActivity.openContextMenu(view);
+ }
+
+ /**
+ * programmatically open the options menu
+ */
+ public void openOptionsMenu() {
+ mActivity.openOptionsMenu();
+ }
+
+ public boolean onMenuOpened(int featureId, Menu menu) {
+ if (mOptionsMenuOpen) {
+ if (mConfigChanged) {
+ // We do not need to make any changes to the state of the
+ // title bar, since the only thing that happened was a
+ // change in orientation
+ mConfigChanged = false;
+ } else {
+ if (!mExtendedMenuOpen) {
+ mExtendedMenuOpen = true;
+ mUi.onExtendedMenuOpened();
+ } else {
+ // Switching the menu back to icon view, so show the
+ // title bar once again.
+ mExtendedMenuOpen = false;
+ mUi.onExtendedMenuClosed(mInLoad);
+ mUi.onOptionsMenuOpened();
+ }
+ }
+ } else {
+ // The options menu is closed, so open it, and show the title
+ mOptionsMenuOpen = true;
+ mConfigChanged = false;
+ mExtendedMenuOpen = false;
+ mUi.onOptionsMenuOpened();
+ }
+ return true;
+ }
+
+ public void onOptionsMenuClosed(Menu menu) {
+ mOptionsMenuOpen = false;
+ mUi.onOptionsMenuClosed(mInLoad);
+ }
+
+ public void onContextMenuClosed(Menu menu) {
+ mUi.onContextMenuClosed(menu, mInLoad);
+ }
+
+ // Helper method for getting the top window.
+ @Override
+ public WebView getCurrentTopWebView() {
+ return mTabControl.getCurrentTopWebView();
+ }
+
+ @Override
+ public WebView getCurrentWebView() {
+ return mTabControl.getCurrentWebView();
+ }
+
+ /*
+ * This method is called as a result of the user selecting the options
+ * menu to see the download window. It shows the download window on top of
+ * the current window.
+ */
+ void viewDownloads() {
+ Intent intent = new Intent(DownloadManager.ACTION_VIEW_DOWNLOADS);
+ mActivity.startActivity(intent);
+ }
+
+ // action mode
+
+ void onActionModeStarted(ActionMode mode) {
+ mUi.onActionModeStarted(mode);
+ mActionMode = mode;
+ }
+
+ /*
+ * True if a custom ActionMode (i.e. find or select) is in use.
+ */
+ @Override
+ public boolean isInCustomActionMode() {
+ return mActionMode != null;
+ }
+
+ /*
+ * End the current ActionMode.
+ */
+ @Override
+ public void endActionMode() {
+ if (mActionMode != null) {
+ mActionMode.finish();
+ }
+ }
+
+ /*
+ * Called by find and select when they are finished. Replace title bars
+ * as necessary.
+ */
+ public void onActionModeFinished(ActionMode mode) {
+ if (!isInCustomActionMode()) return;
+ mUi.onActionModeFinished(mInLoad);
+ mActionMode = null;
+ }
+
+ boolean isInLoad() {
+ return mInLoad;
+ }
+
+ // bookmark handling
+
+ /**
+ * add the current page as a bookmark to the given folder id
+ * @param folderId use -1 for the default folder
+ */
+ @Override
+ public void bookmarkCurrentPage(long folderId) {
+ Intent i = new Intent(mActivity,
+ AddBookmarkPage.class);
+ WebView w = getCurrentTopWebView();
+ i.putExtra(BrowserContract.Bookmarks.URL, w.getUrl());
+ i.putExtra(BrowserContract.Bookmarks.TITLE, w.getTitle());
+ String touchIconUrl = w.getTouchIconUrl();
+ if (touchIconUrl != null) {
+ i.putExtra(AddBookmarkPage.TOUCH_ICON_URL, touchIconUrl);
+ WebSettings settings = w.getSettings();
+ if (settings != null) {
+ i.putExtra(AddBookmarkPage.USER_AGENT,
+ settings.getUserAgentString());
+ }
+ }
+ i.putExtra(BrowserContract.Bookmarks.THUMBNAIL,
+ createScreenshot(w, getDesiredThumbnailWidth(mActivity),
+ getDesiredThumbnailHeight(mActivity)));
+ i.putExtra(BrowserContract.Bookmarks.FAVICON, w.getFavicon());
+ i.putExtra(BrowserContract.Bookmarks.PARENT,
+ folderId);
+ // Put the dialog at the upper right of the screen, covering the
+ // star on the title bar.
+ i.putExtra("gravity", Gravity.RIGHT | Gravity.TOP);
+ mActivity.startActivity(i);
+ }
+
+ // file chooser
+ public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
+ mUploadHandler = new UploadHandler(this);
+ mUploadHandler.openFileChooser(uploadMsg, acceptType);
+ }
+
+ // thumbnails
+
+ /**
+ * Return the desired width for thumbnail screenshots, which are stored in
+ * the database, and used on the bookmarks screen.
+ * @param context Context for finding out the density of the screen.
+ * @return desired width for thumbnail screenshot.
+ */
+ static int getDesiredThumbnailWidth(Context context) {
+ return context.getResources().getDimensionPixelOffset(
+ R.dimen.bookmarkThumbnailWidth);
+ }
+
+ /**
+ * Return the desired height for thumbnail screenshots, which are stored in
+ * the database, and used on the bookmarks screen.
+ * @param context Context for finding out the density of the screen.
+ * @return desired height for thumbnail screenshot.
+ */
+ static int getDesiredThumbnailHeight(Context context) {
+ return context.getResources().getDimensionPixelOffset(
+ R.dimen.bookmarkThumbnailHeight);
+ }
+
+ private static Bitmap createScreenshot(WebView view, int width, int height) {
+ Picture thumbnail = view.capturePicture();
+ if (thumbnail == null) {
+ return null;
+ }
+ Bitmap bm = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
+ Canvas canvas = new Canvas(bm);
+ // May need to tweak these values to determine what is the
+ // best scale factor
+ int thumbnailWidth = thumbnail.getWidth();
+ int thumbnailHeight = thumbnail.getHeight();
+ float scaleFactor = 1.0f;
+ if (thumbnailWidth > 0) {
+ scaleFactor = (float) width / (float)thumbnailWidth;
+ } else {
+ return null;
+ }
+
+ if (view.getWidth() > view.getHeight() &&
+ thumbnailHeight < view.getHeight() && thumbnailHeight > 0) {
+ // If the device is in landscape and the page is shorter
+ // than the height of the view, center the thumnail and crop the sides
+ scaleFactor = (float) height / (float)thumbnailHeight;
+ float wx = (thumbnailWidth * scaleFactor) - width;
+ canvas.translate((int) -(wx / 2), 0);
+ }
+
+ canvas.scale(scaleFactor, scaleFactor);
+
+ thumbnail.draw(canvas);
+ return bm;
+ }
+
+ private void updateScreenshot(WebView view) {
+ // If this is a bookmarked site, add a screenshot to the database.
+ // FIXME: When should we update? Every time?
+ // FIXME: Would like to make sure there is actually something to
+ // draw, but the API for that (WebViewCore.pictureReady()) is not
+ // currently accessible here.
+
+ final Bitmap bm = createScreenshot(view, getDesiredThumbnailWidth(mActivity),
+ getDesiredThumbnailHeight(mActivity));
+ if (bm == null) {
+ return;
+ }
+
+ final ContentResolver cr = mActivity.getContentResolver();
+ final String url = view.getUrl();
+ final String originalUrl = view.getOriginalUrl();
+
+ new AsyncTask<Void, Void, Void>() {
+ @Override
+ protected Void doInBackground(Void... unused) {
+ Cursor cursor = null;
+ try {
+ cursor = Bookmarks.queryCombinedForUrl(cr, originalUrl, url);
+ if (cursor != null && cursor.moveToFirst()) {
+ final ByteArrayOutputStream os =
+ new ByteArrayOutputStream();
+ bm.compress(Bitmap.CompressFormat.PNG, 100, os);
+
+ ContentValues values = new ContentValues();
+ values.put(Images.THUMBNAIL, os.toByteArray());
+ values.put(Images.URL, cursor.getString(0));
+
+ do {
+ cr.update(Images.CONTENT_URI, values, null, null);
+ } while (cursor.moveToNext());
+ }
+ } catch (IllegalStateException e) {
+ // Ignore
+ } finally {
+ if (cursor != null) cursor.close();
+ }
+ return null;
+ }
+ }.execute();
+ }
+
+ private class Copy implements OnMenuItemClickListener {
+ private CharSequence mText;
+
+ public boolean onMenuItemClick(MenuItem item) {
+ copy(mText);
+ return true;
+ }
+
+ public Copy(CharSequence toCopy) {
+ mText = toCopy;
+ }
+ }
+
+ private static class Download implements OnMenuItemClickListener {
+ private Activity mActivity;
+ private String mText;
+
+ public boolean onMenuItemClick(MenuItem item) {
+ DownloadHandler.onDownloadStartNoStream(mActivity, mText, null,
+ null, null);
+ return true;
+ }
+
+ public Download(Activity activity, String toDownload) {
+ mActivity = activity;
+ mText = toDownload;
+ }
+ }
+
+ private static class SelectText implements OnMenuItemClickListener {
+ private WebView mWebView;
+
+ public boolean onMenuItemClick(MenuItem item) {
+ if (mWebView != null) {
+ return mWebView.selectText();
+ }
+ return false;
+ }
+
+ public SelectText(WebView webView) {
+ mWebView = webView;
+ }
+
+ }
+
+ /********************** TODO: UI stuff *****************************/
+
+ // these methods have been copied, they still need to be cleaned up
+
+ /****************** tabs ***************************************************/
+
+ // basic tab interactions:
+
+ // it is assumed that tabcontrol already knows about the tab
+ protected void addTab(Tab tab) {
+ mUi.addTab(tab);
+ }
+
+ protected void removeTab(Tab tab) {
+ mUi.removeTab(tab);
+ mTabControl.removeTab(tab);
+ }
+
+ protected void setActiveTab(Tab tab) {
+ mTabControl.setCurrentTab(tab);
+ // the tab is guaranteed to have a webview after setCurrentTab
+ mUi.setActiveTab(tab);
+ }
+
+ protected void closeEmptyChildTab() {
+ Tab current = mTabControl.getCurrentTab();
+ if (current != null
+ && current.getWebView().copyBackForwardList().getSize() == 0) {
+ Tab parent = current.getParentTab();
+ if (parent != null) {
+ switchToTab(mTabControl.getTabIndex(parent));
+ closeTab(current);
+ }
+ }
+ }
+
+ protected void reuseTab(Tab appTab, String appId, UrlData urlData) {
+ Log.i(LOGTAG, "Reusing tab for " + appId);
+ // Dismiss the subwindow if applicable.
+ dismissSubWindow(appTab);
+ // Since we might kill the WebView, remove it from the
+ // content view first.
+ mUi.detachTab(appTab);
+ // Recreate the main WebView after destroying the old one.
+ // If the WebView has the same original url and is on that
+ // page, it can be reused.
+ boolean needsLoad =
+ mTabControl.recreateWebView(appTab, urlData);
+ // TODO: analyze why the remove and add are necessary
+ mUi.attachTab(appTab);
+ if (mTabControl.getCurrentTab() != appTab) {
+ switchToTab(mTabControl.getTabIndex(appTab));
+ if (needsLoad) {
+ loadUrlDataIn(appTab, urlData);
+ }
+ } else {
+ // If the tab was the current tab, we have to attach
+ // it to the view system again.
+ setActiveTab(appTab);
+ if (needsLoad) {
+ loadUrlDataIn(appTab, urlData);
+ }
+ }
+ }
+
+ // Remove the sub window if it exists. Also called by TabControl when the
+ // user clicks the 'X' to dismiss a sub window.
+ public void dismissSubWindow(Tab tab) {
+ removeSubWindow(tab);
+ // dismiss the subwindow. This will destroy the WebView.
+ tab.dismissSubWindow();
+ getCurrentTopWebView().requestFocus();
+ }
+
+ @Override
+ public void removeSubWindow(Tab t) {
+ if (t.getSubWebView() != null) {
+ mUi.removeSubWindow(t.getSubViewContainer());
+ }
+ }
+
+ @Override
+ public void attachSubWindow(Tab tab) {
+ if (tab.getSubWebView() != null) {
+ mUi.attachSubWindow(tab.getSubViewContainer());
+ getCurrentTopWebView().requestFocus();
+ }
+ }
+
+ // A wrapper function of {@link #openTabAndShow(UrlData, boolean, String)}
+ // that accepts url as string.
+
+ protected Tab openTabAndShow(String url, boolean closeOnExit, String appId) {
+ return openTabAndShow(new UrlData(url), closeOnExit, appId);
+ }
+
+ // This method does a ton of stuff. It will attempt to create a new tab
+ // if we haven't reached MAX_TABS. Otherwise it uses the current tab. If
+ // url isn't null, it will load the given url.
+
+ public Tab openTabAndShow(UrlData urlData, boolean closeOnExit,
+ String appId) {
+ final Tab currentTab = mTabControl.getCurrentTab();
+ if (mTabControl.canCreateNewTab()) {
+ final Tab tab = mTabControl.createNewTab(closeOnExit, appId,
+ urlData.mUrl, false);
+ WebView webview = tab.getWebView();
+ // We must set the new tab as the current tab to reflect the old
+ // animation behavior.
+ addTab(tab);
+ setActiveTab(tab);
+ if (!urlData.isEmpty()) {
+ loadUrlDataIn(tab, urlData);
+ }
+ return tab;
+ } else {
+ // Get rid of the subwindow if it exists
+ dismissSubWindow(currentTab);
+ if (!urlData.isEmpty()) {
+ // Load the given url.
+ loadUrlDataIn(currentTab, urlData);
+ }
+ return currentTab;
+ }
+ }
+
+ protected Tab openTab(String url, boolean forceForeground) {
+ if (mSettings.openInBackground() && !forceForeground) {
+ Tab tab = mTabControl.createNewTab();
+ if (tab != null) {
+ addTab(tab);
+ WebView view = tab.getWebView();
+ loadUrl(view, url);
+ }
+ return tab;
+ } else {
+ return openTabAndShow(url, false, null);
+ }
+ }
+
+ @Override
+ public Tab openIncognitoTab() {
+ if (mTabControl.canCreateNewTab()) {
+ Tab currentTab = mTabControl.getCurrentTab();
+ Tab tab = mTabControl.createNewTab(false, null, null, true);
+ addTab(tab);
+ setActiveTab(tab);
+ return tab;
+ }
+ return null;
+ }
+
+ /**
+ * @param index Index of the tab to change to, as defined by
+ * mTabControl.getTabIndex(Tab t).
+ * @return boolean True if we successfully switched to a different tab. If
+ * the indexth tab is null, or if that tab is the same as
+ * the current one, return false.
+ */
+ @Override
+ public boolean switchToTab(int index) {
+ Tab tab = mTabControl.getTab(index);
+ Tab currentTab = mTabControl.getCurrentTab();
+ if (tab == null || tab == currentTab) {
+ return false;
+ }
+ setActiveTab(tab);
+ return true;
+ }
+
+ @Override
+ public Tab openTabToHomePage() {
+ return openTabAndShow(mSettings.getHomePage(), false, null);
+ }
+
+ @Override
+ public void closeCurrentTab() {
+ final Tab current = mTabControl.getCurrentTab();
+ if (mTabControl.getTabCount() == 1) {
+ // This is the last tab. Open a new one, with the home
+ // page and close the current one.
+ openTabToHomePage();
+ closeTab(current);
+ return;
+ }
+ final Tab parent = current.getParentTab();
+ int indexToShow = -1;
+ if (parent != null) {
+ indexToShow = mTabControl.getTabIndex(parent);
+ } else {
+ final int currentIndex = mTabControl.getCurrentIndex();
+ // Try to move to the tab to the right
+ indexToShow = currentIndex + 1;
+ if (indexToShow > mTabControl.getTabCount() - 1) {
+ // Try to move to the tab to the left
+ indexToShow = currentIndex - 1;
+ }
+ }
+ if (switchToTab(indexToShow)) {
+ // Close window
+ closeTab(current);
+ }
+ }
+
+ /**
+ * Close the tab, remove its associated title bar, and adjust mTabControl's
+ * current tab to a valid value.
+ */
+ @Override
+ public void closeTab(Tab tab) {
+ int currentIndex = mTabControl.getCurrentIndex();
+ int removeIndex = mTabControl.getTabIndex(tab);
+ removeTab(tab);
+ if (currentIndex >= removeIndex && currentIndex != 0) {
+ currentIndex--;
+ }
+ Tab newtab = mTabControl.getTab(currentIndex);
+ setActiveTab(newtab);
+ if (!mTabControl.hasAnyOpenIncognitoTabs()) {
+ WebView.cleanupPrivateBrowsingFiles();
+ }
+ }
+
+ /**************** TODO: Url loading clean up *******************************/
+
+ // Called when loading from context menu or LOAD_URL message
+ protected void loadUrlFromContext(WebView view, String url) {
+ // In case the user enters nothing.
+ if (url != null && url.length() != 0 && view != null) {
+ url = UrlUtils.smartUrlFilter(url);
+ if (!view.getWebViewClient().shouldOverrideUrlLoading(view, url)) {
+ loadUrl(view, url);
+ }
+ }
+ }
+
+ /**
+ * Load the URL into the given WebView and update the title bar
+ * to reflect the new load. Call this instead of WebView.loadUrl
+ * directly.
+ * @param view The WebView used to load url.
+ * @param url The URL to load.
+ */
+ protected void loadUrl(WebView view, String url) {
+ view.loadUrl(url);
+ }
+
+ /**
+ * Load UrlData into a Tab and update the title bar to reflect the new
+ * load. Call this instead of UrlData.loadIn directly.
+ * @param t The Tab used to load.
+ * @param data The UrlData being loaded.
+ */
+ protected void loadUrlDataIn(Tab t, UrlData data) {
+ data.loadIn(t);
+ }
+
+ /**
+ * Resets the browser title-view to whatever it must be
+ * (for example, if we had a loading error)
+ * When we have a new page, we call resetTitle, when we
+ * have to reset the titlebar to whatever it used to be
+ * (for example, if the user chose to stop loading), we
+ * call resetTitleAndRevertLockIcon.
+ */
+ public void resetTitleAndRevertLockIcon(Tab tab) {
+ mUi.resetTitleAndRevertLockIcon(tab);
+ }
+
+ void resetTitleAndIcon(Tab tab) {
+ mUi.resetTitleAndIcon(tab);
+ }
+
+ /**
+ * Sets a title composed of the URL and the title string.
+ * @param url The URL of the site being loaded.
+ * @param title The title of the site being loaded.
+ */
+ void setUrlTitle(Tab tab, String url, String title) {
+ tab.setCurrentUrl(url);
+ tab.setCurrentTitle(title);
+ // If we are in voice search mode, the title has already been set.
+ if (tab.isInVoiceSearchMode()) return;
+ mUi.setUrlTitle(tab, url, title);
+ }
+
+ void goBackOnePageOrQuit() {
+ Tab current = mTabControl.getCurrentTab();
+ if (current == null) {
+ /*
+ * Instead of finishing the activity, simply push this to the back
+ * of the stack and let ActivityManager to choose the foreground
+ * activity. As BrowserActivity is singleTask, it will be always the
+ * root of the task. So we can use either true or false for
+ * moveTaskToBack().
+ */
+ mActivity.moveTaskToBack(true);
+ return;
+ }
+ WebView w = current.getWebView();
+ if (w.canGoBack()) {
+ w.goBack();
+ } else {
+ // Check to see if we are closing a window that was created by
+ // another window. If so, we switch back to that window.
+ Tab parent = current.getParentTab();
+ if (parent != null) {
+ switchToTab(mTabControl.getTabIndex(parent));
+ // Now we close the other tab
+ closeTab(current);
+ } else {
+ if (current.closeOnExit()) {
+ // force the tab's inLoad() to be false as we are going to
+ // either finish the activity or remove the tab. This will
+ // ensure pauseWebViewTimers() taking action.
+ current.clearInPageLoad();
+ if (mTabControl.getTabCount() == 1) {
+ mActivity.finish();
+ return;
+ }
+ if (mActivityPaused) {
+ Log.e(LOGTAG, "BrowserActivity is already paused "
+ + "while handing goBackOnePageOrQuit.");
+ }
+ pauseWebViewTimers(current);
+ removeTab(current);
+ }
+ /*
+ * Instead of finishing the activity, simply push this to the back
+ * of the stack and let ActivityManager to choose the foreground
+ * activity. As BrowserActivity is singleTask, it will be always the
+ * root of the task. So we can use either true or false for
+ * moveTaskToBack().
+ */
+ mActivity.moveTaskToBack(true);
+ }
+ }
+ }
+
+ /**
+ * Feed the previously stored results strings to the BrowserProvider so that
+ * the SearchDialog will show them instead of the standard searches.
+ * @param result String to show on the editable line of the SearchDialog.
+ */
+ @Override
+ public void showVoiceSearchResults(String result) {
+ ContentProviderClient client = mActivity.getContentResolver()
+ .acquireContentProviderClient(Browser.BOOKMARKS_URI);
+ ContentProvider prov = client.getLocalContentProvider();
+ BrowserProvider bp = (BrowserProvider) prov;
+ bp.setQueryResults(mTabControl.getCurrentTab().getVoiceSearchResults());
+ client.release();
+
+ Bundle bundle = createGoogleSearchSourceBundle(
+ GOOGLE_SEARCH_SOURCE_SEARCHKEY);
+ bundle.putBoolean(SearchManager.CONTEXT_IS_VOICE, true);
+ startSearch(result, false, bundle, false);
+ }
+
+ private void startSearch(String initialQuery, boolean selectInitialQuery,
+ Bundle appSearchData, boolean globalSearch) {
+ if (appSearchData == null) {
+ appSearchData = createGoogleSearchSourceBundle(
+ GOOGLE_SEARCH_SOURCE_TYPE);
+ }
+
+ SearchEngine searchEngine = mSettings.getSearchEngine();
+ if (searchEngine != null && !searchEngine.supportsVoiceSearch()) {
+ appSearchData.putBoolean(SearchManager.DISABLE_VOICE_SEARCH, true);
+ }
+ mActivity.startSearch(initialQuery, selectInitialQuery, appSearchData,
+ globalSearch);
+ }
+
+ private Bundle createGoogleSearchSourceBundle(String source) {
+ Bundle bundle = new Bundle();
+ bundle.putString(Search.SOURCE, source);
+ return bundle;
+ }
+
+ /**
+ * handle key events in browser
+ *
+ * @param keyCode
+ * @param event
+ * @return true if handled, false to pass to super
+ */
+ boolean onKeyDown(int keyCode, KeyEvent event) {
+ // Even if MENU is already held down, we need to call to super to open
+ // the IME on long press.
+ if (KeyEvent.KEYCODE_MENU == keyCode) {
+ mMenuIsDown = true;
+ return false;
+ }
+ // The default key mode is DEFAULT_KEYS_SEARCH_LOCAL. As the MENU is
+ // still down, we don't want to trigger the search. Pretend to consume
+ // the key and do nothing.
+ if (mMenuIsDown) return true;
+
+ switch(keyCode) {
+ case KeyEvent.KEYCODE_SPACE:
+ // WebView/WebTextView handle the keys in the KeyDown. As
+ // the Activity's shortcut keys are only handled when WebView
+ // doesn't, have to do it in onKeyDown instead of onKeyUp.
+ if (event.isShiftPressed()) {
+ pageUp();
+ } else {
+ pageDown();
+ }
+ return true;
+ case KeyEvent.KEYCODE_BACK:
+ if (event.getRepeatCount() == 0) {
+ event.startTracking();
+ return true;
+ } else if (mUi.showsWeb()
+ && event.isLongPress()) {
+ bookmarksOrHistoryPicker(true);
+ return true;
+ }
+ break;
+ }
+ return false;
+ }
+
+ boolean onKeyUp(int keyCode, KeyEvent event) {
+ switch(keyCode) {
+ case KeyEvent.KEYCODE_MENU:
+ mMenuIsDown = false;
+ break;
+ case KeyEvent.KEYCODE_BACK:
+ if (event.isTracking() && !event.isCanceled()) {
+ onBackKey();
+ return true;
+ }
+ break;
+ }
+ return false;
+ }
+
+ public boolean isMenuDown() {
+ return mMenuIsDown;
+ }
+
+ public void setupAutoFill(Message message) {
+ // Open the settings activity at the AutoFill profile fragment so that
+ // the user can create a new profile. When they return, we will dispatch
+ // the message so that we can autofill the form using their new profile.
+ Intent intent = new Intent(mActivity, BrowserPreferencesPage.class);
+ intent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT,
+ AutoFillSettingsFragment.class.getName());
+ mAutoFillSetupMessage = message;
+ mActivity.startActivityForResult(intent, AUTOFILL_SETUP);
+ }
+}
diff --git a/src/com/android/browser/DateSortedExpandableListAdapter.java b/src/com/android/browser/DateSortedExpandableListAdapter.java
index 1d04493..a48efe6 100644
--- a/src/com/android/browser/DateSortedExpandableListAdapter.java
+++ b/src/com/android/browser/DateSortedExpandableListAdapter.java
@@ -17,65 +17,55 @@
package com.android.browser;
import android.content.Context;
-import android.database.ContentObserver;
import android.database.Cursor;
import android.database.DataSetObserver;
-import android.os.Handler;
-import android.provider.BaseColumns;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.DateSorter;
-import android.widget.ExpandableListAdapter;
+import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.TextView;
-import java.util.Vector;
-
/**
* ExpandableListAdapter which separates data into categories based on date.
* Used for History and Downloads.
*/
-public class DateSortedExpandableListAdapter implements ExpandableListAdapter {
+public class DateSortedExpandableListAdapter extends BaseExpandableListAdapter {
// Array for each of our bins. Each entry represents how many items are
// in that bin.
private int mItemMap[];
// This is our GroupCount. We will have at most DateSorter.DAY_COUNT
// bins, less if the user has no items in one or more bins.
private int mNumberOfBins;
- private Vector<DataSetObserver> mObservers;
private Cursor mCursor;
private DateSorter mDateSorter;
private int mDateIndex;
private int mIdIndex;
private Context mContext;
- private class ChangeObserver extends ContentObserver {
- public ChangeObserver() {
- super(new Handler());
+ boolean mDataValid;
+
+ DataSetObserver mDataSetObserver = new DataSetObserver() {
+ @Override
+ public void onChanged() {
+ mDataValid = true;
+ notifyDataSetChanged();
}
@Override
- public boolean deliverSelfNotifications() {
- return true;
+ public void onInvalidated() {
+ mDataValid = false;
+ notifyDataSetInvalidated();
}
-
- @Override
- public void onChange(boolean selfChange) {
- refreshData();
- }
- }
-
- public DateSortedExpandableListAdapter(Context context, Cursor cursor,
- int dateIndex) {
+ };
+
+ public DateSortedExpandableListAdapter(Context context, int dateIndex) {
mContext = context;
mDateSorter = new DateSorter(context);
- mObservers = new Vector<DataSetObserver>();
- mCursor = cursor;
- mIdIndex = cursor.getColumnIndexOrThrow(BaseColumns._ID);
- cursor.registerContentObserver(new ChangeObserver());
mDateIndex = dateIndex;
- buildMap();
+ mDataValid = false;
+ mIdIndex = -1;
}
/**
@@ -122,6 +112,7 @@
* @return corresponding byte array from the Cursor.
*/
/* package */ byte[] getBlob(int cursorIndex) {
+ if (!mDataValid) return null;
return mCursor.getBlob(cursorIndex);
}
@@ -138,6 +129,7 @@
* @return corresponding integer from the Cursor.
*/
/* package */ int getInt(int cursorIndex) {
+ if (!mDataValid) return 0;
return mCursor.getInt(cursorIndex);
}
@@ -146,6 +138,7 @@
* already been moved to the correct position.
*/
/* package */ long getLong(int cursorIndex) {
+ if (!mDataValid) return 0;
return mCursor.getLong(cursorIndex);
}
@@ -158,6 +151,7 @@
* @return corresponding String from the Cursor.
*/
/* package */ String getString(int cursorIndex) {
+ if (!mDataValid) return null;
return mCursor.getString(cursorIndex);
}
@@ -166,6 +160,7 @@
* @param childId ID of the child view in question.
* @return int Group position of the containing group.
/* package */ int groupFromChildId(long childId) {
+ if (!mDataValid) return -1;
int group = -1;
for (mCursor.moveToFirst(); !mCursor.isAfterLast();
mCursor.moveToNext()) {
@@ -173,11 +168,15 @@
int bin = mDateSorter.getIndex(getLong(mDateIndex));
// bin is the same as the group if the number of bins is the
// same as DateSorter
- if (mDateSorter.DAY_COUNT == mNumberOfBins) return bin;
+ if (DateSorter.DAY_COUNT == mNumberOfBins) {
+ return bin;
+ }
// There are some empty bins. Find the corresponding group.
group = 0;
for (int i = 0; i < bin; i++) {
- if (mItemMap[i] != 0) group++;
+ if (mItemMap[i] != 0) {
+ group++;
+ }
}
break;
}
@@ -193,6 +192,7 @@
* @return The corresponding bin that holds that group.
*/
private int groupPositionToBin(int groupPosition) {
+ if (!mDataValid) return -1;
if (groupPosition < 0 || groupPosition >= DateSorter.DAY_COUNT) {
throw new AssertionError("group position out of range");
}
@@ -241,7 +241,9 @@
*/
/* package */ boolean moveCursorToChildPosition(int groupPosition,
int childPosition) {
- if (mCursor.isClosed()) return false;
+ if (!mDataValid || mCursor.isClosed()) {
+ return false;
+ }
groupPosition = groupPositionToBin(groupPosition);
int index = childPosition;
for (int i = 0; i < groupPosition; i++) {
@@ -250,19 +252,34 @@
return mCursor.moveToPosition(index);
}
- /* package */ void refreshData() {
- if (mCursor.isClosed()) {
+ public void changeCursor(Cursor cursor) {
+ if (cursor == mCursor) {
return;
}
- mCursor.requery();
- buildMap();
- for (DataSetObserver o : mObservers) {
- o.onChanged();
+ if (mCursor != null) {
+ mCursor.unregisterDataSetObserver(mDataSetObserver);
+ mCursor.close();
+ }
+ mCursor = cursor;
+ if (cursor != null) {
+ cursor.registerDataSetObserver(mDataSetObserver);
+ mIdIndex = cursor.getColumnIndexOrThrow("_id");
+ mDataValid = true;
+ buildMap();
+ // notify the observers about the new cursor
+ notifyDataSetChanged();
+ } else {
+ mIdIndex = -1;
+ mDataValid = false;
+ // notify the observers about the lack of a data set
+ notifyDataSetInvalidated();
}
}
+ @Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
+ if (!mDataValid) throw new IllegalStateException("Data is not valid");
TextView item;
if (null == convertView || !(convertView instanceof TextView)) {
LayoutInflater factory = LayoutInflater.from(mContext);
@@ -275,73 +292,87 @@
return item;
}
+ @Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
+ if (!mDataValid) throw new IllegalStateException("Data is not valid");
return null;
}
+ @Override
public boolean areAllItemsEnabled() {
return true;
}
+ @Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
+ @Override
public int getGroupCount() {
+ if (!mDataValid) return 0;
return mNumberOfBins;
}
+ @Override
public int getChildrenCount(int groupPosition) {
+ if (!mDataValid) return 0;
return mItemMap[groupPositionToBin(groupPosition)];
}
+ @Override
public Object getGroup(int groupPosition) {
return null;
}
+ @Override
public Object getChild(int groupPosition, int childPosition) {
return null;
}
+ @Override
public long getGroupId(int groupPosition) {
+ if (!mDataValid) return 0;
return groupPosition;
}
+ @Override
public long getChildId(int groupPosition, int childPosition) {
+ if (!mDataValid) return 0;
if (moveCursorToChildPosition(groupPosition, childPosition)) {
return getLong(mIdIndex);
}
return 0;
}
+ @Override
public boolean hasStableIds() {
return true;
}
- public void registerDataSetObserver(DataSetObserver observer) {
- mObservers.add(observer);
- }
-
- public void unregisterDataSetObserver(DataSetObserver observer) {
- mObservers.remove(observer);
- }
-
+ @Override
public void onGroupExpanded(int groupPosition) {
}
+ @Override
public void onGroupCollapsed(int groupPosition) {
}
+ @Override
public long getCombinedChildId(long groupId, long childId) {
+ if (!mDataValid) return 0;
return childId;
}
+ @Override
public long getCombinedGroupId(long groupId) {
+ if (!mDataValid) return 0;
return groupId;
}
+ @Override
public boolean isEmpty() {
- return mCursor.isClosed() || mCursor.getCount() == 0;
+ return !mDataValid || mCursor == null || mCursor.isClosed() || mCursor.getCount() == 0;
}
}
diff --git a/src/com/android/browser/Dots.java b/src/com/android/browser/Dots.java
deleted file mode 100644
index eb8d493..0000000
--- a/src/com/android/browser/Dots.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * 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.
- */
-
-package com.android.browser;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.Gravity;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-
-import java.util.Map;
-
-/**
- * Displays a series of dots. The selected one is highlighted.
- * No animations yet. Nothing fancy.
- */
-class Dots extends LinearLayout {
-
- private static final int MAX_DOTS = 8;
- private int mSelected = -1;
-
- public Dots(Context context) {
- this(context, null);
- }
-
- public Dots(Context context, AttributeSet attrs) {
- super(context, attrs);
-
- setGravity(Gravity.CENTER);
- setPadding(0, 4, 0, 4);
-
- LayoutParams lp =
- new LayoutParams(LayoutParams.WRAP_CONTENT,
- LayoutParams.WRAP_CONTENT);
-
- for (int i = 0; i < MAX_DOTS; i++) {
- ImageView dotView = new ImageView(mContext);
- dotView.setImageResource(R.drawable.page_indicator_unselected2);
- addView(dotView, lp);
- }
- }
-
- /**
- * @param dotCount if less than 1 or greater than MAX_DOTS, Dots
- * disappears
- */
- public void setDotCount(int dotCount) {
- if (dotCount > 1 && dotCount <= MAX_DOTS) {
- setVisibility(VISIBLE);
- for (int i = 0; i < MAX_DOTS; i++) {
- getChildAt(i).setVisibility(i < dotCount? VISIBLE : GONE);
- }
- } else {
- setVisibility(GONE);
- }
- }
-
- public void setSelected(int index) {
- if (index < 0 || index >= MAX_DOTS) return;
-
- if (mSelected >= 0) {
- // Unselect old
- ((ImageView)getChildAt(mSelected)).setImageResource(
- R.drawable.page_indicator_unselected2);
- }
- ((ImageView)getChildAt(index)).setImageResource(R.drawable.page_indicator);
- mSelected = index;
- }
-}
diff --git a/src/com/android/browser/DownloadHandler.java b/src/com/android/browser/DownloadHandler.java
new file mode 100644
index 0000000..cbf26f4
--- /dev/null
+++ b/src/com/android/browser/DownloadHandler.java
@@ -0,0 +1,218 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.DownloadManager;
+import android.content.ActivityNotFoundException;
+import android.content.ComponentName;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.net.Uri;
+import android.net.WebAddress;
+import android.os.Environment;
+import android.text.TextUtils;
+import android.util.Log;
+import android.webkit.CookieManager;
+import android.webkit.URLUtil;
+import android.widget.Toast;
+
+/**
+ * Handle download requests
+ */
+public class DownloadHandler {
+
+ private static final boolean LOGD_ENABLED =
+ com.android.browser.Browser.LOGD_ENABLED;
+
+ private static final String LOGTAG = "DLHandler";
+
+ /**
+ * Notify the host application a download should be done, or that
+ * the data should be streamed if a streaming viewer is available.
+ * @param activity Activity requesting the download.
+ * @param url The full url to the content that should be downloaded
+ * @param userAgent User agent of the downloading application.
+ * @param contentDisposition Content-disposition http header, if present.
+ * @param mimetype The mimetype of the content reported by the server
+ */
+ public static void onDownloadStart(Activity activity, String url,
+ String userAgent, String contentDisposition, String mimetype) {
+ // if we're dealing wih A/V content that's not explicitly marked
+ // for download, check if it's streamable.
+ if (contentDisposition == null
+ || !contentDisposition.regionMatches(
+ true, 0, "attachment", 0, 10)) {
+ // query the package manager to see if there's a registered handler
+ // that matches.
+ Intent intent = new Intent(Intent.ACTION_VIEW);
+ intent.setDataAndType(Uri.parse(url), mimetype);
+ ResolveInfo info = activity.getPackageManager().resolveActivity(intent,
+ PackageManager.MATCH_DEFAULT_ONLY);
+ if (info != null) {
+ ComponentName myName = activity.getComponentName();
+ // If we resolved to ourselves, we don't want to attempt to
+ // load the url only to try and download it again.
+ if (!myName.getPackageName().equals(
+ info.activityInfo.packageName)
+ || !myName.getClassName().equals(
+ info.activityInfo.name)) {
+ // someone (other than us) knows how to handle this mime
+ // type with this scheme, don't download.
+ try {
+ activity.startActivity(intent);
+ return;
+ } catch (ActivityNotFoundException ex) {
+ if (LOGD_ENABLED) {
+ Log.d(LOGTAG, "activity not found for " + mimetype
+ + " over " + Uri.parse(url).getScheme(),
+ ex);
+ }
+ // Best behavior is to fall back to a download in this
+ // case
+ }
+ }
+ }
+ }
+ onDownloadStartNoStream(activity, url, userAgent, contentDisposition,
+ mimetype);
+ }
+
+ // This is to work around the fact that java.net.URI throws Exceptions
+ // instead of just encoding URL's properly
+ // Helper method for onDownloadStartNoStream
+ private static String encodePath(String path) {
+ char[] chars = path.toCharArray();
+
+ boolean needed = false;
+ for (char c : chars) {
+ if (c == '[' || c == ']') {
+ needed = true;
+ break;
+ }
+ }
+ if (needed == false) {
+ return path;
+ }
+
+ StringBuilder sb = new StringBuilder("");
+ for (char c : chars) {
+ if (c == '[' || c == ']') {
+ sb.append('%');
+ sb.append(Integer.toHexString(c));
+ } else {
+ sb.append(c);
+ }
+ }
+
+ return sb.toString();
+ }
+
+ /**
+ * Notify the host application a download should be done, even if there
+ * is a streaming viewer available for thise type.
+ * @param activity Activity requesting the download.
+ * @param url The full url to the content that should be downloaded
+ * @param userAgent User agent of the downloading application.
+ * @param contentDisposition Content-disposition http header, if present.
+ * @param mimetype The mimetype of the content reported by the server
+ */
+ /*package */ static void onDownloadStartNoStream(Activity activity,
+ String url, String userAgent, String contentDisposition,
+ String mimetype) {
+
+ String filename = URLUtil.guessFileName(url,
+ contentDisposition, mimetype);
+
+ // Check to see if we have an SDCard
+ String status = Environment.getExternalStorageState();
+ if (!status.equals(Environment.MEDIA_MOUNTED)) {
+ int title;
+ String msg;
+
+ // Check to see if the SDCard is busy, same as the music app
+ if (status.equals(Environment.MEDIA_SHARED)) {
+ msg = activity.getString(R.string.download_sdcard_busy_dlg_msg);
+ title = R.string.download_sdcard_busy_dlg_title;
+ } else {
+ msg = activity.getString(R.string.download_no_sdcard_dlg_msg, filename);
+ title = R.string.download_no_sdcard_dlg_title;
+ }
+
+ new AlertDialog.Builder(activity)
+ .setTitle(title)
+ .setIcon(android.R.drawable.ic_dialog_alert)
+ .setMessage(msg)
+ .setPositiveButton(R.string.ok, null)
+ .show();
+ return;
+ }
+
+ // java.net.URI is a lot stricter than KURL so we have to encode some
+ // extra characters. Fix for b 2538060 and b 1634719
+ WebAddress webAddress;
+ try {
+ webAddress = new WebAddress(url);
+ webAddress.setPath(encodePath(webAddress.getPath()));
+ } catch (Exception e) {
+ // This only happens for very bad urls, we want to chatch the
+ // exception here
+ Log.e(LOGTAG, "Exception trying to parse url:" + url);
+ return;
+ }
+
+ String addressString = webAddress.toString();
+ Uri uri = Uri.parse(addressString);
+ final DownloadManager.Request request = new DownloadManager.Request(uri);
+ request.setMimeType(mimetype);
+ request.setDestinationInExternalFilesDir(activity, null, filename);
+ // let this downloaded file be scanned by MediaScanner - so that it can
+ // show up in Gallery app, for example.
+ request.allowScanningByMediaScanner();
+ request.setDescription(webAddress.getHost());
+ // XXX: Have to use the old url since the cookies were stored using the
+ // old percent-encoded url.
+ String cookies = CookieManager.getInstance().getCookie(url);
+ request.addRequestHeader("cookie", cookies);
+ request.setNotificationVisibility(
+ DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
+ if (mimetype == null) {
+ if (TextUtils.isEmpty(addressString)) {
+ return;
+ }
+ // We must have long pressed on a link or image to download it. We
+ // are not sure of the mimetype in this case, so do a head request
+ new FetchUrlMimeType(activity, request, addressString, cookies,
+ userAgent).start();
+ } else {
+ final DownloadManager manager
+ = (DownloadManager) activity.getSystemService(Context.DOWNLOAD_SERVICE);
+ new Thread("Browser download") {
+ public void run() {
+ manager.enqueue(request);
+ }
+ }.start();
+ }
+ Toast.makeText(activity, R.string.download_pending, Toast.LENGTH_SHORT)
+ .show();
+ }
+
+}
diff --git a/src/com/android/browser/DownloadTouchIcon.java b/src/com/android/browser/DownloadTouchIcon.java
index e8a912c..768eab5 100644
--- a/src/com/android/browser/DownloadTouchIcon.java
+++ b/src/com/android/browser/DownloadTouchIcon.java
@@ -16,20 +16,6 @@
package com.android.browser;
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Context;
-import android.database.Cursor;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.net.http.AndroidHttpClient;
-import android.net.Proxy;
-import android.os.AsyncTask;
-import android.provider.Browser;
-import android.webkit.WebView;
-
-
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
@@ -37,6 +23,21 @@
import org.apache.http.client.params.HttpClientParams;
import org.apache.http.conn.params.ConnRouteParams;
+import android.content.ContentResolver;
+import android.content.ContentValues;
+import android.content.Context;
+import android.database.Cursor;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.net.Proxy;
+import android.net.http.AndroidHttpClient;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.os.Message;
+import android.provider.BrowserContract;
+import android.provider.BrowserContract.Images;
+import android.webkit.WebView;
+
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
@@ -46,10 +47,17 @@
private Cursor mCursor;
private final String mOriginalUrl;
private final String mUrl;
- private final String mUserAgent;
+ private final String mUserAgent; // Sites may serve a different icon to different UAs
+ private Message mMessage;
+
private final Context mContext;
/* package */ Tab mTab;
+ /**
+ * Use this ctor to store the touch icon in the bookmarks database for
+ * the originalUrl so we take account of redirects. Used when the user
+ * bookmarks a page from outside the bookmarks activity.
+ */
public DownloadTouchIcon(Tab tab, Context ctx, ContentResolver cr, WebView view) {
mTab = tab;
mContext = ctx;
@@ -60,6 +68,13 @@
mUserAgent = view.getSettings().getUserAgentString();
}
+ /**
+ * Use this ctor to download the touch icon and update the bookmarks database
+ * entry for the given url. Used when the user creates a bookmark from
+ * within the bookmarks activity and there haven't been any redirects.
+ * TODO: Would be nice to set the user agent here so that there is no
+ * potential for the three different ctors here to return different icons.
+ */
public DownloadTouchIcon(Context ctx, ContentResolver cr, String url) {
mTab = null;
mContext = ctx;
@@ -69,15 +84,33 @@
mUserAgent = null;
}
+ /**
+ * Use this ctor to not store the touch icon in a database, rather add it to
+ * the passed Message's data bundle with the key
+ * {@link BrowserContract.Bookmarks#TOUCH_ICON} and then send the message.
+ */
+ public DownloadTouchIcon(Context context, Message msg, String userAgent) {
+ mMessage = msg;
+ mContext = context;
+ mContentResolver = null;
+ mOriginalUrl = null;
+ mUrl = null;
+ mUserAgent = userAgent;
+ }
+
@Override
public Void doInBackground(String... values) {
- mCursor = BrowserBookmarksAdapter.queryBookmarksForUrl(mContentResolver,
- mOriginalUrl, mUrl, true);
- if (mCursor != null && mCursor.getCount() > 0) {
- String url = values[0];
+ if (mContentResolver != null) {
+ mCursor = Bookmarks.queryCombinedForUrl(mContentResolver,
+ mOriginalUrl, mUrl);
+ }
- AndroidHttpClient client = AndroidHttpClient.newInstance(
- mUserAgent);
+ boolean inDatabase = mCursor != null && mCursor.getCount() > 0;
+
+ String url = values[0];
+
+ if (inDatabase || mMessage != null) {
+ AndroidHttpClient client = AndroidHttpClient.newInstance(mUserAgent);
HttpHost httpHost = Proxy.getPreferredHttpHost(mContext, url);
if (httpHost != null) {
ConnRouteParams.setDefaultProxy(client.getParams(), httpHost);
@@ -90,7 +123,6 @@
try {
HttpResponse response = client.execute(request);
-
if (response.getStatusLine().getStatusCode() == 200) {
HttpEntity entity = response.getEntity();
if (entity != null) {
@@ -98,7 +130,12 @@
if (content != null) {
Bitmap icon = BitmapFactory.decodeStream(
content, null, null);
- storeIcon(icon);
+ if (inDatabase) {
+ storeIcon(icon);
+ } else if (mMessage != null) {
+ Bundle b = mMessage.getData();
+ b.putParcelable(BrowserContract.Bookmarks.TOUCH_ICON, icon);
+ }
}
}
}
@@ -110,9 +147,15 @@
client.close();
}
}
+
if (mCursor != null) {
mCursor.close();
}
+
+ if (mMessage != null) {
+ mMessage.sendToTarget();
+ }
+
return null;
}
@@ -134,17 +177,16 @@
return;
}
- final ByteArrayOutputStream os = new ByteArrayOutputStream();
- icon.compress(Bitmap.CompressFormat.PNG, 100, os);
- ContentValues values = new ContentValues();
- values.put(Browser.BookmarkColumns.TOUCH_ICON,
- os.toByteArray());
-
if (mCursor.moveToFirst()) {
+ final ByteArrayOutputStream os = new ByteArrayOutputStream();
+ icon.compress(Bitmap.CompressFormat.PNG, 100, os);
+
+ ContentValues values = new ContentValues();
+ values.put(Images.TOUCH_ICON, os.toByteArray());
+ values.put(Images.URL, mCursor.getString(0));
+
do {
- mContentResolver.update(ContentUris.withAppendedId(
- Browser.BOOKMARKS_URI, mCursor.getInt(0)),
- values, null, null);
+ mContentResolver.update(Images.CONTENT_URI, values, null, null);
} while (mCursor.moveToNext());
}
}
diff --git a/src/com/android/browser/FetchUrlMimeType.java b/src/com/android/browser/FetchUrlMimeType.java
index 62d877e..2538d90 100644
--- a/src/com/android/browser/FetchUrlMimeType.java
+++ b/src/com/android/browser/FetchUrlMimeType.java
@@ -16,78 +16,67 @@
package com.android.browser;
-import android.content.ContentValues;
-import android.net.Proxy;
-import android.net.Uri;
-import android.net.http.AndroidHttpClient;
-
+import org.apache.http.Header;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
-import org.apache.http.Header;
import org.apache.http.client.methods.HttpHead;
import org.apache.http.conn.params.ConnRouteParams;
-import java.io.IOException;
-
-import android.os.AsyncTask;
-import android.provider.Downloads;
+import android.app.Activity;
+import android.app.DownloadManager;
+import android.content.Context;
+import android.net.Proxy;
+import android.net.http.AndroidHttpClient;
import android.webkit.MimeTypeMap;
import android.webkit.URLUtil;
+import java.io.IOException;
+
/**
* This class is used to pull down the http headers of a given URL so that
* we can analyse the mimetype and make any correction needed before we give
- * the URL to the download manager. The ContentValues class holds the
- * content that would be provided to the download manager, so that on
- * completion of checking the mimetype, we can issue the download to
- * the download manager.
+ * the URL to the download manager.
* This operation is needed when the user long-clicks on a link or image and
* we don't know the mimetype. If the user just clicks on the link, we will
* do the same steps of correcting the mimetype down in
* android.os.webkit.LoadListener rather than handling it here.
*
*/
-class FetchUrlMimeType extends AsyncTask<ContentValues, String, ContentValues> {
+class FetchUrlMimeType extends Thread {
- BrowserActivity mActivity;
- ContentValues mValues;
+ private Activity mActivity;
+ private DownloadManager.Request mRequest;
+ private String mUri;
+ private String mCookies;
+ private String mUserAgent;
- public FetchUrlMimeType(BrowserActivity activity) {
+ public FetchUrlMimeType(Activity activity, DownloadManager.Request request,
+ String uri, String cookies, String userAgent) {
mActivity = activity;
+ mRequest = request;
+ mUri = uri;
+ mCookies = cookies;
+ mUserAgent = userAgent;
}
@Override
- public ContentValues doInBackground(ContentValues... values) {
- mValues = values[0];
-
- // Check to make sure we have a URI to download
- String uri = mValues.getAsString(Downloads.Impl.COLUMN_URI);
- if (uri == null || uri.length() == 0) {
- return null;
- }
-
+ public void run() {
// User agent is likely to be null, though the AndroidHttpClient
// seems ok with that.
- AndroidHttpClient client = AndroidHttpClient.newInstance(
- mValues.getAsString(Downloads.Impl.COLUMN_USER_AGENT));
- HttpHost httpHost = Proxy.getPreferredHttpHost(mActivity, uri);
+ AndroidHttpClient client = AndroidHttpClient.newInstance(mUserAgent);
+ HttpHost httpHost = Proxy.getPreferredHttpHost(mActivity, mUri);
if (httpHost != null) {
ConnRouteParams.setDefaultProxy(client.getParams(), httpHost);
}
- HttpHead request = new HttpHead(uri);
+ HttpHead request = new HttpHead(mUri);
- String cookie = mValues.getAsString(Downloads.Impl.COLUMN_COOKIE_DATA);
- if (cookie != null && cookie.length() > 0) {
- request.addHeader("Cookie", cookie);
- }
-
- String referer = mValues.getAsString(Downloads.Impl.COLUMN_REFERER);
- if (referer != null && referer.length() > 0) {
- request.addHeader("Referer", referer);
+ if (mCookies != null && mCookies.length() > 0) {
+ request.addHeader("Cookie", mCookies);
}
HttpResponse response;
- ContentValues result = new ContentValues();
+ String mimeType = null;
+ String contentDisposition = null;
try {
response = client.execute(request);
// We could get a redirect here, but if we do lets let
@@ -96,16 +85,15 @@
if (response.getStatusLine().getStatusCode() == 200) {
Header header = response.getFirstHeader("Content-Type");
if (header != null) {
- String mimeType = header.getValue();
+ mimeType = header.getValue();
final int semicolonIndex = mimeType.indexOf(';');
if (semicolonIndex != -1) {
mimeType = mimeType.substring(0, semicolonIndex);
}
- result.put("Content-Type", mimeType);
}
Header contentDispositionHeader = response.getFirstHeader("Content-Disposition");
if (contentDispositionHeader != null) {
- result.put("Content-Disposition", contentDispositionHeader.getValue());
+ contentDisposition = contentDispositionHeader.getValue();
}
}
} catch (IllegalArgumentException ex) {
@@ -116,32 +104,25 @@
client.close();
}
- return result;
- }
-
- @Override
- public void onPostExecute(ContentValues values) {
- final String mimeType = values.getAsString("Content-Type");
- final String contentDisposition = values.getAsString("Content-Disposition");
if (mimeType != null) {
- String url = mValues.getAsString(Downloads.Impl.COLUMN_URI);
if (mimeType.equalsIgnoreCase("text/plain") ||
mimeType.equalsIgnoreCase("application/octet-stream")) {
String newMimeType =
MimeTypeMap.getSingleton().getMimeTypeFromExtension(
- MimeTypeMap.getFileExtensionFromUrl(url));
+ MimeTypeMap.getFileExtensionFromUrl(mUri));
if (newMimeType != null) {
- mValues.put(Downloads.Impl.COLUMN_MIME_TYPE, newMimeType);
+ mRequest.setMimeType(newMimeType);
}
}
- String filename = URLUtil.guessFileName(url,
- contentDisposition, mimeType);
- mValues.put(Downloads.Impl.COLUMN_FILE_NAME_HINT, filename);
+ String filename = URLUtil.guessFileName(mUri, contentDisposition,
+ mimeType);
+ mRequest.setDestinationInExternalFilesDir(mActivity, null, filename);
}
// Start the download
- final Uri contentUri =
- mActivity.getContentResolver().insert(Downloads.Impl.CONTENT_URI, mValues);
+ DownloadManager manager = (DownloadManager) mActivity.getSystemService(
+ Context.DOWNLOAD_SERVICE);
+ manager.enqueue(mRequest);
}
}
diff --git a/src/com/android/browser/FindDialog.java b/src/com/android/browser/FindDialog.java
deleted file mode 100644
index 726138e..0000000
--- a/src/com/android/browser/FindDialog.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
- * Copyright (C) 2007 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.text.Editable;
-import android.text.Selection;
-import android.text.Spannable;
-import android.text.TextWatcher;
-import android.view.Gravity;
-import android.view.KeyEvent;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.animation.AnimationUtils;
-import android.view.inputmethod.InputMethodManager;
-import android.webkit.WebView;
-import android.widget.EditText;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-/* package */ class FindDialog extends WebDialog implements TextWatcher {
- private TextView mMatches;
-
- // Views with which the user can interact.
- private EditText mEditText;
- private View mNextButton;
- private View mPrevButton;
- private View mMatchesView;
-
- // When the dialog is opened up with old text, enter needs to be pressed
- // (or the text needs to be changed) before WebView.findAll can be called.
- // Once it has been called, enter should move to the next match.
- private boolean mMatchesFound;
- private int mNumberOfMatches;
-
- private View.OnClickListener mFindListener = new View.OnClickListener() {
- public void onClick(View v) {
- findNext();
- }
- };
-
- private View.OnClickListener mFindPreviousListener =
- new View.OnClickListener() {
- public void onClick(View v) {
- if (mWebView == null) {
- throw new AssertionError("No WebView for FindDialog::onClick");
- }
- mWebView.findNext(false);
- updateMatchesString();
- hideSoftInput();
- }
- };
-
- private void disableButtons() {
- mPrevButton.setEnabled(false);
- mNextButton.setEnabled(false);
- mPrevButton.setFocusable(false);
- mNextButton.setFocusable(false);
- }
-
- /* package */ FindDialog(BrowserActivity context) {
- super(context);
-
- LayoutInflater factory = LayoutInflater.from(context);
- factory.inflate(R.layout.browser_find, this);
-
- addCancel();
- mEditText = (EditText) findViewById(R.id.edit);
-
- View button = findViewById(R.id.next);
- button.setOnClickListener(mFindListener);
- mNextButton = button;
-
- button = findViewById(R.id.previous);
- button.setOnClickListener(mFindPreviousListener);
- mPrevButton = button;
-
- mMatches = (TextView) findViewById(R.id.matches);
- mMatchesView = findViewById(R.id.matches_view);
- disableButtons();
-
- }
-
- /**
- * Called by BrowserActivity.closeDialog. Start the animation to hide
- * the dialog, inform the WebView that the dialog is being dismissed,
- * and hide the soft keyboard.
- */
- public void dismiss() {
- super.dismiss();
- mWebView.notifyFindDialogDismissed();
- hideSoftInput();
- }
-
- @Override
- public boolean dispatchKeyEventPreIme(KeyEvent event) {
- if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
- KeyEvent.DispatcherState state = getKeyDispatcherState();
- if (state != null) {
- int action = event.getAction();
- if (KeyEvent.ACTION_DOWN == action
- && event.getRepeatCount() == 0) {
- state.startTracking(event, this);
- return true;
- } else if (KeyEvent.ACTION_UP == action
- && !event.isCanceled() && state.isTracking(event)) {
- mBrowserActivity.closeDialogs();
- return true;
- }
- }
- }
- return super.dispatchKeyEventPreIme(event);
- }
-
- @Override
- public boolean dispatchKeyEvent(KeyEvent event) {
- int keyCode = event.getKeyCode();
- if (event.getAction() == KeyEvent.ACTION_UP) {
- if (keyCode == KeyEvent.KEYCODE_ENTER
- && mEditText.hasFocus()) {
- if (mMatchesFound) {
- findNext();
- } else {
- findAll();
- // Set the selection to the end.
- Spannable span = (Spannable) mEditText.getText();
- Selection.setSelection(span, span.length());
- }
- return true;
- }
- }
- return super.dispatchKeyEvent(event);
- }
-
- private void findNext() {
- if (mWebView == null) {
- throw new AssertionError("No WebView for FindDialog::findNext");
- }
- mWebView.findNext(true);
- updateMatchesString();
- hideSoftInput();
- }
-
- public void show() {
- super.show();
- // In case the matches view is showing from a previous search
- mMatchesView.setVisibility(View.INVISIBLE);
- mMatchesFound = false;
- // This text is only here to ensure that mMatches has a height.
- mMatches.setText("0");
- mEditText.requestFocus();
- Spannable span = (Spannable) mEditText.getText();
- int length = span.length();
- Selection.setSelection(span, 0, length);
- span.setSpan(this, 0, length, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
- disableButtons();
- InputMethodManager imm = (InputMethodManager)
- mBrowserActivity.getSystemService(Context.INPUT_METHOD_SERVICE);
- imm.showSoftInput(mEditText, 0);
- }
-
- // TextWatcher methods
- public void beforeTextChanged(CharSequence s,
- int start,
- int count,
- int after) {
- }
-
- public void onTextChanged(CharSequence s,
- int start,
- int before,
- int count) {
- findAll();
- }
-
- private void findAll() {
- if (mWebView == null) {
- throw new AssertionError(
- "No WebView for FindDialog::findAll");
- }
- CharSequence find = mEditText.getText();
- if (0 == find.length()) {
- disableButtons();
- mWebView.clearMatches();
- mMatchesView.setVisibility(View.INVISIBLE);
- } else {
- mMatchesView.setVisibility(View.VISIBLE);
- int found = mWebView.findAll(find.toString());
- mMatchesFound = true;
- setMatchesFound(found);
- if (found < 2) {
- disableButtons();
- if (found == 0) {
- // Cannot use getQuantityString, which ignores the "zero"
- // quantity.
- // FIXME: is this fix is beyond the scope
- // of adding touch selection to gingerbread?
- // mMatches.setText(mBrowserActivity.getResources().getString(
- // R.string.no_matches));
- }
- } else {
- mPrevButton.setFocusable(true);
- mNextButton.setFocusable(true);
- mPrevButton.setEnabled(true);
- mNextButton.setEnabled(true);
- }
- }
- }
-
- private void setMatchesFound(int found) {
- mNumberOfMatches = found;
- updateMatchesString();
- }
-
- public void setText(String text) {
- mEditText.setText(text);
- findAll();
- }
-
- private void updateMatchesString() {
- // Note: updateMatchesString is only called by methods that have already
- // checked mWebView for null.
- String template = mBrowserActivity.getResources().
- getQuantityString(R.plurals.matches_found, mNumberOfMatches,
- mWebView.findIndex() + 1, mNumberOfMatches);
-
- mMatches.setText(template);
- }
-
- public void afterTextChanged(Editable s) {
- }
-}
diff --git a/src/com/android/browser/HistoryItem.java b/src/com/android/browser/HistoryItem.java
index 72e1b19..11198f0 100644
--- a/src/com/android/browser/HistoryItem.java
+++ b/src/com/android/browser/HistoryItem.java
@@ -18,12 +18,8 @@
package com.android.browser;
import android.content.Context;
-import android.graphics.Bitmap;
-import android.provider.Browser;
import android.view.View;
import android.widget.CompoundButton;
-import android.widget.ImageView;
-import android.widget.TextView;
/**
* Layout representing a history item in the classic history viewer.
@@ -45,12 +41,13 @@
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
if (isChecked) {
- Bookmarks.addBookmark(mContext,
- mContext.getContentResolver(), mUrl, getName(), null, true);
+ // FIXME: For now, add at the root level. Should we
+ // open AddBookmark from here?
+ Bookmarks.addBookmark(getContext(), true, mUrl, getName(), null, true, 0);
LogTag.logBookmarkAdded(mUrl, "history");
} else {
- Bookmarks.removeFromBookmarks(mContext,
- mContext.getContentResolver(), mUrl, getName());
+ Bookmarks.removeFromBookmarks(getContext(),
+ getContext().getContentResolver(), mUrl, getName());
}
}
};
diff --git a/src/com/android/browser/HttpAuthenticationDialog.java b/src/com/android/browser/HttpAuthenticationDialog.java
new file mode 100644
index 0000000..a9ba332
--- /dev/null
+++ b/src/com/android/browser/HttpAuthenticationDialog.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.browser;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.WindowManager;
+import android.widget.TextView;
+
+/**
+ * HTTP authentication dialog.
+ */
+public class HttpAuthenticationDialog {
+
+ private final Context mContext;
+
+ private final String mHost;
+ private final String mRealm;
+
+ private AlertDialog mDialog;
+ private TextView mUsernameView;
+ private TextView mPasswordView;
+
+ private OkListener mOkListener;
+ private CancelListener mCancelListener;
+
+ /**
+ * Creates an HTTP authentication dialog.
+ */
+ public HttpAuthenticationDialog(Context context, String host, String realm) {
+ mContext = context;
+ mHost = host;
+ mRealm = realm;
+ createDialog();
+ }
+
+ private String getUsername() {
+ return mUsernameView.getText().toString();
+ }
+
+ private String getPassword() {
+ return mPasswordView.getText().toString();
+ }
+
+ /**
+ * Sets the listener that will be notified when the user submits the credentials.
+ */
+ public void setOkListener(OkListener okListener) {
+ mOkListener = okListener;
+ }
+
+ /**
+ * Sets the listener that will be notified when the user cancels the authentication
+ * dialog.
+ */
+ public void setCancelListener(CancelListener cancelListener) {
+ mCancelListener = cancelListener;
+ }
+
+ /**
+ * Shows the dialog.
+ */
+ public void show() {
+ mDialog.show();
+ mUsernameView.requestFocus();
+ }
+
+ /**
+ * Hides, recreates, and shows the dialog. This can be used to handle configuration changes.
+ */
+ public void reshow() {
+ String username = getUsername();
+ String password = getPassword();
+ int focusId = mDialog.getCurrentFocus().getId();
+ mDialog.dismiss();
+ createDialog();
+ mDialog.show();
+ if (username != null) {
+ mUsernameView.setText(username);
+ }
+ if (password != null) {
+ mPasswordView.setText(password);
+ }
+ if (focusId != 0) {
+ mDialog.findViewById(focusId).requestFocus();
+ } else {
+ mUsernameView.requestFocus();
+ }
+ }
+
+ private void createDialog() {
+ LayoutInflater factory = LayoutInflater.from(mContext);
+ View v = factory.inflate(R.layout.http_authentication, null);
+ mUsernameView = (TextView) v.findViewById(R.id.username_edit);
+ mPasswordView = (TextView) v.findViewById(R.id.password_edit);
+
+ String title = mContext.getText(R.string.sign_in_to).toString().replace(
+ "%s1", mHost).replace("%s2", mRealm);
+
+ mDialog = new AlertDialog.Builder(mContext)
+ .setTitle(title)
+ .setIcon(android.R.drawable.ic_dialog_alert)
+ .setView(v)
+ .setPositiveButton(R.string.action, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int whichButton) {
+ if (mOkListener != null) {
+ mOkListener.onOk(mHost, mRealm, getUsername(), getPassword());
+ }
+ }})
+ .setNegativeButton(R.string.cancel,new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int whichButton) {
+ if (mCancelListener != null) mCancelListener.onCancel();
+ }})
+ .setOnCancelListener(new DialogInterface.OnCancelListener() {
+ public void onCancel(DialogInterface dialog) {
+ if (mCancelListener != null) mCancelListener.onCancel();
+ }})
+ .create();
+
+ // Make the IME appear when the dialog is displayed if applicable.
+ mDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
+ }
+
+ /**
+ * Interface for listeners that are notified when the user submits the credentials.
+ */
+ public interface OkListener {
+ void onOk(String host, String realm, String username, String password);
+ }
+
+ /**
+ * Interface for listeners that are notified when the user cancels the dialog.
+ */
+ public interface CancelListener {
+ void onCancel();
+ }
+}
diff --git a/src/com/android/browser/IntentHandler.java b/src/com/android/browser/IntentHandler.java
new file mode 100644
index 0000000..040af81
--- /dev/null
+++ b/src/com/android/browser/IntentHandler.java
@@ -0,0 +1,371 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package com.android.browser;
+
+import com.android.browser.search.SearchEngine;
+import com.android.common.Search;
+import com.android.common.speech.LoggingEvents;
+
+import android.app.Activity;
+import android.app.SearchManager;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.provider.Browser;
+import android.provider.MediaStore;
+import android.speech.RecognizerResultsIntent;
+import android.text.TextUtils;
+import android.util.Patterns;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * Handle all browser related intents
+ */
+public class IntentHandler {
+
+ // "source" parameter for Google search suggested by the browser
+ final static String GOOGLE_SEARCH_SOURCE_SUGGEST = "browser-suggest";
+ // "source" parameter for Google search from unknown source
+ final static String GOOGLE_SEARCH_SOURCE_UNKNOWN = "unknown";
+
+ /* package */ static final UrlData EMPTY_URL_DATA = new UrlData(null);
+
+ private Activity mActivity;
+ private Controller mController;
+ private TabControl mTabControl;
+ private BrowserSettings mSettings;
+
+ public IntentHandler(Activity browser, Controller controller) {
+ mActivity = browser;
+ mController = controller;
+ mTabControl = mController.getTabControl();
+ mSettings = controller.getSettings();
+ }
+
+ void onNewIntent(Intent intent) {
+ Tab current = mTabControl.getCurrentTab();
+ // When a tab is closed on exit, the current tab index is set to -1.
+ // Reset before proceed as Browser requires the current tab to be set.
+ if (current == null) {
+ // Try to reset the tab in case the index was incorrect.
+ current = mTabControl.getTab(0);
+ if (current == null) {
+ // No tabs at all so just ignore this intent.
+ return;
+ }
+ mController.setActiveTab(current);
+ mController.resetTitleAndIcon(current);
+ }
+ final String action = intent.getAction();
+ final int flags = intent.getFlags();
+ if (Intent.ACTION_MAIN.equals(action) ||
+ (flags & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0) {
+ // just resume the browser
+ return;
+ }
+ // In case the SearchDialog is open.
+ ((SearchManager) mActivity.getSystemService(Context.SEARCH_SERVICE))
+ .stopSearch();
+ boolean activateVoiceSearch = RecognizerResultsIntent
+ .ACTION_VOICE_SEARCH_RESULTS.equals(action);
+ if (Intent.ACTION_VIEW.equals(action)
+ || Intent.ACTION_SEARCH.equals(action)
+ || MediaStore.INTENT_ACTION_MEDIA_SEARCH.equals(action)
+ || Intent.ACTION_WEB_SEARCH.equals(action)
+ || activateVoiceSearch) {
+ if (current.isInVoiceSearchMode()) {
+ String title = current.getVoiceDisplayTitle();
+ if (title != null && title.equals(intent.getStringExtra(
+ SearchManager.QUERY))) {
+ // The user submitted the same search as the last voice
+ // search, so do nothing.
+ return;
+ }
+ if (Intent.ACTION_SEARCH.equals(action)
+ && current.voiceSearchSourceIsGoogle()) {
+ Intent logIntent = new Intent(
+ LoggingEvents.ACTION_LOG_EVENT);
+ logIntent.putExtra(LoggingEvents.EXTRA_EVENT,
+ LoggingEvents.VoiceSearch.QUERY_UPDATED);
+ logIntent.putExtra(
+ LoggingEvents.VoiceSearch.EXTRA_QUERY_UPDATED_VALUE,
+ intent.getDataString());
+ mActivity.sendBroadcast(logIntent);
+ // Note, onPageStarted will revert the voice title bar
+ // When http://b/issue?id=2379215 is fixed, we should update
+ // the title bar here.
+ }
+ }
+ // If this was a search request (e.g. search query directly typed into the address bar),
+ // pass it on to the default web search provider.
+ if (handleWebSearchIntent(mActivity, mController, intent)) {
+ return;
+ }
+
+ UrlData urlData = getUrlDataFromIntent(intent);
+ if (urlData.isEmpty()) {
+ urlData = new UrlData(mSettings.getHomePage());
+ }
+
+ final String appId = intent
+ .getStringExtra(Browser.EXTRA_APPLICATION_ID);
+ if ((Intent.ACTION_VIEW.equals(action)
+ // If a voice search has no appId, it means that it came
+ // from the browser. In that case, reuse the current tab.
+ || (activateVoiceSearch && appId != null))
+ && !mActivity.getPackageName().equals(appId)
+ && (flags & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {
+ Tab appTab = mTabControl.getTabFromId(appId);
+ if (appTab != null) {
+ mController.reuseTab(appTab, appId, urlData);
+ return;
+ } else {
+ // No matching application tab, try to find a regular tab
+ // with a matching url.
+ appTab = mTabControl.findUnusedTabWithUrl(urlData.mUrl);
+ if (appTab != null) {
+ if (current != appTab) {
+ mController.switchToTab(mTabControl.getTabIndex(appTab));
+ }
+ // Otherwise, we are already viewing the correct tab.
+ } else {
+ // if FLAG_ACTIVITY_BROUGHT_TO_FRONT flag is on, the url
+ // will be opened in a new tab unless we have reached
+ // MAX_TABS. Then the url will be opened in the current
+ // tab. If a new tab is created, it will have "true" for
+ // exit on close.
+ mController.openTabAndShow(urlData, true, appId);
+ }
+ }
+ } else {
+ if (!urlData.isEmpty()
+ && urlData.mUrl.startsWith("about:debug")) {
+ if ("about:debug.dom".equals(urlData.mUrl)) {
+ current.getWebView().dumpDomTree(false);
+ } else if ("about:debug.dom.file".equals(urlData.mUrl)) {
+ current.getWebView().dumpDomTree(true);
+ } else if ("about:debug.render".equals(urlData.mUrl)) {
+ current.getWebView().dumpRenderTree(false);
+ } else if ("about:debug.render.file".equals(urlData.mUrl)) {
+ current.getWebView().dumpRenderTree(true);
+ } else if ("about:debug.display".equals(urlData.mUrl)) {
+ current.getWebView().dumpDisplayTree();
+ } else {
+ mSettings.toggleDebugSettings();
+ }
+ return;
+ }
+ // Get rid of the subwindow if it exists
+ mController.dismissSubWindow(current);
+ // If the current Tab is being used as an application tab,
+ // remove the association, since the new Intent means that it is
+ // no longer associated with that application.
+ current.setAppId(null);
+ mController.loadUrlDataIn(current, urlData);
+ }
+ }
+ }
+
+ protected UrlData getUrlDataFromIntent(Intent intent) {
+ String url = "";
+ Map<String, String> headers = null;
+ if (intent != null) {
+ final String action = intent.getAction();
+ if (Intent.ACTION_VIEW.equals(action)) {
+ url = UrlUtils.smartUrlFilter(intent.getData());
+ if (url != null && url.startsWith("content:")) {
+ /* Append mimetype so webview knows how to display */
+ String mimeType = intent.resolveType(mActivity.getContentResolver());
+ if (mimeType != null) {
+ url += "?" + mimeType;
+ }
+ }
+ if (url != null && url.startsWith("http")) {
+ final Bundle pairs = intent
+ .getBundleExtra(Browser.EXTRA_HEADERS);
+ if (pairs != null && !pairs.isEmpty()) {
+ Iterator<String> iter = pairs.keySet().iterator();
+ headers = new HashMap<String, String>();
+ while (iter.hasNext()) {
+ String key = iter.next();
+ headers.put(key, pairs.getString(key));
+ }
+ }
+ }
+ } else if (Intent.ACTION_SEARCH.equals(action)
+ || MediaStore.INTENT_ACTION_MEDIA_SEARCH.equals(action)
+ || Intent.ACTION_WEB_SEARCH.equals(action)) {
+ url = intent.getStringExtra(SearchManager.QUERY);
+ if (url != null) {
+ // In general, we shouldn't modify URL from Intent.
+ // But currently, we get the user-typed URL from search box as well.
+ url = UrlUtils.fixUrl(url);
+ url = UrlUtils.smartUrlFilter(url);
+ final ContentResolver cr = mActivity.getContentResolver();
+ final String newUrl = url;
+ if (mTabControl == null
+ || mTabControl.getCurrentWebView() == null
+ || !mTabControl.getCurrentWebView().isPrivateBrowsingEnabled()) {
+ new AsyncTask<Void, Void, Void>() {
+ @Override
+ protected Void doInBackground(Void... unused) {
+ Browser.updateVisitedHistory(cr, newUrl, false);
+ return null;
+ }
+ }.execute();
+ }
+ String searchSource = "&source=android-" + GOOGLE_SEARCH_SOURCE_SUGGEST + "&";
+ if (url.contains(searchSource)) {
+ String source = null;
+ final Bundle appData = intent.getBundleExtra(SearchManager.APP_DATA);
+ if (appData != null) {
+ source = appData.getString(Search.SOURCE);
+ }
+ if (TextUtils.isEmpty(source)) {
+ source = GOOGLE_SEARCH_SOURCE_UNKNOWN;
+ }
+ url = url.replace(searchSource, "&source=android-"+source+"&");
+ }
+ }
+ }
+ }
+ return new UrlData(url, headers, intent);
+ }
+
+ /**
+ * Launches the default web search activity with the query parameters if the given intent's data
+ * are identified as plain search terms and not URLs/shortcuts.
+ * @return true if the intent was handled and web search activity was launched, false if not.
+ */
+ static boolean handleWebSearchIntent(Activity activity,
+ Controller controller, Intent intent) {
+ if (intent == null) return false;
+
+ String url = null;
+ final String action = intent.getAction();
+ if (RecognizerResultsIntent.ACTION_VOICE_SEARCH_RESULTS.equals(
+ action)) {
+ return false;
+ }
+ if (Intent.ACTION_VIEW.equals(action)) {
+ Uri data = intent.getData();
+ if (data != null) url = data.toString();
+ } else if (Intent.ACTION_SEARCH.equals(action)
+ || MediaStore.INTENT_ACTION_MEDIA_SEARCH.equals(action)
+ || Intent.ACTION_WEB_SEARCH.equals(action)) {
+ url = intent.getStringExtra(SearchManager.QUERY);
+ }
+ return handleWebSearchRequest(activity, controller, url,
+ intent.getBundleExtra(SearchManager.APP_DATA),
+ intent.getStringExtra(SearchManager.EXTRA_DATA_KEY));
+ }
+
+ /**
+ * Launches the default web search activity with the query parameters if the given url string
+ * was identified as plain search terms and not URL/shortcut.
+ * @return true if the request was handled and web search activity was launched, false if not.
+ */
+ private static boolean handleWebSearchRequest(Activity activity,
+ Controller controller, String inUrl, Bundle appData,
+ String extraData) {
+ if (inUrl == null) return false;
+
+ // In general, we shouldn't modify URL from Intent.
+ // But currently, we get the user-typed URL from search box as well.
+ String url = UrlUtils.fixUrl(inUrl).trim();
+
+ // URLs are handled by the regular flow of control, so
+ // return early.
+ if (Patterns.WEB_URL.matcher(url).matches()
+ || UrlUtils.ACCEPTED_URI_SCHEMA.matcher(url).matches()) {
+ return false;
+ }
+
+ final ContentResolver cr = activity.getContentResolver();
+ final String newUrl = url;
+ if (controller == null || controller.getTabControl() == null
+ || controller.getTabControl().getCurrentWebView() == null
+ || !controller.getTabControl().getCurrentWebView()
+ .isPrivateBrowsingEnabled()) {
+ new AsyncTask<Void, Void, Void>() {
+ @Override
+ protected Void doInBackground(Void... unused) {
+ Browser.updateVisitedHistory(cr, newUrl, false);
+ Browser.addSearchUrl(cr, newUrl);
+ return null;
+ }
+ }.execute();
+ }
+
+ SearchEngine searchEngine = BrowserSettings.getInstance().getSearchEngine();
+ if (searchEngine == null) return false;
+ searchEngine.startSearch(activity, url, appData, extraData);
+
+ return true;
+ }
+
+ /**
+ * A UrlData class to abstract how the content will be set to WebView.
+ * This base class uses loadUrl to show the content.
+ */
+ static class UrlData {
+ final String mUrl;
+ final Map<String, String> mHeaders;
+ final Intent mVoiceIntent;
+
+ UrlData(String url) {
+ this.mUrl = url;
+ this.mHeaders = null;
+ this.mVoiceIntent = null;
+ }
+
+ UrlData(String url, Map<String, String> headers, Intent intent) {
+ this.mUrl = url;
+ this.mHeaders = headers;
+ if (RecognizerResultsIntent.ACTION_VOICE_SEARCH_RESULTS
+ .equals(intent.getAction())) {
+ this.mVoiceIntent = intent;
+ } else {
+ this.mVoiceIntent = null;
+ }
+ }
+
+ boolean isEmpty() {
+ return mVoiceIntent == null && (mUrl == null || mUrl.length() == 0);
+ }
+
+ /**
+ * Load this UrlData into the given Tab. Use loadUrlDataIn to update
+ * the title bar as well.
+ */
+ public void loadIn(Tab t) {
+ if (mVoiceIntent != null) {
+ t.activateVoiceSearchMode(mVoiceIntent);
+ } else {
+ t.getWebView().loadUrl(mUrl, mHeaders);
+ }
+ }
+ }
+
+}
diff --git a/src/com/android/browser/MeshTracker.java b/src/com/android/browser/MeshTracker.java
deleted file mode 100644
index c4b6332..0000000
--- a/src/com/android/browser/MeshTracker.java
+++ /dev/null
@@ -1,198 +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.graphics.Bitmap;
-import android.graphics.utils.BoundaryPatch;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.webkit.WebView;
-
-/*package*/ class MeshTracker extends WebView.DragTracker {
-
- private static class Mesh {
- private int mWhich;
- private int mRows;
- private int mCols;
- private BoundaryPatch mPatch = new BoundaryPatch();
- private float[] mCubics = new float[24];
- private float[] mOrig = new float[24];
- private float mStretchX, mStretchY;
-
- Mesh(int which, int rows, int cols) {
- mWhich = which;
- mRows = rows;
- mCols = cols;
- }
-
- private void rebuildPatch() {
- mPatch.setCubicBoundary(mCubics, 0, mRows, mCols);
- }
-
- private void setSize(float w, float h) {
- float[] pts = mCubics;
- float x1 = w*0.3333f;
- float y1 = h*0.3333f;
- float x2 = w*0.6667f;
- float y2 = h*0.6667f;
- pts[0*2+0] = 0; pts[0*2+1] = 0;
- pts[1*2+0] = x1; pts[1*2+1] = 0;
- pts[2*2+0] = x2; pts[2*2+1] = 0;
-
- pts[3*2+0] = w; pts[3*2+1] = 0;
- pts[4*2+0] = w; pts[4*2+1] = y1;
- pts[5*2+0] = w; pts[5*2+1] = y2;
-
- pts[6*2+0] = w; pts[6*2+1] = h;
- pts[7*2+0] = x2; pts[7*2+1] = h;
- pts[8*2+0] = x1; pts[8*2+1] = h;
-
- pts[9*2+0] = 0; pts[9*2+1] = h;
- pts[10*2+0] = 0; pts[10*2+1] = y2;
- pts[11*2+0] = 0; pts[11*2+1] = y1;
-
- System.arraycopy(pts, 0, mOrig, 0, 24);
-
- // recall our stretcher
- setStretch(mStretchX, mStretchY);
- }
-
- public void setBitmap(Bitmap bm) {
- mPatch.setTexture(bm);
- setSize(bm.getWidth(), bm.getHeight());
- }
-
- // first experimental behavior
- private void doit1(float dx, float dy) {
- final float scale = 0.75f; // temper how far we actually move
- dx *= scale;
- dy *= scale;
-
- int index;
- if (dx < 0) {
- index = 10;
- } else {
- index = 4;
- }
- mCubics[index*2 + 0] = mOrig[index*2 + 0] + dx;
- mCubics[index*2 + 2] = mOrig[index*2 + 2] + dx;
-
- if (dy < 0) {
- index = 1;
- } else {
- index = 7;
- }
- mCubics[index*2 + 1] = mOrig[index*2 + 1] + dy;
- mCubics[index*2 + 3] = mOrig[index*2 + 3] + dy;
- }
-
- private void doit2(float dx, float dy) {
- final float scale = 0.35f; // temper how far we actually move
- dx *= scale;
- dy *= scale;
- final float cornerScale = 0.25f;
-
- int index;
- if (dx < 0) {
- index = 4;
- } else {
- index = 10;
- }
- mCubics[index*2 + 0] = mOrig[index*2 + 0] + dx;
- mCubics[index*2 + 2] = mOrig[index*2 + 2] + dx;
- // corners
- index -= 1;
- mCubics[index*2 + 0] = mOrig[index*2 + 0] + dx * cornerScale;
- index = (index + 3) % 12; // next corner
- mCubics[index*2 + 0] = mOrig[index*2 + 0] + dx * cornerScale;
-
- if (dy < 0) {
- index = 7;
- } else {
- index = 1;
- }
- mCubics[index*2 + 1] = mOrig[index*2 + 1] + dy;
- mCubics[index*2 + 3] = mOrig[index*2 + 3] + dy;
- // corners
- index -= 1;
- mCubics[index*2 + 1] = mOrig[index*2 + 1] + dy * cornerScale;
- index = (index + 3) % 12; // next corner
- mCubics[index*2 + 1] = mOrig[index*2 + 1] + dy * cornerScale;
- }
-
- public void setStretch(float dx, float dy) {
- mStretchX = dx;
- mStretchY = dy;
- switch (mWhich) {
- case 1:
- doit1(dx, dy);
- break;
- case 2:
- doit2(dx, dy);
- break;
- }
- rebuildPatch();
- }
-
- public void draw(Canvas canvas) {
- mPatch.draw(canvas);
- }
- }
-
- private Mesh mMesh;
- private Bitmap mBitmap;
- private int mWhich;
- private Paint mBGPaint;
-
- public MeshTracker(int which) {
- mWhich = which;
- }
-
- public void setBGPaint(Paint paint) {
- mBGPaint = paint;
- }
-
- @Override public void onStartDrag(float x, float y) {
- mMesh = new Mesh(mWhich, 16, 16);
- }
-
- @Override public void onBitmapChange(Bitmap bm) {
- mBitmap = bm;
- mMesh.setBitmap(bm);
- }
-
- @Override public boolean onStretchChange(float sx, float sy) {
- mMesh.setStretch(-sx, -sy);
- return true;
- }
-
- @Override public void onStopDrag() {
- mMesh = null;
- }
-
- @Override public void onDraw(Canvas canvas) {
- if (mWhich == 2) {
- if (mBGPaint != null) {
- canvas.drawPaint(mBGPaint);
- } else {
- canvas.drawColor(0xFF000000);
- }
- }
- mMesh.draw(canvas);
- }
-}
-
diff --git a/src/com/android/browser/NetworkStateHandler.java b/src/com/android/browser/NetworkStateHandler.java
new file mode 100644
index 0000000..3b2007e
--- /dev/null
+++ b/src/com/android/browser/NetworkStateHandler.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+import android.webkit.WebView;
+
+/**
+ * Handle network state changes
+ */
+public class NetworkStateHandler {
+
+ Activity mActivity;
+ Controller mController;
+
+ // monitor platform changes
+ private IntentFilter mNetworkStateChangedFilter;
+ private BroadcastReceiver mNetworkStateIntentReceiver;
+ private boolean mIsNetworkUp;
+
+ /* hold a ref so we can auto-cancel if necessary */
+ private AlertDialog mAlertDialog;
+
+ public NetworkStateHandler(Activity activity, Controller controller) {
+ mActivity = activity;
+ mController = controller;
+ // Find out if the network is currently up.
+ ConnectivityManager cm = (ConnectivityManager) mActivity
+ .getSystemService(Context.CONNECTIVITY_SERVICE);
+ NetworkInfo info = cm.getActiveNetworkInfo();
+ if (info != null) {
+ mIsNetworkUp = info.isAvailable();
+ }
+
+ /*
+ * enables registration for changes in network status from http stack
+ */
+ mNetworkStateChangedFilter = new IntentFilter();
+ mNetworkStateChangedFilter.addAction(
+ ConnectivityManager.CONNECTIVITY_ACTION);
+ mNetworkStateIntentReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (intent.getAction().equals(
+ ConnectivityManager.CONNECTIVITY_ACTION)) {
+
+ NetworkInfo info = intent.getParcelableExtra(
+ ConnectivityManager.EXTRA_NETWORK_INFO);
+ String typeName = info.getTypeName();
+ String subtypeName = info.getSubtypeName();
+ sendNetworkType(typeName.toLowerCase(),
+ (subtypeName != null ? subtypeName.toLowerCase() : ""));
+
+ onNetworkToggle(info.isAvailable());
+ }
+ }
+ };
+
+ }
+
+ void onPause() {
+ // unregister network state listener
+ mActivity.unregisterReceiver(mNetworkStateIntentReceiver);
+ }
+
+ void onResume() {
+ mActivity.registerReceiver(mNetworkStateIntentReceiver,
+ mNetworkStateChangedFilter);
+ }
+
+ /**
+ * connectivity manager says net has come or gone... inform the user
+ * @param up true if net has come up, false if net has gone down
+ */
+ void onNetworkToggle(boolean up) {
+ if (up == mIsNetworkUp) {
+ return;
+ } else if (up) {
+ mIsNetworkUp = true;
+ if (mAlertDialog != null) {
+ mAlertDialog.cancel();
+ mAlertDialog = null;
+ }
+ } else {
+ mIsNetworkUp = false;
+ if (mController.isInLoad()) {
+ createAndShowNetworkDialog();
+ }
+ }
+ WebView w = mController.getCurrentWebView();
+ if (w != null) {
+ w.setNetworkAvailable(up);
+ }
+ }
+
+ boolean isNetworkUp() {
+ return mIsNetworkUp;
+ }
+
+ // This method shows the network dialog alerting the user that the net is
+ // down. It will only show the dialog if mAlertDialog is null.
+ void createAndShowNetworkDialog() {
+ if (mAlertDialog == null) {
+ mAlertDialog = new AlertDialog.Builder(mActivity)
+ .setTitle(R.string.loadSuspendedTitle)
+ .setMessage(R.string.loadSuspended)
+ .setPositiveButton(R.string.ok, null)
+ .show();
+ }
+ }
+
+ private void sendNetworkType(String type, String subtype) {
+ WebView w = mController.getCurrentWebView();
+ if (w != null) {
+ w.setNetworkType(type, subtype);
+ }
+ }
+
+}
diff --git a/src/com/android/browser/OpenDownloadReceiver.java b/src/com/android/browser/OpenDownloadReceiver.java
index 99e5f41..4277ff4 100644
--- a/src/com/android/browser/OpenDownloadReceiver.java
+++ b/src/com/android/browser/OpenDownloadReceiver.java
@@ -19,15 +19,11 @@
import android.app.DownloadManager;
import android.content.ActivityNotFoundException;
import android.content.BroadcastReceiver;
-import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
-import android.database.Cursor;
import android.net.Uri;
-import android.provider.Downloads;
-import android.widget.Toast;
-
-import java.io.File;
+import android.os.Handler;
+import android.os.HandlerThread;
/**
* This {@link BroadcastReceiver} handles clicks to notifications that
@@ -36,49 +32,63 @@
* a complete, successful download will open the file.
*/
public class OpenDownloadReceiver extends BroadcastReceiver {
- public void onReceive(Context context, Intent intent) {
- ContentResolver cr = context.getContentResolver();
- Uri data = intent.getData();
- Cursor cursor = null;
- try {
- cursor = cr.query(data,
- new String[] { Downloads.Impl._ID, Downloads.Impl._DATA,
- Downloads.Impl.COLUMN_MIME_TYPE, Downloads.COLUMN_STATUS },
- null, null, null);
- if (cursor.moveToFirst()) {
- String filename = cursor.getString(1);
- String mimetype = cursor.getString(2);
- String action = intent.getAction();
- if (Downloads.ACTION_NOTIFICATION_CLICKED.equals(action)) {
- int status = cursor.getInt(3);
- if (Downloads.isStatusCompleted(status)
- && Downloads.isStatusSuccess(status)) {
- Intent launchIntent = new Intent(Intent.ACTION_VIEW);
- Uri path = Uri.parse(filename);
- // If there is no scheme, then it must be a file
- if (path.getScheme() == null) {
- path = Uri.fromFile(new File(filename));
- }
- launchIntent.setDataAndType(path, mimetype);
- launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- try {
- context.startActivity(launchIntent);
- } catch (ActivityNotFoundException ex) {
- Toast.makeText(context,
- R.string.download_no_application_title,
- Toast.LENGTH_LONG).show();
- }
- } else {
- // Open the downloads page
- Intent pageView = new Intent(
- DownloadManager.ACTION_VIEW_DOWNLOADS);
- pageView.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- context.startActivity(pageView);
- }
- }
- }
- } finally {
- if (cursor != null) cursor.close();
+ private static Handler sAsyncHandler;
+ static {
+ HandlerThread thr = new HandlerThread("Open browser download async");
+ thr.start();
+ sAsyncHandler = new Handler(thr.getLooper());
+ }
+ @Override
+ public void onReceive(final Context context, Intent intent) {
+ String action = intent.getAction();
+ if (!DownloadManager.ACTION_NOTIFICATION_CLICKED.equals(action)) {
+ openDownloadsPage(context);
+ return;
}
+ long ids[] = intent.getLongArrayExtra(
+ DownloadManager.EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS);
+ if (ids == null || ids.length == 0) {
+ openDownloadsPage(context);
+ return;
+ }
+ final long id = ids[0];
+ final PendingResult result = goAsync();
+ Runnable worker = new Runnable() {
+ @Override
+ public void run() {
+ onReceiveAsync(context, id);
+ result.finish();
+ }
+ };
+ sAsyncHandler.post(worker);
+ }
+
+ private void onReceiveAsync(Context context, long id) {
+ DownloadManager manager = (DownloadManager) context.getSystemService(
+ Context.DOWNLOAD_SERVICE);
+ Uri uri = manager.getUriForDownloadedFile(id);
+ if (uri == null) {
+ // Open the downloads page
+ openDownloadsPage(context);
+ } else {
+ Intent launchIntent = new Intent(Intent.ACTION_VIEW);
+ launchIntent.setDataAndType(uri, manager.getMimeTypeForDownloadedFile(id));
+ launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ try {
+ context.startActivity(launchIntent);
+ } catch (ActivityNotFoundException e) {
+ openDownloadsPage(context);
+ }
+ }
+ }
+
+ /**
+ * Open the Activity which shows a list of all downloads.
+ * @param context
+ */
+ private void openDownloadsPage(Context context) {
+ Intent pageView = new Intent(DownloadManager.ACTION_VIEW_DOWNLOADS);
+ pageView.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ context.startActivity(pageView);
}
}
diff --git a/src/com/android/browser/PageDialogsHandler.java b/src/com/android/browser/PageDialogsHandler.java
new file mode 100644
index 0000000..6843a10
--- /dev/null
+++ b/src/com/android/browser/PageDialogsHandler.java
@@ -0,0 +1,465 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.res.Configuration;
+import android.net.http.SslCertificate;
+import android.net.http.SslError;
+import android.text.format.DateFormat;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.webkit.HttpAuthHandler;
+import android.webkit.SslErrorHandler;
+import android.webkit.WebView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import java.util.Date;
+
+/**
+ * Displays page info
+ *
+ */
+public class PageDialogsHandler {
+
+ private Context mContext;
+ private Controller mController;
+ private boolean mPageInfoFromShowSSLCertificateOnError;
+ private Tab mPageInfoView;
+ private AlertDialog mPageInfoDialog;
+
+ // as SSLCertificateOnError has different style for landscape / portrait,
+ // we have to re-open it when configuration changed
+ private AlertDialog mSSLCertificateOnErrorDialog;
+ private WebView mSSLCertificateOnErrorView;
+ private SslErrorHandler mSSLCertificateOnErrorHandler;
+ private SslError mSSLCertificateOnErrorError;
+
+ // as SSLCertificate has different style for landscape / portrait, we
+ // have to re-open it when configuration changed
+ private AlertDialog mSSLCertificateDialog;
+ private Tab mSSLCertificateView;
+ private HttpAuthenticationDialog mHttpAuthenticationDialog;
+
+ public PageDialogsHandler(Context context, Controller controller) {
+ mContext = context;
+ mController = controller;
+ }
+
+ public void onConfigurationChanged(Configuration config) {
+ if (mPageInfoDialog != null) {
+ mPageInfoDialog.dismiss();
+ showPageInfo(mPageInfoView, mPageInfoFromShowSSLCertificateOnError);
+ }
+ if (mSSLCertificateDialog != null) {
+ mSSLCertificateDialog.dismiss();
+ showSSLCertificate(mSSLCertificateView);
+ }
+ if (mSSLCertificateOnErrorDialog != null) {
+ mSSLCertificateOnErrorDialog.dismiss();
+ showSSLCertificateOnError(mSSLCertificateOnErrorView, mSSLCertificateOnErrorHandler,
+ mSSLCertificateOnErrorError);
+ }
+ if (mHttpAuthenticationDialog != null) {
+ mHttpAuthenticationDialog.reshow();
+ }
+ }
+
+ /**
+ * Displays an http-authentication dialog.
+ */
+ void showHttpAuthentication(final Tab tab, final HttpAuthHandler handler, String host, String realm) {
+ mHttpAuthenticationDialog = new HttpAuthenticationDialog(mContext, host, realm);
+ mHttpAuthenticationDialog.setOkListener(new HttpAuthenticationDialog.OkListener() {
+ public void onOk(String host, String realm, String username, String password) {
+ setHttpAuthUsernamePassword(host, realm, username, password);
+ handler.proceed(username, password);
+ mHttpAuthenticationDialog = null;
+ }
+ });
+ mHttpAuthenticationDialog.setCancelListener(new HttpAuthenticationDialog.CancelListener() {
+ public void onCancel() {
+ handler.cancel();
+ mController.resetTitleAndRevertLockIcon(tab);
+ mHttpAuthenticationDialog = null;
+ }
+ });
+ mHttpAuthenticationDialog.show();
+ }
+
+ /**
+ * Set HTTP authentication password.
+ *
+ * @param host The host for the password
+ * @param realm The realm for the password
+ * @param username The username for the password. If it is null, it means
+ * password can't be saved.
+ * @param password The password
+ */
+ public void setHttpAuthUsernamePassword(String host, String realm,
+ String username,
+ String password) {
+ WebView w = mController.getCurrentTopWebView();
+ if (w != null) {
+ w.setHttpAuthUsernamePassword(host, realm, username, password);
+ }
+ }
+
+ /**
+ * Displays a page-info dialog.
+ * @param tab The tab to show info about
+ * @param fromShowSSLCertificateOnError The flag that indicates whether
+ * this dialog was opened from the SSL-certificate-on-error dialog or
+ * not. This is important, since we need to know whether to return to
+ * the parent dialog or simply dismiss.
+ */
+ void showPageInfo(final Tab tab,
+ final boolean fromShowSSLCertificateOnError) {
+ final LayoutInflater factory = LayoutInflater.from(mContext);
+
+ final View pageInfoView = factory.inflate(R.layout.page_info, null);
+
+ final WebView view = tab.getWebView();
+
+ String url = null;
+ String title = null;
+
+ if (view == null) {
+ url = tab.getUrl();
+ title = tab.getTitle();
+ } else if (view == mController.getCurrentWebView()) {
+ // Use the cached title and url if this is the current WebView
+ url = tab.getCurrentUrl();
+ title = tab.getCurrentTitle();
+ } else {
+ url = view.getUrl();
+ title = view.getTitle();
+ }
+
+ if (url == null) {
+ url = "";
+ }
+ if (title == null) {
+ title = "";
+ }
+
+ ((TextView) pageInfoView.findViewById(R.id.address)).setText(url);
+ ((TextView) pageInfoView.findViewById(R.id.title)).setText(title);
+
+ mPageInfoView = tab;
+ mPageInfoFromShowSSLCertificateOnError = fromShowSSLCertificateOnError;
+
+ AlertDialog.Builder alertDialogBuilder =
+ new AlertDialog.Builder(mContext)
+ .setTitle(R.string.page_info)
+ .setIcon(android.R.drawable.ic_dialog_info)
+ .setView(pageInfoView)
+ .setPositiveButton(
+ R.string.ok,
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog,
+ int whichButton) {
+ mPageInfoDialog = null;
+ mPageInfoView = null;
+
+ // if we came here from the SSL error dialog
+ if (fromShowSSLCertificateOnError) {
+ // go back to the SSL error dialog
+ showSSLCertificateOnError(
+ mSSLCertificateOnErrorView,
+ mSSLCertificateOnErrorHandler,
+ mSSLCertificateOnErrorError);
+ }
+ }
+ })
+ .setOnCancelListener(
+ new DialogInterface.OnCancelListener() {
+ public void onCancel(DialogInterface dialog) {
+ mPageInfoDialog = null;
+ mPageInfoView = null;
+
+ // if we came here from the SSL error dialog
+ if (fromShowSSLCertificateOnError) {
+ // go back to the SSL error dialog
+ showSSLCertificateOnError(
+ mSSLCertificateOnErrorView,
+ mSSLCertificateOnErrorHandler,
+ mSSLCertificateOnErrorError);
+ }
+ }
+ });
+
+ // if we have a main top-level page SSL certificate set or a certificate
+ // error
+ if (fromShowSSLCertificateOnError ||
+ (view != null && view.getCertificate() != null)) {
+ // add a 'View Certificate' button
+ alertDialogBuilder.setNeutralButton(
+ R.string.view_certificate,
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog,
+ int whichButton) {
+ mPageInfoDialog = null;
+ mPageInfoView = null;
+
+ // if we came here from the SSL error dialog
+ if (fromShowSSLCertificateOnError) {
+ // go back to the SSL error dialog
+ showSSLCertificateOnError(
+ mSSLCertificateOnErrorView,
+ mSSLCertificateOnErrorHandler,
+ mSSLCertificateOnErrorError);
+ } else {
+ // otherwise, display the top-most certificate from
+ // the chain
+ if (view.getCertificate() != null) {
+ showSSLCertificate(tab);
+ }
+ }
+ }
+ });
+ }
+
+ mPageInfoDialog = alertDialogBuilder.show();
+ }
+
+ /**
+ * Displays the main top-level page SSL certificate dialog
+ * (accessible from the Page-Info dialog).
+ * @param tab The tab to show certificate for.
+ */
+ private void showSSLCertificate(final Tab tab) {
+ final View certificateView =
+ inflateCertificateView(tab.getWebView().getCertificate());
+ if (certificateView == null) {
+ return;
+ }
+
+ LayoutInflater factory = LayoutInflater.from(mContext);
+
+ final LinearLayout placeholder =
+ (LinearLayout)certificateView.findViewById(R.id.placeholder);
+
+ LinearLayout ll = (LinearLayout) factory.inflate(
+ R.layout.ssl_success, placeholder);
+ ((TextView)ll.findViewById(R.id.success))
+ .setText(R.string.ssl_certificate_is_valid);
+
+ mSSLCertificateView = tab;
+ mSSLCertificateDialog =
+ new AlertDialog.Builder(mContext)
+ .setTitle(R.string.ssl_certificate).setIcon(
+ R.drawable.ic_dialog_browser_certificate_secure)
+ .setView(certificateView)
+ .setPositiveButton(R.string.ok,
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog,
+ int whichButton) {
+ mSSLCertificateDialog = null;
+ mSSLCertificateView = null;
+
+ showPageInfo(tab, false);
+ }
+ })
+ .setOnCancelListener(
+ new DialogInterface.OnCancelListener() {
+ public void onCancel(DialogInterface dialog) {
+ mSSLCertificateDialog = null;
+ mSSLCertificateView = null;
+
+ showPageInfo(tab, false);
+ }
+ })
+ .show();
+ }
+
+ /**
+ * Displays the SSL error certificate dialog.
+ * @param view The target web-view.
+ * @param handler The SSL error handler responsible for cancelling the
+ * connection that resulted in an SSL error or proceeding per user request.
+ * @param error The SSL error object.
+ */
+ void showSSLCertificateOnError(
+ final WebView view, final SslErrorHandler handler,
+ final SslError error) {
+
+ final View certificateView =
+ inflateCertificateView(error.getCertificate());
+ if (certificateView == null) {
+ return;
+ }
+
+ LayoutInflater factory = LayoutInflater.from(mContext);
+
+ final LinearLayout placeholder =
+ (LinearLayout)certificateView.findViewById(R.id.placeholder);
+
+ if (error.hasError(SslError.SSL_UNTRUSTED)) {
+ LinearLayout ll = (LinearLayout)factory
+ .inflate(R.layout.ssl_warning, placeholder);
+ ((TextView)ll.findViewById(R.id.warning))
+ .setText(R.string.ssl_untrusted);
+ }
+
+ if (error.hasError(SslError.SSL_IDMISMATCH)) {
+ LinearLayout ll = (LinearLayout)factory
+ .inflate(R.layout.ssl_warning, placeholder);
+ ((TextView)ll.findViewById(R.id.warning))
+ .setText(R.string.ssl_mismatch);
+ }
+
+ if (error.hasError(SslError.SSL_EXPIRED)) {
+ LinearLayout ll = (LinearLayout)factory
+ .inflate(R.layout.ssl_warning, placeholder);
+ ((TextView)ll.findViewById(R.id.warning))
+ .setText(R.string.ssl_expired);
+ }
+
+ if (error.hasError(SslError.SSL_NOTYETVALID)) {
+ LinearLayout ll = (LinearLayout)factory
+ .inflate(R.layout.ssl_warning, placeholder);
+ ((TextView)ll.findViewById(R.id.warning))
+ .setText(R.string.ssl_not_yet_valid);
+ }
+
+ mSSLCertificateOnErrorHandler = handler;
+ mSSLCertificateOnErrorView = view;
+ mSSLCertificateOnErrorError = error;
+ mSSLCertificateOnErrorDialog =
+ new AlertDialog.Builder(mContext)
+ .setTitle(R.string.ssl_certificate).setIcon(
+ R.drawable.ic_dialog_browser_certificate_partially_secure)
+ .setView(certificateView)
+ .setPositiveButton(R.string.ok,
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog,
+ int whichButton) {
+ mSSLCertificateOnErrorDialog = null;
+ mSSLCertificateOnErrorView = null;
+ mSSLCertificateOnErrorHandler = null;
+ mSSLCertificateOnErrorError = null;
+
+ view.getWebViewClient().onReceivedSslError(
+ view, handler, error);
+ }
+ })
+ .setNeutralButton(R.string.page_info_view,
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog,
+ int whichButton) {
+ mSSLCertificateOnErrorDialog = null;
+
+ // do not clear the dialog state: we will
+ // need to show the dialog again once the
+ // user is done exploring the page-info details
+
+ showPageInfo(mController.getTabControl()
+ .getTabFromView(view),
+ true);
+ }
+ })
+ .setOnCancelListener(
+ new DialogInterface.OnCancelListener() {
+ public void onCancel(DialogInterface dialog) {
+ mSSLCertificateOnErrorDialog = null;
+ mSSLCertificateOnErrorView = null;
+ mSSLCertificateOnErrorHandler = null;
+ mSSLCertificateOnErrorError = null;
+
+ view.getWebViewClient().onReceivedSslError(
+ view, handler, error);
+ }
+ })
+ .show();
+ }
+
+ /**
+ * Inflates the SSL certificate view (helper method).
+ * @param certificate The SSL certificate.
+ * @return The resultant certificate view with issued-to, issued-by,
+ * issued-on, expires-on, and possibly other fields set.
+ * If the input certificate is null, returns null.
+ */
+ private View inflateCertificateView(SslCertificate certificate) {
+ if (certificate == null) {
+ return null;
+ }
+
+ LayoutInflater factory = LayoutInflater.from(mContext);
+
+ View certificateView = factory.inflate(
+ R.layout.ssl_certificate, null);
+
+ // issued to:
+ SslCertificate.DName issuedTo = certificate.getIssuedTo();
+ if (issuedTo != null) {
+ ((TextView) certificateView.findViewById(R.id.to_common))
+ .setText(issuedTo.getCName());
+ ((TextView) certificateView.findViewById(R.id.to_org))
+ .setText(issuedTo.getOName());
+ ((TextView) certificateView.findViewById(R.id.to_org_unit))
+ .setText(issuedTo.getUName());
+ }
+
+ // issued by:
+ SslCertificate.DName issuedBy = certificate.getIssuedBy();
+ if (issuedBy != null) {
+ ((TextView) certificateView.findViewById(R.id.by_common))
+ .setText(issuedBy.getCName());
+ ((TextView) certificateView.findViewById(R.id.by_org))
+ .setText(issuedBy.getOName());
+ ((TextView) certificateView.findViewById(R.id.by_org_unit))
+ .setText(issuedBy.getUName());
+ }
+
+ // issued on:
+ String issuedOn = formatCertificateDate(
+ certificate.getValidNotBeforeDate());
+ ((TextView) certificateView.findViewById(R.id.issued_on))
+ .setText(issuedOn);
+
+ // expires on:
+ String expiresOn = formatCertificateDate(
+ certificate.getValidNotAfterDate());
+ ((TextView) certificateView.findViewById(R.id.expires_on))
+ .setText(expiresOn);
+
+ return certificateView;
+ }
+
+ /**
+ * Formats the certificate date to a properly localized date string.
+ * @return Properly localized version of the certificate date string and
+ * the "" if it fails to localize.
+ */
+ private String formatCertificateDate(Date certificateDate) {
+ if (certificateDate == null) {
+ return "";
+ }
+ String formattedDate = DateFormat.getDateFormat(mContext)
+ .format(certificateDate);
+ if (formattedDate == null) {
+ return "";
+ }
+ return formattedDate;
+ }
+
+}
diff --git a/src/com/android/browser/PageProgressView.java b/src/com/android/browser/PageProgressView.java
new file mode 100644
index 0000000..f512cef
--- /dev/null
+++ b/src/com/android/browser/PageProgressView.java
@@ -0,0 +1,117 @@
+
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.browser;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.os.Handler;
+import android.os.Message;
+import android.util.AttributeSet;
+import android.widget.ImageView;
+
+/**
+ *
+ */
+public class PageProgressView extends ImageView {
+
+ public static final int MAX_PROGRESS = 10000;
+ private static final int MSG_UPDATE = 42;
+ private static final int STEPS = 10;
+ private static final int DELAY = 40;
+
+ private int mCurrentProgress;
+ private int mTargetProgress;
+ private int mIncrement;
+ private Rect mBounds;
+ private Handler mHandler;
+
+ /**
+ * @param context
+ * @param attrs
+ * @param defStyle
+ */
+ public PageProgressView(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ init(context);
+ }
+
+ /**
+ * @param context
+ * @param attrs
+ */
+ public PageProgressView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ init(context);
+ }
+
+ /**
+ * @param context
+ */
+ public PageProgressView(Context context) {
+ super(context);
+ init(context);
+ }
+
+ private void init(Context ctx) {
+ mBounds = new Rect(0,0,0,0);
+ mCurrentProgress = 0;
+ mTargetProgress = 0;
+ mHandler = new Handler() {
+
+ @Override
+ public void handleMessage(Message msg) {
+ if (msg.what == MSG_UPDATE) {
+ mCurrentProgress = Math.min(mTargetProgress,
+ mCurrentProgress + mIncrement);
+ mBounds.right = getWidth() * mCurrentProgress / MAX_PROGRESS;
+ invalidate();
+ if (mCurrentProgress < mTargetProgress) {
+ sendMessageDelayed(mHandler.obtainMessage(MSG_UPDATE), DELAY);
+ }
+ }
+ }
+
+ };
+ }
+
+ @Override
+ public void onLayout(boolean f, int l, int t, int r, int b) {
+ mBounds.left = 0;
+ mBounds.right = (r - l) * mCurrentProgress / MAX_PROGRESS;
+ mBounds.top = 0;
+ mBounds.bottom = b-t;
+ }
+
+ void setProgress(int progress) {
+ mCurrentProgress = mTargetProgress;
+ mTargetProgress = progress;
+ mIncrement = (mTargetProgress - mCurrentProgress) / STEPS;
+ mHandler.removeMessages(MSG_UPDATE);
+ mHandler.sendEmptyMessage(MSG_UPDATE);
+ }
+
+ @Override
+ public void onDraw(Canvas canvas) {
+// super.onDraw(canvas);
+ Drawable d = getDrawable();
+ d.setBounds(mBounds);
+ d.draw(canvas);
+ }
+
+}
diff --git a/src/com/android/browser/Performance.java b/src/com/android/browser/Performance.java
new file mode 100644
index 0000000..e9ddfa2
--- /dev/null
+++ b/src/com/android/browser/Performance.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import android.net.WebAddress;
+import android.os.Debug;
+import android.os.Process;
+import android.os.SystemClock;
+import android.util.Log;
+
+/**
+ * Performance analysis
+ */
+public class Performance {
+
+ private static final String LOGTAG = "browser";
+
+ private final static boolean LOGD_ENABLED =
+ com.android.browser.Browser.LOGD_ENABLED;
+
+ private static boolean mInTrace;
+
+ // Performance probe
+ private static final int[] SYSTEM_CPU_FORMAT = new int[] {
+ Process.PROC_SPACE_TERM | Process.PROC_COMBINE,
+ Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 1: user time
+ Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 2: nice time
+ Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 3: sys time
+ Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 4: idle time
+ Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 5: iowait time
+ Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 6: irq time
+ Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG // 7: softirq time
+ };
+
+ private static long mStart;
+ private static long mProcessStart;
+ private static long mUserStart;
+ private static long mSystemStart;
+ private static long mIdleStart;
+ private static long mIrqStart;
+
+ private static long mUiStart;
+
+ static void tracePageStart(String url) {
+ if (BrowserSettings.getInstance().isTracing()) {
+ String host;
+ try {
+ WebAddress uri = new WebAddress(url);
+ host = uri.getHost();
+ } catch (android.net.ParseException ex) {
+ host = "browser";
+ }
+ host = host.replace('.', '_');
+ host += ".trace";
+ mInTrace = true;
+ Debug.startMethodTracing(host, 20 * 1024 * 1024);
+ }
+ }
+
+ static void tracePageFinished() {
+ if (mInTrace) {
+ mInTrace = false;
+ Debug.stopMethodTracing();
+ }
+ }
+
+ static void onPageStarted() {
+ mStart = SystemClock.uptimeMillis();
+ mProcessStart = Process.getElapsedCpuTime();
+ long[] sysCpu = new long[7];
+ if (Process.readProcFile("/proc/stat", SYSTEM_CPU_FORMAT, null, sysCpu, null)) {
+ mUserStart = sysCpu[0] + sysCpu[1];
+ mSystemStart = sysCpu[2];
+ mIdleStart = sysCpu[3];
+ mIrqStart = sysCpu[4] + sysCpu[5] + sysCpu[6];
+ }
+ mUiStart = SystemClock.currentThreadTimeMillis();
+ }
+
+ static void onPageFinished(String url) {
+ long[] sysCpu = new long[7];
+ if (Process.readProcFile("/proc/stat", SYSTEM_CPU_FORMAT, null, sysCpu, null)) {
+ String uiInfo =
+ "UI thread used " + (SystemClock.currentThreadTimeMillis() - mUiStart) + " ms";
+ if (LOGD_ENABLED) {
+ Log.d(LOGTAG, uiInfo);
+ }
+ // The string that gets written to the log
+ String performanceString =
+ "It took total " + (SystemClock.uptimeMillis() - mStart)
+ + " ms clock time to load the page." + "\nbrowser process used "
+ + (Process.getElapsedCpuTime() - mProcessStart)
+ + " ms, user processes used " + (sysCpu[0] + sysCpu[1] - mUserStart)
+ * 10 + " ms, kernel used " + (sysCpu[2] - mSystemStart) * 10
+ + " ms, idle took " + (sysCpu[3] - mIdleStart) * 10
+ + " ms and irq took " + (sysCpu[4] + sysCpu[5] + sysCpu[6] - mIrqStart)
+ * 10 + " ms, " + uiInfo;
+ if (LOGD_ENABLED) {
+ Log.d(LOGTAG, performanceString + "\nWebpage: " + url);
+ }
+ if (url != null) {
+ // strip the url to maintain consistency
+ String newUrl = new String(url);
+ if (newUrl.startsWith("http://www.")) {
+ newUrl = newUrl.substring(11);
+ } else if (newUrl.startsWith("http://")) {
+ newUrl = newUrl.substring(7);
+ } else if (newUrl.startsWith("https://www.")) {
+ newUrl = newUrl.substring(12);
+ } else if (newUrl.startsWith("https://")) {
+ newUrl = newUrl.substring(8);
+ }
+ if (LOGD_ENABLED) {
+ Log.d(LOGTAG, newUrl + " loaded");
+ }
+ }
+ }
+ }
+}
diff --git a/src/com/android/browser/ScrollWebView.java b/src/com/android/browser/ScrollWebView.java
new file mode 100644
index 0000000..97bd2c7
--- /dev/null
+++ b/src/com/android/browser/ScrollWebView.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.View;
+import android.webkit.WebView;
+
+import java.util.Map;
+
+/**
+ * Manage WebView scroll events
+ */
+public class ScrollWebView extends WebView {
+
+ private ScrollListener mScrollListener;
+ private boolean mIsCancelled;
+ private Runnable mScrollRunnable;
+
+ /**
+ * @param context
+ * @param attrs
+ * @param defStyle
+ * @param javascriptInterfaces
+ */
+ public ScrollWebView(Context context, AttributeSet attrs, int defStyle,
+ Map<String, Object> javascriptInterfaces, boolean privateBrowsing) {
+ super(context, attrs, defStyle, javascriptInterfaces, privateBrowsing);
+ }
+
+ /**
+ * @param context
+ * @param attrs
+ * @param defStyle
+ */
+ public ScrollWebView(Context context, AttributeSet attrs, int defStyle,
+ boolean privateBrowsing) {
+ super(context, attrs, defStyle, privateBrowsing);
+ }
+
+ /**
+ * @param context
+ * @param attrs
+ */
+ public ScrollWebView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ /**
+ * @param context
+ */
+ public ScrollWebView(Context context) {
+ super(context);
+ }
+
+ void hideEmbeddedTitleBar() {
+ scrollBy(0, getVisibleTitleHeight());
+ }
+
+ @Override
+ public void setEmbeddedTitleBar(final View title) {
+ super.setEmbeddedTitleBar(title);
+ if (title != null && mScrollListener != null) {
+ // allow the scroll listener to initialize its state
+ post(new Runnable() {
+ @Override
+ public void run() {
+ mScrollListener.onScroll((title.getHeight() == 0 ||
+ getVisibleTitleHeight() > 0));
+ }
+ });
+ }
+ }
+
+ @Override
+ public void stopScroll() {
+ mIsCancelled = true;
+ super.stopScroll();
+ }
+
+ @Override
+ protected void onScrollChanged(int l, final int t, int ol, int ot) {
+ super.onScrollChanged(l, t, ol, ot);
+ if (!mIsCancelled) {
+ post(mScrollRunnable);
+ } else {
+ mIsCancelled = false;
+ }
+ }
+
+ void setScrollListener(ScrollListener l) {
+ mScrollListener = l;
+ if (mScrollListener != null) {
+ mScrollRunnable = new Runnable() {
+ public void run() {
+ if (!mIsCancelled) {
+ mScrollListener.onScroll(getVisibleTitleHeight() > 0);
+ }
+ }
+ };
+ }
+ }
+
+ // callback for scroll events
+
+ interface ScrollListener {
+ public void onScroll(boolean titleVisible);
+ }
+
+}
diff --git a/src/com/android/browser/SelectDialog.java b/src/com/android/browser/SelectDialog.java
deleted file mode 100644
index 461127a..0000000
--- a/src/com/android/browser/SelectDialog.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.browser;
-
-import android.provider.Browser;
-import android.view.LayoutInflater;
-import android.view.View;
-
-/* package */ class SelectDialog extends WebDialog {
- private View mCopyButton;
- private View mSelectAllButton;
- private View mShareButton;
- private View mFindButton;
-
- SelectDialog(BrowserActivity context) {
- super(context);
- LayoutInflater factory = LayoutInflater.from(context);
- factory.inflate(R.layout.browser_select, this);
- addCancel();
-
- mCopyButton = findViewById(R.id.copy);
- mCopyButton.setOnClickListener(mCopyListener);
- mSelectAllButton = findViewById(R.id.select_all);
- mSelectAllButton.setOnClickListener(mSelectAllListener);
- mShareButton = findViewById(R.id.share);
- mShareButton.setOnClickListener(mShareListener);
- mFindButton = findViewById(R.id.find);
- mFindButton.setOnClickListener(mFindListener);
- }
-
- private View.OnClickListener mCopyListener = new View.OnClickListener() {
- public void onClick(View v) {
- mWebView.copySelection();
- mBrowserActivity.closeDialogs();
- }
- };
-
- private View.OnClickListener mSelectAllListener = new View.OnClickListener() {
- public void onClick(View v) {
- mWebView.selectAll();
- }
- };
-
- private View.OnClickListener mShareListener = new View.OnClickListener() {
- public void onClick(View v) {
- String selection = mWebView.getSelection();
- Browser.sendString(mBrowserActivity, selection);
- mBrowserActivity.closeDialogs();
- }
- };
-
- private View.OnClickListener mFindListener = new View.OnClickListener() {
- public void onClick(View v) {
- String selection = mWebView.getSelection();
- mBrowserActivity.closeDialogs();
- mBrowserActivity.showFindDialog();
- mBrowserActivity.setFindDialogText(selection);
- }
- };
-
- /**
- * Called by BrowserActivity.closeDialog. Start the animation to hide
- * the dialog, and inform the WebView that the dialog is being dismissed.
- */
- @Override
- public void dismiss() {
- super.dismiss();
- mWebView.notifySelectDialogDismissed();
- }
-
-}
diff --git a/src/com/android/browser/ShortcutActivity.java b/src/com/android/browser/ShortcutActivity.java
new file mode 100644
index 0000000..786c6e1
--- /dev/null
+++ b/src/com/android/browser/ShortcutActivity.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+
+public class ShortcutActivity extends Activity
+ implements BookmarksPageCallbacks {
+
+ private BrowserBookmarksPage mBookmarks;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ // TODO: Is this needed?
+ setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL);
+ mBookmarks = BrowserBookmarksPage.newInstance(this, null, null);
+ mBookmarks.setEnableContextMenu(false);
+ mBookmarks.setBreadCrumbMaxVisible(2);
+ mBookmarks.setBreadCrumbUseBackButton(true);
+ getFragmentManager()
+ .openTransaction()
+ .add(android.R.id.content, mBookmarks)
+ .commit();
+ }
+
+ // BookmarksPageCallbacks
+
+ @Override
+ public boolean onBookmarkSelected(Cursor c, boolean isFolder) {
+ if (isFolder) {
+ return false;
+ }
+ Intent intent = BrowserBookmarksPage.createShortcutIntent(this, c);
+ setResult(RESULT_OK, intent);
+ finish();
+ return true;
+ }
+
+ @Override
+ public boolean onOpenInNewWindow(Cursor c) {
+ return false;
+ }
+
+ @Override
+ public void onBackPressed() {
+ if (!mBookmarks.onBackPressed()) {
+ super.onBackPressed();
+ }
+ }
+
+ @Override
+ public void onFolderChanged(int level, Uri uri) {
+ }
+}
diff --git a/src/com/android/browser/SuggestionsAdapter.java b/src/com/android/browser/SuggestionsAdapter.java
new file mode 100644
index 0000000..8c06353
--- /dev/null
+++ b/src/com/android/browser/SuggestionsAdapter.java
@@ -0,0 +1,623 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import com.android.browser.search.SearchEngine;
+
+import android.app.SearchManager;
+import android.content.Context;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.os.Handler;
+import android.provider.BrowserContract;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.Filter;
+import android.widget.Filterable;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * adapter to wrap multiple cursors for url/search completions
+ */
+public class SuggestionsAdapter extends BaseAdapter implements Filterable, OnClickListener {
+
+ static final int TYPE_BOOKMARK = 0;
+ static final int TYPE_SUGGEST_URL = 1;
+ static final int TYPE_HISTORY = 2;
+ static final int TYPE_SEARCH = 3;
+ static final int TYPE_SUGGEST = 4;
+
+ private static final String[] COMBINED_PROJECTION =
+ {BrowserContract.Combined._ID, BrowserContract.Combined.TITLE,
+ BrowserContract.Combined.URL, BrowserContract.Combined.IS_BOOKMARK};
+
+ private static final String[] SEARCHES_PROJECTION = {BrowserContract.Searches.SEARCH};
+
+ private static final String COMBINED_SELECTION =
+ "(url LIKE ? OR url LIKE ? OR url LIKE ? OR url LIKE ? OR title LIKE ?)";
+
+ Context mContext;
+ Filter mFilter;
+ SuggestionResults mMixedResults;
+ List<SuggestItem> mSuggestResults, mFilterResults;
+ List<CursorSource> mSources;
+ boolean mLandscapeMode;
+ CompletionListener mListener;
+ int mLinesPortrait;
+ int mLinesLandscape;
+ Object mResultsLock = new Object();
+
+ interface CompletionListener {
+
+ public void onSearch(String txt);
+
+ public void onSelect(String txt, String extraData);
+
+ public void onFilterComplete(int count);
+
+ }
+
+ public SuggestionsAdapter(Context ctx, CompletionListener listener) {
+ mContext = ctx;
+ mListener = listener;
+ mLinesPortrait = mContext.getResources().
+ getInteger(R.integer.max_suggest_lines_portrait);
+ mLinesLandscape = mContext.getResources().
+ getInteger(R.integer.max_suggest_lines_landscape);
+ mFilter = new SuggestFilter();
+ addSource(new SearchesCursor());
+ addSource(new CombinedCursor());
+ }
+
+ public void setLandscapeMode(boolean mode) {
+ mLandscapeMode = mode;
+ notifyDataSetChanged();
+ }
+
+ public int getLeftCount() {
+ return mMixedResults.getLeftCount();
+ }
+
+ public int getRightCount() {
+ return mMixedResults.getRightCount();
+ }
+
+ public void addSource(CursorSource c) {
+ if (mSources == null) {
+ mSources = new ArrayList<CursorSource>(5);
+ }
+ mSources.add(c);
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (R.id.icon2 == v.getId()) {
+ // replace input field text with suggestion text
+ SuggestItem item = (SuggestItem) ((View) v.getParent()).getTag();
+ mListener.onSearch(item.title);
+ } else {
+ SuggestItem item = (SuggestItem) v.getTag();
+ mListener.onSelect((TextUtils.isEmpty(item.url)? item.title : item.url),
+ item.extra);
+ }
+ }
+
+ @Override
+ public Filter getFilter() {
+ return mFilter;
+ }
+
+ @Override
+ public int getCount() {
+ return (mMixedResults == null) ? 0 : mMixedResults.getLineCount();
+ }
+
+ @Override
+ public SuggestItem getItem(int position) {
+ if (mMixedResults == null) {
+ return null;
+ }
+ if (mLandscapeMode) {
+ if (position >= mMixedResults.getLineCount()) {
+ // right column
+ position = position - mMixedResults.getLineCount();
+ // index in column
+ if (position >= mMixedResults.getRightCount()) {
+ return null;
+ }
+ return mMixedResults.items.get(position + mMixedResults.getLeftCount());
+ } else {
+ // left column
+ if (position >= mMixedResults.getLeftCount()) {
+ return null;
+ }
+ return mMixedResults.items.get(position);
+ }
+ } else {
+ return mMixedResults.items.get(position);
+ }
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return 0;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ final LayoutInflater inflater = LayoutInflater.from(mContext);
+ View view = convertView;
+ if (view == null) {
+ view = inflater.inflate(R.layout.suggestion_two_column, parent, false);
+ }
+ View s1 = view.findViewById(R.id.suggest1);
+ View s2 = view.findViewById(R.id.suggest2);
+ View div = view.findViewById(R.id.suggestion_divider);
+ if (mLandscapeMode) {
+ SuggestItem item = getItem(position);
+ div.setVisibility(View.VISIBLE);
+ if (item != null) {
+ s1.setVisibility(View.VISIBLE);
+ bindView(s1, item);
+ } else {
+ s1.setVisibility(View.INVISIBLE);
+ }
+ item = getItem(position + mMixedResults.getLineCount());
+ if (item != null) {
+ s2.setVisibility(View.VISIBLE);
+ bindView(s2, item);
+ } else {
+ s2.setVisibility(View.INVISIBLE);
+ }
+ return view;
+ } else {
+ s1.setVisibility(View.VISIBLE);
+ div.setVisibility(View.GONE);
+ s2.setVisibility(View.GONE);
+ bindView(s1, getItem(position));
+ return view;
+ }
+ }
+
+ private void bindView(View view, SuggestItem item) {
+ // store item for click handling
+ view.setTag(item);
+ TextView tv1 = (TextView) view.findViewById(android.R.id.text1);
+ TextView tv2 = (TextView) view.findViewById(android.R.id.text2);
+ ImageView ic1 = (ImageView) view.findViewById(R.id.icon1);
+ View spacer = view.findViewById(R.id.spacer);
+ View ic2 = view.findViewById(R.id.icon2);
+ View div = view.findViewById(R.id.divider);
+ tv1.setText(item.title);
+ tv2.setText(item.url);
+ int id = -1;
+ switch (item.type) {
+ case TYPE_SUGGEST:
+ case TYPE_SEARCH:
+ id = R.drawable.ic_search_category_suggest;
+ break;
+ case TYPE_BOOKMARK:
+ id = R.drawable.ic_search_category_bookmark;
+ break;
+ case TYPE_HISTORY:
+ id = R.drawable.ic_search_category_history;
+ break;
+ case TYPE_SUGGEST_URL:
+ id = R.drawable.ic_search_category_browser;
+ break;
+ default:
+ id = -1;
+ }
+ if (id != -1) {
+ ic1.setImageDrawable(mContext.getResources().getDrawable(id));
+ }
+ ic2.setVisibility(((TYPE_SUGGEST == item.type) || (TYPE_SEARCH == item.type))
+ ? View.VISIBLE : View.GONE);
+ div.setVisibility(ic2.getVisibility());
+ spacer.setVisibility(((TYPE_SUGGEST == item.type) || (TYPE_SEARCH == item.type))
+ ? View.GONE : View.INVISIBLE);
+ view.setOnClickListener(this);
+ ic2.setOnClickListener(this);
+ }
+
+ class SlowFilterTask extends AsyncTask<CharSequence, Void, List<SuggestItem>> {
+
+ @Override
+ protected List<SuggestItem> doInBackground(CharSequence... params) {
+ SuggestCursor cursor = new SuggestCursor();
+ cursor.runQuery(params[0]);
+ List<SuggestItem> results = new ArrayList<SuggestItem>();
+ int count = cursor.getCount();
+ for (int i = 0; i < count; i++) {
+ results.add(cursor.getItem());
+ cursor.moveToNext();
+ }
+ cursor.close();
+ return results;
+ }
+
+ @Override
+ protected void onPostExecute(List<SuggestItem> items) {
+ mSuggestResults = items;
+ mMixedResults = buildSuggestionResults();
+ notifyDataSetChanged();
+ mListener.onFilterComplete(mMixedResults.getLineCount());
+ }
+ }
+
+ SuggestionResults buildSuggestionResults() {
+ SuggestionResults mixed = new SuggestionResults();
+ List<SuggestItem> filter, suggest;
+ synchronized (mResultsLock) {
+ filter = mFilterResults;
+ suggest = mSuggestResults;
+ }
+ if (filter != null) {
+ for (SuggestItem item : filter) {
+ mixed.addResult(item);
+ }
+ }
+ if (suggest != null) {
+ for (SuggestItem item : suggest) {
+ mixed.addResult(item);
+ }
+ }
+ return mixed;
+ }
+
+ class SuggestFilter extends Filter {
+
+ @Override
+ public CharSequence convertResultToString(Object item) {
+ if (item == null) {
+ return "";
+ }
+ SuggestItem sitem = (SuggestItem) item;
+ if (sitem.title != null) {
+ return sitem.title;
+ } else {
+ return sitem.url;
+ }
+ }
+
+ void startSuggestionsAsync(final CharSequence constraint) {
+ new SlowFilterTask().execute(constraint);
+ }
+
+ @Override
+ protected FilterResults performFiltering(CharSequence constraint) {
+ FilterResults res = new FilterResults();
+ if (TextUtils.isEmpty(constraint)) {
+ res.count = 0;
+ res.values = null;
+ return res;
+ }
+ startSuggestionsAsync(constraint);
+ List<SuggestItem> filterResults = new ArrayList<SuggestItem>();
+ if (constraint != null) {
+ for (CursorSource sc : mSources) {
+ sc.runQuery(constraint);
+ }
+ mixResults(filterResults);
+ }
+ synchronized (mResultsLock) {
+ mFilterResults = filterResults;
+ }
+ SuggestionResults mixed = buildSuggestionResults();
+ res.count = mixed.getLineCount();
+ res.values = mixed;
+ return res;
+ }
+
+ void mixResults(List<SuggestItem> results) {
+ int maxLines = mLandscapeMode ? mLinesLandscape : (mLinesPortrait / 2);
+ for (int i = 0; i < mSources.size(); i++) {
+ CursorSource s = mSources.get(i);
+ int n = Math.min(s.getCount(), maxLines);
+ maxLines -= n;
+ boolean more = false;
+ for (int j = 0; j < n; j++) {
+ results.add(s.getItem());
+ more = s.moveToNext();
+ }
+ }
+ }
+
+ @Override
+ protected void publishResults(CharSequence constraint, FilterResults fresults) {
+ mMixedResults = (SuggestionResults) fresults.values;
+ mListener.onFilterComplete(fresults.count);
+ notifyDataSetChanged();
+ }
+
+ }
+
+ /**
+ * sorted list of results of a suggestion query
+ *
+ */
+ class SuggestionResults {
+
+ ArrayList<SuggestItem> items;
+ // count per type
+ int[] counts;
+
+ SuggestionResults() {
+ items = new ArrayList<SuggestItem>(24);
+ // n of types:
+ counts = new int[5];
+ }
+
+ int getTypeCount(int type) {
+ return counts[type];
+ }
+
+ void addResult(SuggestItem item) {
+ int ix = 0;
+ while ((ix < items.size()) && (item.type >= items.get(ix).type))
+ ix++;
+ items.add(ix, item);
+ counts[item.type]++;
+ }
+
+ int getLineCount() {
+ if (mLandscapeMode) {
+ return Math.min(mLinesLandscape,
+ Math.max(getLeftCount(), getRightCount()));
+ } else {
+ return Math.min(mLinesPortrait, getLeftCount() + getRightCount());
+ }
+ }
+
+ int getLeftCount() {
+ return counts[TYPE_BOOKMARK] + counts[TYPE_HISTORY] + counts[TYPE_SUGGEST_URL];
+ }
+
+ int getRightCount() {
+ return counts[TYPE_SEARCH] + counts[TYPE_SUGGEST];
+ }
+
+ @Override
+ public String toString() {
+ if (items == null) return null;
+ if (items.size() == 0) return "[]";
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < items.size(); i++) {
+ SuggestItem item = items.get(i);
+ sb.append(item.type + ": " + item.title);
+ if (i < items.size() - 1) {
+ sb.append(", ");
+ }
+ }
+ return sb.toString();
+ }
+ }
+
+ /**
+ * data object to hold suggestion values
+ */
+ class SuggestItem {
+ String title;
+ String url;
+ int type;
+ String extra;
+
+ public SuggestItem(String text, String u, int t) {
+ title = text;
+ url = u;
+ type = t;
+ }
+ }
+
+ abstract class CursorSource {
+
+ Cursor mCursor;
+
+ boolean moveToNext() {
+ return mCursor.moveToNext();
+ }
+
+ public abstract void runQuery(CharSequence constraint);
+
+ public abstract SuggestItem getItem();
+
+ public int getCount() {
+ return (mCursor != null) ? mCursor.getCount() : 0;
+ }
+
+ public void close() {
+ if (mCursor != null) {
+ mCursor.close();
+ }
+ }
+ }
+
+ /**
+ * combined bookmark & history source
+ */
+ class CombinedCursor extends CursorSource {
+
+ @Override
+ public SuggestItem getItem() {
+ if ((mCursor != null) && (!mCursor.isAfterLast())) {
+ String title = mCursor.getString(1);
+ String url = mCursor.getString(2);
+ boolean isBookmark = (mCursor.getInt(3) == 1);
+ return new SuggestItem(getTitle(title, url), getUrl(title, url),
+ isBookmark ? TYPE_BOOKMARK : TYPE_HISTORY);
+ }
+ return null;
+ }
+
+ @Override
+ public void runQuery(CharSequence constraint) {
+ // constraint != null
+ if (mCursor != null) {
+ mCursor.close();
+ }
+ String like = constraint + "%";
+ String[] args = null;
+ String selection = null;
+ if (like.startsWith("http") || like.startsWith("file")) {
+ args = new String[1];
+ args[0] = like;
+ selection = "url LIKE ?";
+ } else {
+ args = new String[5];
+ args[0] = "http://" + like;
+ args[1] = "http://www." + like;
+ args[2] = "https://" + like;
+ args[3] = "https://www." + like;
+ // To match against titles.
+ args[4] = like;
+ selection = COMBINED_SELECTION;
+ }
+ Uri.Builder ub = BrowserContract.Combined.CONTENT_URI.buildUpon();
+ ub.appendQueryParameter(BrowserContract.PARAM_LIMIT,
+ Integer.toString(mLinesPortrait));
+ mCursor =
+ mContext.getContentResolver().query(ub.build(), COMBINED_PROJECTION,
+ selection,
+ (constraint != null) ? args : null,
+ BrowserContract.Combined.VISITS + " DESC, " +
+ BrowserContract.Combined.DATE_LAST_VISITED + " DESC");
+ if (mCursor != null) {
+ mCursor.moveToFirst();
+ }
+ }
+
+ /**
+ * Provides the title (text line 1) for a browser suggestion, which should be the
+ * webpage title. If the webpage title is empty, returns the stripped url instead.
+ *
+ * @return the title string to use
+ */
+ private String getTitle(String title, String url) {
+ if (TextUtils.isEmpty(title) || TextUtils.getTrimmedLength(title) == 0) {
+ title = UrlUtils.stripUrl(url);
+ }
+ return title;
+ }
+
+ /**
+ * Provides the subtitle (text line 2) for a browser suggestion, which should be the
+ * webpage url. If the webpage title is empty, then the url should go in the title
+ * instead, and the subtitle should be empty, so this would return null.
+ *
+ * @return the subtitle string to use, or null if none
+ */
+ private String getUrl(String title, String url) {
+ if (TextUtils.isEmpty(title)
+ || TextUtils.getTrimmedLength(title) == 0
+ || title.equals(url)) {
+ return null;
+ } else {
+ return UrlUtils.stripUrl(url);
+ }
+ }
+ }
+
+ class SearchesCursor extends CursorSource {
+
+ @Override
+ public SuggestItem getItem() {
+ if ((mCursor != null) && (!mCursor.isAfterLast())) {
+ return new SuggestItem(mCursor.getString(0), null, TYPE_SEARCH);
+ }
+ return null;
+ }
+
+ @Override
+ public void runQuery(CharSequence constraint) {
+ // constraint != null
+ if (mCursor != null) {
+ mCursor.close();
+ }
+ String like = constraint + "%";
+ String[] args = new String[] {like};
+ String selection = BrowserContract.Searches.SEARCH + " LIKE ?";
+ Uri.Builder ub = BrowserContract.Searches.CONTENT_URI.buildUpon();
+ ub.appendQueryParameter(BrowserContract.PARAM_LIMIT,
+ Integer.toString(mLinesPortrait));
+ mCursor =
+ mContext.getContentResolver().query(ub.build(), SEARCHES_PROJECTION,
+ selection,
+ args, BrowserContract.Searches.DATE + " DESC");
+ if (mCursor != null) {
+ mCursor.moveToFirst();
+ }
+ }
+
+ }
+
+ class SuggestCursor extends CursorSource {
+
+ @Override
+ public SuggestItem getItem() {
+ if (mCursor != null) {
+ String title = mCursor.getString(
+ mCursor.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_1));
+ String text2 = mCursor.getString(
+ mCursor.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_2));
+ String url = mCursor.getString(
+ mCursor.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_2_URL));
+ String uri = mCursor.getString(
+ mCursor.getColumnIndex(SearchManager.SUGGEST_COLUMN_INTENT_DATA));
+ int type = (TextUtils.isEmpty(url)) ? TYPE_SUGGEST : TYPE_SUGGEST_URL;
+ SuggestItem item = new SuggestItem(title, url, type);
+ item.extra = mCursor.getString(
+ mCursor.getColumnIndex(SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA));
+ return item;
+ }
+ return null;
+ }
+
+ @Override
+ public void runQuery(CharSequence constraint) {
+ if (mCursor != null) {
+ mCursor.close();
+ }
+ if (!TextUtils.isEmpty(constraint)) {
+ SearchEngine searchEngine = BrowserSettings.getInstance().getSearchEngine();
+ if (searchEngine != null && searchEngine.supportsSuggestions()) {
+ mCursor = searchEngine.getSuggestions(mContext, constraint.toString());
+ if (mCursor != null) {
+ mCursor.moveToFirst();
+ }
+ }
+ } else {
+ mCursor = null;
+ }
+ }
+
+ }
+
+ public void clearCache() {
+ mFilterResults = null;
+ mSuggestResults = null;
+ }
+
+}
diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java
index 7019c8a..3e79edb 100644
--- a/src/com/android/browser/Tab.java
+++ b/src/com/android/browser/Tab.java
@@ -16,23 +16,16 @@
package com.android.browser;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.Map;
-import java.util.Vector;
+import com.android.common.speech.LoggingEvents;
+import android.app.Activity;
import android.app.AlertDialog;
import android.app.SearchManager;
import android.content.ContentResolver;
-import android.content.ContentValues;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.Intent;
import android.database.Cursor;
-import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.graphics.Bitmap;
import android.net.Uri;
@@ -41,17 +34,14 @@
import android.os.Bundle;
import android.os.Message;
import android.os.SystemClock;
-import android.provider.Browser;
+import android.provider.BrowserContract;
import android.speech.RecognizerResultsIntent;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
-import android.view.ViewGroup;
import android.view.ViewStub;
-import android.view.View.OnClickListener;
import android.webkit.ConsoleMessage;
-import android.webkit.CookieSyncManager;
import android.webkit.DownloadListener;
import android.webkit.GeolocationPermissions;
import android.webkit.HttpAuthHandler;
@@ -62,21 +52,26 @@
import android.webkit.WebBackForwardListClient;
import android.webkit.WebChromeClient;
import android.webkit.WebHistoryItem;
-import android.webkit.WebIconDatabase;
import android.webkit.WebStorage;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.FrameLayout;
-import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;
+import android.widget.Toast;
-import com.android.common.speech.LoggingEvents;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Vector;
/**
* Class for maintaining Tabs with a main WebView and a subwindow.
*/
class Tab {
+
// Log Tag
private static final String LOGTAG = "Tab";
// Special case the logtag for messages for the Console to make it easier to
@@ -84,10 +79,17 @@
// of the browser.
private static final String CONSOLE_LOGTAG = "browser";
+ final static int LOCK_ICON_UNSECURE = 0;
+ final static int LOCK_ICON_SECURE = 1;
+ final static int LOCK_ICON_MIXED = 2;
+
+ Activity mActivity;
+ private WebViewController mWebViewController;
+
// The Geolocation permissions prompt
private GeolocationPermissionsPrompt mGeolocationPermissionsPrompt;
// Main WebView wrapper
- private LinearLayout mContainer;
+ private View mContainer;
// Main WebView
private WebView mMainView;
// Subwindow container
@@ -110,8 +112,9 @@
private boolean mCloseOnExit;
// If true, the tab is in the foreground of the current activity.
private boolean mInForeground;
- // If true, the tab is in loading state.
- private boolean mInLoad;
+ // If true, the tab is in page loading state (after onPageStarted,
+ // before onPageFinsihed)
+ private boolean mInPageLoad;
// The time the load started, used to find load page time
private long mLoadStartTime;
// Application identifier used to find tabs that another application wants
@@ -120,15 +123,15 @@
// Keep the original url around to avoid killing the old WebView if the url
// has not changed.
private String mOriginalUrl;
+ // Hold on to the currently loaded url
+ private String mCurrentUrl;
+ //The currently loaded title
+ private String mCurrentTitle;
// Error console for the tab
private ErrorConsoleView mErrorConsole;
// the lock icon type and previous lock icon type for the tab
private int mLockIconType;
private int mPrevLockIconType;
- // Inflation service for making subwindows.
- private final LayoutInflater mInflateService;
- // The BrowserActivity which owners the Tab
- private final BrowserActivity mActivity;
// The listener that gets invoked when a download is started from the
// mMainView
private final DownloadListener mDownloadListener;
@@ -145,6 +148,14 @@
Bitmap mFavicon;
}
+ // Whether or not the currently shown page is a bookmarked site. Will be
+ // out of date when loading a new page until the mBookmarkAsyncTask returns.
+ private boolean mIsBookmarkedSite;
+ // Used to determine whether the current site is bookmarked.
+ private AsyncTask<Void, Void, Boolean> mBookmarkAsyncTask;
+
+ public boolean isBookmarkedSite() { return mIsBookmarkedSite; }
+
// Used for saving and restoring each Tab
static final String WEBVIEW = "webview";
static final String NUMTABS = "numTabs";
@@ -155,6 +166,7 @@
static final String PARENTTAB = "parentTab";
static final String APPID = "appid";
static final String ORIGINALURL = "originalUrl";
+ static final String INCOGNITO = "privateBrowsingEnabled";
// -------------------------------------------------------------------------
@@ -170,10 +182,11 @@
if (mVoiceSearchData != null) {
mVoiceSearchData = null;
if (mInForeground) {
- mActivity.revertVoiceTitleBar();
+ mWebViewController.revertVoiceSearchMode(this);
}
}
}
+
/**
* Return whether the tab is in voice search mode.
*/
@@ -271,7 +284,7 @@
mVoiceSearchData.mLastVoiceSearchTitle
= mVoiceSearchData.mVoiceSearchResults.get(index);
if (mInForeground) {
- mActivity.showVoiceTitleBar(mVoiceSearchData.mLastVoiceSearchTitle);
+ mWebViewController.activateVoiceSearchMode(mVoiceSearchData.mLastVoiceSearchTitle);
}
if (mVoiceSearchData.mVoiceSearchHtmls != null) {
// When index was found it was already ensured that it was valid
@@ -298,7 +311,7 @@
mVoiceSearchData.mLastVoiceSearchUrl
= mVoiceSearchData.mVoiceSearchUrls.get(index);
if (null == mVoiceSearchData.mLastVoiceSearchUrl) {
- mVoiceSearchData.mLastVoiceSearchUrl = mActivity.smartUrlFilter(
+ mVoiceSearchData.mLastVoiceSearchUrl = UrlUtils.smartUrlFilter(
mVoiceSearchData.mLastVoiceSearchTitle);
}
Map<String, String> headers = null;
@@ -391,7 +404,7 @@
mDescription = desc;
mError = error;
}
- };
+ }
private void processNextError() {
if (mQueuedErrors == null) {
@@ -458,7 +471,7 @@
private Message mResend;
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
- mInLoad = true;
+ mInPageLoad = true;
mLoadStartTime = SystemClock.uptimeMillis();
if (mVoiceSearchData != null
&& !url.equals(mVoiceSearchData.mLastVoiceSearchUrl)) {
@@ -470,12 +483,6 @@
revertVoiceSearchMode();
}
- // We've started to load a new page. If there was a pending message
- // to save a screenshot then we will now take the new page and save
- // an incorrect screenshot. Therefore, remove any pending thumbnail
- // messages from the queue.
- mActivity.removeMessages(BrowserActivity.UPDATE_BOOKMARK_THUMBNAIL,
- view);
// If we start a touch icon load and then load a new page, we don't
// want to cancel the current touch icon loader. But, we do want to
@@ -488,49 +495,58 @@
// reset the error console
if (mErrorConsole != null) {
mErrorConsole.clearErrorMessages();
- if (mActivity.shouldShowErrorConsole()) {
+ if (mWebViewController.shouldShowErrorConsole()) {
mErrorConsole.showConsole(ErrorConsoleView.SHOW_NONE);
}
}
- // update the bookmark database for favicon
- if (favicon != null) {
- BrowserBookmarksAdapter.updateBookmarkFavicon(mActivity
- .getContentResolver(), null, url, favicon);
- }
-
- // reset sync timer to avoid sync starts during loading a page
- CookieSyncManager.getInstance().resetSync();
-
- if (!mActivity.isNetworkUp()) {
- view.setNetworkAvailable(false);
- }
-
// finally update the UI in the activity if it is in the foreground
- if (mInForeground) {
- mActivity.onPageStarted(view, url, favicon);
+ mWebViewController.onPageStarted(Tab.this, view, url, favicon);
+
+ final String urlInQuestion = url;
+ if (mBookmarkAsyncTask != null) {
+ mBookmarkAsyncTask.cancel(true);
}
+ mBookmarkAsyncTask = new AsyncTask<Void, Void, Boolean>() {
+ @Override
+ protected Boolean doInBackground(Void... unused) {
+ // Check to see if the site is bookmarked
+ Cursor cursor = null;
+ try {
+ cursor = mActivity.getContentResolver().query(
+ BrowserContract.Bookmarks.CONTENT_URI,
+ new String[] { BrowserContract.Bookmarks.URL },
+ BrowserContract.Bookmarks.URL + " == ?",
+ new String[] { urlInQuestion },
+ null);
+ return cursor.moveToFirst();
+ } catch (SQLiteException e) {
+ Log.e(LOGTAG, "Error checking for bookmark: " + e);
+ return false;
+ } finally {
+ if (cursor != null) cursor.close();
+ }
+ }
+ @Override
+ protected void onPostExecute(Boolean isBookmarked) {
+ if (this == mBookmarkAsyncTask) {
+ mIsBookmarkedSite = isBookmarked;
+ mWebViewController.bookmarkedStatusHasChanged(Tab.this);
+ }
+ }
+ };
+ mBookmarkAsyncTask.execute();
}
@Override
public void onPageFinished(WebView view, String url) {
- LogTag.logPageFinishedLoading(
- url, SystemClock.uptimeMillis() - mLoadStartTime);
- mInLoad = false;
-
- if (mInForeground && !mActivity.didUserStopLoading()
- || !mInForeground) {
- // Only update the bookmark screenshot if the user did not
- // cancel the load early.
- mActivity.postMessage(
- BrowserActivity.UPDATE_BOOKMARK_THUMBNAIL, 0, 0, view,
- 500);
+ if (!isPrivateBrowsingEnabled()) {
+ LogTag.logPageFinishedLoading(
+ url, SystemClock.uptimeMillis() - mLoadStartTime);
}
+ mInPageLoad = false;
- // finally update the UI in the activity if it is in the foreground
- if (mInForeground) {
- mActivity.onPageFinished(view, url);
- }
+ mWebViewController.onPageFinished(Tab.this, url);
}
// return true if want to hijack the url to let another app to handle it
@@ -549,7 +565,7 @@
mActivity.sendBroadcast(logIntent);
}
if (mInForeground) {
- return mActivity.shouldOverrideUrlLoading(view, url);
+ return mWebViewController.shouldOverrideUrlLoading(view, url);
} else {
return false;
}
@@ -566,11 +582,11 @@
if (url != null && url.length() > 0) {
// It is only if the page claims to be secure that we may have
// to update the lock:
- if (mLockIconType == BrowserActivity.LOCK_ICON_SECURE) {
+ if (mLockIconType == LOCK_ICON_SECURE) {
// If NOT a 'safe' url, change the lock to mixed content!
if (!(URLUtil.isHttpsUrl(url) || URLUtil.isDataUrl(url)
|| URLUtil.isAboutUrl(url))) {
- mLockIconType = BrowserActivity.LOCK_ICON_MIXED;
+ mLockIconType = LOCK_ICON_MIXED;
}
}
}
@@ -590,12 +606,16 @@
errorCode != WebViewClient.ERROR_FILE) {
queueError(errorCode, description);
}
- Log.e(LOGTAG, "onReceivedError " + errorCode + " " + failingUrl
- + " " + description);
+
+ // Don't log URLs when in private browsing mode
+ if (!isPrivateBrowsingEnabled()) {
+ Log.e(LOGTAG, "onReceivedError " + errorCode + " " + failingUrl
+ + " " + description);
+ }
// We need to reset the title after an error if it is in foreground.
if (mInForeground) {
- mActivity.resetTitleAndRevertLockIcon();
+ mWebViewController.resetTitleAndRevertLockIcon(Tab.this);
}
}
@@ -661,31 +681,7 @@
@Override
public void doUpdateVisitedHistory(WebView view, String url,
boolean isReload) {
- if (url.regionMatches(true, 0, "about:", 0, 6)) {
- return;
- }
- // remove "client" before updating it to the history so that it wont
- // show up in the auto-complete list.
- int index = url.indexOf("client=ms-");
- if (index > 0 && url.contains(".google.")) {
- int end = url.indexOf('&', index);
- if (end > 0) {
- url = url.substring(0, index)
- .concat(url.substring(end + 1));
- } else {
- // the url.charAt(index-1) should be either '?' or '&'
- url = url.substring(0, index-1);
- }
- }
- final ContentResolver cr = mActivity.getContentResolver();
- final String newUrl = url;
- new AsyncTask<Void, Void, Void>() {
- protected Void doInBackground(Void... unused) {
- Browser.updateVisitedHistory(cr, newUrl, true);
- return null;
- }
- }.execute();
- WebIconDatabase.getInstance().retainIconForPageUrl(url);
+ mWebViewController.doUpdateVisitedHistory(Tab.this, url, isReload);
}
/**
@@ -751,21 +747,21 @@
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int whichButton) {
- mActivity.showSSLCertificateOnError(view,
+ mWebViewController.showSslCertificateOnError(view,
handler, error);
}
- }).setNegativeButton(R.string.cancel,
+ }).setNegativeButton(R.string.ssl_go_back,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int whichButton) {
handler.cancel();
- mActivity.resetTitleAndRevertLockIcon();
+ mWebViewController.resetTitleAndRevertLockIcon(Tab.this);
}
}).setOnCancelListener(
new DialogInterface.OnCancelListener() {
public void onCancel(DialogInterface dialog) {
handler.cancel();
- mActivity.resetTitleAndRevertLockIcon();
+ mWebViewController.resetTitleAndRevertLockIcon(Tab.this);
}
}).show();
} else {
@@ -784,31 +780,7 @@
public void onReceivedHttpAuthRequest(WebView view,
final HttpAuthHandler handler, final String host,
final String realm) {
- String username = null;
- String password = null;
-
- boolean reuseHttpAuthUsernamePassword = handler
- .useHttpAuthUsernamePassword();
-
- if (reuseHttpAuthUsernamePassword && view != null) {
- String[] credentials = view.getHttpAuthUsernamePassword(
- host, realm);
- if (credentials != null && credentials.length == 2) {
- username = credentials[0];
- password = credentials[1];
- }
- }
-
- if (username != null && password != null) {
- handler.proceed(username, password);
- } else {
- if (mInForeground) {
- mActivity.showHttpAuthentication(handler, host, realm,
- null, null, null, 0);
- } else {
- handler.cancel();
- }
- }
+ mWebViewController.onReceivedHttpAuthRequest(Tab.this, view, handler, host, realm);
}
@Override
@@ -816,25 +788,15 @@
if (!mInForeground) {
return false;
}
- if (mActivity.isMenuDown()) {
- // only check shortcut key when MENU is held
- return mActivity.getWindow().isShortcutKey(event.getKeyCode(),
- event);
- } else {
- return false;
- }
+ return mWebViewController.shouldOverrideKeyEvent(event);
}
@Override
public void onUnhandledKeyEvent(WebView view, KeyEvent event) {
- if (!mInForeground || mActivity.mActivityInPause) {
+ if (!mInForeground) {
return;
}
- if (event.isDown()) {
- mActivity.onKeyDown(event.getKeyCode(), event);
- } else {
- mActivity.onKeyUp(event.getKeyCode(), event);
- }
+ mWebViewController.onUnhandledKeyEvent(event);
}
};
@@ -849,11 +811,11 @@
(WebView.WebViewTransport) msg.obj;
if (dialog) {
createSubWindow();
- mActivity.attachSubWindow(Tab.this);
+ mWebViewController.attachSubWindow(Tab.this);
transport.setWebView(mSubView);
} else {
- final Tab newTab = mActivity.openTabAndShow(
- BrowserActivity.EMPTY_URL_DATA, false, null);
+ final Tab newTab = mWebViewController.openTabAndShow(
+ IntentHandler.EMPTY_URL_DATA, false, null);
if (newTab != Tab.this) {
Tab.this.addChildTab(newTab);
}
@@ -878,7 +840,7 @@
.setPositiveButton(R.string.ok, null)
.show();
return false;
- } else if (!mActivity.getTabControl().canCreateNewTab()) {
+ } else if (!mWebViewController.getTabControl().canCreateNewTab()) {
new AlertDialog.Builder(mActivity)
.setTitle(R.string.too_many_windows_dialog_title)
.setIcon(android.R.drawable.ic_dialog_alert)
@@ -930,7 +892,7 @@
@Override
public void onRequestFocus(WebView view) {
if (!mInForeground) {
- mActivity.switchToTab(mActivity.getTabControl().getTabIndex(
+ mWebViewController.switchToTab(mWebViewController.getTabControl().getTabIndex(
Tab.this));
}
}
@@ -940,94 +902,26 @@
if (mParentTab != null) {
// JavaScript can only close popup window.
if (mInForeground) {
- mActivity.switchToTab(mActivity.getTabControl()
+ mWebViewController.switchToTab(mWebViewController.getTabControl()
.getTabIndex(mParentTab));
}
- mActivity.closeTab(Tab.this);
+ mWebViewController.closeTab(Tab.this);
}
}
@Override
public void onProgressChanged(WebView view, int newProgress) {
- if (newProgress == 100) {
- // sync cookies and cache promptly here.
- CookieSyncManager.getInstance().sync();
- }
- if (mInForeground) {
- mActivity.onProgressChanged(view, newProgress);
- }
+ mWebViewController.onProgressChanged(Tab.this, newProgress);
}
@Override
public void onReceivedTitle(WebView view, final String title) {
- final String pageUrl = view.getUrl();
- if (mInForeground) {
- // here, if url is null, we want to reset the title
- mActivity.setUrlTitle(pageUrl, title);
- }
- if (pageUrl == null || pageUrl.length()
- >= SQLiteDatabase.SQLITE_MAX_LIKE_PATTERN_LENGTH) {
- return;
- }
- new AsyncTask<Void, Void, Void>() {
- protected Void doInBackground(Void... unused) {
- // See if we can find the current url in our history
- // database and add the new title to it.
- String url = pageUrl;
- if (url.startsWith("http://www.")) {
- url = url.substring(11);
- } else if (url.startsWith("http://")) {
- url = url.substring(4);
- }
- // Escape wildcards for LIKE operator.
- url = url.replace("\\", "\\\\").replace("%", "\\%")
- .replace("_", "\\_");
- Cursor c = null;
- try {
- final ContentResolver cr
- = mActivity.getContentResolver();
- url = "%" + url;
- String [] selArgs = new String[] { url };
- String where = Browser.BookmarkColumns.URL
- + " LIKE ? ESCAPE '\\' AND "
- + Browser.BookmarkColumns.BOOKMARK + " = 0";
- c = cr.query(Browser.BOOKMARKS_URI, new String[]
- { Browser.BookmarkColumns._ID }, where, selArgs,
- null);
- if (c.moveToFirst()) {
- // Current implementation of database only has one
- // entry per url.
- ContentValues map = new ContentValues();
- map.put(Browser.BookmarkColumns.TITLE, title);
- String[] projection = new String[]
- { Integer.valueOf(c.getInt(0)).toString() };
- cr.update(Browser.BOOKMARKS_URI, map, "_id = ?",
- projection);
- }
- } catch (IllegalStateException e) {
- Log.e(LOGTAG, "Tab onReceived title", e);
- } catch (SQLiteException ex) {
- Log.e(LOGTAG,
- "onReceivedTitle() caught SQLiteException: ",
- ex);
- } finally {
- if (c != null) c.close();
- }
- return null;
- }
- }.execute();
+ mWebViewController.onReceivedTitle(Tab.this, title);
}
@Override
public void onReceivedIcon(WebView view, Bitmap icon) {
- if (icon != null) {
- BrowserBookmarksAdapter.updateBookmarkFavicon(mActivity
- .getContentResolver(), view.getOriginalUrl(), view
- .getUrl(), icon);
- }
- if (mInForeground) {
- mActivity.setFavicon(icon);
- }
+ mWebViewController.onFavicon(Tab.this, view, icon);
}
@Override
@@ -1042,30 +936,22 @@
}
// Have only one async task at a time.
if (mTouchIconLoader == null) {
- mTouchIconLoader = new DownloadTouchIcon(Tab.this, mActivity, cr, view);
+ mTouchIconLoader = new DownloadTouchIcon(Tab.this,
+ mActivity, cr, view);
mTouchIconLoader.execute(url);
}
}
@Override
- public void onSelectionDone(WebView view) {
- if (mInForeground) mActivity.closeDialogs();
- }
-
- @Override
- public void onSelectionStart(WebView view) {
- if (false && mInForeground) mActivity.showSelectDialog();
- }
-
- @Override
public void onShowCustomView(View view,
WebChromeClient.CustomViewCallback callback) {
- if (mInForeground) mActivity.onShowCustomView(view, callback);
+ if (mInForeground) mWebViewController.showCustomView(Tab.this, view,
+ callback);
}
@Override
public void onHideCustomView() {
- if (mInForeground) mActivity.onHideCustomView();
+ if (mInForeground) mWebViewController.hideCustomView();
}
/**
@@ -1144,12 +1030,16 @@
// call getErrorConsole(true) so it will create one if needed
ErrorConsoleView errorConsole = getErrorConsole(true);
errorConsole.addErrorMessage(consoleMessage);
- if (mActivity.shouldShowErrorConsole()
- && errorConsole.getShowState() != ErrorConsoleView.SHOW_MAXIMIZED) {
+ if (mWebViewController.shouldShowErrorConsole()
+ && errorConsole.getShowState() !=
+ ErrorConsoleView.SHOW_MAXIMIZED) {
errorConsole.showConsole(ErrorConsoleView.SHOW_MINIMIZED);
}
}
+ // Don't log console messages in private browsing mode
+ if (isPrivateBrowsingEnabled()) return true;
+
String message = "Console: " + consoleMessage.message() + " "
+ consoleMessage.sourceId() + ":"
+ consoleMessage.lineNumber();
@@ -1183,7 +1073,7 @@
@Override
public Bitmap getDefaultVideoPoster() {
if (mInForeground) {
- return mActivity.getDefaultVideoPoster();
+ return mWebViewController.getDefaultVideoPoster();
}
return null;
}
@@ -1196,15 +1086,15 @@
@Override
public View getVideoLoadingProgressView() {
if (mInForeground) {
- return mActivity.getVideoLoadingProgressView();
+ return mWebViewController.getVideoLoadingProgressView();
}
return null;
}
@Override
- public void openFileChooser(ValueCallback<Uri> uploadMsg) {
+ public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
if (mInForeground) {
- mActivity.openFileChooser(uploadMsg);
+ mWebViewController.openFileChooser(uploadMsg, acceptType);
} else {
uploadMsg.onReceiveValue(null);
}
@@ -1215,17 +1105,37 @@
*/
@Override
public void getVisitedHistory(final ValueCallback<String[]> callback) {
- AsyncTask<Void, Void, String[]> task = new AsyncTask<Void, Void, String[]>() {
- public String[] doInBackground(Void... unused) {
- return Browser.getVisitedHistory(mActivity
- .getContentResolver());
- }
- public void onPostExecute(String[] result) {
- callback.onReceiveValue(result);
- };
- };
- task.execute();
- };
+ mWebViewController.getVisitedHistory(callback);
+ }
+
+ @Override
+ public void setupAutoFill(Message message) {
+ // Prompt the user to set up their profile.
+ final Message msg = message;
+ AlertDialog.Builder builder = new AlertDialog.Builder(mActivity);
+ builder.setMessage(R.string.autofill_setup_dialog_message)
+ .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int id) {
+ // Take user to the AutoFill profile editor. When they return,
+ // we will send the message that we pass here which will trigger
+ // the form to get filled out with their new profile.
+ mWebViewController.setupAutoFill(msg);
+ }
+ })
+ .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int id) {
+ // 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();
+ Toast.makeText(mActivity, R.string.autofill_setup_dialog_negative_toast,
+ Toast.LENGTH_LONG).show();
+ }
+ }).show();
+ }
};
// -------------------------------------------------------------------------
@@ -1237,18 +1147,18 @@
private static class SubWindowClient extends WebViewClient {
// The main WebViewClient.
private final WebViewClient mClient;
- private final BrowserActivity mBrowserActivity;
+ private final WebViewController mController;
- SubWindowClient(WebViewClient client, BrowserActivity activity) {
+ SubWindowClient(WebViewClient client, WebViewController controller) {
mClient = client;
- mBrowserActivity = activity;
+ mController = controller;
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
// Unlike the others, do not call mClient's version, which would
// change the progress bar. However, we do want to remove the
// find or select dialog.
- mBrowserActivity.closeDialogs();
+ mController.endActionMode();
}
@Override
public void doUpdateVisitedHistory(WebView view, String url,
@@ -1316,48 +1226,35 @@
if (window != mSubView) {
Log.e(LOGTAG, "Can't close the window");
}
- mActivity.dismissSubWindow(Tab.this);
+ mWebViewController.dismissSubWindow(Tab.this);
}
}
// -------------------------------------------------------------------------
+ // TODO temporarily use activity here
+ // remove later
+
// Construct a new tab
- Tab(BrowserActivity activity, WebView w, boolean closeOnExit, String appId,
+ Tab(WebViewController wvcontroller, WebView w, boolean closeOnExit, String appId,
String url) {
- mActivity = activity;
+ mWebViewController = wvcontroller;
+ mActivity = mWebViewController.getActivity();
mCloseOnExit = closeOnExit;
mAppId = appId;
mOriginalUrl = url;
- mLockIconType = BrowserActivity.LOCK_ICON_UNSECURE;
- mPrevLockIconType = BrowserActivity.LOCK_ICON_UNSECURE;
- mInLoad = false;
+ mLockIconType = LOCK_ICON_UNSECURE;
+ mPrevLockIconType = LOCK_ICON_UNSECURE;
+ mInPageLoad = false;
mInForeground = false;
- mInflateService = LayoutInflater.from(activity);
-
- // The tab consists of a container view, which contains the main
- // WebView, as well as any other UI elements associated with the tab.
- mContainer = (LinearLayout) mInflateService.inflate(R.layout.tab, null);
mDownloadListener = new DownloadListener() {
public void onDownloadStart(String url, String userAgent,
String contentDisposition, String mimetype,
long contentLength) {
- mActivity.onDownloadStart(url, userAgent, contentDisposition,
+ mWebViewController.onDownloadStart(Tab.this, url, userAgent, contentDisposition,
mimetype, contentLength);
- if (mMainView.copyBackForwardList().getSize() == 0) {
- // This Tab was opened for the sole purpose of downloading a
- // file. Remove it.
- if (mActivity.getTabControl().getCurrentWebView()
- == mMainView) {
- // In this case, the Tab is still on top.
- mActivity.goBackOnePageOrQuit();
- } else {
- // In this case, it is not.
- mActivity.closeTab(Tab.this);
- }
- }
}
};
mWebBackForwardListClient = new WebBackForwardListClient() {
@@ -1387,16 +1284,14 @@
if (mMainView == w) {
return;
}
+
// If the WebView is changing, the page will be reloaded, so any ongoing
// Geolocation permission requests are void.
if (mGeolocationPermissionsPrompt != null) {
mGeolocationPermissionsPrompt.hide();
}
- // Just remove the old one.
- FrameLayout wrapper =
- (FrameLayout) mContainer.findViewById(R.id.webview_wrapper);
- wrapper.removeView(mMainView);
+ mWebViewController.onSetWebView(this, w);
// set the new one
mMainView = w;
@@ -1449,17 +1344,9 @@
*/
boolean createSubWindow() {
if (mSubView == null) {
- mActivity.closeDialogs();
- mSubViewContainer = mInflateService.inflate(
- R.layout.browser_subwindow, null);
- mSubView = (WebView) mSubViewContainer.findViewById(R.id.webview);
- mSubView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);
- // use trackball directly
- mSubView.setMapTrackballToArrowKeys(false);
- // Enable the built-in zoom
- mSubView.getSettings().setBuiltInZoomControls(true);
+ mWebViewController.createSubWindow(this);
mSubView.setWebViewClient(new SubWindowClient(mWebViewClient,
- mActivity));
+ mWebViewController));
mSubView.setWebChromeClient(new SubWindowChromeClient(
mWebChromeClient));
// Set a different DownloadListener for the mSubView, since it will
@@ -1468,25 +1355,16 @@
public void onDownloadStart(String url, String userAgent,
String contentDisposition, String mimetype,
long contentLength) {
- mActivity.onDownloadStart(url, userAgent,
+ mWebViewController.onDownloadStart(Tab.this, url, userAgent,
contentDisposition, mimetype, contentLength);
if (mSubView.copyBackForwardList().getSize() == 0) {
// This subwindow was opened for the sole purpose of
// downloading a file. Remove it.
- mActivity.dismissSubWindow(Tab.this);
+ mWebViewController.dismissSubWindow(Tab.this);
}
}
});
mSubView.setOnCreateContextMenuListener(mActivity);
- final BrowserSettings s = BrowserSettings.getInstance();
- s.addObserver(mSubView.getSettings()).update(s, null);
- final ImageButton cancel = (ImageButton) mSubViewContainer
- .findViewById(R.id.subwindow_close);
- cancel.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- mSubView.getWebChromeClient().onCloseWindow(mSubView);
- }
- });
return true;
}
return false;
@@ -1497,7 +1375,7 @@
*/
void dismissSubWindow() {
if (mSubView != null) {
- mActivity.closeDialogs();
+ mWebViewController.endActionMode();
BrowserSettings.getInstance().deleteObserver(
mSubView.getSettings());
mSubView.destroy();
@@ -1506,84 +1384,6 @@
}
}
- /**
- * Attach the sub window to the content view.
- */
- void attachSubWindow(ViewGroup content) {
- if (mSubView != null) {
- content.addView(mSubViewContainer,
- BrowserActivity.COVER_SCREEN_PARAMS);
- }
- }
-
- /**
- * Remove the sub window from the content view.
- */
- void removeSubWindow(ViewGroup content) {
- if (mSubView != null) {
- content.removeView(mSubViewContainer);
- mActivity.closeDialogs();
- }
- }
-
- /**
- * This method attaches both the WebView and any sub window to the
- * given content view.
- */
- void attachTabToContentView(ViewGroup content) {
- if (mMainView == null) {
- return;
- }
-
- // Attach the WebView to the container and then attach the
- // container to the content view.
- FrameLayout wrapper =
- (FrameLayout) mContainer.findViewById(R.id.webview_wrapper);
- ViewGroup parent = (ViewGroup) mMainView.getParent();
- if (parent != wrapper) {
- if (parent != null) {
- Log.w(LOGTAG, "mMainView already has a parent in"
- + " attachTabToContentView!");
- parent.removeView(mMainView);
- }
- wrapper.addView(mMainView);
- } else {
- Log.w(LOGTAG, "mMainView is already attached to wrapper in"
- + " attachTabToContentView!");
- }
- parent = (ViewGroup) mContainer.getParent();
- if (parent != content) {
- if (parent != null) {
- Log.w(LOGTAG, "mContainer already has a parent in"
- + " attachTabToContentView!");
- parent.removeView(mContainer);
- }
- content.addView(mContainer, BrowserActivity.COVER_SCREEN_PARAMS);
- } else {
- Log.w(LOGTAG, "mContainer is already attached to content in"
- + " attachTabToContentView!");
- }
- attachSubWindow(content);
- }
-
- /**
- * Remove the WebView and any sub window from the given content view.
- */
- void removeTabFromContentView(ViewGroup content) {
- if (mMainView == null) {
- return;
- }
-
- // Remove the container from the content and then remove the
- // WebView from the container. This will trigger a focus change
- // needed by WebView.
- FrameLayout wrapper =
- (FrameLayout) mContainer.findViewById(R.id.webview_wrapper);
- wrapper.removeView(mMainView);
- content.removeView(mContainer);
- mActivity.closeDialogs();
- removeSubWindow(content);
- }
/**
* Set the parent tab of this tab.
@@ -1598,7 +1398,7 @@
if (parent == null) {
mSavedState.remove(PARENTTAB);
} else {
- mSavedState.putInt(PARENTTAB, mActivity.getTabControl()
+ mSavedState.putInt(PARENTTAB, mWebViewController.getTabControl()
.getTabIndex(parent));
}
}
@@ -1661,6 +1461,10 @@
}
}
+ boolean inForeground() {
+ return mInForeground;
+ }
+
/**
* Return the top window of this tab; either the subwindow if it is not
* null or the main window.
@@ -1683,6 +1487,27 @@
return mMainView;
}
+ void setViewContainer(View container) {
+ mContainer = container;
+ }
+
+ View getViewContainer() {
+ return mContainer;
+ }
+
+ /**
+ * Return whether private browsing is enabled for the main window of
+ * this tab.
+ * @return True if private browsing is enabled.
+ */
+ boolean isPrivateBrowsingEnabled() {
+ WebView webView = getWebView();
+ if (webView == null) {
+ return false;
+ }
+ return webView.isPrivateBrowsingEnabled();
+ }
+
/**
* Return the subwindow of this tab or null if there is no subwindow.
* @return The subwindow of this tab or null.
@@ -1691,6 +1516,18 @@
return mSubView;
}
+ void setSubWebView(WebView subView) {
+ mSubView = subView;
+ }
+
+ View getSubViewContainer() {
+ return mSubViewContainer;
+ }
+
+ void setSubViewContainer(View subViewContainer) {
+ mSubViewContainer = subViewContainer;
+ }
+
/**
* @return The geolocation permissions prompt for this tab.
*/
@@ -1735,6 +1572,28 @@
}
/**
+ * set the title for the tab
+ */
+ void setCurrentTitle(String title) {
+ mCurrentTitle = title;
+ }
+
+ /**
+ * set url for this tab
+ * @param url
+ */
+ void setCurrentUrl(String url) {
+ mCurrentUrl = url;
+ }
+
+ String getCurrentTitle() {
+ return mCurrentTitle;
+ }
+
+ String getCurrentUrl() {
+ return mCurrentUrl;
+ }
+ /**
* Get the url of this tab. Valid after calling populatePickerData, but
* before calling wipePickerData, or if the webview has been destroyed.
* @return The WebView's url or null.
@@ -1771,6 +1630,7 @@
return null;
}
+
/**
* Return the tab's error console. Creates the console if createIfNEcessary
* is true and we haven't already created the console.
@@ -1811,9 +1671,9 @@
*/
void resetLockIcon(String url) {
mPrevLockIconType = mLockIconType;
- mLockIconType = BrowserActivity.LOCK_ICON_UNSECURE;
+ mLockIconType = LOCK_ICON_UNSECURE;
if (URLUtil.isHttpsUrl(url)) {
- mLockIconType = BrowserActivity.LOCK_ICON_SECURE;
+ mLockIconType = LOCK_ICON_SECURE;
}
}
@@ -1836,14 +1696,14 @@
* @return TRUE if onPageStarted is called while onPageFinished is not
* called yet.
*/
- boolean inLoad() {
- return mInLoad;
+ boolean inPageLoad() {
+ return mInPageLoad;
}
// force mInLoad to be false. This should only be called before closing the
// tab to ensure BrowserActivity's pauseWebViewTimers() is called correctly.
- void clearInLoad() {
- mInLoad = false;
+ void clearInPageLoad() {
+ mInPageLoad = false;
}
void populatePickerData() {
@@ -1855,6 +1715,9 @@
// FIXME: The only place we cared about subwindow was for
// bookmarking (i.e. not when saving state). Was this deliberate?
final WebBackForwardList list = mMainView.copyBackForwardList();
+ if (list == null) {
+ Log.w(LOGTAG, "populatePickerData called and WebBackForwardList is null");
+ }
final WebHistoryItem item = list != null ? list.getCurrentItem() : null;
populatePickerData(item);
}
@@ -1863,7 +1726,9 @@
// WebView.
private void populatePickerData(WebHistoryItem item) {
mPickerData = new PickerData();
- if (item != null) {
+ if (item == null) {
+ Log.w(LOGTAG, "populatePickerData called with a null WebHistoryItem");
+ } else {
mPickerData.mUrl = item.getUrl();
mPickerData.mTitle = item.getTitle();
mPickerData.mFavicon = item.getFavicon();
@@ -1934,7 +1799,7 @@
}
// Remember the parent tab so the relationship can be restored.
if (mParentTab != null) {
- mSavedState.putInt(PARENTTAB, mActivity.getTabControl().getTabIndex(
+ mSavedState.putInt(PARENTTAB, mWebViewController.getTabControl().getTabIndex(
mParentTab));
}
return true;
@@ -1962,35 +1827,4 @@
return true;
}
- /*
- * Opens the find and select text dialogs. Called by BrowserActivity.
- */
- WebView showDialog(WebDialog dialog) {
- LinearLayout container;
- WebView view;
- if (mSubView != null) {
- view = mSubView;
- container = (LinearLayout) mSubViewContainer.findViewById(
- R.id.inner_container);
- } else {
- view = mMainView;
- container = mContainer;
- }
- dialog.show();
- container.addView(dialog, 0, new LinearLayout.LayoutParams(
- ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.WRAP_CONTENT));
- dialog.setWebView(view);
- return view;
- }
-
- /*
- * Close the find or select dialog. Called by BrowserActivity.closeDialog.
- */
- void closeDialog(WebDialog dialog) {
- // The dialog may be attached to the subwindow. Ensure that the
- // correct parent has it removed.
- LinearLayout parent = (LinearLayout) dialog.getParent();
- if (parent != null) parent.removeView(dialog);
- }
}
diff --git a/src/com/android/browser/TabBar.java b/src/com/android/browser/TabBar.java
new file mode 100644
index 0000000..14b1845
--- /dev/null
+++ b/src/com/android/browser/TabBar.java
@@ -0,0 +1,471 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import com.android.browser.ScrollWebView.ScrollListener;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.res.Resources;
+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.view.ContextMenu;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.MenuInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.webkit.WebView;
+import android.widget.ImageButton;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * tabbed title bar for xlarge screen browser
+ */
+public class TabBar extends LinearLayout
+ implements ScrollListener, OnClickListener {
+
+ private static final int PROGRESS_MAX = 100;
+
+ private Activity mActivity;
+ private UiController mUiController;
+ private TabControl mTabControl;
+ private BaseUi mUi;
+
+ private final int mTabWidthSelected;
+ private final int mTabWidthUnselected;
+
+ private TabScrollView mTabs;
+
+ private ImageButton mNewTab;
+ private int mButtonWidth;
+
+ private Map<Tab, TabViewData> mTabMap;
+
+ private boolean mUserRequestedUrlbar;
+ private boolean mTitleVisible;
+ private boolean mShowUrlMode;
+ private boolean mHasReceivedTitle;
+
+ private Drawable mGenericFavicon;
+ private String mLoadingText;
+
+ public TabBar(Activity activity, UiController controller, BaseUi ui) {
+ super(activity);
+ mActivity = activity;
+ mUiController = controller;
+ mTabControl = mUiController.getTabControl();
+ mUi = ui;
+ Resources res = activity.getResources();
+ mTabWidthSelected = (int) res.getDimension(R.dimen.tab_width_selected);
+ mTabWidthUnselected = (int) res.getDimension(R.dimen.tab_width_unselected);
+
+ mTabMap = new HashMap<Tab, TabViewData>();
+ Resources resources = activity.getResources();
+ LayoutInflater factory = LayoutInflater.from(activity);
+ factory.inflate(R.layout.tab_bar, this);
+ mTabs = (TabScrollView) findViewById(R.id.tabs);
+ mNewTab = (ImageButton) findViewById(R.id.newtab);
+ mNewTab.setOnClickListener(this);
+ mGenericFavicon = res.getDrawable(R.drawable.app_web_browser_sm);
+ mLoadingText = res.getString(R.string.title_bar_loading);
+
+ // TODO: Change enabled states based on whether you can go
+ // back/forward. Probably should be done inside onPageStarted.
+
+ updateTabs(mUiController.getTabs());
+
+ mUserRequestedUrlbar = false;
+ mTitleVisible = true;
+ mButtonWidth = -1;
+ }
+
+ void updateTabs(List<Tab> tabs) {
+ mTabs.clearTabs();
+ mTabMap.clear();
+ for (Tab tab : tabs) {
+ TabViewData data = buildTab(tab);
+ TabView tv = buildView(data);
+ }
+ mTabs.setSelectedTab(mTabControl.getCurrentIndex());
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ if (mButtonWidth == -1) {
+ mButtonWidth = mNewTab.getMeasuredWidth();
+ }
+ int sw = mTabs.getMeasuredWidth();
+ int w = right-left;
+ if (w-sw < mButtonWidth) {
+ sw = w - mButtonWidth;
+ }
+ mTabs.layout(0, 0, sw, bottom-top );
+ mNewTab.layout(sw, 0, sw+mButtonWidth, bottom-top);
+ }
+
+ public void onClick(View view) {
+ mUi.hideComboView();
+ if (mNewTab == view) {
+ mUiController.openTabToHomePage();
+ } else if (mTabs.getSelectedTab() == view) {
+ if (mUi.isFakeTitleBarShowing() && !isLoading()) {
+ mUi.hideFakeTitleBar();
+ } else {
+ showUrlBar();
+ }
+ } else {
+ int ix = mTabs.getChildIndex(view);
+ if (ix >= 0) {
+ mTabs.setSelectedTab(ix);
+ mUiController.switchToTab(ix);
+ }
+ }
+ }
+
+ private void showUrlBar() {
+ mUi.stopWebViewScrolling();
+ mUi.showFakeTitleBar();
+ mUserRequestedUrlbar = true;
+ }
+
+ private void setShowUrlMode(boolean showUrl) {
+ mShowUrlMode = showUrl;
+ }
+
+ // callback after fake titlebar is shown
+ void onShowTitleBar() {
+ setShowUrlMode(false);
+ }
+
+ // callback after fake titlebar is hidden
+ void onHideTitleBar() {
+ setShowUrlMode(!mTitleVisible);
+ Tab tab = mTabControl.getCurrentTab();
+ tab.getWebView().requestFocus();
+ mUserRequestedUrlbar = false;
+ }
+
+ // webview scroll listener
+
+ @Override
+ public void onScroll(boolean titleVisible) {
+ // isLoading is using the current tab, which initially might not be set yet
+ if (mTabControl.getCurrentTab() != null) {
+ mTitleVisible = titleVisible;
+ if (!mShowUrlMode && !mTitleVisible && !isLoading()) {
+ if (mUserRequestedUrlbar) {
+ mUi.hideFakeTitleBar();
+ } else {
+ setShowUrlMode(true);
+ }
+ } else if (mTitleVisible && !isLoading()) {
+ if (mShowUrlMode) {
+ setShowUrlMode(false);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void createContextMenu(ContextMenu menu) {
+ MenuInflater inflater = mActivity.getMenuInflater();
+ inflater.inflate(R.menu.title_context, menu);
+ mActivity.onCreateContextMenu(menu, this, null);
+ }
+
+ private TabViewData buildTab(Tab tab) {
+ TabViewData data = new TabViewData(tab);
+ mTabMap.put(tab, data);
+ return data;
+ }
+
+ private TabView buildView(final TabViewData data) {
+ TabView tv = new TabView(mActivity, data);
+ tv.setTag(data);
+ tv.setOnClickListener(this);
+ mTabs.addTab(tv);
+ return tv;
+ }
+
+ /**
+ * View used in the tab bar
+ */
+ class TabView extends LinearLayout implements OnClickListener {
+
+ TabViewData mTabData;
+ View mTabContent;
+ TextView mTitle;
+ View mIncognito;
+ ImageView mIconView;
+ ImageView mLock;
+ ImageView mClose;
+ boolean mSelected;
+ boolean mInLoad;
+
+ /**
+ * @param context
+ */
+ public TabView(Context context, TabViewData tab) {
+ super(context);
+ mTabData = tab;
+ setGravity(Gravity.CENTER_VERTICAL);
+ setOrientation(LinearLayout.HORIZONTAL);
+ setBackgroundResource(R.drawable.tab_background);
+ LayoutInflater inflater = LayoutInflater.from(getContext());
+ mTabContent = inflater.inflate(R.layout.tab_title, this, true);
+ mTitle = (TextView) mTabContent.findViewById(R.id.title);
+ mIconView = (ImageView) mTabContent.findViewById(R.id.favicon);
+ mLock = (ImageView) mTabContent.findViewById(R.id.lock);
+ mClose = (ImageView) mTabContent.findViewById(R.id.close);
+ mClose.setOnClickListener(this);
+ mIncognito = mTabContent.findViewById(R.id.incognito);
+ mSelected = false;
+ mInLoad = false;
+ // update the status
+ updateFromData();
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (v == mClose) {
+ closeTab();
+ }
+ }
+
+ private void updateFromData() {
+ mTabData.mTabView = this;
+ if (mTabData.mUrl != null) {
+ setDisplayTitle(mTabData.mUrl);
+ }
+ if (mTabData.mTitle != null) {
+ setDisplayTitle(mTabData.mTitle);
+ }
+ setProgress(mTabData.mProgress);
+ if (mTabData.mIcon != null) {
+ setFavicon(mTabData.mIcon);
+ }
+ if (mTabData.mLock != null) {
+ setLock(mTabData.mLock);
+ }
+ if (mTabData.mTab != null) {
+ mIncognito.setVisibility(
+ mTabData.mTab.isPrivateBrowsingEnabled() ?
+ View.VISIBLE : View.GONE);
+ }
+ }
+
+ @Override
+ public void setActivated(boolean selected) {
+ mSelected = selected;
+ mClose.setVisibility(mSelected ? View.VISIBLE : View.GONE);
+ mTitle.setTextAppearance(mActivity, mSelected ?
+ R.style.TabTitleSelected : R.style.TabTitleUnselected);
+ setHorizontalFadingEdgeEnabled(!mSelected);
+ setFadingEdgeLength(50);
+ super.setActivated(selected);
+ setLayoutParams(new LayoutParams(selected ?
+ mTabWidthSelected : mTabWidthUnselected,
+ LayoutParams.MATCH_PARENT));
+ }
+
+ void setDisplayTitle(String title) {
+ mTitle.setText(title);
+ }
+
+ void setFavicon(Drawable d) {
+ mIconView.setImageDrawable(d);
+ }
+
+ void setLock(Drawable d) {
+ if (null == d) {
+ mLock.setVisibility(View.GONE);
+ } else {
+ mLock.setImageDrawable(d);
+ mLock.setVisibility(View.VISIBLE);
+ }
+ }
+
+ void setProgress(int newProgress) {
+ if (newProgress >= PROGRESS_MAX) {
+ mInLoad = false;
+ } else {
+ if (!mInLoad && getWindowToken() != null) {
+ mInLoad = true;
+ }
+ }
+ }
+
+ private void closeTab() {
+ if (mTabData.mTab == mTabControl.getCurrentTab()) {
+ mUiController.closeCurrentTab();
+ } else {
+ mUiController.closeTab(mTabData.mTab);
+ }
+ }
+
+ }
+
+ /**
+ * Store tab state within the title bar
+ */
+ class TabViewData {
+
+ Tab mTab;
+ TabView mTabView;
+ int mProgress;
+ Drawable mIcon;
+ Drawable mLock;
+ String mTitle;
+ String mUrl;
+
+ TabViewData(Tab tab) {
+ mTab = tab;
+ WebView web = tab.getWebView();
+ if (web != null) {
+ setUrlAndTitle(web.getUrl(), web.getTitle());
+ }
+ }
+
+ void setUrlAndTitle(String url, String title) {
+ mUrl = url;
+ mTitle = title;
+ if (mTabView != null) {
+ if (title != null) {
+ mTabView.setDisplayTitle(title);
+ } else if (url != null) {
+ mTabView.setDisplayTitle(UrlUtils.stripUrl(url));
+ }
+ }
+ }
+
+ void setProgress(int newProgress) {
+ mProgress = newProgress;
+ if (mTabView != null) {
+ mTabView.setProgress(mProgress);
+ }
+ }
+
+ void setFavicon(Bitmap icon) {
+ Drawable[] array = new Drawable[3];
+ array[0] = new PaintDrawable(Color.BLACK);
+ array[1] = new PaintDrawable(Color.WHITE);
+ 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);
+ mIcon = d;
+ if (mTabView != null) {
+ mTabView.setFavicon(mIcon);
+ }
+ }
+
+ }
+
+ // TabChangeListener implementation
+
+ public void onSetActiveTab(Tab tab) {
+ mTabs.setSelectedTab(mTabControl.getTabIndex(tab));
+ TabViewData tvd = mTabMap.get(tab);
+ if (tvd != null) {
+ tvd.setProgress(tvd.mProgress);
+ // update the scroll state
+ WebView webview = tab.getWebView();
+ onScroll(webview.getVisibleTitleHeight() > 0);
+ }
+ }
+
+ public void onFavicon(Tab tab, Bitmap favicon) {
+ TabViewData tvd = mTabMap.get(tab);
+ if (tvd != null) {
+ tvd.setFavicon(favicon);
+ }
+ }
+
+ public void onNewTab(Tab tab) {
+ TabViewData tvd = buildTab(tab);
+ buildView(tvd);
+ }
+
+ public void onProgress(Tab tab, int progress) {
+ TabViewData tvd = mTabMap.get(tab);
+ if (tvd != null) {
+ tvd.setProgress(progress);
+ }
+ }
+
+ public void onRemoveTab(Tab tab) {
+ TabViewData tvd = mTabMap.get(tab);
+ if (tvd != null) {
+ TabView tv = tvd.mTabView;
+ if (tv != null) {
+ mTabs.removeTab(tv);
+ }
+ }
+ mTabMap.remove(tab);
+ }
+
+ public void onUrlAndTitle(Tab tab, String url, String title) {
+ mHasReceivedTitle = true;
+ TabViewData tvd = mTabMap.get(tab);
+ if (tvd != null) {
+ tvd.setUrlAndTitle(url, title);
+ }
+ }
+
+ public void onPageFinished(Tab tab) {
+ if (!mHasReceivedTitle) {
+ TabViewData tvd = mTabMap.get(tab);
+ if (tvd != null) {
+ tvd.setUrlAndTitle(tvd.mUrl, null);
+ }
+ }
+ }
+
+ public void onPageStarted(Tab tab, String url, Bitmap favicon) {
+ mHasReceivedTitle = false;
+ TabViewData tvd = mTabMap.get(tab);
+ if (tvd != null) {
+ tvd.setFavicon(favicon);
+ tvd.setUrlAndTitle(url, mLoadingText);
+ }
+ }
+
+ private boolean isLoading() {
+ TabViewData tvd = mTabMap.get(mTabControl.getCurrentTab());
+ if ((tvd != null) && (tvd.mTabView != null)) {
+ return tvd.mTabView.mInLoad;
+ } else {
+ return false;
+ }
+ }
+
+}
diff --git a/src/com/android/browser/TabControl.java b/src/com/android/browser/TabControl.java
index afd4ea8..9e669ce 100644
--- a/src/com/android/browser/TabControl.java
+++ b/src/com/android/browser/TabControl.java
@@ -16,57 +16,51 @@
package com.android.browser;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.BitmapShader;
-import android.graphics.Paint;
-import android.graphics.Shader;
+import com.android.browser.IntentHandler.UrlData;
+
import android.os.Bundle;
import android.util.Log;
-import android.view.View;
import android.webkit.WebBackForwardList;
import android.webkit.WebView;
import java.io.File;
import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
import java.util.Vector;
class TabControl {
// Log Tag
private static final String LOGTAG = "TabControl";
// Maximum number of tabs.
- private static final int MAX_TABS = 8;
+ private int mMaxTabs;
// Private array of WebViews that are used as tabs.
- private ArrayList<Tab> mTabs = new ArrayList<Tab>(MAX_TABS);
+ private ArrayList<Tab> mTabs;
// Queue of most recently viewed tabs.
- private ArrayList<Tab> mTabQueue = new ArrayList<Tab>(MAX_TABS);
+ private ArrayList<Tab> mTabQueue;
// Current position in mTabs.
private int mCurrentTab = -1;
- // A private instance of BrowserActivity to interface with when adding and
- // switching between tabs.
- private final BrowserActivity mActivity;
- // Directory to store thumbnails for each WebView.
+ // the main browser controller
+ private final Controller mController;
+
private final File mThumbnailDir;
/**
- * Construct a new TabControl object that interfaces with the given
- * BrowserActivity instance.
- * @param activity A BrowserActivity instance that TabControl will interface
- * with.
+ * Construct a new TabControl object
*/
- TabControl(BrowserActivity activity) {
- mActivity = activity;
- mThumbnailDir = activity.getDir("thumbnails", 0);
+ TabControl(Controller controller) {
+ mController = controller;
+ mThumbnailDir = mController.getActivity()
+ .getDir("thumbnails", 0);
+ mMaxTabs = mController.getMaxTabs();
+ mTabs = new ArrayList<Tab>(mMaxTabs);
+ mTabQueue = new ArrayList<Tab>(mMaxTabs);
}
File getThumbnailDir() {
return mThumbnailDir;
}
- BrowserActivity getBrowserActivity() {
- return mActivity;
- }
-
/**
* Return the current tab's main WebView. This will always return the main
* WebView for a given tab and not a subwindow.
@@ -106,6 +100,13 @@
}
/**
+ * return the list of tabs
+ */
+ List<Tab> getTabs() {
+ return mTabs;
+ }
+
+ /**
* Return the tab at the specified index.
* @return The Tab for the specified index or null if the tab does not
* exist.
@@ -132,7 +133,7 @@
int getCurrentIndex() {
return mCurrentTab;
}
-
+
/**
* Given a Tab, find it's index
* @param Tab to find
@@ -146,7 +147,20 @@
}
boolean canCreateNewTab() {
- return MAX_TABS != mTabs.size();
+ return mMaxTabs != mTabs.size();
+ }
+
+ /**
+ * Returns true if there are any incognito tabs open.
+ * @return True when any incognito tabs are open, false otherwise.
+ */
+ boolean hasAnyOpenIncognitoTabs() {
+ for (Tab tab : mTabs) {
+ if (tab.getWebView() != null && tab.getWebView().isPrivateBrowsingEnabled()) {
+ return true;
+ }
+ }
+ return false;
}
/**
@@ -154,16 +168,17 @@
* @return The newly createTab or null if we have reached the maximum
* number of open tabs.
*/
- Tab createNewTab(boolean closeOnExit, String appId, String url) {
+ Tab createNewTab(boolean closeOnExit, String appId, String url,
+ boolean privateBrowsing) {
int size = mTabs.size();
// Return false if we have maxed out on tabs
- if (MAX_TABS == size) {
+ if (mMaxTabs == size) {
return null;
}
- final WebView w = createNewWebView();
+ final WebView w = createNewWebView(privateBrowsing);
// Create a new tab and add it to the tab list
- Tab t = new Tab(mActivity, w, closeOnExit, appId, url);
+ Tab t = new Tab(mController, w, closeOnExit, appId, url);
mTabs.add(t);
// Initially put the tab in the background.
t.putInBackground();
@@ -172,10 +187,10 @@
/**
* Create a new tab with default values for closeOnExit(false),
- * appId(null), and url(null).
+ * appId(null), url(null), and privateBrowsing(false).
*/
Tab createNewTab() {
- return createNewTab(false, null, null);
+ return createNewTab(false, null, null, false);
}
/**
@@ -274,32 +289,65 @@
/**
* Restore the state of all the tabs.
* @param inState The saved state of all the tabs.
+ * @param restoreIncognitoTabs Restoring private browsing tabs
+ * @param restoreAll All webviews get restored, not just the current tab
+ * (this does not override handling of incognito tabs)
* @return True if there were previous tabs that were restored. False if
* there was no saved state or restoring the state failed.
*/
- boolean restoreState(Bundle inState) {
+ boolean restoreState(Bundle inState, boolean restoreIncognitoTabs,
+ boolean restoreAll) {
final int numTabs = (inState == null)
? -1 : inState.getInt(Tab.NUMTABS, -1);
if (numTabs == -1) {
return false;
} else {
- final int currentTab = inState.getInt(Tab.CURRTAB, -1);
+ final int oldCurrentTab = inState.getInt(Tab.CURRTAB, -1);
+
+ // Determine whether the saved current tab can be restored, and
+ // if not, which tab will take its place.
+ int currentTab = -1;
+ if (restoreIncognitoTabs
+ || !inState.getBundle(Tab.WEBVIEW + oldCurrentTab).getBoolean(Tab.INCOGNITO)) {
+ currentTab = oldCurrentTab;
+ } else {
+ for (int i = 0; i < numTabs; i++) {
+ if (!inState.getBundle(Tab.WEBVIEW + i).getBoolean(Tab.INCOGNITO)) {
+ currentTab = i;
+ break;
+ }
+ }
+ }
+ if (currentTab < 0) {
+ return false;
+ }
+
+ // Map saved tab indices to new indices, in case any incognito tabs
+ // need to not be restored.
+ HashMap<Integer, Integer> originalTabIndices = new HashMap<Integer, Integer>();
+ originalTabIndices.put(-1, -1);
for (int i = 0; i < numTabs; i++) {
- if (i == currentTab) {
+ Bundle state = inState.getBundle(Tab.WEBVIEW + i);
+
+ if (!restoreIncognitoTabs && state != null && state.getBoolean(Tab.INCOGNITO)) {
+ originalTabIndices.put(i, -1);
+ } else if (i == currentTab || restoreAll) {
Tab t = createNewTab();
// Me must set the current tab before restoring the state
// so that all the client classes are set.
- setCurrentTab(t);
- if (!t.restoreState(inState.getBundle(Tab.WEBVIEW + i))) {
+ if (i == currentTab) {
+ setCurrentTab(t);
+ }
+ if (!t.restoreState(state)) {
Log.w(LOGTAG, "Fail in restoreState, load home page.");
t.getWebView().loadUrl(BrowserSettings.getInstance()
.getHomePage());
}
+ originalTabIndices.put(i, getTabCount() - 1);
} else {
// Create a new tab and don't restore the state yet, add it
// to the tab list
- Tab t = new Tab(mActivity, null, false, null, null);
- Bundle state = inState.getBundle(Tab.WEBVIEW + i);
+ Tab t = new Tab(mController, null, false, null, null);
if (state != null) {
t.setSavedState(state);
t.populatePickerDataFromSavedState();
@@ -311,15 +359,17 @@
mTabs.add(t);
// added the tab to the front as they are not current
mTabQueue.add(0, t);
+ originalTabIndices.put(i, getTabCount() - 1);
}
}
+
// Rebuild the tree of tabs. Do this after all tabs have been
// created/restored so that the parent tab exists.
for (int i = 0; i < numTabs; i++) {
final Bundle b = inState.getBundle(Tab.WEBVIEW + i);
final Tab t = getTab(i);
if (b != null && t != null) {
- final int parentIndex = b.getInt(Tab.PARENTTAB, -1);
+ final Integer parentIndex = originalTabIndices.get(b.getInt(Tab.PARENTTAB, -1));
if (parentIndex != -1) {
final Tab parent = getTab(parentIndex);
if (parent != null) {
@@ -491,7 +541,7 @@
* requires a load, whether it was due to the fact that it was deleted, or
* it is because it was a voice search.
*/
- boolean recreateWebView(Tab t, BrowserActivity.UrlData urlData) {
+ boolean recreateWebView(Tab t, UrlData urlData) {
final String url = urlData.mUrl;
final WebView w = t.getWebView();
if (w != null) {
@@ -529,30 +579,16 @@
* Creates a new WebView and registers it with the global settings.
*/
private WebView createNewWebView() {
- // Create a new WebView
- WebView w = new WebView(mActivity);
- w.setScrollbarFadingEnabled(true);
- w.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);
- w.setMapTrackballToArrowKeys(false); // use trackball directly
- // Enable the built-in zoom
- w.getSettings().setBuiltInZoomControls(true);
- // Add this WebView to the settings observer list and update the
- // settings
- final BrowserSettings s = BrowserSettings.getInstance();
- s.addObserver(w.getSettings()).update(s, null);
+ return createNewWebView(false);
+ }
- // pick a default
- if (false) {
- MeshTracker mt = new MeshTracker(2);
- Paint paint = new Paint();
- Bitmap bm = BitmapFactory.decodeResource(mActivity.getResources(),
- R.drawable.pattern_carbon_fiber_dark);
- paint.setShader(new BitmapShader(bm, Shader.TileMode.REPEAT,
- Shader.TileMode.REPEAT));
- mt.setBGPaint(paint);
- w.setDragTracker(mt);
- }
- return w;
+ /**
+ * Creates a new WebView and registers it with the global settings.
+ * @param privateBrowsing When true, enables private browsing in the new
+ * WebView.
+ */
+ private WebView createNewWebView(boolean privateBrowsing) {
+ return mController.getWebViewFactory().createWebView(privateBrowsing);
}
/**
@@ -564,20 +600,6 @@
return setCurrentTab(newTab, false);
}
- void pauseCurrentTab() {
- Tab t = getCurrentTab();
- if (t != null) {
- t.pause();
- }
- }
-
- void resumeCurrentTab() {
- Tab t = getCurrentTab();
- if (t != null) {
- t.resume();
- }
- }
-
/**
* If force is true, this method skips the check for newTab == current.
*/
@@ -619,4 +641,5 @@
}
return true;
}
+
}
diff --git a/src/com/android/browser/TabScrollView.java b/src/com/android/browser/TabScrollView.java
new file mode 100644
index 0000000..fbb40aa
--- /dev/null
+++ b/src/com/android/browser/TabScrollView.java
@@ -0,0 +1,214 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.browser;
+
+import android.animation.Animator;
+import android.animation.Animator.AnimatorListener;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ObjectAnimator;
+import android.animation.PropertyValuesHolder;
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.animation.AccelerateInterpolator;
+import android.widget.HorizontalScrollView;
+import android.widget.LinearLayout;
+
+/**
+ * custom view for displaying tabs in the tabbed title bar
+ */
+public class TabScrollView extends HorizontalScrollView {
+
+ private Context mContext;
+ private LinearLayout mContentView;
+ private int mSelected;
+ private Drawable mArrowLeft;
+ private Drawable mArrowRight;
+ private int mAnimationDuration;
+
+ /**
+ * @param context
+ * @param attrs
+ * @param defStyle
+ */
+ public TabScrollView(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ init(context);
+ }
+
+ /**
+ * @param context
+ * @param attrs
+ */
+ public TabScrollView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ init(context);
+ }
+
+ /**
+ * @param context
+ */
+ public TabScrollView(Context context) {
+ super(context);
+ init(context);
+ }
+
+ private void init(Context ctx) {
+ mContext = ctx;
+ mAnimationDuration = ctx.getResources().getInteger(
+ R.integer.tab_animation_duration);
+ setHorizontalScrollBarEnabled(false);
+ mContentView = new LinearLayout(mContext);
+ mContentView.setOrientation(LinearLayout.HORIZONTAL);
+ mContentView.setLayoutParams(
+ new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT));
+ addView(mContentView);
+ mSelected = -1;
+ mArrowLeft = ctx.getResources().getDrawable(R.drawable.ic_arrow_left);
+ mArrowRight = ctx.getResources().getDrawable(R.drawable.ic_arrow_right);
+ // prevent ProGuard from removing the property methods
+ setScroll(getScroll());
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ super.onLayout(changed, left, top, right, bottom);
+ ensureChildVisible(getSelectedTab());
+ }
+
+ void setSelectedTab(int position) {
+ View v = getSelectedTab();
+ if (v != null) {
+ v.setActivated(false);
+ }
+ mSelected = position;
+ v = getSelectedTab();
+ if (v != null) {
+ v.setActivated(true);
+ }
+ requestLayout();
+ }
+
+ int getChildIndex(View v) {
+ return mContentView.indexOfChild(v);
+ }
+
+ View getSelectedTab() {
+ if ((mSelected >= 0) && (mSelected < mContentView.getChildCount())) {
+ return mContentView.getChildAt(mSelected);
+ } else {
+ return null;
+ }
+ }
+
+ void clearTabs() {
+ mContentView.removeAllViews();
+ }
+
+ void addTab(View tab) {
+ mContentView.addView(tab);
+ animateIn(tab);
+ tab.setActivated(false);
+ }
+
+ void removeTab(View tab) {
+ int ix = mContentView.indexOfChild(tab);
+ if (ix == mSelected) {
+ mSelected = -1;
+ } else if (ix < mSelected) {
+ mSelected--;
+ }
+ animateOut(tab);
+ }
+
+ private void ensureChildVisible(View child) {
+ if (child != null) {
+ int childl = child.getLeft();
+ int childr = childl + child.getWidth();
+ int viewl = getScrollX();
+ int viewr = viewl + getWidth();
+ if (childl < viewl) {
+ // need scrolling to left
+ animateScroll(childl);
+ } else if (childr > viewr) {
+ // need scrolling to right
+ animateScroll(childr - viewr + viewl);
+ }
+ }
+ }
+
+ @Override
+ protected void dispatchDraw(Canvas canvas) {
+ super.dispatchDraw(canvas);
+ int l = getScrollX();
+ int r = l + getWidth();
+ int dis = 8;
+ if (l > 0) {
+ int aw = mArrowLeft.getIntrinsicWidth();
+ mArrowLeft.setBounds(l + dis, 0, l + dis + aw, getHeight());
+ mArrowLeft.draw(canvas);
+ }
+ if (r < mContentView.getWidth()) {
+ int aw = mArrowRight.getIntrinsicWidth();
+ mArrowRight.setBounds(r - dis - aw, 0, r - dis, getHeight());
+ mArrowRight.draw(canvas);
+ }
+ }
+
+ private void animateIn(View tab) {
+ ObjectAnimator animator = ObjectAnimator.ofInt(tab, "TranslationX", 500, 0);
+ animator.setDuration(mAnimationDuration);
+ animator.start();
+ }
+
+ private void animateOut(final View tab) {
+ ObjectAnimator animator = ObjectAnimator.ofInt(
+ tab, "TranslationX", 0, getScrollX() - tab.getRight());
+ animator.setDuration(mAnimationDuration);
+ animator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ mContentView.removeView(tab);
+ }
+ });
+ animator.setInterpolator(new AccelerateInterpolator());
+ animator.start();
+ }
+
+ private void animateScroll(int newscroll) {
+ ObjectAnimator animator = ObjectAnimator.ofInt(this, "scroll", getScrollX(), newscroll);
+ animator.setDuration(mAnimationDuration);
+ animator.start();
+ }
+
+ /**
+ * required for animation
+ */
+ public void setScroll(int newscroll) {
+ scrollTo(newscroll, getScrollY());
+ }
+
+ /**
+ * required for animation
+ */
+ public int getScroll() {
+ return getScrollX();
+ }
+
+}
diff --git a/src/com/android/browser/TitleBar.java b/src/com/android/browser/TitleBar.java
index dc4979b..bdef82e 100644
--- a/src/com/android/browser/TitleBar.java
+++ b/src/com/android/browser/TitleBar.java
@@ -16,19 +16,15 @@
package com.android.browser;
-import android.content.Context;
+import com.android.common.speech.LoggingEvents;
+
+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.Bitmap;
-import android.graphics.Color;
-import android.graphics.Rect;
import android.graphics.drawable.Animatable;
-import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
-import android.graphics.drawable.LayerDrawable;
-import android.graphics.drawable.PaintDrawable;
import android.os.Handler;
import android.os.Message;
import android.speech.RecognizerIntent;
@@ -45,50 +41,45 @@
import android.view.View;
import android.view.ViewConfiguration;
import android.widget.ImageView;
-import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
-import com.android.common.speech.LoggingEvents;
-
/**
* This class represents a title bar for a particular "tab" or "window" in the
* browser.
*/
-public class TitleBar extends LinearLayout {
- private TextView mTitle;
- private Drawable mCloseDrawable;
- private ImageView mRtButton;
- private Drawable mCircularProgress;
- private ProgressBar mHorizontalProgress;
- private ImageView mFavicon;
- private ImageView mLockIcon;
- private ImageView mStopButton;
- private Drawable mBookmarkDrawable;
- private Drawable mVoiceDrawable;
- private boolean mInLoad;
- private BrowserActivity mBrowserActivity;
- private Drawable mGenericFavicon;
- private int mIconDimension;
- private View mTitleBg;
- private MyHandler mHandler;
- private Intent mVoiceSearchIntent;
- private boolean mInVoiceMode;
- private Drawable mVoiceModeBackground;
- private Drawable mNormalBackground;
- private Drawable mLoadingBackground;
- private ImageSpan mArcsSpan;
- private int mLeftMargin;
- private int mRightMargin;
+public class TitleBar extends TitleBarBase {
+
+ private Activity mActivity;
+ private UiController mController;
+ private TextView mTitle;
+ private ImageView mRtButton;
+ private Drawable mCircularProgress;
+ private ProgressBar mHorizontalProgress;
+ private ImageView mStopButton;
+ private Drawable mBookmarkDrawable;
+ private Drawable mVoiceDrawable;
+ private boolean mInLoad;
+ private View mTitleBg;
+ private MyHandler mHandler;
+ private Intent mVoiceSearchIntent;
+ private boolean mInVoiceMode;
+ private Drawable mVoiceModeBackground;
+ private Drawable mNormalBackground;
+ private Drawable mLoadingBackground;
+ private ImageSpan mArcsSpan;
+ private int mLeftMargin;
+ private int mRightMargin;
private static int LONG_PRESS = 1;
- public TitleBar(BrowserActivity context) {
- super(context, null);
+ public TitleBar(Activity activity, UiController controller) {
+ super(activity);
mHandler = new MyHandler();
- LayoutInflater factory = LayoutInflater.from(context);
+ LayoutInflater factory = LayoutInflater.from(activity);
factory.inflate(R.layout.title_bar, this);
- mBrowserActivity = context;
+ mActivity = activity;
+ mController = controller;
mTitle = (TextView) findViewById(R.id.title);
mTitle.setCompoundDrawablePadding(5);
@@ -99,21 +90,19 @@
mStopButton = (ImageView) findViewById(R.id.stop);
mRtButton = (ImageView) findViewById(R.id.rt_btn);
- Resources resources = context.getResources();
- mCircularProgress = (Drawable) resources.getDrawable(
+ Resources resources = activity.getResources();
+ mCircularProgress = resources.getDrawable(
com.android.internal.R.drawable.search_spinner);
DisplayMetrics metrics = resources.getDisplayMetrics();
mLeftMargin = (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 8f, metrics);
mRightMargin = (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 6f, metrics);
- mIconDimension = (int) TypedValue.applyDimension(
+ int iconDimension = (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 20f, metrics);
- mCircularProgress.setBounds(0, 0, mIconDimension, mIconDimension);
+ mCircularProgress.setBounds(0, 0, iconDimension, iconDimension);
mHorizontalProgress = (ProgressBar) findViewById(
R.id.progress_horizontal);
- mGenericFavicon = context.getResources().getDrawable(
- R.drawable.app_web_browser_sm);
mVoiceSearchIntent = new Intent(RecognizerIntent.ACTION_WEB_SEARCH);
mVoiceSearchIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH);
@@ -121,8 +110,9 @@
// results intent - http://b/2546173
//
// TODO: Make a constant for this extra.
- mVoiceSearchIntent.putExtra("android.speech.extras.SEND_APPLICATION_ID_EXTRA", false);
- PackageManager pm = context.getPackageManager();
+ mVoiceSearchIntent.putExtra("android.speech.extras.SEND_APPLICATION_ID_EXTRA",
+ false);
+ PackageManager pm = activity.getPackageManager();
ResolveInfo ri = pm.resolveActivity(mVoiceSearchIntent,
PackageManager.MATCH_DEFAULT_ONLY);
if (ri == null) {
@@ -136,11 +126,12 @@
R.drawable.title_voice);
mNormalBackground = mTitleBg.getBackground();
mLoadingBackground = resources.getDrawable(R.drawable.title_loading);
- mArcsSpan = new ImageSpan(context, R.drawable.arcs,
+ mArcsSpan = new ImageSpan(activity, R.drawable.arcs,
ImageSpan.ALIGN_BASELINE);
}
private class MyHandler extends Handler {
+ @Override
public void handleMessage(Message msg) {
if (msg.what == LONG_PRESS) {
// Prevent the normal action from happening by setting the title
@@ -149,16 +140,20 @@
// Need to call a special method on BrowserActivity for when the
// fake title bar is up, because its ViewGroup does not show a
// context menu.
- mBrowserActivity.showTitleBarContextMenu();
+ // TODO:
+ // this test is not valid for all UIs; fix later
+ if (getParent() != null) {
+ mActivity.openContextMenu(TitleBar.this);
+ }
}
}
};
@Override
public void createContextMenu(ContextMenu menu) {
- MenuInflater inflater = mBrowserActivity.getMenuInflater();
+ MenuInflater inflater = mActivity.getMenuInflater();
inflater.inflate(R.menu.title_context, menu);
- mBrowserActivity.onCreateContextMenu(menu, this, null);
+ mActivity.onCreateContextMenu(menu, this, null);
}
@Override
@@ -179,7 +174,7 @@
}
break;
case MotionEvent.ACTION_MOVE:
- int slop = ViewConfiguration.get(mBrowserActivity)
+ int slop = ViewConfiguration.get(mActivity)
.getScaledTouchSlop();
if ((int) event.getY() > getHeight() + slop) {
// We only trigger the actions in ACTION_UP if one or the
@@ -207,36 +202,37 @@
case MotionEvent.ACTION_UP:
if (button.isPressed()) {
if (mInVoiceMode) {
- if (mBrowserActivity.getTabControl().getCurrentTab()
+ if (mController.getTabControl().getCurrentTab()
.voiceSearchSourceIsGoogle()) {
Intent i = new Intent(
LoggingEvents.ACTION_LOG_EVENT);
i.putExtra(LoggingEvents.EXTRA_EVENT,
LoggingEvents.VoiceSearch.RETRY);
- mBrowserActivity.sendBroadcast(i);
+ mActivity.sendBroadcast(i);
}
- mBrowserActivity.startActivity(mVoiceSearchIntent);
+ mActivity.startActivity(mVoiceSearchIntent);
} else if (mInLoad) {
- mBrowserActivity.stopLoading();
+ mController.stopLoading();
} else {
- mBrowserActivity.bookmarksOrHistoryPicker(false);
+ mController.bookmarkCurrentPage(
+ AddBookmarkPage.DEFAULT_FOLDER_ID);
}
button.setPressed(false);
} else if (mTitleBg.isPressed()) {
mHandler.removeMessages(LONG_PRESS);
if (mInVoiceMode) {
- if (mBrowserActivity.getTabControl().getCurrentTab()
+ if (mController.getTabControl().getCurrentTab()
.voiceSearchSourceIsGoogle()) {
Intent i = new Intent(
LoggingEvents.ACTION_LOG_EVENT);
i.putExtra(LoggingEvents.EXTRA_EVENT,
LoggingEvents.VoiceSearch.N_BEST_REVEAL);
- mBrowserActivity.sendBroadcast(i);
+ mActivity.sendBroadcast(i);
}
- mBrowserActivity.showVoiceSearchResults(
+ mController.showVoiceSearchResults(
mTitle.getText().toString().trim());
} else {
- mBrowserActivity.editUrl();
+ mController.editUrl();
}
mTitleBg.setPressed(false);
}
@@ -248,29 +244,11 @@
}
/**
- * Set a new Bitmap for the Favicon.
- */
- /* package */ void setFavicon(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);
- mFavicon.setImageDrawable(d);
- }
-
- /**
* 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.
*/
- /* package */ void setInVoiceMode(boolean inVoiceMode) {
+ @Override
+ void setInVoiceMode(boolean inVoiceMode) {
if (mInVoiceMode == inVoiceMode) return;
mInVoiceMode = inVoiceMode && mVoiceSearchIntent != null;
Drawable titleDrawable;
@@ -302,21 +280,10 @@
}
/**
- * Set the Drawable for the lock icon, or null to hide it.
- */
- /* package */ void setLock(Drawable d) {
- if (null == d) {
- mLockIcon.setVisibility(View.GONE);
- } else {
- mLockIcon.setImageDrawable(d);
- mLockIcon.setVisibility(View.VISIBLE);
- }
- }
-
- /**
* Update the progress, from 0 to 100.
*/
- /* package */ void setProgress(int newProgress) {
+ @Override
+ void setProgress(int newProgress) {
if (newProgress >= mHorizontalProgress.getMax()) {
mTitle.setCompoundDrawables(null, null, null, null);
((Animatable) mCircularProgress).stop();
@@ -353,12 +320,13 @@
/**
* Update the text displayed in the title bar.
- * @param title String to display. If null, the loading string will be
+ * @param title String to display. If null, the new tab string will be
* shown.
*/
- /* package */ void setDisplayTitle(String title) {
+ @Override
+ void setDisplayTitle(String title) {
if (title == null) {
- mTitle.setText(R.string.title_bar_loading);
+ mTitle.setText(R.string.new_tab);
} else {
if (mInVoiceMode) {
// Add two spaces. The second one will be replaced with an
@@ -374,11 +342,4 @@
}
}
}
-
- /* package */ void setToTabPicker() {
- mTitle.setText(R.string.tab_picker_title);
- setFavicon(null);
- setLock(null);
- mHorizontalProgress.setVisibility(View.GONE);
- }
}
diff --git a/src/com/android/browser/TitleBarBase.java b/src/com/android/browser/TitleBarBase.java
new file mode 100644
index 0000000..7016dc0
--- /dev/null
+++ b/src/com/android/browser/TitleBarBase.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import android.content.Context;
+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.view.View;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+
+/**
+ * Base class for a title bar used by the browser.
+ */
+public class TitleBarBase extends LinearLayout {
+ // These need to be set by the subclass.
+ protected ImageView mFavicon;
+ protected ImageView mLockIcon;
+
+ protected Drawable mGenericFavicon;
+
+ public TitleBarBase(Context context) {
+ super(context, null);
+ mGenericFavicon = context.getResources().getDrawable(
+ R.drawable.app_web_browser_sm);
+ }
+
+ /* package */ void setProgress(int newProgress) {}
+ /* package */ void setDisplayTitle(String title) {}
+
+ /* package */ void setLock(Drawable d) {
+ assert mLockIcon != null;
+ if (null == d) {
+ mLockIcon.setVisibility(View.GONE);
+ } else {
+ mLockIcon.setImageDrawable(d);
+ mLockIcon.setVisibility(View.VISIBLE);
+ }
+ }
+
+ /* package */ void setFavicon(Bitmap icon) {
+ 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) {}
+
+}
diff --git a/src/com/android/browser/TitleBarXLarge.java b/src/com/android/browser/TitleBarXLarge.java
new file mode 100644
index 0000000..cd3b230
--- /dev/null
+++ b/src/com/android/browser/TitleBarXLarge.java
@@ -0,0 +1,267 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import com.android.browser.UrlInputView.UrlInputListener;
+
+import android.app.Activity;
+import android.app.SearchManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.drawable.Drawable;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.CheckBox;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+/**
+ * tabbed title bar for xlarge screen browser
+ */
+public class TitleBarXLarge extends TitleBarBase
+ implements UrlInputListener, OnClickListener {
+
+ private static final int PROGRESS_MAX = 100;
+
+ private UiController mUiController;
+
+ private Drawable mStopDrawable;
+ private Drawable mReloadDrawable;
+
+ private View mContainer;
+ private View mBackButton;
+ private View mForwardButton;
+ private CheckBox mStar;
+ private View mSearchButton;
+ private View mFocusContainer;
+ private View mUnfocusContainer;
+ private View mGoButton;
+ private ImageView mStopButton;
+ private View mAllButton;
+ private View mClearButton;
+ private PageProgressView mProgressView;
+ private UrlInputView mUrlFocused;
+ private TextView mUrlUnfocused;
+ private boolean mInLoad;
+
+ public TitleBarXLarge(Activity activity, UiController controller) {
+ super(activity);
+ mUiController = controller;
+ Resources resources = activity.getResources();
+ mStopDrawable = resources.getDrawable(R.drawable.ic_stop_normal);
+ mReloadDrawable = resources.getDrawable(R.drawable.ic_refresh_normal);
+ rebuildLayout(activity, true);
+ }
+
+ private void rebuildLayout(Context context, boolean rebuildData) {
+ LayoutInflater factory = LayoutInflater.from(context);
+ factory.inflate(R.layout.url_bar, this);
+
+ mContainer = findViewById(R.id.taburlbar);
+ mUrlFocused = (UrlInputView) findViewById(R.id.url_focused);
+ mUrlUnfocused = (TextView) findViewById(R.id.url_unfocused);
+ mAllButton = findViewById(R.id.all_btn);
+ // TODO: Change enabled states based on whether you can go
+ // back/forward. Probably should be done inside onPageStarted.
+ mBackButton = findViewById(R.id.back);
+ mForwardButton = findViewById(R.id.forward);
+ mStar = (CheckBox) findViewById(R.id.star);
+ mStopButton = (ImageView) findViewById(R.id.stop);
+ mSearchButton = findViewById(R.id.search);
+ mLockIcon = (ImageView) findViewById(R.id.lock);
+ mGoButton = findViewById(R.id.go);
+ mClearButton = findViewById(R.id.clear);
+ mProgressView = (PageProgressView) findViewById(R.id.progress);
+ mFocusContainer = findViewById(R.id.urlbar_focused);
+ mUnfocusContainer = findViewById(R.id.urlbar_unfocused);
+
+ mBackButton.setOnClickListener(this);
+ mForwardButton.setOnClickListener(this);
+ mStar.setOnClickListener(this);
+ mAllButton.setOnClickListener(this);
+ mStopButton.setOnClickListener(this);
+ mSearchButton.setOnClickListener(this);
+ mGoButton.setOnClickListener(this);
+ mClearButton.setOnClickListener(this);
+ mUrlFocused.setUrlInputListener(this);
+ mUrlFocused.setContainer(mFocusContainer);
+ mUrlFocused.setController(mUiController);
+ mUnfocusContainer.setOnClickListener(this);
+ }
+
+ public void setCurrentUrlIsBookmark(boolean isBookmark) {
+ mStar.setChecked(isBookmark);
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (mUnfocusContainer == v) {
+ setUrlMode(true);
+ } else if (mBackButton == v) {
+ mUiController.getCurrentTopWebView().goBack();
+ } else if (mForwardButton == v) {
+ mUiController.getCurrentTopWebView().goForward();
+ } else if (mStar == v) {
+ mUiController.bookmarkCurrentPage(
+ AddBookmarkPage.DEFAULT_FOLDER_ID);
+ } else if (mAllButton == v) {
+ mUiController.bookmarksOrHistoryPicker(false);
+ } else if (mSearchButton == v) {
+ search();
+ } else if (mStopButton == v) {
+ stopOrRefresh();
+ } else if (mGoButton == v) {
+ if (!TextUtils.isEmpty(mUrlFocused.getText())) {
+ onAction(mUrlFocused.getText().toString(), null);
+ }
+ } else if (mClearButton == v) {
+ mUrlFocused.setText("");
+ }
+ }
+
+ int getHeightWithoutProgress() {
+ return mContainer.getHeight();
+ }
+
+ @Override
+ void setFavicon(Bitmap icon) { }
+
+ // UrlInputListener implementation
+
+ @Override
+ public void onAction(String text, String extra) {
+ mUiController.getCurrentTopWebView().requestFocus();
+ ((BaseUi) mUiController.getUi()).hideFakeTitleBar();
+ Intent i = new Intent();
+ i.setAction(Intent.ACTION_SEARCH);
+ i.putExtra(SearchManager.QUERY, text);
+ if (extra != null) {
+ i.putExtra(SearchManager.EXTRA_DATA_KEY, extra);
+ }
+ mUiController.handleNewIntent(i);
+ setUrlMode(false);
+ setDisplayTitle(text);
+ }
+
+ @Override
+ public void onDismiss() {
+ mUiController.getCurrentTopWebView().requestFocus();
+ ((BaseUi) mUiController.getUi()).hideFakeTitleBar();
+ setUrlMode(false);
+ setDisplayTitle(mUiController.getCurrentWebView().getUrl());
+ }
+
+ @Override
+ public void onEdit(String text) {
+ setDisplayTitle(text, true);
+ if (text != null) {
+ mUrlFocused.setSelection(text.length());
+ }
+ }
+
+ private void setUrlMode(boolean focused) {
+ swapUrlContainer(focused);
+ if (focused) {
+ mUrlFocused.selectAll();
+ mUrlFocused.requestFocus();
+ mUrlFocused.setDropDownWidth(mUnfocusContainer.getWidth());
+ mUrlFocused.setDropDownHorizontalOffset(-mUrlFocused.getLeft());
+ mSearchButton.setVisibility(View.GONE);
+ mGoButton.setVisibility(View.VISIBLE);
+ } else {
+ mSearchButton.setVisibility(View.VISIBLE);
+ mGoButton.setVisibility(View.GONE);
+ }
+ }
+
+ private void swapUrlContainer(boolean focus) {
+ mUnfocusContainer.setVisibility(focus ? View.GONE : View.VISIBLE);
+ mFocusContainer.setVisibility(focus ? View.VISIBLE : View.GONE);
+ }
+
+ private void search() {
+ setDisplayTitle("");
+ mUrlUnfocused.requestFocus();
+ }
+
+ private void stopOrRefresh() {
+ if (mInLoad) {
+ mUiController.stopLoading();
+ } else {
+ mUiController.getCurrentTopWebView().reload();
+ }
+ }
+
+ /**
+ * Update the progress, from 0 to 100.
+ */
+ @Override
+ void setProgress(int newProgress) {
+ if (newProgress >= PROGRESS_MAX) {
+ mProgressView.setProgress(PageProgressView.MAX_PROGRESS);
+ mProgressView.setVisibility(View.GONE);
+ mInLoad = false;
+ mStopButton.setImageDrawable(mReloadDrawable);
+ } else {
+ if (!mInLoad) {
+ mProgressView.setVisibility(View.VISIBLE);
+ mInLoad = true;
+ mStopButton.setImageDrawable(mStopDrawable);
+ }
+ mProgressView.setProgress(newProgress * PageProgressView.MAX_PROGRESS
+ / PROGRESS_MAX);
+ }
+ }
+
+ @Override
+ /* package */ void setDisplayTitle(String title) {
+ mUrlFocused.setText(title, false);
+ mUrlUnfocused.setText(title);
+ }
+
+ void setDisplayTitle(String title, boolean filter) {
+ mUrlFocused.setText(title, filter);
+ mUrlUnfocused.setText(title);
+ }
+
+ /**
+ * Custom CheckBox which does not toggle when pressed. Used by mStar.
+ */
+ public static class CustomCheck extends CheckBox {
+ public CustomCheck(Context context) {
+ super(context);
+ }
+
+ public CustomCheck(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public CustomCheck(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ @Override
+ public void toggle() {
+ // Do nothing
+ }
+ }
+}
diff --git a/src/com/android/browser/UI.java b/src/com/android/browser/UI.java
new file mode 100644
index 0000000..2bfec44
--- /dev/null
+++ b/src/com/android/browser/UI.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import com.android.browser.ScrollWebView.ScrollListener;
+
+import android.content.res.Configuration;
+import android.graphics.Bitmap;
+import android.os.Bundle;
+import android.view.ActionMode;
+import android.view.Menu;
+import android.view.View;
+import android.webkit.WebChromeClient.CustomViewCallback;
+import android.webkit.WebView;
+
+import java.util.List;
+
+/**
+ * UI interface definitions
+ */
+public interface UI extends ScrollListener {
+
+ public void onPause();
+
+ public void onResume();
+
+ public void onDestroy();
+
+ public void onConfigurationChanged(Configuration config);
+
+ public boolean onBackKey();
+
+ public boolean needsRestoreAllTabs();
+
+ public void addTab(Tab tab);
+
+ public void removeTab(Tab tab);
+
+ public void setActiveTab(Tab tab);
+
+ public void updateTabs(List<Tab> tabs);
+
+ public void detachTab(Tab tab);
+
+ public void attachTab(Tab tab);
+
+ public void onSetWebView(Tab tab, WebView view);
+
+ public void createSubWindow(Tab tab, WebView subWebView);
+
+ public void attachSubWindow(View subContainer);
+
+ public void removeSubWindow(View subContainer);
+
+ // TODO: consolidate
+ public void setUrlTitle(Tab tab, String url, String title);
+
+ // TODO: consolidate
+ public void setFavicon(Tab tab, Bitmap icon);
+
+ public void resetTitleAndRevertLockIcon(Tab tab);
+
+ public void resetTitleAndIcon(Tab tab);
+
+ public void onPageStarted(Tab tab, String url, Bitmap favicon);
+
+ public void onPageFinished(Tab tab, String url);
+
+ public void onPageStopped(Tab tab);
+
+ public void onProgressChanged(Tab tab, int progress);
+
+ public void showActiveTabsPage();
+
+ public void removeActiveTabsPage();
+
+ public void showComboView(boolean startWithHistory, Bundle extra);
+
+ public void hideComboView();
+
+ public void showCustomView(View view, CustomViewCallback callback);
+
+ public void onHideCustomView();
+
+ public boolean isCustomViewShowing();
+
+ public void showVoiceTitleBar(String title);
+
+ public void revertVoiceTitleBar(Tab tab);
+
+ // allow the ui to update state
+ public void onPrepareOptionsMenu(Menu menu);
+
+ public void onOptionsMenuOpened();
+
+ public void onExtendedMenuOpened();
+
+ public void onOptionsMenuClosed(boolean inLoad);
+
+ public void onExtendedMenuClosed(boolean inLoad);
+
+ public void onContextMenuCreated(Menu menu);
+
+ public void onContextMenuClosed(Menu menu, boolean inLoad);
+
+ public void onActionModeStarted(ActionMode mode);
+
+ public void onActionModeFinished(boolean inLoad);
+
+ public void setShouldShowErrorConsole(Tab tab, boolean show);
+
+ // returns if the web page is clear of any overlays (not including sub windows)
+ public boolean showsWeb();
+
+ Bitmap getDefaultVideoPoster();
+
+ View getVideoLoadingProgressView();
+
+ void bookmarkedStatusHasChanged(Tab tab);
+}
diff --git a/src/com/android/browser/UiController.java b/src/com/android/browser/UiController.java
new file mode 100644
index 0000000..c74d74e
--- /dev/null
+++ b/src/com/android/browser/UiController.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import android.content.Intent;
+import android.webkit.WebView;
+
+import java.util.List;
+
+
+/**
+ * UI aspect of the controller
+ */
+public interface UiController extends BookmarksHistoryCallbacks {
+
+ UI getUi();
+
+ WebView getCurrentWebView();
+
+ WebView getCurrentTopWebView();
+
+ TabControl getTabControl();
+
+ List<Tab> getTabs();
+
+ Tab openTabToHomePage();
+
+ Tab openIncognitoTab();
+
+ boolean switchToTab(int tabIndex);
+
+ void closeCurrentTab();
+
+ void closeTab(Tab tab);
+
+ void stopLoading();
+
+ void bookmarkCurrentPage(long folderId);
+
+ void bookmarksOrHistoryPicker(boolean openHistory);
+
+ void showVoiceSearchResults(String title);
+
+ void editUrl();
+
+ void removeActiveTabsPage(boolean attach);
+
+ void handleNewIntent(Intent intent);
+
+ boolean shouldShowErrorConsole();
+
+ void removeComboView();
+
+ void hideCustomView();
+
+ void attachSubWindow(Tab tab);
+
+ void removeSubWindow(Tab tab);
+
+ boolean isInCustomActionMode();
+
+ void endActionMode();
+
+ void shareCurrentPage();
+
+}
diff --git a/src/com/android/browser/UploadHandler.java b/src/com/android/browser/UploadHandler.java
new file mode 100644
index 0000000..d9b387f
--- /dev/null
+++ b/src/com/android/browser/UploadHandler.java
@@ -0,0 +1,214 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Environment;
+import android.provider.MediaStore;
+import android.webkit.ValueCallback;
+
+import java.io.File;
+import java.util.Vector;
+
+/**
+ * Handle the file upload callbacks from WebView here
+ */
+public class UploadHandler {
+
+ /*
+ * The Object used to inform the WebView of the file to upload.
+ */
+ private ValueCallback<Uri> mUploadMessage;
+ private String mCameraFilePath;
+
+ private Controller mController;
+
+ public UploadHandler(Controller controller) {
+ mController = controller;
+ }
+
+ String getFilePath() {
+ return mCameraFilePath;
+ }
+
+ void onResult(int resultCode, Intent intent) {
+ Uri result = intent == null || resultCode != Activity.RESULT_OK ? null
+ : intent.getData();
+
+ // As we ask the camera to save the result of the user taking
+ // a picture, the camera application does not return anything other
+ // than RESULT_OK. So we need to check whether the file we expected
+ // was written to disk in the in the case that we
+ // did not get an intent returned but did get a RESULT_OK. If it was,
+ // we assume that this result has came back from the camera.
+ if (result == null && intent == null && resultCode == Activity.RESULT_OK) {
+ File cameraFile = new File(mCameraFilePath);
+ if (cameraFile.exists()) {
+ result = Uri.fromFile(cameraFile);
+ // Broadcast to the media scanner that we have a new photo
+ // so it will be added into the gallery for the user.
+ mController.getActivity().sendBroadcast(
+ new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, result));
+ }
+ }
+
+ mUploadMessage.onReceiveValue(result);
+ }
+
+ void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
+
+ final String imageMimeType = "image/*";
+ final String videoMimeType = "video/*";
+ final String audioMimeType = "audio/*";
+ final String mediaSourceKey = "capture";
+ final String mediaSourceValueCamera = "camera";
+ final String mediaSourceValueFileSystem = "filesystem";
+ final String mediaSourceValueCamcorder = "camcorder";
+ final String mediaSourceValueMicrophone = "microphone";
+
+ // media source can be 'filesystem' or 'camera' or 'camcorder' or 'microphone'.
+ String mediaSource = "";
+
+ // We add the camera intent if there was no accept type (or '*/*' or 'image/*').
+ boolean addCameraIntent = true;
+ // We add the camcorder intent if there was no accept type (or '*/*' or 'video/*').
+ boolean addCamcorderIntent = true;
+
+ if (mUploadMessage != null) {
+ // Already a file picker operation in progress.
+ return;
+ }
+
+ mUploadMessage = uploadMsg;
+
+ // Parse the accept type.
+ String params[] = acceptType.split(";");
+ String mimeType = params[0];
+
+ for (String p : params) {
+ String[] keyValue = p.split("=");
+ if (keyValue.length == 2) {
+ // Process key=value parameters.
+ if (mediaSourceKey.equals(keyValue[0])) {
+ mediaSource = keyValue[1];
+ }
+ }
+ }
+
+ // This intent will display the standard OPENABLE file picker.
+ Intent i = new Intent(Intent.ACTION_GET_CONTENT);
+ i.addCategory(Intent.CATEGORY_OPENABLE);
+
+ // Create an intent to add to the standard file picker that will
+ // capture an image from the camera. We'll combine this intent with
+ // the standard OPENABLE picker unless the web developer specifically
+ // requested the camera or gallery be opened by passing a parameter
+ // in the accept type.
+ Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
+ File externalDataDir = Environment.getExternalStoragePublicDirectory(
+ Environment.DIRECTORY_DCIM);
+ File cameraDataDir = new File(externalDataDir.getAbsolutePath() +
+ File.separator + "browser-photos");
+ cameraDataDir.mkdirs();
+ mCameraFilePath = cameraDataDir.getAbsolutePath() + File.separator +
+ System.currentTimeMillis() + ".jpg";
+ cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(mCameraFilePath)));
+
+ Intent camcorderIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
+
+ Intent soundRecIntent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
+
+ if (mimeType.equals(imageMimeType)) {
+ i.setType(imageMimeType);
+ addCamcorderIntent = false;
+ if (mediaSource.equals(mediaSourceValueCamera)) {
+ // Specified 'image/*' and requested the camera, so go ahead and launch the camera
+ // directly.
+ startActivity(cameraIntent);
+ return;
+ } else if (mediaSource.equals(mediaSourceValueFileSystem)) {
+ // Specified filesytem as the source, so don't want to consider the camera.
+ addCameraIntent = false;
+ }
+ } else if (mimeType.equals(videoMimeType)) {
+ i.setType(videoMimeType);
+ addCameraIntent = false;
+ // The camcorder saves it's own file and returns it to us in the intent, so
+ // we don't need to generate one here.
+ mCameraFilePath = null;
+
+ if (mediaSource.equals(mediaSourceValueCamcorder)) {
+ // Specified 'video/*' and requested the camcorder, so go ahead and launch the
+ // camcorder directly.
+ startActivity(camcorderIntent);
+ return;
+ } else if (mediaSource.equals(mediaSourceValueFileSystem)) {
+ // Specified filesystem as the source, so don't want to consider the camcorder.
+ addCamcorderIntent = false;
+ }
+ } else if (mimeType.equals(audioMimeType)) {
+ i.setType(audioMimeType);
+ addCameraIntent = false;
+ addCamcorderIntent = false;
+ if (mediaSource.equals(mediaSourceValueMicrophone)) {
+ // Specified 'audio/*' and requested microphone, so go ahead and launch the sound
+ // recorder.
+ startActivity(soundRecIntent);
+ return;
+ }
+ // On a default system, there is no single option to open an audio "gallery". Both the
+ // sound recorder and music browser respond to the OPENABLE/audio/* intent unlike the
+ // image/* and video/* OPENABLE intents where the image / video gallery are the only
+ // respondants (and so the user is not prompted by default).
+ } else {
+ i.setType("*/*");
+ }
+
+ // Combine the chooser and the extra choices (like camera or camcorder)
+ Intent chooser = new Intent(Intent.ACTION_CHOOSER);
+ chooser.putExtra(Intent.EXTRA_INTENT, i);
+
+ Vector<Intent> extraInitialIntents = new Vector<Intent>(0);
+
+ if (addCameraIntent) {
+ extraInitialIntents.add(cameraIntent);
+ }
+
+ if (addCamcorderIntent) {
+ extraInitialIntents.add(camcorderIntent);
+ }
+
+ if (extraInitialIntents.size() > 0) {
+ Intent[] extraIntents = new Intent[extraInitialIntents.size()];
+ chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS,
+ extraInitialIntents.toArray(extraIntents));
+ }
+
+ chooser.putExtra(Intent.EXTRA_TITLE,
+ mController.getActivity().getResources()
+ .getString(R.string.choose_upload));
+ startActivity(chooser);
+ }
+
+ private void startActivity(Intent intent) {
+ mController.getActivity().startActivityForResult(intent,
+ Controller.FILE_SELECTED);
+ }
+
+}
diff --git a/src/com/android/browser/UrlHandler.java b/src/com/android/browser/UrlHandler.java
new file mode 100644
index 0000000..72704e0
--- /dev/null
+++ b/src/com/android/browser/UrlHandler.java
@@ -0,0 +1,238 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import android.app.Activity;
+import android.content.ActivityNotFoundException;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.database.Cursor;
+import android.net.Uri;
+import android.util.Log;
+import android.webkit.WebView;
+
+import java.net.URISyntaxException;
+
+/**
+ *
+ */
+public class UrlHandler {
+
+ // Use in overrideUrlLoading
+ /* package */ final static String SCHEME_WTAI = "wtai://wp/";
+ /* package */ final static String SCHEME_WTAI_MC = "wtai://wp/mc;";
+ /* package */ final static String SCHEME_WTAI_SD = "wtai://wp/sd;";
+ /* package */ final static String SCHEME_WTAI_AP = "wtai://wp/ap;";
+
+ Controller mController;
+ Activity mActivity;
+
+ private Boolean mIsProviderPresent = null;
+ private Uri mRlzUri = null;
+
+ public UrlHandler(Controller controller) {
+ mController = controller;
+ mActivity = mController.getActivity();
+ }
+
+ boolean shouldOverrideUrlLoading(WebView view, String url) {
+ if (view.isPrivateBrowsingEnabled()) {
+ // Don't allow urls to leave the browser app when in
+ // private browsing mode
+ mController.loadUrl(view, url);
+ return true;
+ }
+
+ if (url.startsWith(SCHEME_WTAI)) {
+ // wtai://wp/mc;number
+ // number=string(phone-number)
+ if (url.startsWith(SCHEME_WTAI_MC)) {
+ Intent intent = new Intent(Intent.ACTION_VIEW,
+ Uri.parse(WebView.SCHEME_TEL +
+ url.substring(SCHEME_WTAI_MC.length())));
+ mActivity.startActivity(intent);
+ // before leaving BrowserActivity, close the empty child tab.
+ // If a new tab is created through JavaScript open to load this
+ // url, we would like to close it as we will load this url in a
+ // different Activity.
+ mController.closeEmptyChildTab();
+ return true;
+ }
+ // wtai://wp/sd;dtmf
+ // dtmf=string(dialstring)
+ if (url.startsWith(SCHEME_WTAI_SD)) {
+ // TODO: only send when there is active voice connection
+ return false;
+ }
+ // wtai://wp/ap;number;name
+ // number=string(phone-number)
+ // name=string
+ if (url.startsWith(SCHEME_WTAI_AP)) {
+ // TODO
+ return false;
+ }
+ }
+
+ // The "about:" schemes are internal to the browser; don't want these to
+ // be dispatched to other apps.
+ if (url.startsWith("about:")) {
+ return false;
+ }
+
+ // If this is a Google search, attempt to add an RLZ string
+ // (if one isn't already present).
+ if (rlzProviderPresent()) {
+ Uri siteUri = Uri.parse(url);
+ if (needsRlzString(siteUri)) {
+ String rlz = null;
+ Cursor cur = null;
+ try {
+ cur = mActivity.getContentResolver()
+ .query(getRlzUri(), null, null, null, null);
+ if (cur != null && cur.moveToFirst() && !cur.isNull(0)) {
+ url = siteUri.buildUpon()
+ .appendQueryParameter("rlz", cur.getString(0))
+ .build().toString();
+ }
+ } finally {
+ if (cur != null) {
+ cur.close();
+ }
+ }
+ mController.loadUrl(view, url);
+ return true;
+ }
+ }
+
+ Intent intent;
+ // perform generic parsing of the URI to turn it into an Intent.
+ try {
+ intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
+ } catch (URISyntaxException ex) {
+ Log.w("Browser", "Bad URI " + url + ": " + ex.getMessage());
+ return false;
+ }
+
+ // check whether the intent can be resolved. If not, we will see
+ // whether we can download it from the Market.
+ if (mActivity.getPackageManager().resolveActivity(intent, 0) == null) {
+ String packagename = intent.getPackage();
+ if (packagename != null) {
+ intent = new Intent(Intent.ACTION_VIEW, Uri
+ .parse("market://search?q=pname:" + packagename));
+ intent.addCategory(Intent.CATEGORY_BROWSABLE);
+ mActivity.startActivity(intent);
+ // before leaving BrowserActivity, close the empty child tab.
+ // If a new tab is created through JavaScript open to load this
+ // url, we would like to close it as we will load this url in a
+ // different Activity.
+ mController.closeEmptyChildTab();
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ // sanitize the Intent, ensuring web pages can not bypass browser
+ // security (only access to BROWSABLE activities).
+ intent.addCategory(Intent.CATEGORY_BROWSABLE);
+ intent.setComponent(null);
+ try {
+ if (mActivity.startActivityIfNeeded(intent, -1)) {
+ // before leaving BrowserActivity, close the empty child tab.
+ // If a new tab is created through JavaScript open to load this
+ // url, we would like to close it as we will load this url in a
+ // different Activity.
+ mController.closeEmptyChildTab();
+ return true;
+ }
+ } catch (ActivityNotFoundException ex) {
+ // ignore the error. If no application can handle the URL,
+ // eg about:blank, assume the browser can handle it.
+ }
+
+ if (mController.isMenuDown()) {
+ mController.openTab(url, false);
+ mActivity.closeOptionsMenu();
+ return true;
+ }
+ return false;
+ }
+
+ // Determine whether the RLZ provider is present on the system.
+ private boolean rlzProviderPresent() {
+ if (mIsProviderPresent == null) {
+ PackageManager pm = mActivity.getPackageManager();
+ mIsProviderPresent = pm.resolveContentProvider(
+ BrowserSettings.RLZ_PROVIDER, 0) != null;
+ }
+ return mIsProviderPresent;
+ }
+
+ // Retrieve the RLZ access point string and cache the URI used to
+ // retrieve RLZ values.
+ private Uri getRlzUri() {
+ if (mRlzUri == null) {
+ String ap = mActivity.getResources()
+ .getString(R.string.rlz_access_point);
+ mRlzUri = Uri.withAppendedPath(BrowserSettings.RLZ_PROVIDER_URI, ap);
+ }
+ return mRlzUri;
+ }
+
+ // Determine if this URI appears to be for a Google search
+ // and does not have an RLZ parameter.
+ // Taken largely from Chrome source, src/chrome/browser/google_url_tracker.cc
+ private static boolean needsRlzString(Uri uri) {
+ String scheme = uri.getScheme();
+ if (("http".equals(scheme) || "https".equals(scheme)) &&
+ (uri.getQueryParameter("q") != null) &&
+ (uri.getQueryParameter("rlz") == null)) {
+ String host = uri.getHost();
+ if (host == null) {
+ return false;
+ }
+ String[] hostComponents = host.split("\\.");
+
+ if (hostComponents.length < 2) {
+ return false;
+ }
+ int googleComponent = hostComponents.length - 2;
+ String component = hostComponents[googleComponent];
+ if (!"google".equals(component)) {
+ if (hostComponents.length < 3 ||
+ (!"co".equals(component) && !"com".equals(component))) {
+ return false;
+ }
+ googleComponent = hostComponents.length - 3;
+ if (!"google".equals(hostComponents[googleComponent])) {
+ return false;
+ }
+ }
+
+ // Google corp network handling.
+ if (googleComponent > 0 && "corp".equals(
+ hostComponents[googleComponent - 1])) {
+ return false;
+ }
+
+ return true;
+ }
+ return false;
+ }
+
+}
diff --git a/src/com/android/browser/UrlInputView.java b/src/com/android/browser/UrlInputView.java
new file mode 100644
index 0000000..a4c2be3
--- /dev/null
+++ b/src/com/android/browser/UrlInputView.java
@@ -0,0 +1,191 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import com.android.browser.SuggestionsAdapter.CompletionListener;
+
+import android.content.Context;
+import android.content.res.Configuration;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.View.OnFocusChangeListener;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.AutoCompleteTextView;
+import android.widget.TextView;
+import android.widget.TextView.OnEditorActionListener;
+
+/**
+ * url/search input view
+ * handling suggestions
+ */
+public class UrlInputView extends AutoCompleteTextView
+ implements OnFocusChangeListener, OnEditorActionListener,
+ CompletionListener {
+
+ private UrlInputListener mListener;
+ private InputMethodManager mInputManager;
+ private SuggestionsAdapter mAdapter;
+ private OnFocusChangeListener mWrappedFocusListener;
+ private View mContainer;
+ private boolean mLandscape;
+
+ public UrlInputView(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ init(context);
+ }
+
+ public UrlInputView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ init(context);
+ }
+
+ public UrlInputView(Context context) {
+ super(context);
+ init(context);
+ }
+
+ private void init(Context ctx) {
+ mInputManager = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
+ setOnEditorActionListener(this);
+ super.setOnFocusChangeListener(this);
+ mAdapter = new SuggestionsAdapter(ctx, this);
+ setAdapter(mAdapter);
+ setSelectAllOnFocus(true);
+ onConfigurationChanged(ctx.getResources().getConfiguration());
+ setThreshold(1);
+ }
+
+ void setController(UiController controller) {
+ UrlSelectionActionMode urlSelectionMode
+ = new UrlSelectionActionMode(controller);
+ setCustomSelectionActionModeCallback(urlSelectionMode);
+ }
+
+ void setContainer(View container) {
+ mContainer = container;
+ }
+
+ @Override
+ protected void onConfigurationChanged(Configuration config) {
+ super.onConfigurationChanged(config);
+ mLandscape = (config.orientation &
+ Configuration.ORIENTATION_LANDSCAPE) > 0;
+ mAdapter.setLandscapeMode(mLandscape);
+ if (isPopupShowing() && (getVisibility() == View.VISIBLE)) {
+ setupDropDown();
+ }
+ }
+
+ @Override
+ public void showDropDown() {
+ setupDropDown();
+ super.showDropDown();
+ }
+
+ @Override
+ public void dismissDropDown() {
+ super.dismissDropDown();
+ mAdapter.clearCache();
+ }
+
+ private void setupDropDown() {
+ int width = mContainer.getWidth();
+ if (width != getDropDownWidth()) {
+ setDropDownWidth(width);
+ }
+ if (getLeft() != -getDropDownHorizontalOffset()) {
+ setDropDownHorizontalOffset(-getLeft());
+ }
+ }
+
+ @Override
+ public void setOnFocusChangeListener(OnFocusChangeListener focusListener) {
+ mWrappedFocusListener = focusListener;
+ }
+
+ @Override
+ public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
+ finishInput(getText().toString(), null);
+ return true;
+ }
+
+ @Override
+ public void onFocusChange(View v, boolean hasFocus) {
+ if (hasFocus) {
+ forceIme();
+ } else {
+ finishInput(null, null);
+ }
+ if (mWrappedFocusListener != null) {
+ mWrappedFocusListener.onFocusChange(v, hasFocus);
+ }
+ }
+
+ public void setUrlInputListener(UrlInputListener listener) {
+ mListener = listener;
+ }
+
+ public void forceIme() {
+ mInputManager.showSoftInput(this, 0);
+ }
+
+ private void finishInput(String url, String extra) {
+ this.dismissDropDown();
+ this.setSelection(0,0);
+ mInputManager.hideSoftInputFromWindow(getWindowToken(), 0);
+ if (TextUtils.isEmpty(url)) {
+ mListener.onDismiss();
+ } else {
+ mListener.onAction(url, extra);
+ }
+ }
+
+ // Completion Listener
+
+ @Override
+ public void onSearch(String search) {
+ mListener.onEdit(search);
+ }
+
+ @Override
+ public void onSelect(String url, String extra) {
+ finishInput(url, extra);
+ }
+
+ @Override
+ public boolean onKeyPreIme(int keyCode, KeyEvent evt) {
+ if (keyCode == KeyEvent.KEYCODE_BACK) {
+ // catch back key in order to do slightly more cleanup than usual
+ finishInput(null, null);
+ return true;
+ }
+ return super.onKeyPreIme(keyCode, evt);
+ }
+
+ interface UrlInputListener {
+
+ public void onDismiss();
+
+ public void onAction(String text, String extra);
+
+ public void onEdit(String text);
+
+ }
+
+}
diff --git a/src/com/android/browser/UrlSelectionActionMode.java b/src/com/android/browser/UrlSelectionActionMode.java
new file mode 100644
index 0000000..5636388
--- /dev/null
+++ b/src/com/android/browser/UrlSelectionActionMode.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.browser;
+
+import android.view.ActionMode;
+import android.view.Menu;
+import android.view.MenuItem;
+
+public class UrlSelectionActionMode implements ActionMode.Callback {
+
+ private UiController mUiController;
+
+ public UrlSelectionActionMode(UiController controller) {
+ mUiController = controller;
+ }
+
+ // ActionMode.Callback implementation
+
+ @Override
+ public boolean onCreateActionMode(ActionMode mode, Menu menu) {
+ mode.getMenuInflater().inflate(R.menu.url_selection, menu);
+ return true;
+ }
+
+ @Override
+ public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.share:
+ mUiController.shareCurrentPage();
+ mode.finish();
+ break;
+ default:
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public void onDestroyActionMode(ActionMode mode) {
+ }
+
+ @Override
+ public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
+ return true;
+ }
+
+}
diff --git a/src/com/android/browser/UrlUtils.java b/src/com/android/browser/UrlUtils.java
new file mode 100644
index 0000000..2df0a61
--- /dev/null
+++ b/src/com/android/browser/UrlUtils.java
@@ -0,0 +1,148 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import android.net.Uri;
+import android.util.Patterns;
+import android.webkit.URLUtil;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Utility methods for Url manipulation
+ */
+public class UrlUtils {
+
+ static final Pattern ACCEPTED_URI_SCHEMA = Pattern.compile(
+ "(?i)" + // switch on case insensitive matching
+ "(" + // begin group for schema
+ "(?:http|https|file):\\/\\/" +
+ "|(?:inline|data|about|content|javascript):" +
+ ")" +
+ "(.*)" );
+
+ // Google search
+ private final static String QUICKSEARCH_G = "http://www.google.com/m?q=%s";
+ private final static String QUERY_PLACE_HOLDER = "%s";
+
+ // Regular expression which matches http://, followed by some stuff, followed by
+ // optionally a trailing slash, all matched as separate groups.
+ private static final Pattern STRIP_URL_PATTERN = Pattern.compile("^(http://)(.*?)(/$)?");
+
+ private UrlUtils() { /* cannot be instantiated */ }
+
+ /**
+ * Strips the provided url of preceding "http://" and any trailing "/". Does not
+ * strip "https://". If the provided string cannot be stripped, the original string
+ * is returned.
+ *
+ * TODO: Put this in TextUtils to be used by other packages doing something similar.
+ *
+ * @param url a url to strip, like "http://www.google.com/"
+ * @return a stripped url like "www.google.com", or the original string if it could
+ * not be stripped
+ */
+ /* package */ static String stripUrl(String url) {
+ if (url == null) return null;
+ Matcher m = STRIP_URL_PATTERN.matcher(url);
+ if (m.matches() && m.groupCount() == 3) {
+ return m.group(2);
+ } else {
+ return url;
+ }
+ }
+
+ protected static String smartUrlFilter(Uri inUri) {
+ if (inUri != null) {
+ return smartUrlFilter(inUri.toString());
+ }
+ return null;
+ }
+
+ /**
+ * Attempts to determine whether user input is a URL or search
+ * terms. Anything with a space is passed to search.
+ *
+ * Converts to lowercase any mistakenly uppercased schema (i.e.,
+ * "Http://" converts to "http://"
+ *
+ * @return Original or modified URL
+ *
+ */
+ protected static String smartUrlFilter(String url) {
+
+ String inUrl = url.trim();
+ boolean hasSpace = inUrl.indexOf(' ') != -1;
+
+ Matcher matcher = ACCEPTED_URI_SCHEMA.matcher(inUrl);
+ if (matcher.matches()) {
+ // force scheme to lowercase
+ String scheme = matcher.group(1);
+ String lcScheme = scheme.toLowerCase();
+ if (!lcScheme.equals(scheme)) {
+ inUrl = lcScheme + matcher.group(2);
+ }
+ if (hasSpace) {
+ inUrl = inUrl.replace(" ", "%20");
+ }
+ return inUrl;
+ }
+ if (!hasSpace) {
+ if (Patterns.WEB_URL.matcher(inUrl).matches()) {
+ return URLUtil.guessUrl(inUrl);
+ }
+ }
+
+ // FIXME: Is this the correct place to add to searches?
+ // what if someone else calls this function?
+
+// Browser.addSearchUrl(mBrowser.getContentResolver(), inUrl);
+ return URLUtil.composeSearchUrl(inUrl, QUICKSEARCH_G, QUERY_PLACE_HOLDER);
+ }
+
+ /* package */ static String fixUrl(String inUrl) {
+ // FIXME: Converting the url to lower case
+ // duplicates functionality in smartUrlFilter().
+ // However, changing all current callers of fixUrl to
+ // call smartUrlFilter in addition may have unwanted
+ // consequences, and is deferred for now.
+ int colon = inUrl.indexOf(':');
+ boolean allLower = true;
+ for (int index = 0; index < colon; index++) {
+ char ch = inUrl.charAt(index);
+ if (!Character.isLetter(ch)) {
+ break;
+ }
+ allLower &= Character.isLowerCase(ch);
+ if (index == colon - 1 && !allLower) {
+ inUrl = inUrl.substring(0, colon).toLowerCase()
+ + inUrl.substring(colon);
+ }
+ }
+ if (inUrl.startsWith("http://") || inUrl.startsWith("https://"))
+ return inUrl;
+ if (inUrl.startsWith("http:") ||
+ inUrl.startsWith("https:")) {
+ if (inUrl.startsWith("http:/") || inUrl.startsWith("https:/")) {
+ inUrl = inUrl.replaceFirst("/", "//");
+ } else inUrl = inUrl.replaceFirst(":", "://");
+ }
+ return inUrl;
+ }
+
+}
diff --git a/src/com/android/browser/WallpaperHandler.java b/src/com/android/browser/WallpaperHandler.java
new file mode 100644
index 0000000..0c88a50
--- /dev/null
+++ b/src/com/android/browser/WallpaperHandler.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import android.app.ProgressDialog;
+import android.app.WallpaperManager;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.drawable.Drawable;
+import android.util.Log;
+import android.view.MenuItem;
+import android.view.MenuItem.OnMenuItemClickListener;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+/**
+ * Handle setWallpaper requests
+ *
+ */
+public class WallpaperHandler extends Thread
+ implements OnMenuItemClickListener, DialogInterface.OnCancelListener {
+
+
+ private static final String LOGTAG = "WallpaperHandler";
+
+ private Context mContext;
+ private URL mUrl;
+ private ProgressDialog mWallpaperProgress;
+ private boolean mCanceled = false;
+
+ public WallpaperHandler(Context context, String url) {
+ mContext = context;
+ try {
+ mUrl = new URL(url);
+ } catch (MalformedURLException e) {
+ mUrl = null;
+ }
+ }
+
+ @Override
+ public void onCancel(DialogInterface dialog) {
+ mCanceled = true;
+ }
+
+ @Override
+ public boolean onMenuItemClick(MenuItem item) {
+ if (mUrl != null) {
+ // The user may have tried to set a image with a large file size as
+ // their background so it may take a few moments to perform the
+ // operation.
+ // Display a progress spinner while it is working.
+ mWallpaperProgress = new ProgressDialog(mContext);
+ mWallpaperProgress.setIndeterminate(true);
+ mWallpaperProgress.setMessage(mContext.getResources()
+ .getText(R.string.progress_dialog_setting_wallpaper));
+ mWallpaperProgress.setCancelable(true);
+ mWallpaperProgress.setOnCancelListener(this);
+ mWallpaperProgress.show();
+ start();
+ }
+ return true;
+ }
+
+ @Override
+ public void run() {
+ Drawable oldWallpaper =
+ WallpaperManager.getInstance(mContext).getDrawable();
+ try {
+ // TODO: This will cause the resource to be downloaded again, when
+ // we should in most cases be able to grab it from the cache. To fix
+ // this we should query WebCore to see if we can access a cached
+ // version and instead open an input stream on that. This pattern
+ // could also be used in the download manager where the same problem
+ // exists.
+ InputStream inputstream = mUrl.openStream();
+ if (inputstream != null) {
+ WallpaperManager.getInstance(mContext).setStream(inputstream);
+ }
+ } catch (IOException e) {
+ Log.e(LOGTAG, "Unable to set new wallpaper");
+ // Act as though the user canceled the operation so we try to
+ // restore the old wallpaper.
+ mCanceled = true;
+ }
+
+ if (mCanceled) {
+ // Restore the old wallpaper if the user cancelled whilst we were
+ // setting
+ // the new wallpaper.
+ int width = oldWallpaper.getIntrinsicWidth();
+ int height = oldWallpaper.getIntrinsicHeight();
+ Bitmap bm = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
+ Canvas canvas = new Canvas(bm);
+ oldWallpaper.setBounds(0, 0, width, height);
+ oldWallpaper.draw(canvas);
+ try {
+ WallpaperManager.getInstance(mContext).setBitmap(bm);
+ } catch (IOException e) {
+ Log.e(LOGTAG, "Unable to restore old wallpaper.");
+ }
+ mCanceled = false;
+ }
+
+ if (mWallpaperProgress.isShowing()) {
+ mWallpaperProgress.dismiss();
+ }
+ }
+}
diff --git a/src/com/android/browser/WebDialog.java b/src/com/android/browser/WebDialog.java
deleted file mode 100644
index 9995e8f..0000000
--- a/src/com/android/browser/WebDialog.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.browser;
-
-import android.content.Context;
-import android.view.View;
-import android.view.animation.AnimationUtils;
-import android.view.inputmethod.InputMethodManager;
-import android.webkit.WebView;
-import android.widget.LinearLayout;
-
-/* package */ class WebDialog extends LinearLayout {
- protected WebView mWebView;
- protected BrowserActivity mBrowserActivity;
- private boolean mIsVisible;
-
- /* package */ WebDialog(BrowserActivity context) {
- super(context);
- mBrowserActivity = context;
- }
-
- /* dialogs that have cancel buttons can optionally share code by including a
- * view with an id of 'done'.
- */
- protected void addCancel() {
- View button = findViewById(R.id.done);
- if (button != null) button.setOnClickListener(mCancelListener);
- }
-
- private View.OnClickListener mCancelListener = new View.OnClickListener() {
- public void onClick(View v) {
- mBrowserActivity.closeDialogs();
- }
- };
-
- protected void dismiss() {
- startAnimation(AnimationUtils.loadAnimation(mBrowserActivity,
- R.anim.dialog_exit));
- mIsVisible = false;
- }
-
- /*
- * Remove the soft keyboard from the screen.
- */
- protected void hideSoftInput() {
- InputMethodManager imm = (InputMethodManager)
- mBrowserActivity.getSystemService(Context.INPUT_METHOD_SERVICE);
- imm.hideSoftInputFromWindow(mWebView.getWindowToken(), 0);
- }
-
- protected boolean isVisible() {
- return mIsVisible;
- }
-
- /* package */ void setWebView(WebView webview) {
- mWebView = webview;
- }
-
- protected void show() {
- startAnimation(AnimationUtils.loadAnimation(mBrowserActivity,
- R.anim.dialog_enter));
- mIsVisible = true;
- }
-
-}
diff --git a/src/com/android/browser/WebStorageSizeManager.java b/src/com/android/browser/WebStorageSizeManager.java
index dcf2f8b..5f76f72 100644
--- a/src/com/android/browser/WebStorageSizeManager.java
+++ b/src/com/android/browser/WebStorageSizeManager.java
@@ -16,17 +16,19 @@
package com.android.browser;
+import com.android.browser.preferences.WebsiteSettingsFragment;
+
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.StatFs;
+import android.preference.PreferenceActivity;
import android.util.Log;
import android.webkit.WebStorage;
import java.io.File;
-import java.util.Set;
/**
@@ -82,7 +84,7 @@
* the user can free some of the Web storage space by deleting all the data used
* by an origin.
*/
-class WebStorageSizeManager {
+public class WebStorageSizeManager {
// Logging flags.
private final static boolean LOGV_ENABLED = com.android.browser.Browser.LOGV_ENABLED;
private final static boolean LOGD_ENABLED = com.android.browser.Browser.LOGD_ENABLED;
@@ -346,7 +348,7 @@
// Reset the notification time; we use this iff the user
// use clear all; we reset it to some time in the future instead
// of just setting it to -1, as the clear all method is asynchronous
- static void resetLastOutOfSpaceNotificationTime() {
+ public static void resetLastOutOfSpaceNotificationTime() {
mLastOutOfSpaceNotificationTime = System.currentTimeMillis() -
NOTIFICATION_INTERVAL + RESET_NOTIFICATION_INTERVAL;
}
@@ -403,7 +405,9 @@
CharSequence text = mContext.getString(
R.string.webstorage_outofspace_notification_text);
long when = System.currentTimeMillis();
- Intent intent = new Intent(mContext, WebsiteSettingsActivity.class);
+ Intent intent = new Intent(mContext, BrowserPreferencesPage.class);
+ intent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT,
+ WebsiteSettingsFragment.class.getName());
PendingIntent contentIntent =
PendingIntent.getActivity(mContext, 0, intent, 0);
Notification notification = new Notification(icon, title, when);
diff --git a/src/com/android/browser/WebViewController.java b/src/com/android/browser/WebViewController.java
new file mode 100644
index 0000000..894bbec
--- /dev/null
+++ b/src/com/android/browser/WebViewController.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import com.android.browser.IntentHandler.UrlData;
+
+import android.app.Activity;
+import android.graphics.Bitmap;
+import android.net.Uri;
+import android.net.http.SslError;
+import android.os.Message;
+import android.view.KeyEvent;
+import android.view.View;
+import android.webkit.HttpAuthHandler;
+import android.webkit.SslErrorHandler;
+import android.webkit.ValueCallback;
+import android.webkit.WebChromeClient;
+import android.webkit.WebView;
+
+/**
+ * WebView aspect of the controller
+ */
+public interface WebViewController {
+
+ Activity getActivity();
+
+ TabControl getTabControl();
+
+ WebViewFactory getWebViewFactory();
+
+ void onSetWebView(Tab tab, WebView view);
+
+ void createSubWindow(Tab tab);
+
+ void onPageStarted(Tab tab, WebView view, String url, Bitmap favicon);
+
+ void onPageFinished(Tab tab, String url);
+
+ void onProgressChanged(Tab tab, int newProgress);
+
+ void onReceivedTitle(Tab tab, final String title);
+
+ void onFavicon(Tab tab, WebView view, Bitmap icon);
+
+ boolean shouldOverrideUrlLoading(WebView view, String url);
+
+ boolean shouldOverrideKeyEvent(KeyEvent event);
+
+ void onUnhandledKeyEvent(KeyEvent event);
+
+ void doUpdateVisitedHistory(Tab tab, String url, boolean isReload);
+
+ void getVisitedHistory(final ValueCallback<String[]> callback);
+
+ void onReceivedHttpAuthRequest(Tab tab, WebView view, final HttpAuthHandler handler,
+ final String host, final String realm);
+
+ void onDownloadStart(Tab tab, String url, String useragent, String contentDisposition,
+ String mimeType, long contentLength);
+
+ void showCustomView(Tab tab, View view, WebChromeClient.CustomViewCallback callback);
+
+ void hideCustomView();
+
+ Bitmap getDefaultVideoPoster();
+
+ View getVideoLoadingProgressView();
+
+ void showSslCertificateOnError(WebView view, SslErrorHandler handler,
+ SslError error);
+
+ void activateVoiceSearchMode(String title);
+
+ void revertVoiceSearchMode(Tab tab);
+
+ boolean shouldShowErrorConsole();
+
+ void resetTitleAndRevertLockIcon(Tab tab);
+
+ void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType);
+
+ void endActionMode();
+
+ void attachSubWindow(Tab tab);
+
+ void dismissSubWindow(Tab tab);
+
+ Tab openTabAndShow(UrlData urlData, boolean closeOnExit, String appId);
+
+ boolean switchToTab(int tabindex);
+
+ void closeTab(Tab tab);
+
+ void setupAutoFill(Message message);
+
+ void bookmarkedStatusHasChanged(Tab tab);
+
+}
diff --git a/src/com/android/browser/WebViewFactory.java b/src/com/android/browser/WebViewFactory.java
new file mode 100644
index 0000000..1186e65
--- /dev/null
+++ b/src/com/android/browser/WebViewFactory.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import android.webkit.WebView;
+
+/**
+ * Factory for WebViews
+ */
+public interface WebViewFactory {
+
+ public WebView createWebView(boolean privateBrowsing);
+
+ public WebView createSubWebView(boolean privateBrowsing);
+
+}
diff --git a/src/com/android/browser/preferences/AdvancedPreferencesFragment.java b/src/com/android/browser/preferences/AdvancedPreferencesFragment.java
new file mode 100644
index 0000000..952e04a
--- /dev/null
+++ b/src/com/android/browser/preferences/AdvancedPreferencesFragment.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.browser.preferences;
+
+import com.android.browser.BrowserSettings;
+import com.android.browser.R;
+
+import android.os.Bundle;
+import android.preference.Preference;
+import android.preference.PreferenceFragment;
+import android.preference.PreferenceScreen;
+import android.webkit.GeolocationPermissions;
+import android.webkit.ValueCallback;
+import android.webkit.WebStorage;
+
+import java.util.Map;
+import java.util.Set;
+
+public class AdvancedPreferencesFragment extends PreferenceFragment
+ implements Preference.OnPreferenceChangeListener {
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ // Load the XML preferences file
+ addPreferencesFromResource(R.xml.advanced_preferences);
+
+ PreferenceScreen websiteSettings = (PreferenceScreen) findPreference(
+ BrowserSettings.PREF_WEBSITE_SETTINGS);
+ websiteSettings.setFragment(WebsiteSettingsFragment.class.getName());
+ }
+
+ /*
+ * We need to set the PreferenceScreen state in onResume(), as the number of
+ * origins with active features (WebStorage, Geolocation etc) could have
+ * changed after calling the WebsiteSettingsActivity.
+ */
+ @Override
+ public void onResume() {
+ super.onResume();
+ final PreferenceScreen websiteSettings = (PreferenceScreen) findPreference(
+ BrowserSettings.PREF_WEBSITE_SETTINGS);
+ websiteSettings.setEnabled(false);
+ WebStorage.getInstance().getOrigins(new ValueCallback<Map>() {
+ @Override
+ public void onReceiveValue(Map webStorageOrigins) {
+ if ((webStorageOrigins != null) && !webStorageOrigins.isEmpty()) {
+ websiteSettings.setEnabled(true);
+ }
+ }
+ });
+ GeolocationPermissions.getInstance().getOrigins(new ValueCallback<Set<String> >() {
+ @Override
+ public void onReceiveValue(Set<String> geolocationOrigins) {
+ if ((geolocationOrigins != null) && !geolocationOrigins.isEmpty()) {
+ websiteSettings.setEnabled(true);
+ }
+ }
+ });
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference pref, Object objValue) {
+ if (pref.getKey().equals(BrowserSettings.PREF_EXTRAS_RESET_DEFAULTS)) {
+ Boolean value = (Boolean) objValue;
+ if (value.booleanValue() == true) {
+ getActivity().finish();
+ return true;
+ }
+ }
+ return false;
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/browser/preferences/DebugPreferencesFragment.java b/src/com/android/browser/preferences/DebugPreferencesFragment.java
new file mode 100644
index 0000000..0a82371
--- /dev/null
+++ b/src/com/android/browser/preferences/DebugPreferencesFragment.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.browser.preferences;
+
+import com.android.browser.BrowserActivity;
+import com.android.browser.BrowserSettings;
+import com.android.browser.Controller;
+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 {
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ // 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);
+ e.setOnPreferenceChangeListener(this);
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ // Attempt to restart
+ startActivity(new Intent(BrowserActivity.ACTION_RESTART, null,
+ getActivity(), BrowserActivity.class));
+ return true;
+ }
+}
diff --git a/src/com/android/browser/preferences/PageContentPreferencesFragment.java b/src/com/android/browser/preferences/PageContentPreferencesFragment.java
new file mode 100644
index 0000000..4be14a6
--- /dev/null
+++ b/src/com/android/browser/preferences/PageContentPreferencesFragment.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.browser.preferences;
+
+import com.android.browser.BrowserHomepagePreference;
+import com.android.browser.BrowserPreferencesPage;
+import com.android.browser.BrowserSettings;
+import com.android.browser.R;
+
+import android.content.res.Resources;
+import android.net.Uri;
+import android.os.Bundle;
+import android.preference.EditTextPreference;
+import android.preference.Preference;
+import android.preference.PreferenceFragment;
+import android.util.Log;
+
+public class PageContentPreferencesFragment extends PreferenceFragment
+ implements Preference.OnPreferenceChangeListener {
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ // Load the preferences from an XML resource
+ addPreferencesFromResource(R.xml.page_content_preferences);
+
+ Preference e = findPreference(BrowserSettings.PREF_HOMEPAGE);
+ e.setOnPreferenceChangeListener(this);
+ e.setSummary(getPreferenceScreen().getSharedPreferences()
+ .getString(BrowserSettings.PREF_HOMEPAGE, null));
+ ((BrowserHomepagePreference) e).setCurrentPage(
+ getActivity().getIntent().getStringExtra(BrowserPreferencesPage.CURRENT_PAGE));
+
+ 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);
+ e.setOnPreferenceChangeListener(this);
+ e.setSummary(getVisualDefaultZoomName(
+ getPreferenceScreen().getSharedPreferences()
+ .getString(BrowserSettings.PREF_DEFAULT_ZOOM, null)) );
+
+ e = findPreference(BrowserSettings.PREF_DEFAULT_TEXT_ENCODING);
+ e.setOnPreferenceChangeListener(this);
+ }
+
+ @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.
+ Log.w("PageContentPreferencesFragment", "onPreferenceChange called from detached fragment!");
+ return false;
+ }
+
+ if (pref.getKey().equals(BrowserSettings.PREF_HOMEPAGE)) {
+ pref.setSummary((String) objValue);
+ return true;
+ } else if (pref.getKey().equals(BrowserSettings.PREF_TEXT_SIZE)) {
+ pref.setSummary(getVisualTextSizeName((String) objValue));
+ return true;
+ } else if (pref.getKey().equals(BrowserSettings.PREF_DEFAULT_ZOOM)) {
+ pref.setSummary(getVisualDefaultZoomName((String) objValue));
+ return true;
+ } else if (pref.getKey().equals(BrowserSettings.PREF_DEFAULT_TEXT_ENCODING)) {
+ pref.setSummary((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 "";
+ }
+
+ private CharSequence getVisualDefaultZoomName(String enumName) {
+ Resources res = getActivity().getResources();
+ CharSequence[] visualNames = res.getTextArray(R.array.pref_default_zoom_choices);
+ CharSequence[] enumNames = res.getTextArray(R.array.pref_default_zoom_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/PersonalPreferencesFragment.java b/src/com/android/browser/preferences/PersonalPreferencesFragment.java
new file mode 100644
index 0000000..0620df2
--- /dev/null
+++ b/src/com/android/browser/preferences/PersonalPreferencesFragment.java
@@ -0,0 +1,379 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.browser.preferences;
+
+import com.android.browser.BrowserBookmarksPage;
+import com.android.browser.BrowserSettings;
+import com.android.browser.R;
+
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.DialogFragment;
+import android.app.Fragment;
+import android.content.ContentProviderOperation;
+import android.content.ContentResolver;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.OperationApplicationException;
+import android.content.SharedPreferences;
+import android.database.Cursor;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.os.RemoteException;
+import android.preference.Preference;
+import android.preference.Preference.OnPreferenceClickListener;
+import android.preference.PreferenceFragment;
+import android.preference.PreferenceManager;
+import android.preference.PreferenceScreen;
+import android.provider.BrowserContract;
+import android.provider.BrowserContract.Bookmarks;
+import android.provider.BrowserContract.ChromeSyncColumns;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import android.widget.LinearLayout;
+
+import java.util.ArrayList;
+
+public class PersonalPreferencesFragment extends PreferenceFragment
+ implements OnPreferenceClickListener {
+ static final String TAG = "PersonalPreferencesFragment";
+
+ static final String PREF_CHROME_SYNC = "sync_with_chrome";
+
+ Preference mChromeSync;
+ boolean mEnabled;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ // Load the XML preferences file
+ addPreferencesFromResource(R.xml.personal_preferences);
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+
+ // Setup the proper state for the sync with chrome item
+ Context context = getActivity();
+ mChromeSync = findPreference(PREF_CHROME_SYNC);
+ refreshUi(context);
+ }
+
+ private class GetAccountsTask extends AsyncTask<Void, Void, String> {
+ private Context mContext;
+
+ GetAccountsTask(Context ctx) {
+ mContext = ctx;
+ }
+
+ protected String doInBackground(Void... unused) {
+ AccountManager am = (AccountManager) mContext.getSystemService(Context.ACCOUNT_SERVICE);
+ Account[] accounts = am.getAccountsByType("com.google");
+ if (accounts == null || accounts.length == 0) {
+ // No Google accounts setup, don't offer Chrome sync
+ if (mChromeSync != null) {
+ getPreferenceScreen().removePreference(mChromeSync);
+ }
+ } else {
+ // Google accounts are present.
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext);
+ Bundle args = mChromeSync.getExtras();
+ args.putParcelableArray("accounts", accounts);
+ mEnabled = BrowserContract.Settings.isSyncEnabled(mContext);
+ mChromeSync.setOnPreferenceClickListener(PersonalPreferencesFragment.this);
+
+ if (!mEnabled) {
+ // Setup a link to the enable wizard
+ return mContext.getResources().getString(
+ R.string.pref_personal_sync_with_chrome_summary);
+ } else {
+ // Chrome sync is enabled, setup a link to account switcher
+ String accountName = prefs.getString(
+ BrowserBookmarksPage.PREF_ACCOUNT_NAME, null);
+ args.putString("curAccount", accountName);
+ return accountName;
+ }
+ }
+
+ return null;
+ }
+
+ protected void onPostExecute(String summary) {
+ if (summary != null) {
+ mChromeSync.setSummary(summary);
+ }
+ }
+ }
+
+ void refreshUi(Context context) {
+ new GetAccountsTask(context).execute();
+
+ PreferenceScreen autoFillSettings =
+ (PreferenceScreen)findPreference(BrowserSettings.PREF_AUTOFILL_PROFILE);
+ autoFillSettings.setDependency(BrowserSettings.PREF_AUTOFILL_ENABLED);
+ }
+
+ @Override
+ public boolean onPreferenceClick(Preference preference) {
+ Fragment frag;
+ if (mEnabled) {
+ frag = new AccountChooserDialog();
+ } else {
+ frag = new ImportWizardDialog();
+ }
+ frag.setArguments(preference.getExtras());
+ getFragmentManager().openTransaction()
+ .add(frag, null)
+ .commit();
+ return true;
+ }
+
+ final class AccountChooserDialog extends DialogFragment
+ implements DialogInterface.OnClickListener {
+
+ AlertDialog mDialog;
+
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ Bundle args = getArguments();
+ Account[] accounts = (Account[]) args.getParcelableArray("accounts");
+ String curAccount = args.getString("curAccount");
+ int length = accounts.length;
+ int curAccountOffset = 0;
+ CharSequence[] accountNames = new CharSequence[length];
+ for (int i = 0; i < length; i++) {
+ String name = accounts[i].name;
+ if (name.equals(curAccount)) {
+ curAccountOffset = i;
+ }
+ accountNames[i] = name;
+ }
+
+ mDialog = new AlertDialog.Builder(getActivity())
+ .setIcon(android.R.drawable.ic_dialog_alert)
+ .setTitle("Choose account") // STOPSHIP localize
+ .setSingleChoiceItems(accountNames, curAccountOffset, this)
+ .create();
+ return mDialog;
+ }
+
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ String accountName = mDialog.getListView().getAdapter().getItem(which).toString();
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
+ prefs.edit().putString(BrowserBookmarksPage.PREF_ACCOUNT_NAME, accountName).apply();
+ refreshUi(getActivity());
+ dismiss();
+ }
+ }
+
+ final class ImportWizardDialog extends DialogFragment implements OnClickListener {
+ View mRemoveButton;
+ View mCancelButton;
+ String mDefaultAccount;
+
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ Context context = getActivity();
+ Dialog dialog = new Dialog(context);
+ dialog.setTitle(R.string.import_bookmarks_dialog_title);
+ dialog.setContentView(R.layout.import_bookmarks_dialog);
+ mRemoveButton = dialog.findViewById(R.id.remove);
+ mRemoveButton.setOnClickListener(this);
+ mCancelButton = dialog.findViewById(R.id.cancel);
+ mCancelButton.setOnClickListener(this);
+
+ LayoutInflater inflater = dialog.getLayoutInflater();
+ LinearLayout accountList = (LinearLayout) dialog.findViewById(R.id.accountList);
+ Account[] accounts = (Account[]) getArguments().getParcelableArray("accounts");
+ mDefaultAccount = accounts[0].name;
+ int length = accounts.length;
+ for (int i = 0; i < length; i++) {
+ Button button = (Button) inflater.inflate(R.layout.import_bookmarks_dialog_button,
+ null);
+ button.setText(context.getString(R.string.import_bookmarks_dialog_import,
+ accounts[i].name));
+ button.setTag(accounts[i].name);
+ button.setOnClickListener(this);
+ accountList.addView(button);
+ }
+
+ return dialog;
+ }
+
+ @Override
+ public void onClick(View view) {
+ if (view == mCancelButton) {
+ dismiss();
+ return;
+ }
+
+ ContentResolver resolver = getActivity().getContentResolver();
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
+ String accountName;
+ if (view == mRemoveButton) {
+ // The user chose to remove their old bookmarks, delete them now
+ resolver.delete(Bookmarks.CONTENT_URI,
+ Bookmarks.PARENT + "=1 AND " + Bookmarks.ACCOUNT_NAME + " IS NULL", null);
+ accountName = mDefaultAccount;
+ } else {
+ // The user chose to migrate their old bookmarks to the account they're syncing
+ accountName = view.getTag().toString();
+ migrateBookmarks(resolver, accountName);
+ }
+
+ // Record the fact that we turned on sync
+ BrowserContract.Settings.setSyncEnabled(getActivity(), true);
+ prefs.edit()
+ .putString(BrowserBookmarksPage.PREF_ACCOUNT_TYPE, "com.google")
+ .putString(BrowserBookmarksPage.PREF_ACCOUNT_NAME, accountName)
+ .apply();
+
+ // Enable bookmark sync on all accounts
+ Account[] accounts = (Account[]) getArguments().getParcelableArray("accounts");
+ for (Account account : accounts) {
+ ContentResolver.setIsSyncable(account, BrowserContract.AUTHORITY, 1);
+ }
+
+ refreshUi(getActivity());
+ dismiss();
+ }
+
+ /**
+ * Migrates bookmarks to the given account
+ */
+ void migrateBookmarks(ContentResolver resolver, String accountName) {
+ Cursor cursor = null;
+ try {
+ // Re-parent the bookmarks in the default root folder
+ cursor = resolver.query(Bookmarks.CONTENT_URI, new String[] { Bookmarks._ID },
+ Bookmarks.ACCOUNT_NAME + " =? AND " +
+ ChromeSyncColumns.SERVER_UNIQUE + " =?",
+ new String[] { accountName,
+ ChromeSyncColumns.FOLDER_NAME_BOOKMARKS_BAR },
+ null);
+ ContentValues values = new ContentValues();
+ if (cursor == null || !cursor.moveToFirst()) {
+ // The root folders don't exist for the account, create them now
+ ArrayList<ContentProviderOperation> ops =
+ new ArrayList<ContentProviderOperation>();
+
+ // Chrome sync root folder
+ values.clear();
+ values.put(ChromeSyncColumns.SERVER_UNIQUE, ChromeSyncColumns.FOLDER_NAME_ROOT);
+ values.put(Bookmarks.TITLE, "Google Chrome");
+ values.put(Bookmarks.POSITION, 0);
+ values.put(Bookmarks.IS_FOLDER, true);
+ values.put(Bookmarks.DIRTY, true);
+ ops.add(ContentProviderOperation.newInsert(
+ Bookmarks.CONTENT_URI.buildUpon().appendQueryParameter(
+ BrowserContract.CALLER_IS_SYNCADAPTER, "true").build())
+ .withValues(values)
+ .build());
+
+ // Bookmarks folder
+ values.clear();
+ values.put(ChromeSyncColumns.SERVER_UNIQUE,
+ ChromeSyncColumns.FOLDER_NAME_BOOKMARKS);
+ values.put(Bookmarks.TITLE, "Bookmarks");
+ values.put(Bookmarks.POSITION, 0);
+ values.put(Bookmarks.IS_FOLDER, true);
+ values.put(Bookmarks.DIRTY, true);
+ ops.add(ContentProviderOperation.newInsert(Bookmarks.CONTENT_URI)
+ .withValues(values)
+ .withValueBackReference(Bookmarks.PARENT, 0)
+ .build());
+
+ // Bookmarks Bar folder
+ values.clear();
+ values.put(ChromeSyncColumns.SERVER_UNIQUE,
+ ChromeSyncColumns.FOLDER_NAME_BOOKMARKS_BAR);
+ values.put(Bookmarks.TITLE, "Bookmarks Bar");
+ values.put(Bookmarks.POSITION, 0);
+ values.put(Bookmarks.IS_FOLDER, true);
+ values.put(Bookmarks.DIRTY, true);
+ ops.add(ContentProviderOperation.newInsert(Bookmarks.CONTENT_URI)
+ .withValues(values)
+ .withValueBackReference(Bookmarks.PARENT, 1)
+ .build());
+
+ // Other Bookmarks folder
+ values.clear();
+ values.put(ChromeSyncColumns.SERVER_UNIQUE,
+ ChromeSyncColumns.FOLDER_NAME_OTHER_BOOKMARKS);
+ values.put(Bookmarks.TITLE, "Other Bookmarks");
+ values.put(Bookmarks.POSITION, 1000);
+ values.put(Bookmarks.IS_FOLDER, true);
+ values.put(Bookmarks.DIRTY, true);
+ ops.add(ContentProviderOperation.newInsert(Bookmarks.CONTENT_URI)
+ .withValues(values)
+ .withValueBackReference(Bookmarks.PARENT, 1)
+ .build());
+
+ // Re-parent the existing bookmarks to the newly create bookmarks bar folder
+ ops.add(ContentProviderOperation.newUpdate(Bookmarks.CONTENT_URI)
+ .withValueBackReference(Bookmarks.PARENT, 2)
+ .withSelection(Bookmarks.PARENT + "=?",
+ new String[] { Integer.toString(1) })
+ .build());
+
+ // Mark all non-root folder items as belonging to the new account
+ values.clear();
+ values.put(Bookmarks.ACCOUNT_TYPE, "com.google");
+ values.put(Bookmarks.ACCOUNT_NAME, accountName);
+ ops.add(ContentProviderOperation.newUpdate(Bookmarks.CONTENT_URI)
+ .withValues(values)
+ .withSelection(Bookmarks.ACCOUNT_NAME + " IS NULL AND " +
+ Bookmarks._ID + "<>1", null)
+ .build());
+
+ try {
+ resolver.applyBatch(BrowserContract.AUTHORITY, ops);
+ } catch (RemoteException e) {
+ Log.e(TAG, "failed to create root folder for account " + accountName, e);
+ return;
+ } catch (OperationApplicationException e) {
+ Log.e(TAG, "failed to create root folder for account " + accountName, e);
+ return;
+ }
+ } else {
+ values.put(Bookmarks.PARENT, cursor.getLong(0));
+ resolver.update(Bookmarks.CONTENT_URI, values, Bookmarks.PARENT + "=?",
+ new String[] { Integer.toString(1) });
+
+ // Mark all bookmarks at all levels as part of the new account
+ values.clear();
+ values.put(Bookmarks.ACCOUNT_TYPE, "com.google");
+ values.put(Bookmarks.ACCOUNT_NAME, accountName);
+ resolver.update(Bookmarks.CONTENT_URI, values,
+ Bookmarks.ACCOUNT_NAME + " IS NULL AND " + Bookmarks._ID + "<>1",
+ null);
+ }
+ } finally {
+ if (cursor != null) cursor.close();
+ }
+ }
+ }
+}
diff --git a/src/com/android/browser/preferences/PrivacyPreferencesFragment.java b/src/com/android/browser/preferences/PrivacyPreferencesFragment.java
new file mode 100644
index 0000000..79f2084
--- /dev/null
+++ b/src/com/android/browser/preferences/PrivacyPreferencesFragment.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.browser.preferences;
+
+import com.android.browser.BrowserSettings;
+import com.android.browser.R;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.preference.Preference;
+import android.preference.PreferenceFragment;
+
+public class PrivacyPreferencesFragment extends PreferenceFragment
+ implements Preference.OnPreferenceChangeListener {
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ // Load the preferences from an XML resource
+ addPreferencesFromResource(R.xml.privacy_preferences);
+
+ Preference e = findPreference(BrowserSettings.PREF_CLEAR_HISTORY);
+ e.setOnPreferenceChangeListener(this);
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference pref, Object objValue) {
+ if (pref.getKey().equals(BrowserSettings.PREF_CLEAR_HISTORY)
+ && ((Boolean) objValue).booleanValue() == true) {
+ // Need to tell the browser to remove the parent/child relationship
+ // between tabs
+ getActivity().setResult(Activity.RESULT_OK, (new Intent()).putExtra(Intent.EXTRA_TEXT,
+ pref.getKey()));
+ return true;
+ }
+
+ return false;
+ }
+}
diff --git a/src/com/android/browser/preferences/SecurityPreferencesFragment.java b/src/com/android/browser/preferences/SecurityPreferencesFragment.java
new file mode 100644
index 0000000..d20a50c
--- /dev/null
+++ b/src/com/android/browser/preferences/SecurityPreferencesFragment.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.browser.preferences;
+
+import com.android.browser.R;
+
+import android.os.Bundle;
+import android.preference.PreferenceFragment;
+
+public class SecurityPreferencesFragment extends PreferenceFragment {
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ // Load the XML preferences file
+ addPreferencesFromResource(R.xml.security_preferences);
+ }
+}
diff --git a/src/com/android/browser/WebsiteSettingsActivity.java b/src/com/android/browser/preferences/WebsiteSettingsFragment.java
similarity index 71%
rename from src/com/android/browser/WebsiteSettingsActivity.java
rename to src/com/android/browser/preferences/WebsiteSettingsFragment.java
index 1e27092..1965ffe 100644
--- a/src/com/android/browser/WebsiteSettingsActivity.java
+++ b/src/com/android/browser/preferences/WebsiteSettingsFragment.java
@@ -14,55 +14,62 @@
* limitations under the License.
*/
-package com.android.browser;
+package com.android.browser.preferences;
+
+import com.android.browser.R;
+import com.android.browser.WebStorageSizeManager;
import android.app.AlertDialog;
-import android.app.ListActivity;
+import android.app.FragmentTransaction;
+import android.app.ListFragment;
import android.content.Context;
import android.content.DialogInterface;
+import android.content.res.Resources;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
+import android.os.AsyncTask;
import android.os.Bundle;
-import android.provider.Browser;
+import android.preference.PreferenceActivity;
+import android.preference.PreferenceFragment;
+import android.provider.BrowserContract.Bookmarks;
import android.util.Log;
-import android.view.KeyEvent;
import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
+import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.webkit.GeolocationPermissions;
import android.webkit.ValueCallback;
-import android.webkit.WebIconDatabase;
import android.webkit.WebStorage;
-import android.widget.ArrayAdapter;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
+import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
+import java.io.Serializable;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
-import java.util.Vector;
/**
* Manage the settings for an origin.
* We use it to keep track of the 'HTML5' settings, i.e. database (webstorage)
* and Geolocation.
*/
-public class WebsiteSettingsActivity extends ListActivity {
+public class WebsiteSettingsFragment extends ListFragment implements OnClickListener {
+ private static final String EXTRA_SITE = "site";
private String LOGTAG = "WebsiteSettingsActivity";
private static String sMBStored = null;
private SiteAdapter mAdapter = null;
+ private Site mSite = null;
- static class Site {
+ static class Site implements Serializable {
private String mOrigin;
private String mTitle;
private Bitmap mIcon;
@@ -168,6 +175,10 @@
private Site mCurrentSite;
public SiteAdapter(Context context, int rsc) {
+ this(context, rsc, null);
+ }
+
+ public SiteAdapter(Context context, int rsc, Site site) {
super(context, rsc);
mResource = rsc;
mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
@@ -183,7 +194,10 @@
R.drawable.ic_list_gps_on);
mLocationDisallowedIcon = BitmapFactory.decodeResource(getResources(),
R.drawable.ic_list_gps_denied);
- askForOrigins();
+ mCurrentSite = site;
+ if (mCurrentSite == null) {
+ askForOrigins();
+ }
}
/**
@@ -242,67 +256,94 @@
public void populateIcons(Map<String, Site> sites) {
// Create a map from host to origin. This is used to add metadata
- // (title, icon) for this origin from the bookmarks DB.
- HashMap<String, Set<Site>> hosts = new HashMap<String, Set<Site>>();
- Set<Map.Entry<String, Site>> elements = sites.entrySet();
- Iterator<Map.Entry<String, Site>> originIter = elements.iterator();
- while (originIter.hasNext()) {
- Map.Entry<String, Site> entry = originIter.next();
- Site site = entry.getValue();
- String host = Uri.parse(entry.getKey()).getHost();
- Set<Site> hostSites = null;
- if (hosts.containsKey(host)) {
- hostSites = (Set<Site>)hosts.get(host);
- } else {
- hostSites = new HashSet<Site>();
- hosts.put(host, hostSites);
- }
- hostSites.add(site);
+ // (title, icon) for this origin from the bookmarks DB. We must do
+ // the DB access on a background thread.
+ new UpdateFromBookmarksDbTask(this.getContext(), sites).execute();
+ }
+
+ private class UpdateFromBookmarksDbTask extends AsyncTask<Void, Void, Void> {
+
+ private Context mContext;
+ private boolean mDataSetChanged;
+ private Map<String, Site> mSites;
+
+ public UpdateFromBookmarksDbTask(Context ctx, Map<String, Site> sites) {
+ mContext = ctx;
+ mSites = sites;
}
- // Check the bookmark DB. If we have data for a host used by any of
- // our origins, use it to set their title and favicon
- Cursor c = getContext().getContentResolver().query(Browser.BOOKMARKS_URI,
- new String[] { Browser.BookmarkColumns.URL, Browser.BookmarkColumns.TITLE,
- Browser.BookmarkColumns.FAVICON }, "bookmark = 1", null, null);
-
- if (c != null) {
- if (c.moveToFirst()) {
- int urlIndex = c.getColumnIndex(Browser.BookmarkColumns.URL);
- int titleIndex = c.getColumnIndex(Browser.BookmarkColumns.TITLE);
- int faviconIndex = c.getColumnIndex(Browser.BookmarkColumns.FAVICON);
- do {
- String url = c.getString(urlIndex);
- String host = Uri.parse(url).getHost();
- if (hosts.containsKey(host)) {
- String title = c.getString(titleIndex);
- Bitmap bmp = null;
- byte[] data = c.getBlob(faviconIndex);
- if (data != null) {
- bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
- }
- Set matchingSites = (Set) hosts.get(host);
- Iterator<Site> sitesIter = matchingSites.iterator();
- while (sitesIter.hasNext()) {
- Site site = sitesIter.next();
- // We should only set the title if the bookmark is for the root
- // (i.e. www.google.com), as website settings act on the origin
- // as a whole rather than a single page under that origin. If the
- // user has bookmarked a page under the root but *not* the root,
- // then we risk displaying the title of that page which may or
- // may not have any relevance to the origin.
- if (url.equals(site.getOrigin()) ||
- (new String(site.getOrigin()+"/")).equals(url)) {
- site.setTitle(title);
- }
- if (bmp != null) {
- site.setIcon(bmp);
- }
- }
- }
- } while (c.moveToNext());
+ protected Void doInBackground(Void... unused) {
+ HashMap<String, Set<Site>> hosts = new HashMap<String, Set<Site>>();
+ Set<Map.Entry<String, Site>> elements = mSites.entrySet();
+ Iterator<Map.Entry<String, Site>> originIter = elements.iterator();
+ while (originIter.hasNext()) {
+ Map.Entry<String, Site> entry = originIter.next();
+ Site site = entry.getValue();
+ String host = Uri.parse(entry.getKey()).getHost();
+ Set<Site> hostSites = null;
+ if (hosts.containsKey(host)) {
+ hostSites = (Set<Site>)hosts.get(host);
+ } else {
+ hostSites = new HashSet<Site>();
+ hosts.put(host, hostSites);
+ }
+ hostSites.add(site);
}
- c.close();
+
+ // Check the bookmark DB. If we have data for a host used by any of
+ // our origins, use it to set their title and favicon
+ Cursor c = mContext.getContentResolver().query(Bookmarks.CONTENT_URI,
+ new String[] { Bookmarks.URL, Bookmarks.TITLE, Bookmarks.FAVICON },
+ Bookmarks.IS_FOLDER + " == 0", null, null);
+
+ if (c != null) {
+ if (c.moveToFirst()) {
+ int urlIndex = c.getColumnIndex(Bookmarks.URL);
+ int titleIndex = c.getColumnIndex(Bookmarks.TITLE);
+ int faviconIndex = c.getColumnIndex(Bookmarks.FAVICON);
+ do {
+ String url = c.getString(urlIndex);
+ String host = Uri.parse(url).getHost();
+ if (hosts.containsKey(host)) {
+ String title = c.getString(titleIndex);
+ Bitmap bmp = null;
+ byte[] data = c.getBlob(faviconIndex);
+ if (data != null) {
+ bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
+ }
+ Set matchingSites = (Set) hosts.get(host);
+ Iterator<Site> sitesIter = matchingSites.iterator();
+ while (sitesIter.hasNext()) {
+ Site site = sitesIter.next();
+ // We should only set the title if the bookmark is for the root
+ // (i.e. www.google.com), as website settings act on the origin
+ // as a whole rather than a single page under that origin. If the
+ // user has bookmarked a page under the root but *not* the root,
+ // then we risk displaying the title of that page which may or
+ // may not have any relevance to the origin.
+ if (url.equals(site.getOrigin()) ||
+ (new String(site.getOrigin()+"/")).equals(url)) {
+ mDataSetChanged = true;
+ site.setTitle(title);
+ }
+
+ if (bmp != null) {
+ mDataSetChanged = true;
+ site.setIcon(bmp);
+ }
+ }
+ }
+ } while (c.moveToNext());
+ }
+ c.close();
+ }
+ return null;
+ }
+
+ protected void onPostExecute(Void unused) {
+ if (mDataSetChanged) {
+ notifyDataSetChanged();
+ }
}
}
@@ -381,6 +422,7 @@
}
}
+ @Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
final TextView title;
@@ -406,7 +448,6 @@
locationIcon.setVisibility(View.GONE);
if (mCurrentSite == null) {
- setTitle(getString(R.string.pref_extras_website_settings));
Site site = getItem(position);
title.setText(site.getPrettyTitle());
@@ -466,7 +507,6 @@
locationIcon.setVisibility(View.GONE);
usageIcon.setVisibility(View.GONE);
featureIcon.setVisibility(View.VISIBLE);
- setTitle(mCurrentSite.getPrettyTitle());
String origin = mCurrentSite.getOrigin();
switch (mCurrentSite.getFeatureByIndex(position)) {
case Site.FEATURE_WEB_STORAGE:
@@ -523,7 +563,7 @@
// origins list.
mCurrentSite.removeFeature(Site.FEATURE_WEB_STORAGE);
if (mCurrentSite.getFeatureCount() == 0) {
- mCurrentSite = null;
+ finish();
}
askForOrigins();
notifyDataSetChanged();
@@ -542,7 +582,7 @@
GeolocationPermissions.getInstance().clear(mCurrentSite.getOrigin());
mCurrentSite.removeFeature(Site.FEATURE_GEOLOCATION);
if (mCurrentSite.getFeatureCount() == 0) {
- mCurrentSite = null;
+ finish();
}
askForOrigins();
notifyDataSetChanged();
@@ -553,8 +593,14 @@
break;
}
} else {
- mCurrentSite = (Site) view.getTag();
- notifyDataSetChanged();
+ Site site = (Site) view.getTag();
+ PreferenceActivity activity = (PreferenceActivity) getActivity();
+ if (activity != null) {
+ Bundle args = new Bundle();
+ args.putSerializable(EXTRA_SITE, site);
+ activity.startPreferencePanel(WebsiteSettingsFragment.class.getName(), args, 0,
+ site.getPrettyTitle(), null, 0);
+ }
}
}
@@ -563,67 +609,64 @@
}
}
- /**
- * Intercepts the back key to immediately notify
- * NativeDialog that we are done.
- */
- public boolean dispatchKeyEvent(KeyEvent event) {
- if ((event.getKeyCode() == KeyEvent.KEYCODE_BACK)
- && (event.getAction() == KeyEvent.ACTION_DOWN)) {
- if ((mAdapter != null) && (mAdapter.backKeyPressed())){
- return true; // event consumed
- }
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ View view = inflater.inflate(R.layout.website_settings, container, false);
+ Bundle args = getArguments();
+ if (args != null) {
+ mSite = (Site) args.getSerializable(EXTRA_SITE);
}
- return super.dispatchKeyEvent(event);
+ if (mSite == null) {
+ View clear = view.findViewById(R.id.clear_all_button);
+ clear.setVisibility(View.VISIBLE);
+ clear.setOnClickListener(this);
+ }
+ return view;
}
@Override
- protected void onCreate(Bundle icicle) {
- super.onCreate(icicle);
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
if (sMBStored == null) {
sMBStored = getString(R.string.webstorage_origin_summary_mb_stored);
}
- mAdapter = new SiteAdapter(this, R.layout.website_settings_row);
- setListAdapter(mAdapter);
+ mAdapter = new SiteAdapter(getActivity(), R.layout.website_settings_row);
+ if (mSite != null) {
+ mAdapter.mCurrentSite = mSite;
+ }
+ getListView().setAdapter(mAdapter);
getListView().setOnItemClickListener(mAdapter);
}
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- MenuInflater inflater = getMenuInflater();
- inflater.inflate(R.menu.websitesettings, menu);
- return true;
- }
-
- @Override
- public boolean onPrepareOptionsMenu(Menu menu) {
- // If we are not on the sites list (rather on the page for a specific site) or
- // we aren't listing any sites hide the clear all button (and hence the menu).
- return mAdapter.currentSite() == null && mAdapter.getCount() > 0;
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.website_settings_menu_clear_all:
- // Show the prompt to clear all origins of their data and geolocation permissions.
- new AlertDialog.Builder(this)
- .setTitle(R.string.website_settings_clear_all_dialog_title)
- .setMessage(R.string.website_settings_clear_all_dialog_message)
- .setPositiveButton(R.string.website_settings_clear_all_dialog_ok_button,
- new AlertDialog.OnClickListener() {
- public void onClick(DialogInterface dlg, int which) {
- WebStorage.getInstance().deleteAllData();
- GeolocationPermissions.getInstance().clearAll();
- WebStorageSizeManager.resetLastOutOfSpaceNotificationTime();
- mAdapter.askForOrigins();
- finish();
- }})
- .setNegativeButton(R.string.website_settings_clear_all_dialog_cancel_button, null)
- .setIcon(android.R.drawable.ic_dialog_alert)
- .show();
- return true;
+ private void finish() {
+ PreferenceActivity activity = (PreferenceActivity) getActivity();
+ if (activity != null) {
+ activity.finishPreferencePanel(this, 0, null);
}
- return false;
+ }
+
+ @Override
+ public void onClick(View v) {
+ switch (v.getId()) {
+ case R.id.clear_all_button:
+ // Show the prompt to clear all origins of their data and geolocation permissions.
+ new AlertDialog.Builder(getActivity())
+ .setTitle(R.string.website_settings_clear_all_dialog_title)
+ .setMessage(R.string.website_settings_clear_all_dialog_message)
+ .setPositiveButton(R.string.website_settings_clear_all_dialog_ok_button,
+ new AlertDialog.OnClickListener() {
+ public void onClick(DialogInterface dlg, int which) {
+ WebStorage.getInstance().deleteAllData();
+ GeolocationPermissions.getInstance().clearAll();
+ WebStorageSizeManager.resetLastOutOfSpaceNotificationTime();
+ mAdapter.askForOrigins();
+ finish();
+ }})
+ .setNegativeButton(R.string.website_settings_clear_all_dialog_cancel_button, null)
+ .setIcon(android.R.drawable.ic_dialog_alert)
+ .show();
+ break;
+ }
}
}
diff --git a/src/com/android/browser/provider/BrowserProvider2.java b/src/com/android/browser/provider/BrowserProvider2.java
new file mode 100644
index 0000000..8d9f1fe
--- /dev/null
+++ b/src/com/android/browser/provider/BrowserProvider2.java
@@ -0,0 +1,1186 @@
+/*
+ * Copyright (C) 2010 he 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.provider;
+
+import com.android.browser.R;
+import com.android.common.content.SyncStateContentProviderHelper;
+
+import android.accounts.Account;
+import android.content.ContentResolver;
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.UriMatcher;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.database.Cursor;
+import android.database.DatabaseUtils;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.database.sqlite.SQLiteQueryBuilder;
+import android.net.Uri;
+import android.provider.BrowserContract;
+import android.provider.BrowserContract.Accounts;
+import android.provider.BrowserContract.Bookmarks;
+import android.provider.BrowserContract.ChromeSyncColumns;
+import android.provider.BrowserContract.Combined;
+import android.provider.BrowserContract.History;
+import android.provider.BrowserContract.Images;
+import android.provider.BrowserContract.Searches;
+import android.provider.BrowserContract.Settings;
+import android.provider.BrowserContract.SyncState;
+import android.provider.ContactsContract.RawContacts;
+import android.provider.SyncStateContract;
+import android.text.TextUtils;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+
+public class BrowserProvider2 extends SQLiteContentProvider {
+
+ static final String LEGACY_AUTHORITY = "browser";
+ static final Uri LEGACY_AUTHORITY_URI = new Uri.Builder().authority(LEGACY_AUTHORITY).build();
+
+ static final String TABLE_BOOKMARKS = "bookmarks";
+ static final String TABLE_HISTORY = "history";
+ static final String TABLE_IMAGES = "images";
+ static final String TABLE_SEARCHES = "searches";
+ static final String TABLE_SYNC_STATE = "syncstate";
+ static final String TABLE_SETTINGS = "settings";
+ static final String VIEW_COMBINED = "combined";
+
+ static final String TABLE_BOOKMARKS_JOIN_IMAGES = "bookmarks LEFT OUTER JOIN images " +
+ "ON bookmarks.url = images." + Images.URL;
+ static final String TABLE_HISTORY_JOIN_IMAGES = "history LEFT OUTER JOIN images " +
+ "ON history.url = images." + Images.URL;
+
+ static final String DEFAULT_SORT_HISTORY = History.DATE_LAST_VISITED + " DESC";
+
+ static final String DEFAULT_SORT_SEARCHES = Searches.DATE + " DESC";
+
+ static final int BOOKMARKS = 1000;
+ static final int BOOKMARKS_ID = 1001;
+ static final int BOOKMARKS_FOLDER = 1002;
+ static final int BOOKMARKS_FOLDER_ID = 1003;
+
+ static final int HISTORY = 2000;
+ static final int HISTORY_ID = 2001;
+
+ static final int SEARCHES = 3000;
+ static final int SEARCHES_ID = 3001;
+
+ static final int SYNCSTATE = 4000;
+ static final int SYNCSTATE_ID = 4001;
+
+ static final int IMAGES = 5000;
+
+ static final int COMBINED = 6000;
+ static final int COMBINED_ID = 6001;
+
+ static final int ACCOUNTS = 7000;
+
+ static final int SETTINGS = 8000;
+
+ public static final long FIXED_ID_ROOT = 1;
+
+ // Default sort order for unsync'd bookmarks
+ static final String DEFAULT_BOOKMARKS_SORT_ORDER =
+ Bookmarks.IS_FOLDER + " DESC, position ASC, _id ASC";
+
+ // Default sort order for sync'd bookmarks
+ static final String DEFAULT_BOOKMARKS_SORT_ORDER_SYNC = "position ASC, _id ASC";
+
+ static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
+
+ static final HashMap<String, String> ACCOUNTS_PROJECTION_MAP = new HashMap<String, String>();
+ static final HashMap<String, String> BOOKMARKS_PROJECTION_MAP = new HashMap<String, String>();
+ static final HashMap<String, String> OTHER_BOOKMARKS_PROJECTION_MAP =
+ new HashMap<String, String>();
+ static final HashMap<String, String> HISTORY_PROJECTION_MAP = new HashMap<String, String>();
+ static final HashMap<String, String> SYNC_STATE_PROJECTION_MAP = new HashMap<String, String>();
+ static final HashMap<String, String> IMAGES_PROJECTION_MAP = new HashMap<String, String>();
+ static final HashMap<String, String> COMBINED_PROJECTION_MAP = new HashMap<String, String>();
+ static final HashMap<String, String> SEARCHES_PROJECTION_MAP = new HashMap<String, String>();
+ static final HashMap<String, String> SETTINGS_PROJECTION_MAP = new HashMap<String, String>();
+
+ static {
+ final UriMatcher matcher = URI_MATCHER;
+ final String authority = BrowserContract.AUTHORITY;
+ matcher.addURI(authority, "accounts", ACCOUNTS);
+ matcher.addURI(authority, "bookmarks", BOOKMARKS);
+ matcher.addURI(authority, "bookmarks/#", BOOKMARKS_ID);
+ matcher.addURI(authority, "bookmarks/folder", BOOKMARKS_FOLDER);
+ matcher.addURI(authority, "bookmarks/folder/#", BOOKMARKS_FOLDER_ID);
+ matcher.addURI(authority, "history", HISTORY);
+ matcher.addURI(authority, "history/#", HISTORY_ID);
+ matcher.addURI(authority, "searches", SEARCHES);
+ matcher.addURI(authority, "searches/#", SEARCHES_ID);
+ matcher.addURI(authority, "syncstate", SYNCSTATE);
+ matcher.addURI(authority, "syncstate/#", SYNCSTATE_ID);
+ matcher.addURI(authority, "images", IMAGES);
+ matcher.addURI(authority, "combined", COMBINED);
+ matcher.addURI(authority, "combined/#", COMBINED_ID);
+ matcher.addURI(authority, "settings", SETTINGS);
+
+ // Projection maps
+ HashMap<String, String> map;
+
+ // Accounts
+ map = ACCOUNTS_PROJECTION_MAP;
+ map.put(Accounts.ACCOUNT_TYPE, Accounts.ACCOUNT_TYPE);
+ map.put(Accounts.ACCOUNT_NAME, Accounts.ACCOUNT_NAME);
+
+ // Bookmarks
+ map = BOOKMARKS_PROJECTION_MAP;
+ map.put(Bookmarks._ID, qualifyColumn(TABLE_BOOKMARKS, Bookmarks._ID));
+ map.put(Bookmarks.TITLE, Bookmarks.TITLE);
+ map.put(Bookmarks.URL, Bookmarks.URL);
+ map.put(Bookmarks.FAVICON, Bookmarks.FAVICON);
+ map.put(Bookmarks.THUMBNAIL, Bookmarks.THUMBNAIL);
+ map.put(Bookmarks.TOUCH_ICON, Bookmarks.TOUCH_ICON);
+ map.put(Bookmarks.IS_FOLDER, Bookmarks.IS_FOLDER);
+ map.put(Bookmarks.PARENT, Bookmarks.PARENT);
+ map.put(Bookmarks.POSITION, Bookmarks.POSITION);
+ map.put(Bookmarks.INSERT_AFTER, Bookmarks.INSERT_AFTER);
+ map.put(Bookmarks.IS_DELETED, Bookmarks.IS_DELETED);
+ map.put(Bookmarks.ACCOUNT_NAME, Bookmarks.ACCOUNT_NAME);
+ map.put(Bookmarks.ACCOUNT_TYPE, Bookmarks.ACCOUNT_TYPE);
+ map.put(Bookmarks.SOURCE_ID, Bookmarks.SOURCE_ID);
+ map.put(Bookmarks.VERSION, Bookmarks.VERSION);
+ map.put(Bookmarks.DATE_CREATED, Bookmarks.DATE_CREATED);
+ map.put(Bookmarks.DATE_MODIFIED, Bookmarks.DATE_MODIFIED);
+ map.put(Bookmarks.DIRTY, Bookmarks.DIRTY);
+ map.put(Bookmarks.SYNC1, Bookmarks.SYNC1);
+ map.put(Bookmarks.SYNC2, Bookmarks.SYNC2);
+ map.put(Bookmarks.SYNC3, Bookmarks.SYNC3);
+ map.put(Bookmarks.SYNC4, Bookmarks.SYNC4);
+ map.put(Bookmarks.SYNC5, Bookmarks.SYNC5);
+ map.put(Bookmarks.PARENT_SOURCE_ID, "(SELECT " + Bookmarks.SOURCE_ID +
+ " FROM " + TABLE_BOOKMARKS + " A WHERE " +
+ "A." + Bookmarks._ID + "=" + TABLE_BOOKMARKS + "." + Bookmarks.PARENT +
+ ") AS " + Bookmarks.PARENT_SOURCE_ID);
+ map.put(Bookmarks.INSERT_AFTER_SOURCE_ID, "(SELECT " + Bookmarks.SOURCE_ID +
+ " FROM " + TABLE_BOOKMARKS + " A WHERE " +
+ "A." + Bookmarks._ID + "=" + TABLE_BOOKMARKS + "." + Bookmarks.INSERT_AFTER +
+ ") AS " + Bookmarks.INSERT_AFTER_SOURCE_ID);
+
+ // Other bookmarks
+ OTHER_BOOKMARKS_PROJECTION_MAP.putAll(BOOKMARKS_PROJECTION_MAP);
+ OTHER_BOOKMARKS_PROJECTION_MAP.put(Bookmarks.POSITION,
+ Long.toString(Long.MAX_VALUE) + " AS " + Bookmarks.POSITION);
+
+ // History
+ map = HISTORY_PROJECTION_MAP;
+ map.put(History._ID, qualifyColumn(TABLE_HISTORY, History._ID));
+ map.put(History.TITLE, History.TITLE);
+ map.put(History.URL, History.URL);
+ map.put(History.FAVICON, History.FAVICON);
+ map.put(History.THUMBNAIL, History.THUMBNAIL);
+ map.put(History.TOUCH_ICON, History.TOUCH_ICON);
+ map.put(History.DATE_CREATED, History.DATE_CREATED);
+ map.put(History.DATE_LAST_VISITED, History.DATE_LAST_VISITED);
+ map.put(History.VISITS, History.VISITS);
+ map.put(History.USER_ENTERED, History.USER_ENTERED);
+
+ // Sync state
+ map = SYNC_STATE_PROJECTION_MAP;
+ map.put(SyncState._ID, SyncState._ID);
+ map.put(SyncState.ACCOUNT_NAME, SyncState.ACCOUNT_NAME);
+ map.put(SyncState.ACCOUNT_TYPE, SyncState.ACCOUNT_TYPE);
+ map.put(SyncState.DATA, SyncState.DATA);
+
+ // Images
+ map = IMAGES_PROJECTION_MAP;
+ map.put(Images.URL, Images.URL);
+ map.put(Images.FAVICON, Images.FAVICON);
+ map.put(Images.THUMBNAIL, Images.THUMBNAIL);
+ map.put(Images.TOUCH_ICON, Images.TOUCH_ICON);
+
+ // Combined history half
+ map = COMBINED_PROJECTION_MAP;
+ map.put(Combined._ID, Combined._ID);
+ map.put(Combined.TITLE, Combined.TITLE);
+ map.put(Combined.URL, Combined.URL);
+ map.put(Combined.DATE_CREATED, Combined.DATE_CREATED);
+ map.put(Combined.DATE_LAST_VISITED, Combined.DATE_LAST_VISITED);
+ map.put(Combined.IS_BOOKMARK, Combined.IS_BOOKMARK);
+ map.put(Combined.VISITS, Combined.VISITS);
+ map.put(Combined.FAVICON, Combined.FAVICON);
+ map.put(Combined.THUMBNAIL, Combined.THUMBNAIL);
+ map.put(Combined.TOUCH_ICON, Combined.TOUCH_ICON);
+ map.put(Combined.USER_ENTERED, Combined.USER_ENTERED);
+
+ // Searches
+ map = SEARCHES_PROJECTION_MAP;
+ map.put(Searches._ID, Searches._ID);
+ map.put(Searches.SEARCH, Searches.SEARCH);
+ map.put(Searches.DATE, Searches.DATE);
+
+ // Settings
+ map = SETTINGS_PROJECTION_MAP;
+ map.put(Settings.KEY, Settings.KEY);
+ map.put(Settings.VALUE, Settings.VALUE);
+ }
+
+ static final String bookmarkOrHistoryColumn(String column) {
+ return "CASE WHEN bookmarks." + column + " IS NOT NULL THEN " +
+ "bookmarks." + column + " ELSE history." + column + " END AS " + column;
+ }
+
+ static final String qualifyColumn(String table, String column) {
+ return table + "." + column + " AS " + column;
+ }
+
+ DatabaseHelper mOpenHelper;
+ SyncStateContentProviderHelper mSyncHelper = new SyncStateContentProviderHelper();
+
+ final class DatabaseHelper extends SQLiteOpenHelper {
+ static final String DATABASE_NAME = "browser2.db";
+ static final int DATABASE_VERSION = 25;
+ public DatabaseHelper(Context context) {
+ super(context, DATABASE_NAME, null, DATABASE_VERSION);
+ }
+
+ @Override
+ public void onCreate(SQLiteDatabase db) {
+ db.execSQL("CREATE TABLE " + TABLE_BOOKMARKS + "(" +
+ Bookmarks._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
+ Bookmarks.TITLE + " TEXT," +
+ Bookmarks.URL + " TEXT," +
+ Bookmarks.IS_FOLDER + " INTEGER NOT NULL DEFAULT 0," +
+ Bookmarks.PARENT + " INTEGER," +
+ Bookmarks.POSITION + " INTEGER NOT NULL," +
+ Bookmarks.INSERT_AFTER + " INTEGER," +
+ Bookmarks.IS_DELETED + " INTEGER NOT NULL DEFAULT 0," +
+ Bookmarks.ACCOUNT_NAME + " TEXT," +
+ Bookmarks.ACCOUNT_TYPE + " TEXT," +
+ Bookmarks.SOURCE_ID + " TEXT," +
+ Bookmarks.VERSION + " INTEGER NOT NULL DEFAULT 1," +
+ Bookmarks.DATE_CREATED + " INTEGER," +
+ Bookmarks.DATE_MODIFIED + " INTEGER," +
+ Bookmarks.DIRTY + " INTEGER NOT NULL DEFAULT 0," +
+ Bookmarks.SYNC1 + " TEXT," +
+ Bookmarks.SYNC2 + " TEXT," +
+ Bookmarks.SYNC3 + " TEXT," +
+ Bookmarks.SYNC4 + " TEXT," +
+ Bookmarks.SYNC5 + " TEXT" +
+ ");");
+
+ // TODO indices
+
+ db.execSQL("CREATE TABLE " + TABLE_HISTORY + "(" +
+ History._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
+ History.TITLE + " TEXT," +
+ History.URL + " TEXT NOT NULL," +
+ History.DATE_CREATED + " INTEGER," +
+ History.DATE_LAST_VISITED + " INTEGER," +
+ History.VISITS + " INTEGER NOT NULL DEFAULT 0," +
+ History.USER_ENTERED + " INTEGER" +
+ ");");
+
+ db.execSQL("CREATE TABLE " + TABLE_IMAGES + " (" +
+ Images.URL + " TEXT UNIQUE NOT NULL," +
+ Images.FAVICON + " BLOB," +
+ Images.THUMBNAIL + " BLOB," +
+ Images.TOUCH_ICON + " BLOB" +
+ ");");
+ db.execSQL("CREATE INDEX imagesUrlIndex ON " + TABLE_IMAGES +
+ "(" + Images.URL + ")");
+
+ db.execSQL("CREATE TABLE " + TABLE_SEARCHES + " (" +
+ Searches._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
+ Searches.SEARCH + " TEXT," +
+ Searches.DATE + " LONG" +
+ ");");
+
+ db.execSQL("CREATE TABLE " + TABLE_SETTINGS + " (" +
+ Settings.KEY + " TEXT PRIMARY KEY," +
+ Settings.VALUE + " TEXT NOT NULL" +
+ ");");
+
+ db.execSQL("CREATE VIEW " + VIEW_COMBINED + " AS " +
+ "SELECT " +
+ bookmarkOrHistoryColumn(Combined._ID) + ", " +
+ bookmarkOrHistoryColumn(Combined.TITLE) + ", " +
+ qualifyColumn(TABLE_HISTORY, Combined.URL) + ", " +
+ qualifyColumn(TABLE_HISTORY, Combined.DATE_CREATED) + ", " +
+ Combined.DATE_LAST_VISITED + ", " +
+ "CASE WHEN bookmarks._id IS NOT NULL THEN 1 ELSE 0 END AS " + Combined.IS_BOOKMARK + ", " +
+ Combined.VISITS + ", " +
+ Combined.FAVICON + ", " +
+ Combined.THUMBNAIL + ", " +
+ Combined.TOUCH_ICON + ", " +
+ "NULL AS " + Combined.USER_ENTERED + " "+
+ "FROM history LEFT OUTER JOIN bookmarks ON history.url = bookmarks.url LEFT OUTER JOIN images ON history.url = images.url_key " +
+
+ "UNION ALL " +
+
+ "SELECT " +
+ Combined._ID + ", " +
+ Combined.TITLE + ", " +
+ Combined.URL + ", " +
+ Combined.DATE_CREATED + ", " +
+ "NULL AS " + Combined.DATE_LAST_VISITED + ", "+
+ "1 AS " + Combined.IS_BOOKMARK + ", " +
+ "0 AS " + Combined.VISITS + ", "+
+ Combined.FAVICON + ", " +
+ Combined.THUMBNAIL + ", " +
+ Combined.TOUCH_ICON + ", " +
+ "NULL AS " + Combined.USER_ENTERED + " "+
+ "FROM bookmarks LEFT OUTER JOIN images ON bookmarks.url = images.url_key WHERE url NOT IN (SELECT url FROM history)");
+
+ mSyncHelper.createDatabase(db);
+
+ createDefaultBookmarks(db);
+ }
+
+ @Override
+ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+ // TODO write upgrade logic
+ db.execSQL("DROP TABLE IF EXISTS " + TABLE_BOOKMARKS);
+ db.execSQL("DROP TABLE IF EXISTS " + TABLE_HISTORY);
+ db.execSQL("DROP TABLE IF EXISTS " + TABLE_SEARCHES);
+ db.execSQL("DROP TABLE IF EXISTS " + TABLE_IMAGES);
+ db.execSQL("DROP TABLE IF EXISTS " + TABLE_SETTINGS);
+ db.execSQL("DROP VIEW IF EXISTS " + VIEW_COMBINED);
+ mSyncHelper.onAccountsChanged(db, new Account[] {}); // remove all sync info
+ onCreate(db);
+ }
+
+ @Override
+ public void onOpen(SQLiteDatabase db) {
+ mSyncHelper.onDatabaseOpened(db);
+ }
+
+ private void createDefaultBookmarks(SQLiteDatabase db) {
+ ContentValues values = new ContentValues();
+ // TODO figure out how to deal with localization for the defaults
+
+ // Bookmarks folder
+ values.put(Bookmarks._ID, FIXED_ID_ROOT);
+ values.put(ChromeSyncColumns.SERVER_UNIQUE, ChromeSyncColumns.FOLDER_NAME_BOOKMARKS);
+ values.put(Bookmarks.TITLE, "Bookmarks");
+ values.putNull(Bookmarks.PARENT);
+ values.put(Bookmarks.POSITION, 0);
+ values.put(Bookmarks.IS_FOLDER, true);
+ values.put(Bookmarks.DIRTY, true);
+ db.insertOrThrow(TABLE_BOOKMARKS, null, values);
+
+ addDefaultBookmarks(db, FIXED_ID_ROOT);
+ }
+
+ private void addDefaultBookmarks(SQLiteDatabase db, long parentId) {
+ Resources res = getContext().getResources();
+ final CharSequence[] bookmarks = res.getTextArray(
+ R.array.bookmarks);
+ int size = bookmarks.length;
+ TypedArray preloads = res.obtainTypedArray(R.array.bookmark_preloads);
+ try {
+ String parent = Long.toString(parentId);
+ String now = Long.toString(System.currentTimeMillis());
+ for (int i = 0; i < size; i = i + 2) {
+ CharSequence bookmarkDestination = replaceSystemPropertyInString(getContext(),
+ bookmarks[i + 1]);
+ db.execSQL("INSERT INTO bookmarks (" +
+ Bookmarks.TITLE + ", " +
+ Bookmarks.URL + ", " +
+ Bookmarks.IS_FOLDER + "," +
+ Bookmarks.PARENT + "," +
+ Bookmarks.POSITION + "," +
+ Bookmarks.DATE_CREATED +
+ ") VALUES (" +
+ "'" + bookmarks[i] + "', " +
+ "'" + bookmarkDestination + "', " +
+ "0," +
+ parent + "," +
+ Integer.toString(i) + "," +
+ now +
+ ");");
+
+ int faviconId = preloads.getResourceId(i, 0);
+ int thumbId = preloads.getResourceId(i + 1, 0);
+ byte[] thumb = null, favicon = null;
+ try {
+ thumb = readRaw(res, thumbId);
+ } catch (IOException e) {
+ }
+ try {
+ favicon = readRaw(res, faviconId);
+ } catch (IOException e) {
+ }
+ if (thumb != null || favicon != null) {
+ ContentValues imageValues = new ContentValues();
+ imageValues.put(Images.URL, bookmarkDestination.toString());
+ if (favicon != null) {
+ imageValues.put(Images.FAVICON, favicon);
+ }
+ if (thumb != null) {
+ imageValues.put(Images.THUMBNAIL, thumb);
+ }
+ db.insert(TABLE_IMAGES, Images.FAVICON, imageValues);
+ }
+ }
+ } catch (ArrayIndexOutOfBoundsException e) {
+ }
+ }
+
+ private byte[] readRaw(Resources res, int id) throws IOException {
+ InputStream is = res.openRawResource(id);
+ try {
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ byte[] buf = new byte[4096];
+ int read;
+ while ((read = is.read(buf)) > 0) {
+ bos.write(buf, 0, read);
+ }
+ bos.flush();
+ return bos.toByteArray();
+ } finally {
+ is.close();
+ }
+ }
+
+ // XXX: This is a major hack to remove our dependency on gsf constants and
+ // its content provider. http://b/issue?id=2425179
+ private String getClientId(ContentResolver cr) {
+ String ret = "android-google";
+ Cursor c = null;
+ try {
+ c = cr.query(Uri.parse("content://com.google.settings/partner"),
+ new String[] { "value" }, "name='client_id'", null, null);
+ if (c != null && c.moveToNext()) {
+ ret = c.getString(0);
+ }
+ } catch (RuntimeException ex) {
+ // fall through to return the default
+ } finally {
+ if (c != null) {
+ c.close();
+ }
+ }
+ return ret;
+ }
+
+ private CharSequence replaceSystemPropertyInString(Context context, CharSequence srcString) {
+ StringBuffer sb = new StringBuffer();
+ int lastCharLoc = 0;
+
+ final String client_id = getClientId(context.getContentResolver());
+
+ for (int i = 0; i < srcString.length(); ++i) {
+ char c = srcString.charAt(i);
+ if (c == '{') {
+ sb.append(srcString.subSequence(lastCharLoc, i));
+ lastCharLoc = i;
+ inner:
+ for (int j = i; j < srcString.length(); ++j) {
+ char k = srcString.charAt(j);
+ if (k == '}') {
+ String propertyKeyValue = srcString.subSequence(i + 1, j).toString();
+ if (propertyKeyValue.equals("CLIENT_ID")) {
+ sb.append(client_id);
+ } else {
+ sb.append("unknown");
+ }
+ lastCharLoc = j + 1;
+ i = j;
+ break inner;
+ }
+ }
+ }
+ }
+ if (srcString.length() - lastCharLoc > 0) {
+ // Put on the tail, if there is one
+ sb.append(srcString.subSequence(lastCharLoc, srcString.length()));
+ }
+ return sb;
+ }
+ }
+
+ @Override
+ public SQLiteOpenHelper getDatabaseHelper(Context context) {
+ synchronized (this) {
+ if (mOpenHelper == null) {
+ mOpenHelper = new DatabaseHelper(context);
+ }
+ return mOpenHelper;
+ }
+ }
+
+ @Override
+ public boolean isCallerSyncAdapter(Uri uri) {
+ return uri.getBooleanQueryParameter(BrowserContract.CALLER_IS_SYNCADAPTER, false);
+ }
+
+ @Override
+ public void notifyChange(boolean callerIsSyncAdapter) {
+ ContentResolver resolver = getContext().getContentResolver();
+ resolver.notifyChange(BrowserContract.AUTHORITY_URI, null, !callerIsSyncAdapter);
+ resolver.notifyChange(LEGACY_AUTHORITY_URI, null, !callerIsSyncAdapter);
+ }
+
+ @Override
+ public String getType(Uri uri) {
+ final int match = URI_MATCHER.match(uri);
+ switch (match) {
+ case BOOKMARKS:
+ return Bookmarks.CONTENT_TYPE;
+ case BOOKMARKS_ID:
+ return Bookmarks.CONTENT_ITEM_TYPE;
+ case HISTORY:
+ return History.CONTENT_TYPE;
+ case HISTORY_ID:
+ return History.CONTENT_ITEM_TYPE;
+ case SEARCHES:
+ return Searches.CONTENT_TYPE;
+ case SEARCHES_ID:
+ return Searches.CONTENT_ITEM_TYPE;
+// case SUGGEST:
+// return SearchManager.SUGGEST_MIME_TYPE;
+ }
+ return null;
+ }
+
+ @Override
+ public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
+ String sortOrder) {
+ SQLiteDatabase db = mOpenHelper.getReadableDatabase();
+ final int match = URI_MATCHER.match(uri);
+ SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
+ String limit = uri.getQueryParameter(BrowserContract.PARAM_LIMIT);
+ switch (match) {
+ case ACCOUNTS: {
+ qb.setTables(TABLE_BOOKMARKS);
+ qb.setProjectionMap(ACCOUNTS_PROJECTION_MAP);
+ qb.setDistinct(true);
+ qb.appendWhere(Bookmarks.ACCOUNT_NAME + " IS NOT NULL");
+ break;
+ }
+
+ case BOOKMARKS_FOLDER_ID:
+ case BOOKMARKS_ID:
+ case BOOKMARKS: {
+ // Only show deleted bookmarks if requested to do so
+ if (!uri.getBooleanQueryParameter(Bookmarks.QUERY_PARAMETER_SHOW_DELETED, false)) {
+ selection = DatabaseUtils.concatenateWhere(
+ Bookmarks.IS_DELETED + "=0", selection);
+ }
+
+ if (match == BOOKMARKS_ID) {
+ // Tack on the ID of the specific bookmark requested
+ selection = DatabaseUtils.concatenateWhere(selection,
+ TABLE_BOOKMARKS + "." + Bookmarks._ID + "=?");
+ selectionArgs = DatabaseUtils.appendSelectionArgs(selectionArgs,
+ new String[] { Long.toString(ContentUris.parseId(uri)) });
+ } else if (match == BOOKMARKS_FOLDER_ID) {
+ // Tack on the ID of the specific folder requested
+ selection = DatabaseUtils.concatenateWhere(selection,
+ TABLE_BOOKMARKS + "." + Bookmarks.PARENT + "=?");
+ selectionArgs = DatabaseUtils.appendSelectionArgs(selectionArgs,
+ new String[] { Long.toString(ContentUris.parseId(uri)) });
+ }
+
+ // Look for account info
+ String accountType = uri.getQueryParameter(Bookmarks.PARAM_ACCOUNT_TYPE);
+ String accountName = uri.getQueryParameter(Bookmarks.PARAM_ACCOUNT_NAME);
+ if (!TextUtils.isEmpty(accountType) && !TextUtils.isEmpty(accountName)) {
+ selection = DatabaseUtils.concatenateWhere(selection,
+ Bookmarks.ACCOUNT_TYPE + "=? AND " + Bookmarks.ACCOUNT_NAME + "=? ");
+ selectionArgs = DatabaseUtils.appendSelectionArgs(selectionArgs,
+ new String[] { accountType, accountName });
+ }
+
+ // Set a default sort order if one isn't specified
+ if (TextUtils.isEmpty(sortOrder)) {
+ if (!TextUtils.isEmpty(accountType)
+ && !TextUtils.isEmpty(accountName)) {
+ sortOrder = DEFAULT_BOOKMARKS_SORT_ORDER_SYNC;
+ } else {
+ sortOrder = DEFAULT_BOOKMARKS_SORT_ORDER;
+ }
+ }
+
+ qb.setProjectionMap(BOOKMARKS_PROJECTION_MAP);
+ qb.setTables(TABLE_BOOKMARKS_JOIN_IMAGES);
+ break;
+ }
+
+ case BOOKMARKS_FOLDER: {
+ // Don't allow selections to be applied to the default folder
+ if (!TextUtils.isEmpty(selection) || selectionArgs != null) {
+ throw new UnsupportedOperationException(
+ "selections aren't supported on this URI");
+ }
+
+ // Look for an account
+ boolean useAccount = false;
+ String accountType = uri.getQueryParameter(Bookmarks.PARAM_ACCOUNT_TYPE);
+ String accountName = uri.getQueryParameter(Bookmarks.PARAM_ACCOUNT_NAME);
+ if (!TextUtils.isEmpty(accountType) && !TextUtils.isEmpty(accountName)) {
+ useAccount = true;
+ }
+
+ qb.setTables(TABLE_BOOKMARKS_JOIN_IMAGES);
+ String[] args;
+ String query;
+ // Set a default sort order if one isn't specified
+ if (TextUtils.isEmpty(sortOrder)) {
+ if (useAccount) {
+ sortOrder = DEFAULT_BOOKMARKS_SORT_ORDER_SYNC;
+ } else {
+ sortOrder = DEFAULT_BOOKMARKS_SORT_ORDER;
+ }
+ }
+ if (!useAccount) {
+ qb.setProjectionMap(BOOKMARKS_PROJECTION_MAP);
+ query = qb.buildQuery(projection,
+ Bookmarks.PARENT + "=? AND " + Bookmarks.IS_DELETED + "=0",
+ null, null, null, sortOrder, null);
+
+ args = new String[] { Long.toString(FIXED_ID_ROOT) };
+ } else {
+ qb.setProjectionMap(BOOKMARKS_PROJECTION_MAP);
+ String bookmarksBarQuery = qb.buildQuery(projection,
+ Bookmarks.ACCOUNT_TYPE + "=? AND " + Bookmarks.ACCOUNT_NAME + "=? " +
+ "AND parent = " +
+ "(SELECT _id FROM " + TABLE_BOOKMARKS + " WHERE " +
+ ChromeSyncColumns.SERVER_UNIQUE + "=" +
+ "'" + ChromeSyncColumns.FOLDER_NAME_BOOKMARKS_BAR + "' " +
+ "AND account_type = ? AND account_name = ?) " +
+ "AND " + Bookmarks.IS_DELETED + "=0",
+ null, null, null, null, null);
+
+ qb.setProjectionMap(OTHER_BOOKMARKS_PROJECTION_MAP);
+ String otherBookmarksQuery = qb.buildQuery(projection,
+ Bookmarks.ACCOUNT_TYPE + "=? AND " + Bookmarks.ACCOUNT_NAME + "=?" +
+ " AND " + ChromeSyncColumns.SERVER_UNIQUE + "=?",
+ null, null, null, null, null);
+
+ query = qb.buildUnionQuery(
+ new String[] { bookmarksBarQuery, otherBookmarksQuery },
+ sortOrder, limit);
+
+ args = new String[] {
+ accountType, accountName, accountType, accountName,
+ accountType, accountName, ChromeSyncColumns.FOLDER_NAME_OTHER_BOOKMARKS,
+ };
+ }
+
+ Cursor cursor = db.rawQuery(query, args);
+ if (cursor != null) {
+ cursor.setNotificationUri(getContext().getContentResolver(),
+ BrowserContract.AUTHORITY_URI);
+ }
+ return cursor;
+ }
+
+ case HISTORY_ID: {
+ selection = DatabaseUtils.concatenateWhere(selection, TABLE_HISTORY + "._id=?");
+ selectionArgs = DatabaseUtils.appendSelectionArgs(selectionArgs,
+ new String[] { Long.toString(ContentUris.parseId(uri)) });
+ // fall through
+ }
+ case HISTORY: {
+ if (sortOrder == null) {
+ sortOrder = DEFAULT_SORT_HISTORY;
+ }
+ qb.setProjectionMap(HISTORY_PROJECTION_MAP);
+ qb.setTables(TABLE_HISTORY_JOIN_IMAGES);
+ break;
+ }
+
+ case SEARCHES_ID: {
+ selection = DatabaseUtils.concatenateWhere(selection, TABLE_SEARCHES + "._id=?");
+ selectionArgs = DatabaseUtils.appendSelectionArgs(selectionArgs,
+ new String[] { Long.toString(ContentUris.parseId(uri)) });
+ // fall through
+ }
+ case SEARCHES: {
+ if (sortOrder == null) {
+ sortOrder = DEFAULT_SORT_SEARCHES;
+ }
+ qb.setTables(TABLE_SEARCHES);
+ qb.setProjectionMap(SEARCHES_PROJECTION_MAP);
+ break;
+ }
+
+ case SYNCSTATE: {
+ return mSyncHelper.query(db, projection, selection, selectionArgs, sortOrder);
+ }
+
+ case SYNCSTATE_ID: {
+ selection = appendAccountToSelection(uri, selection);
+ String selectionWithId =
+ (SyncStateContract.Columns._ID + "=" + ContentUris.parseId(uri) + " ")
+ + (selection == null ? "" : " AND (" + selection + ")");
+ return mSyncHelper.query(db, projection, selectionWithId, selectionArgs, sortOrder);
+ }
+
+ case IMAGES: {
+ qb.setTables(TABLE_IMAGES);
+ qb.setProjectionMap(IMAGES_PROJECTION_MAP);
+ break;
+ }
+
+ case COMBINED_ID: {
+ selection = DatabaseUtils.concatenateWhere(selection, VIEW_COMBINED + "._id=?");
+ selectionArgs = DatabaseUtils.appendSelectionArgs(selectionArgs,
+ new String[] { Long.toString(ContentUris.parseId(uri)) });
+ // fall through
+ }
+ case COMBINED: {
+ qb.setTables(VIEW_COMBINED);
+ qb.setProjectionMap(COMBINED_PROJECTION_MAP);
+ break;
+ }
+
+ case SETTINGS: {
+ qb.setTables(TABLE_SETTINGS);
+ qb.setProjectionMap(SETTINGS_PROJECTION_MAP);
+ break;
+ }
+
+ default: {
+ throw new UnsupportedOperationException("Unknown URL " + uri.toString());
+ }
+ }
+
+ Cursor cursor = qb.query(db, projection, selection, selectionArgs, null, null, sortOrder,
+ limit);
+ cursor.setNotificationUri(getContext().getContentResolver(), BrowserContract.AUTHORITY_URI);
+ return cursor;
+ }
+
+ @Override
+ public int deleteInTransaction(Uri uri, String selection, String[] selectionArgs,
+ boolean callerIsSyncAdapter) {
+ final int match = URI_MATCHER.match(uri);
+ final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+ switch (match) {
+ case BOOKMARKS_ID:
+ case BOOKMARKS: {
+ //TODO cascade deletes down from folders
+ if (!callerIsSyncAdapter) {
+ // If the caller isn't a sync adapter just go through and update all the
+ // bookmarks to have the deleted flag set.
+ ContentValues values = new ContentValues();
+ values.put(Bookmarks.DATE_MODIFIED, System.currentTimeMillis());
+ values.put(Bookmarks.IS_DELETED, 1);
+ return updateInTransaction(uri, values, selection, selectionArgs,
+ callerIsSyncAdapter);
+ } else {
+ // Sync adapters are allowed to actually delete things
+ if (match == BOOKMARKS_ID) {
+ selection = DatabaseUtils.concatenateWhere(selection,
+ TABLE_BOOKMARKS + "._id=?");
+ selectionArgs = DatabaseUtils.appendSelectionArgs(selectionArgs,
+ new String[] { Long.toString(ContentUris.parseId(uri)) });
+ }
+ return db.delete(TABLE_BOOKMARKS, selection, selectionArgs);
+ }
+ }
+
+ case HISTORY_ID: {
+ selection = DatabaseUtils.concatenateWhere(selection, TABLE_HISTORY + "._id=?");
+ selectionArgs = DatabaseUtils.appendSelectionArgs(selectionArgs,
+ new String[] { Long.toString(ContentUris.parseId(uri)) });
+ // fall through
+ }
+ case HISTORY: {
+ return db.delete(TABLE_HISTORY, selection, selectionArgs);
+ }
+
+ case SEARCHES_ID: {
+ selection = DatabaseUtils.concatenateWhere(selection, TABLE_SEARCHES + "._id=?");
+ selectionArgs = DatabaseUtils.appendSelectionArgs(selectionArgs,
+ new String[] { Long.toString(ContentUris.parseId(uri)) });
+ // fall through
+ }
+ case SEARCHES: {
+ return db.delete(TABLE_SEARCHES, selection, selectionArgs);
+ }
+
+ case SYNCSTATE: {
+ return mSyncHelper.delete(db, selection, selectionArgs);
+ }
+ case SYNCSTATE_ID: {
+ String selectionWithId =
+ (SyncStateContract.Columns._ID + "=" + ContentUris.parseId(uri) + " ")
+ + (selection == null ? "" : " AND (" + selection + ")");
+ return mSyncHelper.delete(db, selectionWithId, selectionArgs);
+ }
+ }
+ throw new UnsupportedOperationException("Unknown update URI " + uri);
+ }
+
+ @Override
+ public Uri insertInTransaction(Uri uri, ContentValues values, boolean callerIsSyncAdapter) {
+ final int match = URI_MATCHER.match(uri);
+ final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+ long id = -1;
+ switch (match) {
+ case BOOKMARKS: {
+ // Mark rows dirty if they're not coming from a sync adapter
+ if (!callerIsSyncAdapter) {
+ long now = System.currentTimeMillis();
+ values.put(Bookmarks.DATE_CREATED, now);
+ values.put(Bookmarks.DATE_MODIFIED, now);
+ values.put(Bookmarks.DIRTY, 1);
+
+ // If no parent is set default to the "Bookmarks Bar" folder
+ // TODO set the parent based on the account info
+ if (!values.containsKey(Bookmarks.PARENT)) {
+ values.put(Bookmarks.PARENT, FIXED_ID_ROOT);
+ }
+ }
+
+ // If no position is requested put the bookmark at the beginning of the list
+ if (!values.containsKey(Bookmarks.POSITION)) {
+ values.put(Bookmarks.POSITION, Long.toString(Long.MIN_VALUE));
+ }
+
+ // Extract out the image values so they can be inserted into the images table
+ String url = values.getAsString(Bookmarks.URL);
+ ContentValues imageValues = extractImageValues(values, url);
+ Boolean isFolder = values.getAsBoolean(Bookmarks.IS_FOLDER);
+ if ((isFolder == null || !isFolder)
+ && imageValues != null && !TextUtils.isEmpty(url)) {
+ int count = db.update(TABLE_IMAGES, imageValues, Images.URL + "=?",
+ new String[] { url });
+ if (count == 0) {
+ db.insertOrThrow(TABLE_IMAGES, Images.FAVICON, imageValues);
+ }
+ }
+
+ id = db.insertOrThrow(TABLE_BOOKMARKS, Bookmarks.DIRTY, values);
+ break;
+ }
+
+ case HISTORY: {
+ // If no created time is specified set it to now
+ if (!values.containsKey(History.DATE_CREATED)) {
+ values.put(History.DATE_CREATED, System.currentTimeMillis());
+ }
+
+ // Extract out the image values so they can be inserted into the images table
+ ContentValues imageValues = extractImageValues(values,
+ values.getAsString(History.URL));
+ if (imageValues != null) {
+ db.insertOrThrow(TABLE_IMAGES, Images.FAVICON, imageValues);
+ }
+
+ id = db.insertOrThrow(TABLE_HISTORY, History.VISITS, values);
+ break;
+ }
+
+ case SEARCHES: {
+ id = insertSearchesInTransaction(db, values);
+ break;
+ }
+
+ case SYNCSTATE: {
+ id = mSyncHelper.insert(db, values);
+ break;
+ }
+
+ case SETTINGS: {
+ id = 0;
+ insertSettingsInTransaction(db, values);
+ break;
+ }
+
+ default: {
+ throw new UnsupportedOperationException("Unknown insert URI " + uri);
+ }
+ }
+
+ if (id >= 0) {
+ return ContentUris.withAppendedId(uri, id);
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Searches are unique, so perform an UPSERT manually since SQLite doesn't support them.
+ */
+ private long insertSearchesInTransaction(SQLiteDatabase db, ContentValues values) {
+ String search = values.getAsString(Searches.SEARCH);
+ if (TextUtils.isEmpty(search)) {
+ throw new IllegalArgumentException("Must include the SEARCH field");
+ }
+ Cursor cursor = null;
+ try {
+ cursor = db.query(TABLE_SEARCHES, new String[] { Searches._ID },
+ Searches.SEARCH + "=?", new String[] { search }, null, null, null);
+ if (cursor.moveToNext()) {
+ long id = cursor.getLong(0);
+ db.update(TABLE_SEARCHES, values, Searches._ID + "=?",
+ new String[] { Long.toString(id) });
+ return id;
+ } else {
+ return db.insertOrThrow(TABLE_SEARCHES, Searches.SEARCH, values);
+ }
+ } finally {
+ if (cursor != null) cursor.close();
+ }
+ }
+
+ /**
+ * Settings are unique, so perform an UPSERT manually since SQLite doesn't support them.
+ */
+ private long insertSettingsInTransaction(SQLiteDatabase db, ContentValues values) {
+ String key = values.getAsString(Settings.KEY);
+ if (TextUtils.isEmpty(key)) {
+ throw new IllegalArgumentException("Must include the KEY field");
+ }
+ String[] keyArray = new String[] { key };
+ Cursor cursor = null;
+ try {
+ cursor = db.query(TABLE_SETTINGS, new String[] { Settings.KEY },
+ Settings.KEY + "=?", keyArray, null, null, null);
+ if (cursor.moveToNext()) {
+ long id = cursor.getLong(0);
+ db.update(TABLE_SETTINGS, values, Settings.KEY + "=?", keyArray);
+ return id;
+ } else {
+ return db.insertOrThrow(TABLE_SETTINGS, Settings.VALUE, values);
+ }
+ } finally {
+ if (cursor != null) cursor.close();
+ }
+ }
+
+ @Override
+ public int updateInTransaction(Uri uri, ContentValues values, String selection,
+ String[] selectionArgs, boolean callerIsSyncAdapter) {
+ final int match = URI_MATCHER.match(uri);
+ final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+ switch (match) {
+ case BOOKMARKS_ID: {
+ selection = DatabaseUtils.concatenateWhere(selection,
+ TABLE_BOOKMARKS + "._id=?");
+ selectionArgs = DatabaseUtils.appendSelectionArgs(selectionArgs,
+ new String[] { Long.toString(ContentUris.parseId(uri)) });
+ // fall through
+ }
+ case BOOKMARKS: {
+ return updateBookmarksInTransaction(values, selection, selectionArgs,
+ callerIsSyncAdapter);
+ }
+
+ case HISTORY_ID: {
+ selection = DatabaseUtils.concatenateWhere(selection, TABLE_HISTORY + "._id=?");
+ selectionArgs = DatabaseUtils.appendSelectionArgs(selectionArgs,
+ new String[] { Long.toString(ContentUris.parseId(uri)) });
+ // fall through
+ }
+ case HISTORY: {
+ return updateHistoryInTransaction(values, selection, selectionArgs);
+ }
+
+ case SYNCSTATE: {
+ return mSyncHelper.update(mDb, values,
+ appendAccountToSelection(uri, selection), selectionArgs);
+ }
+
+ case SYNCSTATE_ID: {
+ selection = appendAccountToSelection(uri, selection);
+ String selectionWithId =
+ (SyncStateContract.Columns._ID + "=" + ContentUris.parseId(uri) + " ")
+ + (selection == null ? "" : " AND (" + selection + ")");
+ return mSyncHelper.update(mDb, values,
+ selectionWithId, selectionArgs);
+ }
+
+ case IMAGES: {
+ String url = values.getAsString(Images.URL);
+ if (TextUtils.isEmpty(url)) {
+ throw new IllegalArgumentException("Images.URL is required");
+ }
+ int count = db.update(TABLE_IMAGES, values, Images.URL + "=?",
+ new String[] { url });
+ if (count == 0) {
+ db.insertOrThrow(TABLE_IMAGES, Images.FAVICON, values);
+ count = 1;
+ }
+ return count;
+ }
+ }
+ throw new UnsupportedOperationException("Unknown update URI " + uri);
+ }
+
+ /**
+ * Does a query to find the matching bookmarks and updates each one with the provided values.
+ */
+ int updateBookmarksInTransaction(ContentValues values, String selection,
+ String[] selectionArgs, boolean callerIsSyncAdapter) {
+ int count = 0;
+ final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+ Cursor cursor = query(Bookmarks.CONTENT_URI,
+ new String[] { Bookmarks._ID, Bookmarks.VERSION, Bookmarks.URL },
+ selection, selectionArgs, null);
+ try {
+ String[] args = new String[1];
+ // Mark the bookmark dirty if the caller isn't a sync adapter
+ if (!callerIsSyncAdapter) {
+ values.put(Bookmarks.DATE_MODIFIED, System.currentTimeMillis());
+ values.put(Bookmarks.DIRTY, 1);
+ }
+
+ boolean updatingUrl = values.containsKey(Bookmarks.URL);
+ String url = null;
+ if (updatingUrl) {
+ url = values.getAsString(Bookmarks.URL);
+ }
+ ContentValues imageValues = extractImageValues(values, url);
+
+ while (cursor.moveToNext()) {
+ args[0] = cursor.getString(0);
+ if (!callerIsSyncAdapter) {
+ // increase the local version for non-sync changes
+ values.put(Bookmarks.VERSION, cursor.getLong(1) + 1);
+ }
+ count += db.update(TABLE_BOOKMARKS, values, "_id=?", args);
+
+ // Update the images over in their table
+ if (imageValues != null) {
+ if (!updatingUrl) {
+ url = cursor.getString(2);
+ imageValues.put(Images.URL, url);
+ }
+
+ if (!TextUtils.isEmpty(url)) {
+ args[0] = url;
+ if (db.update(TABLE_IMAGES, imageValues, Images.URL + "=?", args) == 0) {
+ db.insert(TABLE_IMAGES, Images.FAVICON, imageValues);
+ }
+ }
+ }
+ }
+ } finally {
+ if (cursor != null) cursor.close();
+ }
+ return count;
+ }
+
+ /**
+ * Does a query to find the matching bookmarks and updates each one with the provided values.
+ */
+ int updateHistoryInTransaction(ContentValues values, String selection, String[] selectionArgs) {
+ int count = 0;
+ final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+ Cursor cursor = query(History.CONTENT_URI,
+ new String[] { History._ID, History.URL },
+ selection, selectionArgs, null);
+ try {
+ String[] args = new String[1];
+
+ boolean updatingUrl = values.containsKey(History.URL);
+ String url = null;
+ if (updatingUrl) {
+ url = values.getAsString(History.URL);
+ }
+ ContentValues imageValues = extractImageValues(values, url);
+
+ while (cursor.moveToNext()) {
+ args[0] = cursor.getString(0);
+ count += db.update(TABLE_HISTORY, values, "_id=?", args);
+
+ // Update the images over in their table
+ if (imageValues != null) {
+ if (!updatingUrl) {
+ url = cursor.getString(1);
+ imageValues.put(Images.URL, url);
+ }
+ args[0] = url;
+ if (db.update(TABLE_IMAGES, imageValues, Images.URL + "=?", args) == 0) {
+ db.insert(TABLE_IMAGES, Images.FAVICON, imageValues);
+ }
+ }
+ }
+ } finally {
+ if (cursor != null) cursor.close();
+ }
+ return count;
+ }
+
+ String appendAccountToSelection(Uri uri, String selection) {
+ final String accountName = uri.getQueryParameter(RawContacts.ACCOUNT_NAME);
+ final String accountType = uri.getQueryParameter(RawContacts.ACCOUNT_TYPE);
+
+ final boolean partialUri = TextUtils.isEmpty(accountName) ^ TextUtils.isEmpty(accountType);
+ if (partialUri) {
+ // Throw when either account is incomplete
+ throw new IllegalArgumentException(
+ "Must specify both or neither of ACCOUNT_NAME and ACCOUNT_TYPE for " + uri);
+ }
+
+ // Accounts are valid by only checking one parameter, since we've
+ // already ruled out partial accounts.
+ final boolean validAccount = !TextUtils.isEmpty(accountName);
+ if (validAccount) {
+ StringBuilder selectionSb = new StringBuilder(RawContacts.ACCOUNT_NAME + "="
+ + DatabaseUtils.sqlEscapeString(accountName) + " AND "
+ + RawContacts.ACCOUNT_TYPE + "="
+ + DatabaseUtils.sqlEscapeString(accountType));
+ if (!TextUtils.isEmpty(selection)) {
+ selectionSb.append(" AND (");
+ selectionSb.append(selection);
+ selectionSb.append(')');
+ }
+ return selectionSb.toString();
+ } else {
+ return selection;
+ }
+ }
+
+ ContentValues extractImageValues(ContentValues values, String url) {
+ ContentValues imageValues = null;
+ // favicon
+ if (values.containsKey(Bookmarks.FAVICON)) {
+ imageValues = new ContentValues();
+ imageValues.put(Images.FAVICON, values.getAsByteArray(Bookmarks.FAVICON));
+ values.remove(Bookmarks.FAVICON);
+ }
+
+ // thumbnail
+ if (values.containsKey(Bookmarks.THUMBNAIL)) {
+ if (imageValues == null) {
+ imageValues = new ContentValues();
+ }
+ imageValues.put(Images.THUMBNAIL, values.getAsByteArray(Bookmarks.THUMBNAIL));
+ values.remove(Bookmarks.THUMBNAIL);
+ }
+
+ // touch icon
+ if (values.containsKey(Bookmarks.TOUCH_ICON)) {
+ if (imageValues == null) {
+ imageValues = new ContentValues();
+ }
+ imageValues.put(Images.TOUCH_ICON, values.getAsByteArray(Bookmarks.TOUCH_ICON));
+ values.remove(Bookmarks.TOUCH_ICON);
+ }
+
+ if (imageValues != null) {
+ imageValues.put(Images.URL, url);
+ }
+ return imageValues;
+ }
+}
diff --git a/src/com/android/browser/provider/SQLiteContentProvider.java b/src/com/android/browser/provider/SQLiteContentProvider.java
new file mode 100644
index 0000000..a50894a
--- /dev/null
+++ b/src/com/android/browser/provider/SQLiteContentProvider.java
@@ -0,0 +1,276 @@
+/*
+ * 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.provider;
+
+import android.content.ContentProvider;
+import android.content.ContentProviderOperation;
+import android.content.ContentProviderResult;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.OperationApplicationException;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.database.sqlite.SQLiteTransactionListener;
+import android.net.Uri;
+
+import java.util.ArrayList;
+
+/**
+ * General purpose {@link ContentProvider} base class that uses SQLiteDatabase for storage.
+ */
+public abstract class SQLiteContentProvider extends ContentProvider
+ implements SQLiteTransactionListener {
+
+ private static final String TAG = "SQLiteContentProvider";
+
+ private SQLiteOpenHelper mOpenHelper;
+ private volatile boolean mNotifyChange;
+ protected SQLiteDatabase mDb;
+
+ private final ThreadLocal<Boolean> mApplyingBatch = new ThreadLocal<Boolean>();
+ private static final int SLEEP_AFTER_YIELD_DELAY = 4000;
+
+ /**
+ * Maximum number of operations allowed in a batch between yield points.
+ */
+ private static final int MAX_OPERATIONS_PER_YIELD_POINT = 500;
+
+ @Override
+ public boolean onCreate() {
+ Context context = getContext();
+ mOpenHelper = getDatabaseHelper(context);
+ return true;
+ }
+
+ /**
+ * Returns a {@link SQLiteOpenHelper} that can open the database.
+ */
+ public abstract SQLiteOpenHelper getDatabaseHelper(Context context);
+
+ /**
+ * The equivalent of the {@link #insert} method, but invoked within a transaction.
+ */
+ public abstract Uri insertInTransaction(Uri uri, ContentValues values,
+ boolean callerIsSyncAdapter);
+
+ /**
+ * The equivalent of the {@link #update} method, but invoked within a transaction.
+ */
+ public abstract int updateInTransaction(Uri uri, ContentValues values, String selection,
+ String[] selectionArgs, boolean callerIsSyncAdapter);
+
+ /**
+ * The equivalent of the {@link #delete} method, but invoked within a transaction.
+ */
+ public abstract int deleteInTransaction(Uri uri, String selection, String[] selectionArgs,
+ boolean callerIsSyncAdapter);
+
+ /**
+ * Called when the provider needs to notify the system of a change.
+ * @param callerIsSyncAdapter true if the caller that caused the change was a sync adapter.
+ */
+ public abstract void notifyChange(boolean callerIsSyncAdapter);
+
+ public boolean isCallerSyncAdapter(Uri uri) {
+ return false;
+ }
+
+ public SQLiteOpenHelper getDatabaseHelper() {
+ return mOpenHelper;
+ }
+
+ private boolean applyingBatch() {
+ return mApplyingBatch.get() != null && mApplyingBatch.get();
+ }
+
+ @Override
+ public Uri insert(Uri uri, ContentValues values) {
+ Uri result = null;
+ boolean callerIsSyncAdapter = isCallerSyncAdapter(uri);
+ boolean applyingBatch = applyingBatch();
+ if (!applyingBatch) {
+ mDb = mOpenHelper.getWritableDatabase();
+ mDb.beginTransactionWithListener(this);
+ try {
+ result = insertInTransaction(uri, values, callerIsSyncAdapter);
+ if (result != null) {
+ mNotifyChange = true;
+ }
+ mDb.setTransactionSuccessful();
+ } finally {
+ mDb.endTransaction();
+ }
+
+ onEndTransaction(callerIsSyncAdapter);
+ } else {
+ result = insertInTransaction(uri, values, callerIsSyncAdapter);
+ if (result != null) {
+ mNotifyChange = true;
+ }
+ }
+ return result;
+ }
+
+ @Override
+ public int bulkInsert(Uri uri, ContentValues[] values) {
+ int numValues = values.length;
+ boolean callerIsSyncAdapter = isCallerSyncAdapter(uri);
+ mDb = mOpenHelper.getWritableDatabase();
+ mDb.beginTransactionWithListener(this);
+ try {
+ for (int i = 0; i < numValues; i++) {
+ Uri result = insertInTransaction(uri, values[i], callerIsSyncAdapter);
+ if (result != null) {
+ mNotifyChange = true;
+ }
+ mDb.yieldIfContendedSafely();
+ }
+ mDb.setTransactionSuccessful();
+ } finally {
+ mDb.endTransaction();
+ }
+
+ onEndTransaction(callerIsSyncAdapter);
+ return numValues;
+ }
+
+ @Override
+ public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+ int count = 0;
+ boolean callerIsSyncAdapter = isCallerSyncAdapter(uri);
+ boolean applyingBatch = applyingBatch();
+ if (!applyingBatch) {
+ mDb = mOpenHelper.getWritableDatabase();
+ mDb.beginTransactionWithListener(this);
+ try {
+ count = updateInTransaction(uri, values, selection, selectionArgs,
+ callerIsSyncAdapter);
+ if (count > 0) {
+ mNotifyChange = true;
+ }
+ mDb.setTransactionSuccessful();
+ } finally {
+ mDb.endTransaction();
+ }
+
+ onEndTransaction(callerIsSyncAdapter);
+ } else {
+ count = updateInTransaction(uri, values, selection, selectionArgs, callerIsSyncAdapter);
+ if (count > 0) {
+ mNotifyChange = true;
+ }
+ }
+
+ return count;
+ }
+
+ @Override
+ public int delete(Uri uri, String selection, String[] selectionArgs) {
+ int count = 0;
+ boolean callerIsSyncAdapter = isCallerSyncAdapter(uri);
+ boolean applyingBatch = applyingBatch();
+ if (!applyingBatch) {
+ mDb = mOpenHelper.getWritableDatabase();
+ mDb.beginTransactionWithListener(this);
+ try {
+ count = deleteInTransaction(uri, selection, selectionArgs, callerIsSyncAdapter);
+ if (count > 0) {
+ mNotifyChange = true;
+ }
+ mDb.setTransactionSuccessful();
+ } finally {
+ mDb.endTransaction();
+ }
+
+ onEndTransaction(callerIsSyncAdapter);
+ } else {
+ count = deleteInTransaction(uri, selection, selectionArgs, callerIsSyncAdapter);
+ if (count > 0) {
+ mNotifyChange = true;
+ }
+ }
+ return count;
+ }
+
+ @Override
+ public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> operations)
+ throws OperationApplicationException {
+ int ypCount = 0;
+ int opCount = 0;
+ boolean callerIsSyncAdapter = false;
+ mDb = mOpenHelper.getWritableDatabase();
+ mDb.beginTransactionWithListener(this);
+ try {
+ mApplyingBatch.set(true);
+ final int numOperations = operations.size();
+ final ContentProviderResult[] results = new ContentProviderResult[numOperations];
+ for (int i = 0; i < numOperations; i++) {
+ if (++opCount >= MAX_OPERATIONS_PER_YIELD_POINT) {
+ throw new OperationApplicationException(
+ "Too many content provider operations between yield points. "
+ + "The maximum number of operations per yield point is "
+ + MAX_OPERATIONS_PER_YIELD_POINT, ypCount);
+ }
+ final ContentProviderOperation operation = operations.get(i);
+ if (!callerIsSyncAdapter && isCallerSyncAdapter(operation.getUri())) {
+ callerIsSyncAdapter = true;
+ }
+ if (i > 0 && operation.isYieldAllowed()) {
+ opCount = 0;
+ if (mDb.yieldIfContendedSafely(SLEEP_AFTER_YIELD_DELAY)) {
+ ypCount++;
+ }
+ }
+ results[i] = operation.apply(this, results, i);
+ }
+ mDb.setTransactionSuccessful();
+ return results;
+ } finally {
+ mApplyingBatch.set(false);
+ mDb.endTransaction();
+ onEndTransaction(callerIsSyncAdapter);
+ }
+ }
+
+ @Override
+ public void onBegin() {
+ onBeginTransaction();
+ }
+
+ @Override
+ public void onCommit() {
+ beforeTransactionCommit();
+ }
+
+ @Override
+ public void onRollback() {
+ // not used
+ }
+
+ protected void onBeginTransaction() {
+ }
+
+ protected void beforeTransactionCommit() {
+ }
+
+ protected void onEndTransaction(boolean callerIsSyncAdapter) {
+ if (mNotifyChange) {
+ mNotifyChange = false;
+ notifyChange(callerIsSyncAdapter);
+ }
+ }
+}
diff --git a/src/com/android/browser/search/.DefaultSearchEngine.java.swp b/src/com/android/browser/search/.DefaultSearchEngine.java.swp
new file mode 100644
index 0000000..441153c
--- /dev/null
+++ b/src/com/android/browser/search/.DefaultSearchEngine.java.swp
Binary files differ
diff --git a/src/com/android/browser/widget/BookmarkListWidgetProvider.java b/src/com/android/browser/widget/BookmarkListWidgetProvider.java
new file mode 100644
index 0000000..2196ae0
--- /dev/null
+++ b/src/com/android/browser/widget/BookmarkListWidgetProvider.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser.widget;
+
+import com.android.browser.BrowserActivity;
+import com.android.browser.R;
+
+import android.app.PendingIntent;
+import android.appwidget.AppWidgetManager;
+import android.appwidget.AppWidgetProvider;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.widget.RemoteViews;
+
+/**
+ * Widget that shows a preview of the user's bookmarks.
+ */
+public class BookmarkListWidgetProvider extends AppWidgetProvider {
+ static final String ACTION_BOOKMARK_APPWIDGET_UPDATE =
+ "com.android.browser.BOOKMARK_APPWIDGET_UPDATE";
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ // Handle bookmark-specific updates ourselves because they might be
+ // coming in without extras, which AppWidgetProvider then blocks.
+ final String action = intent.getAction();
+ if (ACTION_BOOKMARK_APPWIDGET_UPDATE.equals(action)) {
+ AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
+ performUpdate(context, appWidgetManager,
+ appWidgetManager.getAppWidgetIds(getComponentName(context)));
+ } else {
+ super.onReceive(context, intent);
+ }
+ }
+
+ @Override
+ public void onUpdate(Context context, AppWidgetManager mngr, int[] ids) {
+ performUpdate(context, mngr, ids);
+ }
+
+ @Override
+ public void onEnabled(Context context) {
+ // Start the backing service
+ context.startService(new Intent(context, BookmarkListWidgetService.class));
+ }
+
+ @Override
+ public void onDisabled(Context context) {
+ // Stop the backing service
+ context.stopService(new Intent(context, BookmarkListWidgetService.class));
+ }
+
+ @Override
+ public void onDeleted(Context context, int[] appWidgetIds) {
+ super.onDeleted(context, appWidgetIds);
+ context.startService(new Intent(BookmarkListWidgetService.ACTION_REMOVE_FACTORIES,
+ null, context, BookmarkListWidgetService.class)
+ .putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds));
+ }
+
+ private void performUpdate(Context context,
+ AppWidgetManager appWidgetManager, int[] appWidgetIds) {
+ // Update the widgets
+ for (int appWidgetId : appWidgetIds) {
+ Intent updateIntent = new Intent(context, BookmarkListWidgetService.class);
+ updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
+ updateIntent.setData(Uri.parse(updateIntent.toUri(Intent.URI_INTENT_SCHEME)));
+ RemoteViews views = new RemoteViews(context.getPackageName(),
+ R.layout.bookmarklistwidget);
+ views.setRemoteAdapter(R.id.bookmarks_list, updateIntent);
+ appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.bookmarks_list);
+ Intent ic = new Intent(context, BookmarkListWidgetService.class);
+ views.setPendingIntentTemplate(R.id.bookmarks_list,
+ PendingIntent.getService(context, 0, ic,
+ PendingIntent.FLAG_UPDATE_CURRENT));
+ Intent launch = new Intent(context, BrowserActivity.class);
+ views.setOnClickPendingIntent(R.id.header, PendingIntent
+ .getActivity(context, 0, launch, PendingIntent.FLAG_CANCEL_CURRENT));
+ appWidgetManager.updateAppWidget(appWidgetId, views);
+ }
+ }
+
+ /**
+ * Build {@link ComponentName} describing this specific
+ * {@link AppWidgetProvider}
+ */
+ static ComponentName getComponentName(Context context) {
+ return new ComponentName(context, BookmarkListWidgetProvider.class);
+ }
+}
diff --git a/src/com/android/browser/widget/BookmarkListWidgetService.java b/src/com/android/browser/widget/BookmarkListWidgetService.java
new file mode 100644
index 0000000..8fbe807
--- /dev/null
+++ b/src/com/android/browser/widget/BookmarkListWidgetService.java
@@ -0,0 +1,424 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser.widget;
+
+import com.android.browser.BrowserBookmarksPage;
+import com.android.browser.R;
+
+import android.appwidget.AppWidgetManager;
+import android.content.ContentUris;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
+import android.database.ContentObserver;
+import android.database.Cursor;
+import android.graphics.Bitmap;
+import android.graphics.Bitmap.Config;
+import android.graphics.BitmapFactory;
+import android.graphics.BitmapFactory.Options;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.os.Handler;
+import android.preference.PreferenceManager;
+import android.provider.BrowserContract;
+import android.provider.BrowserContract.Bookmarks;
+import android.text.TextUtils;
+import android.util.Log;
+import android.widget.RemoteViews;
+import android.widget.RemoteViewsService;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Stack;
+
+public class BookmarkListWidgetService extends RemoteViewsService {
+
+ static final String TAG = "BookmarkListWidgetService";
+ static final boolean USE_FOLDERS = true;
+
+ static final String ACTION_REMOVE_FACTORIES
+ = "com.android.browser.widget.REMOVE_FACTORIES";
+ static final String ACTION_CHANGE_FOLDER
+ = "com.android.browser.widget.CHANGE_FOLDER";
+
+ private static final String[] PROJECTION = new String[] {
+ BrowserContract.Bookmarks._ID,
+ BrowserContract.Bookmarks.TITLE,
+ BrowserContract.Bookmarks.URL,
+ BrowserContract.Bookmarks.FAVICON,
+ BrowserContract.Bookmarks.IS_FOLDER,
+ BrowserContract.Bookmarks.PARENT,
+ BrowserContract.Bookmarks.POSITION};
+
+ private Map<Integer, BookmarkFactory> mFactories;
+ private Handler mUiHandler;
+ private BookmarksObserver mBookmarksObserver;
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ mFactories = new HashMap<Integer, BookmarkFactory>();
+ mUiHandler = new Handler();
+ mBookmarksObserver = new BookmarksObserver(mUiHandler);
+ getContentResolver().registerContentObserver(
+ BrowserContract.AUTHORITY_URI, true, mBookmarksObserver);
+ }
+
+ @Override
+ public int onStartCommand(Intent intent, int flags, int startId) {
+ String action = intent.getAction();
+ if (Intent.ACTION_VIEW.equals(action)) {
+ Intent view = new Intent(intent);
+ view.setComponent(null);
+ startActivity(view);
+ } else if (ACTION_REMOVE_FACTORIES.equals(action)) {
+ int[] ids = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS);
+ if (ids != null) {
+ for (int id : ids) {
+ mFactories.remove(id);
+ }
+ }
+ } else if (ACTION_CHANGE_FOLDER.equals(action)) {
+ int widgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
+ long folderId = intent.getLongExtra(Bookmarks._ID, -1);
+ BookmarkFactory fac = mFactories.get(widgetId);
+ if (fac != null && folderId >= 0) {
+ fac.changeFolder(folderId);
+ }
+ }
+ return START_STICKY;
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ getContentResolver().unregisterContentObserver(mBookmarksObserver);
+ }
+
+ private class BookmarksObserver extends ContentObserver {
+ public BookmarksObserver(Handler handler) {
+ super(handler);
+ }
+
+ @Override
+ public void onChange(boolean selfChange) {
+ super.onChange(selfChange);
+
+ // Update all the bookmark widgets
+ if (mFactories != null) {
+ for (BookmarkFactory fac : mFactories.values()) {
+ fac.loadData();
+ }
+ }
+ }
+ }
+
+ @Override
+ public RemoteViewsFactory onGetViewFactory(Intent intent) {
+ int widgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
+ if (widgetId < 0) {
+ Log.w(TAG, "Missing EXTRA_APPWIDGET_ID!");
+ return null;
+ } else {
+ BookmarkFactory fac = mFactories.get(widgetId);
+ if (fac == null) {
+ fac = new BookmarkFactory(getApplicationContext(), widgetId);
+ }
+ mFactories.put(widgetId, fac);
+ return fac;
+ }
+ }
+
+ private static class Breadcrumb {
+ long mId;
+ String mTitle;
+ public Breadcrumb(long id, String title) {
+ mId = id;
+ mTitle = title;
+ }
+ }
+
+ static class BookmarkFactory implements RemoteViewsService.RemoteViewsFactory,
+ OnSharedPreferenceChangeListener {
+ private List<RenderResult> mBookmarks;
+ private Context mContext;
+ private int mWidgetId;
+ private String mAccountType;
+ private String mAccountName;
+ private Stack<Breadcrumb> mBreadcrumbs;
+ private LoadBookmarksTask mLoadTask;
+
+ public BookmarkFactory(Context context, int widgetId) {
+ mBreadcrumbs = new Stack<Breadcrumb>();
+ mContext = context;
+ mWidgetId = widgetId;
+ }
+
+ void changeFolder(long folderId) {
+ if (mBookmarks == null) return;
+
+ if (!mBreadcrumbs.empty() && mBreadcrumbs.peek().mId == folderId) {
+ mBreadcrumbs.pop();
+ loadData();
+ return;
+ }
+
+ for (RenderResult res : mBookmarks) {
+ if (res.mId == folderId) {
+ mBreadcrumbs.push(new Breadcrumb(res.mId, res.mTitle));
+ loadData();
+ break;
+ }
+ }
+ }
+
+ @Override
+ public int getCount() {
+ if (mBookmarks == null)
+ return 0;
+ return mBookmarks.size();
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return position;
+ }
+
+ @Override
+ public RemoteViews getLoadingView() {
+ return null;
+ }
+
+ @Override
+ public RemoteViews getViewAt(int position) {
+ if (position < 0 || position >= getCount()) {
+ return null;
+ }
+
+ RenderResult res = mBookmarks.get(position);
+ Breadcrumb folder = mBreadcrumbs.empty() ? null : mBreadcrumbs.peek();
+
+ RemoteViews views = new RemoteViews(
+ mContext.getPackageName(), R.layout.bookmarklistwidget_item);
+ Intent fillin;
+ if (res.mIsFolder) {
+ long nfi = res.mId;
+ fillin = new Intent(ACTION_CHANGE_FOLDER, null,
+ mContext, BookmarkListWidgetService.class)
+ .putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mWidgetId)
+ .putExtra(Bookmarks._ID, nfi);
+ } else {
+ fillin = new Intent(Intent.ACTION_VIEW)
+ .setData(Uri.parse(res.mUrl))
+ .addCategory(Intent.CATEGORY_BROWSABLE);
+ }
+ views.setOnClickFillInIntent(R.id.list_item, fillin);
+ // Set the title of the bookmark. Use the url as a backup.
+ String displayTitle = res.mTitle;
+ if (TextUtils.isEmpty(displayTitle)) {
+ // The browser always requires a title for bookmarks, but jic...
+ displayTitle = res.mUrl;
+ }
+ views.setTextViewText(R.id.label, displayTitle);
+ views.setDrawableParameters(R.id.list_item, true, 0, -1, null, -1);
+ if (res.mIsFolder) {
+ if (folder != null && res.mId == folder.mId) {
+ views.setDrawableParameters(R.id.list_item, true, 255, -1, null, -1);
+ views.setImageViewResource(R.id.thumb, R.drawable.ic_back_normal);
+ } else {
+ views.setImageViewResource(R.id.thumb, R.drawable.ic_folder);
+ }
+ } else {
+ if (res.mBitmap != null) {
+ views.setImageViewBitmap(R.id.thumb, res.mBitmap);
+ } else {
+ views.setImageViewResource(R.id.thumb,
+ R.drawable.browser_thumbnail);
+ }
+ }
+ return views;
+ }
+
+ @Override
+ public int getViewTypeCount() {
+ return 1;
+ }
+
+ @Override
+ public boolean hasStableIds() {
+ return false;
+ }
+
+ @Override
+ public void onCreate() {
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext);
+ mAccountType = prefs.getString(BrowserBookmarksPage.PREF_ACCOUNT_TYPE, null);
+ mAccountName = prefs.getString(BrowserBookmarksPage.PREF_ACCOUNT_NAME, null);
+ prefs.registerOnSharedPreferenceChangeListener(this);
+ loadData();
+ }
+
+ @Override
+ public void onDestroy() {
+ recycleBitmaps();
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext);
+ prefs.unregisterOnSharedPreferenceChangeListener(this);
+ }
+
+ @Override
+ public void onDataSetChanged() {
+ }
+
+ void loadData() {
+ if (mLoadTask != null) {
+ mLoadTask.cancel(false);
+ }
+ mLoadTask = new LoadBookmarksTask();
+ mLoadTask.execute();
+ }
+
+ class LoadBookmarksTask extends AsyncTask<Void, Void, List<RenderResult>> {
+ private Breadcrumb mFolder;
+
+ @Override
+ protected void onPreExecute() {
+ mFolder = mBreadcrumbs.empty() ? null : mBreadcrumbs.peek();
+ }
+
+ @Override
+ protected List<RenderResult> doInBackground(Void... params) {
+ return loadBookmarks(mFolder);
+ }
+
+ @Override
+ protected void onPostExecute(List<RenderResult> result) {
+ if (!isCancelled() && result != null) {
+ recycleBitmaps();
+ mBookmarks = result;
+ AppWidgetManager.getInstance(mContext)
+ .notifyAppWidgetViewDataChanged(mWidgetId, R.id.bookmarks_list);
+ }
+ }
+ }
+
+ List<RenderResult> loadBookmarks(Breadcrumb folder) {
+ String where = null;
+ Uri uri;
+ if (USE_FOLDERS) {
+ uri = BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER;
+ if (folder != null) {
+ uri = ContentUris.withAppendedId(uri, folder.mId);
+ }
+ } else {
+ uri = BrowserContract.Bookmarks.CONTENT_URI;
+ where = Bookmarks.IS_FOLDER + " == 0";
+ }
+ if (!TextUtils.isEmpty(mAccountType) && !TextUtils.isEmpty(mAccountName)) {
+ uri = uri.buildUpon()
+ .appendQueryParameter(Bookmarks.PARAM_ACCOUNT_TYPE, mAccountType)
+ .appendQueryParameter(Bookmarks.PARAM_ACCOUNT_NAME, mAccountName)
+ .build();
+ }
+ Cursor c = null;
+ try {
+ c = mContext.getContentResolver().query(uri, PROJECTION,
+ where, null, null);
+ if (c != null) {
+ ArrayList<RenderResult> bookmarks
+ = new ArrayList<RenderResult>(c.getCount() + 1);
+ if (folder != null) {
+ RenderResult res = new RenderResult(
+ folder.mId, folder.mTitle, null);
+ res.mIsFolder = true;
+ bookmarks.add(res);
+ }
+ while (c.moveToNext()) {
+ long id = c.getLong(0);
+ String title = c.getString(1);
+ String url = c.getString(2);
+ RenderResult res = new RenderResult(id, title, url);
+ byte[] blob = c.getBlob(3);
+ if (blob != null) {
+ // RemoteViews require a valid bitmap config
+ Options options = new Options();
+ options.inPreferredConfig = Config.ARGB_8888;
+ res.mBitmap = BitmapFactory.decodeByteArray(
+ blob, 0, blob.length, options);
+ }
+ res.mIsFolder = c.getInt(4) != 0;
+ bookmarks.add(res);
+ }
+ return bookmarks;
+ }
+ } catch (IllegalStateException e) {
+ Log.e(TAG, "update bookmark widget", e);
+ } finally {
+ if (c != null) {
+ c.close();
+ }
+ }
+ return null;
+ }
+
+ private void recycleBitmaps() {
+ // Do a bit of house cleaning for the system
+ if (mBookmarks != null) {
+ for (RenderResult res : mBookmarks) {
+ if (res.mBitmap != null) {
+ res.mBitmap.recycle();
+ res.mBitmap = null;
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onSharedPreferenceChanged(
+ SharedPreferences prefs, String key) {
+ if (BrowserBookmarksPage.PREF_ACCOUNT_TYPE.equals(key)) {
+ mAccountType = prefs.getString(BrowserBookmarksPage.PREF_ACCOUNT_TYPE, null);
+ mBreadcrumbs.clear();
+ loadData();
+ }
+ if (BrowserBookmarksPage.PREF_ACCOUNT_NAME.equals(key)) {
+ mAccountName = prefs.getString(BrowserBookmarksPage.PREF_ACCOUNT_NAME, null);
+ mBreadcrumbs.clear();
+ loadData();
+ }
+ }
+ }
+
+ // Class containing the rendering information for a specific bookmark.
+ private static class RenderResult {
+ final String mTitle;
+ final String mUrl;
+ Bitmap mBitmap;
+ boolean mIsFolder;
+ long mId;
+
+ RenderResult(long id, String title, String url) {
+ mId = id;
+ mTitle = title;
+ mUrl = url;
+ }
+
+ }
+
+}
diff --git a/src/com/android/browser/widget/BookmarkWidgetProvider.java b/src/com/android/browser/widget/BookmarkWidgetProvider.java
deleted file mode 100644
index 62b48c0..0000000
--- a/src/com/android/browser/widget/BookmarkWidgetProvider.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.browser.widget;
-
-import android.app.PendingIntent;
-import android.appwidget.AppWidgetManager;
-import android.appwidget.AppWidgetProvider;
-import android.content.Context;
-import android.content.Intent;
-import android.util.Log;
-
-/**
- * Widget that shows a preview of the user's bookmarks.
- */
-public class BookmarkWidgetProvider extends AppWidgetProvider {
-
- static final String TAG = "BookmarkWidgetProvider";
-
- @Override
- public void onUpdate(Context context, AppWidgetManager mngr, int[] ids) {
- context.startService(new Intent(BookmarkWidgetService.UPDATE, null,
- context, BookmarkWidgetService.class));
- }
-
- @Override
- public void onEnabled(Context context) {
- context.startService(new Intent(context, BookmarkWidgetService.class));
- }
-
- @Override
- public void onDisabled(Context context) {
- context.stopService(new Intent(context, BookmarkWidgetService.class));
- }
-}
-
diff --git a/src/com/android/browser/widget/BookmarkWidgetService.java b/src/com/android/browser/widget/BookmarkWidgetService.java
deleted file mode 100644
index 1fd9163..0000000
--- a/src/com/android/browser/widget/BookmarkWidgetService.java
+++ /dev/null
@@ -1,385 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.browser.widget;
-
-import android.app.PendingIntent;
-import android.app.Service;
-import android.appwidget.AppWidgetManager;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.database.Cursor;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Message;
-import android.os.ParcelFileDescriptor;
-import android.provider.Browser;
-import android.provider.Browser.BookmarkColumns;
-import android.service.urlrenderer.UrlRenderer;
-import android.service.urlrenderer.UrlRendererService;
-import android.util.Log;
-import android.view.View;
-import android.widget.RemoteViews;
-
-import com.android.browser.R;
-
-import java.io.InputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-
-public class BookmarkWidgetService extends Service
- implements UrlRenderer.Callback {
-
- private static final String TAG = "BookmarkWidgetService";
-
- /** Force the bookmarks to be re-renderer. */
- public static final String UPDATE = "com.android.browser.widget.UPDATE";
-
- /** Change the widget to the next bookmark. */
- private static final String NEXT = "com.android.browser.widget.NEXT";
-
- /** Change the widget to the previous bookmark. */
- private static final String PREV = "com.android.browser.widget.PREV";
-
- /** Id of the current item displayed in the widget. */
- private static final String EXTRA_ID =
- "com.android.browser.widget.extra.ID";
-
- // XXX: Remove these magic numbers once the dimensions of the widget can be
- // queried.
- private static final int WIDTH = 306;
- private static final int HEIGHT = 386;
-
- // Limit the number of connection attempts.
- private static final int MAX_SERVICE_RETRY_COUNT = 5;
-
- // No id specified.
- private static final int NO_ID = -1;
-
- private static final int MSG_UPDATE = 0;
- private final Handler mHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MSG_UPDATE:
- if (mRenderer != null) {
- queryCursorAndRender();
- } else {
- if (++mServiceRetryCount <= MAX_SERVICE_RETRY_COUNT) {
- // Service is not connected, try again in a second.
- mHandler.sendEmptyMessageDelayed(MSG_UPDATE, 1000);
- }
- }
- break;
- default:
- break;
- }
- }
- };
-
- private final ServiceConnection mConnection = new ServiceConnection() {
- public void onServiceConnected(ComponentName className,
- IBinder service) {
- mRenderer = new UrlRenderer(service);
- }
-
- public void onServiceDisconnected(ComponentName className) {
- mRenderer = null;
- }
- };
-
- // Id -> information map storing db ids and their result.
- private final HashMap<Integer, RenderResult> mIdsToResults =
- new HashMap<Integer, RenderResult>();
-
- // List of ids in order
- private final ArrayList<Integer> mIdList = new ArrayList<Integer>();
-
- // Map of urls to ids for when a url is complete.
- private final HashMap<String, Integer> mUrlsToIds =
- new HashMap<String, Integer>();
-
- // The current id used by the widget during an update.
- private int mCurrentId = NO_ID;
- // Class that contacts the service on the phone to render bookmarks.
- private UrlRenderer mRenderer;
- // Number of service retries. Stop trying to connect after
- // MAX_SERVICE_RETRY_COUNT
- private int mServiceRetryCount;
-
- @Override
- public void onCreate() {
- bindService(new Intent(UrlRendererService.SERVICE_INTERFACE),
- mConnection, Context.BIND_AUTO_CREATE);
- }
-
- @Override
- public void onDestroy() {
- unbindService(mConnection);
- }
-
- @Override
- public android.os.IBinder onBind(Intent intent) {
- return null;
- }
-
- @Override
- public int onStartCommand(Intent intent, int flags, int startId) {
- final String action = intent.getAction();
- if (UPDATE.equals(action)) {
- mHandler.sendEmptyMessage(MSG_UPDATE);
- } else if (PREV.equals(action) && mIdList.size() > 1) {
- int prev = getPreviousId(intent);
- if (prev == NO_ID) {
- Log.d(TAG, "Could not determine previous id");
- return START_NOT_STICKY;
- }
- RenderResult res = mIdsToResults.get(prev);
- if (res != null) {
- updateWidget(res);
- }
- } else if (NEXT.equals(action) && mIdList.size() > 1) {
- int next = getNextId(intent);
- if (next == NO_ID) {
- Log.d(TAG, "Could not determine next id");
- return START_NOT_STICKY;
- }
- RenderResult res = mIdsToResults.get(next);
- if (res != null) {
- updateWidget(res);
- }
- }
- return START_STICKY;
- }
-
- private int getPreviousId(Intent intent) {
- int listSize = mIdList.size();
- // If the list contains 1 or fewer entries, return NO_ID so that the
- // widget does not update.
- if (listSize <= 1) {
- return NO_ID;
- }
-
- int curr = intent.getIntExtra(EXTRA_ID, NO_ID);
- if (curr == NO_ID) {
- return NO_ID;
- }
-
- // Check if the current id is the beginning of the list so we can skip
- // iterating through.
- if (mIdList.get(0) == curr) {
- return mIdList.get(listSize - 1);
- }
-
- // Search for the current id and remember the previous id.
- int prev = NO_ID;
- for (int id : mIdList) {
- if (id == curr) {
- break;
- }
- prev = id;
- }
- return prev;
- }
-
- private int getNextId(Intent intent) {
- int listSize = mIdList.size();
- // If the list contains 1 or fewer entries, return NO_ID so that the
- // widget does not update.
- if (listSize <= 1) {
- return NO_ID;
- }
-
- int curr = intent.getIntExtra(EXTRA_ID, NO_ID);
- if (curr == NO_ID) {
- return NO_ID;
- }
-
- // Check if the current id is at the end of the list so we can skip
- // iterating through.
- if (mIdList.get(listSize - 1) == curr) {
- return mIdList.get(0);
- }
-
- // Iterate through the ids. i is set to the current index + 1.
- int i = 1;
- for (int id : mIdList) {
- if (id == curr) {
- break;
- }
- i++;
- }
- return mIdList.get(i);
- }
-
- private void updateWidget(RenderResult res) {
- RemoteViews views = new RemoteViews(getPackageName(),
- R.layout.bookmarkwidget);
-
- Intent prev = new Intent(PREV, null, this, BookmarkWidgetService.class);
- prev.putExtra(EXTRA_ID, res.mId);
- views.setOnClickPendingIntent(R.id.previous,
- PendingIntent.getService(this, 0, prev,
- PendingIntent.FLAG_CANCEL_CURRENT));
-
- Intent next = new Intent(NEXT, null, this, BookmarkWidgetService.class);
- next.putExtra(EXTRA_ID, res.mId);
- views.setOnClickPendingIntent(R.id.next,
- PendingIntent.getService(this, 0, next,
- PendingIntent.FLAG_CANCEL_CURRENT));
-
- // Set the title of the bookmark. Use the url as a backup.
- String displayTitle = res.mTitle;
- if (displayTitle == null) {
- displayTitle = res.mUrl;
- }
- views.setTextViewText(R.id.title, displayTitle);
-
- // Set the image or revert to the progress indicator.
- if (res.mBitmap != null) {
- views.setImageViewBitmap(R.id.image, res.mBitmap);
- views.setViewVisibility(R.id.image, View.VISIBLE);
- views.setViewVisibility(R.id.progress, View.GONE);
- } else {
- views.setViewVisibility(R.id.progress, View.VISIBLE);
- views.setViewVisibility(R.id.image, View.GONE);
- }
-
- // Update the current id.
- mCurrentId = res.mId;
-
- AppWidgetManager.getInstance(this).updateAppWidget(
- new ComponentName(this, BookmarkWidgetProvider.class),
- views);
- }
-
- // Default WHERE clause is all bookmarks.
- private static final String QUERY_WHERE =
- BookmarkColumns.BOOKMARK + " == 1";
- private static final String[] PROJECTION = new String[] {
- BookmarkColumns._ID, BookmarkColumns.TITLE, BookmarkColumns.URL };
-
- // Class containing the rendering information for a specific bookmark.
- private static class RenderResult {
- final int mId;
- final String mTitle;
- final String mUrl;
- Bitmap mBitmap;
-
- RenderResult(int id, String title, String url) {
- mId = id;
- mTitle = title;
- mUrl = url;
- }
- }
-
- private void queryCursorAndRender() {
- // Clear the ordered list of ids and the map of ids to bitmaps.
- mIdList.clear();
- mIdsToResults.clear();
-
- // Look up all the bookmarks
- Cursor c = getContentResolver().query(Browser.BOOKMARKS_URI, PROJECTION,
- QUERY_WHERE, null, null);
- if (c != null) {
- if (c.moveToFirst()) {
- ArrayList<String> urls = new ArrayList<String>(c.getCount());
- boolean sawCurrentId = false;
- do {
- int id = c.getInt(0);
- String title = c.getString(1);
- String url = c.getString(2);
-
- // Linear list of ids to obtain the previous and next.
- mIdList.add(id);
-
- // Map the url to its db id for lookup when complete.
- mUrlsToIds.put(url, id);
-
- // Is this the current id?
- if (mCurrentId == id) {
- sawCurrentId = true;
- }
-
- // Store the current information to at least display the
- // title.
- RenderResult res = new RenderResult(id, title, url);
- mIdsToResults.put(id, res);
-
- // Add the url to our list to render.
- urls.add(url);
- } while (c.moveToNext());
-
- // Request a rendering of the urls. XXX: Hard-coded dimensions
- // until the view's orientation and size can be determined. Or
- // in the future the image will be a picture that can be
- // scaled/zoomed arbitrarily.
- mRenderer.render(urls, WIDTH, HEIGHT, this);
-
- // Set the current id to the very first id if we did not see
- // the current id in the list (the bookmark could have been
- // deleted or this is the first update).
- if (!sawCurrentId) {
- mCurrentId = mIdList.get(0);
- }
- }
- c.close();
- }
- }
-
- // UrlRenderer.Callback implementation
- public void complete(String url, ParcelFileDescriptor result) {
- int id = mUrlsToIds.get(url);
- if (id == NO_ID) {
- Log.d(TAG, "No matching id found during completion of "
- + url);
- return;
- }
-
- RenderResult res = mIdsToResults.get(id);
- if (res == null) {
- Log.d(TAG, "No result found during completion of "
- + url);
- return;
- }
-
- // Set the result.
- if (result != null) {
- InputStream input =
- new ParcelFileDescriptor.AutoCloseInputStream(result);
- Bitmap orig = BitmapFactory.decodeStream(input, null, null);
- // XXX: Hard-coded scaled bitmap until I can query the image
- // dimensions.
- res.mBitmap = Bitmap.createScaledBitmap(orig, WIDTH, HEIGHT, true);
- try {
- input.close();
- } catch (IOException e) {
- // oh well...
- }
- }
-
- // If we are currently looking at the bookmark that just finished,
- // update the widget.
- if (mCurrentId == id) {
- updateWidget(res);
- }
- }
-}
diff --git a/tests/assets/popular_urls.txt b/tests/assets/popular_urls.txt
new file mode 100644
index 0000000..70d0997
--- /dev/null
+++ b/tests/assets/popular_urls.txt
@@ -0,0 +1,4 @@
+http://google.com
+http://nytimes.com
+http://slashdot.org
+
diff --git a/tests/src/com/android/browser/JNIBindingsTestApp.java b/tests/src/com/android/browser/JNIBindingsTestApp.java
index 4f083f6..f4efa2c 100644
--- a/tests/src/com/android/browser/JNIBindingsTestApp.java
+++ b/tests/src/com/android/browser/JNIBindingsTestApp.java
@@ -37,6 +37,9 @@
/**
* Adds a JavaScript interface to the webview and calls functions on it to verify variables
* are passed from JS to Java correctly.
+ * To run this test, execute:
+ * adb shell am instrument -w -e class com.android.browser.JNIBindingsTestApp#testJNIBindings \
+ * com.android.browser.tests/android.test.InstrumentationTestRunner
*/
public class JNIBindingsTestApp extends ActivityInstrumentationTestCase2<BrowserActivity> {
@@ -47,6 +50,7 @@
private static final int MSG_WEBKIT_DATA_READY = 101;
private BrowserActivity mActivity = null;
+ private Controller mController = null;
private Instrumentation mInst = null;
private boolean mTestDone = false;
@@ -89,7 +93,7 @@
}
}
};
- mWebView.documentAsText(mHandler.obtainMessage(MSG_WEBKIT_DATA_READY));
+ mWebView.documentAsText(mHandler.obtainMessage(MSG_WEBKIT_DATA_READY, 1, 0));
Looper.loop();
}
}
@@ -108,6 +112,7 @@
super.setUp();
mActivity = getActivity();
+ mController = mActivity.getController();
mInst = getInstrumentation();
mInst.waitForIdleSync();
@@ -144,7 +149,7 @@
* and wrapping the WebView's helper clients.
*/
void setUpBrowser() {
- Tab tab = mActivity.getTabControl().getCurrentTab();
+ Tab tab = mController.getTabControl().getCurrentTab();
WebView webView = tab.getWebView();
webView.addJavascriptInterface(new JNIBindingsTest(this), "JNIBindingsTest");
@@ -226,7 +231,7 @@
public void testJNIBindings() {
setUpBrowser();
- Tab tab = mActivity.getTabControl().getCurrentTab();
+ Tab tab = mController.getTabControl().getCurrentTab();
WebView webView = tab.getWebView();
webView.loadUrl("file://" + SDCARD_BINDINGS_TEST_HTML);
synchronized(this) {
diff --git a/tests/src/com/android/browser/PopularUrlsTest.java b/tests/src/com/android/browser/PopularUrlsTest.java
index 98a0e9f..ac9a90e 100644
--- a/tests/src/com/android/browser/PopularUrlsTest.java
+++ b/tests/src/com/android/browser/PopularUrlsTest.java
@@ -17,11 +17,13 @@
package com.android.browser;
import android.app.Instrumentation;
+import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.net.http.SslError;
import android.os.Environment;
import android.test.ActivityInstrumentationTestCase2;
+import android.text.TextUtils;
import android.util.Log;
import android.webkit.HttpAuthHandler;
import android.webkit.JsPromptResult;
@@ -60,6 +62,7 @@
private final static int PAGE_LOAD_TIMEOUT = 120000; // 2 minutes
private BrowserActivity mActivity = null;
+ private Controller mController = null;
private Instrumentation mInst = null;
private CountDownLatch mLatch = new CountDownLatch(1);
private RunStatus mStatus;
@@ -76,6 +79,7 @@
Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("about:blank"));
setActivityIntent(i);
mActivity = getActivity();
+ mController = mActivity.getController();
mInst = getInstrumentation();
mInst.waitForIdleSync();
@@ -91,13 +95,12 @@
super.tearDown();
}
- static BufferedReader getInputStream() throws FileNotFoundException {
+ BufferedReader getInputStream() throws FileNotFoundException {
return getInputStream(sInputFile);
}
- static BufferedReader getInputStream(String inputFile) throws FileNotFoundException {
- String path = sExternalStorage + File.separator + inputFile;
- FileReader fileReader = new FileReader(path);
+ BufferedReader getInputStream(String inputFile) throws FileNotFoundException {
+ FileReader fileReader = new FileReader(new File(sExternalStorage, inputFile));
BufferedReader bufferedReader = new BufferedReader(fileReader);
return bufferedReader;
@@ -108,11 +111,7 @@
}
OutputStreamWriter getOutputStream(String outputFile) throws IOException {
- String path = sExternalStorage + File.separator + outputFile;
-
- File file = new File(path);
-
- return new FileWriter(file, mStatus.getIsRecovery());
+ return new FileWriter(new File(sExternalStorage, outputFile), mStatus.getIsRecovery());
}
/**
@@ -120,7 +119,16 @@
* and wrapping the WebView's helper clients.
*/
void setUpBrowser() {
- Tab tab = mActivity.getTabControl().getCurrentTab();
+ mInst.runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ setupBrowserInternal();
+ }
+ });
+ }
+
+ void setupBrowserInternal() {
+ Tab tab = mController.getTabControl().getCurrentTab();
WebView webView = tab.getWebView();
webView.setWebChromeClient(new TestWebChromeClient(webView.getWebChromeClient()) {
@@ -219,6 +227,7 @@
*/
@Override
public void onPageFinished(WebView view, String url) {
+ super.onPageFinished(view, url);
if (!pageLoadFinishCalled) {
pageLoadFinishCalled = true;
if (pageProgressFull) {
@@ -252,7 +261,7 @@
// try to stop page load
mInst.runOnMainSync(new Runnable(){
public void run() {
- mActivity.getTabControl().getCurrentTab().getWebView().stopLoading();
+ mController.getTabControl().getCurrentTab().getWebView().stopLoading();
}
});
// try to wait for count down latch again
@@ -270,8 +279,8 @@
private String url;
private boolean isRecovery;
- private RunStatus(String file) throws IOException {
- mFile = new File(file);
+ private RunStatus(File file) throws IOException {
+ mFile = file;
FileReader input = null;
BufferedReader reader = null;
isRecovery = false;
@@ -312,7 +321,7 @@
}
public static RunStatus load(String file) throws IOException {
- return new RunStatus(sExternalStorage + File.separator + file);
+ return new RunStatus(new File(sExternalStorage, file));
}
public void write() throws IOException {
@@ -380,14 +389,16 @@
void loopUrls(BufferedReader input, OutputStreamWriter writer,
boolean clearCache, int loopCount)
throws IOException, InterruptedException {
- Tab tab = mActivity.getTabControl().getCurrentTab();
+ Tab tab = mController.getTabControl().getCurrentTab();
WebView webView = tab.getWebView();
List<String> pages = new LinkedList<String>();
String page;
while (null != (page = input.readLine())) {
- pages.add(page);
+ if (!TextUtils.isEmpty(page)) {
+ pages.add(page);
+ }
}
Iterator<String> iterator = pages.iterator();
diff --git a/tests/src/com/android/browser/TestWebChromeClient.java b/tests/src/com/android/browser/TestWebChromeClient.java
index d78eaed..53f8db3 100644
--- a/tests/src/com/android/browser/TestWebChromeClient.java
+++ b/tests/src/com/android/browser/TestWebChromeClient.java
@@ -195,7 +195,7 @@
/** {@inheritDoc} */
@Override
- public void openFileChooser(ValueCallback<Uri> uploadFile) {
- mWrappedClient.openFileChooser(uploadFile);
+ public void openFileChooser(ValueCallback<Uri> uploadFile, String acceptType) {
+ mWrappedClient.openFileChooser(uploadFile, acceptType);
}
}