summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--AndroidManifest.xml2
-rw-r--r--res/layout-port/autofill_settings_fragment.xml168
-rw-r--r--res/layout/autofill_settings_fragment.xml159
-rw-r--r--res/menu/autofill_profile_editor.xml5
-rw-r--r--res/menu/browser.xml4
-rw-r--r--res/values-af/strings.xml2
-rw-r--r--res/values-am/strings.xml2
-rw-r--r--res/values-ar/strings.xml2
-rw-r--r--res/values-bg/strings.xml2
-rw-r--r--res/values-ca/strings.xml2
-rw-r--r--res/values-cs/strings.xml2
-rw-r--r--res/values-da/strings.xml2
-rw-r--r--res/values-de/strings.xml2
-rw-r--r--res/values-el/strings.xml2
-rw-r--r--res/values-en-rGB/strings.xml2
-rw-r--r--res/values-es-rUS/strings.xml2
-rw-r--r--res/values-es/strings.xml2
-rw-r--r--res/values-fa/strings.xml2
-rw-r--r--res/values-fi/strings.xml2
-rw-r--r--res/values-fr/strings.xml2
-rw-r--r--res/values-hi/strings.xml2
-rw-r--r--res/values-hr/strings.xml2
-rw-r--r--res/values-hu/strings.xml2
-rw-r--r--res/values-in/strings.xml2
-rw-r--r--res/values-it/strings.xml2
-rw-r--r--res/values-iw/strings.xml2
-rw-r--r--res/values-ja/strings.xml2
-rw-r--r--res/values-ko/strings.xml2
-rw-r--r--res/values-lt/strings.xml2
-rw-r--r--res/values-lv/strings.xml2
-rw-r--r--res/values-ms/strings.xml2
-rw-r--r--res/values-nb/strings.xml2
-rw-r--r--res/values-nl/strings.xml2
-rw-r--r--res/values-pl/strings.xml2
-rw-r--r--res/values-pt-rPT/strings.xml2
-rw-r--r--res/values-pt/strings.xml2
-rw-r--r--res/values-rm/strings.xml2
-rw-r--r--res/values-ro/strings.xml2
-rw-r--r--res/values-ru/strings.xml2
-rw-r--r--res/values-sk/strings.xml2
-rw-r--r--res/values-sl/strings.xml2
-rw-r--r--res/values-sr/strings.xml2
-rw-r--r--res/values-sv/strings.xml2
-rw-r--r--res/values-sw/strings.xml2
-rw-r--r--res/values-th/strings.xml2
-rw-r--r--res/values-tl/strings.xml2
-rw-r--r--res/values-tr/strings.xml4
-rw-r--r--res/values-uk/strings.xml2
-rw-r--r--res/values-vi/strings.xml2
-rw-r--r--res/values-zh-rCN/strings.xml2
-rw-r--r--res/values-zh-rTW/strings.xml2
-rw-r--r--res/values-zu/strings.xml2
-rw-r--r--res/values/strings.xml4
-rw-r--r--res/values/styles.xml13
-rw-r--r--src/com/android/browser/AutoFillSettingsFragment.java81
-rw-r--r--src/com/android/browser/AutofillHandler.java52
-rw-r--r--src/com/android/browser/BaseUi.java1
-rw-r--r--src/com/android/browser/BrowserActivity.java10
-rw-r--r--src/com/android/browser/BrowserSettings.java45
-rw-r--r--src/com/android/browser/Controller.java133
-rw-r--r--src/com/android/browser/CrashRecoveryHandler.java89
-rw-r--r--src/com/android/browser/NavigationBarTablet.java4
-rw-r--r--src/com/android/browser/PhoneUi.java2
-rw-r--r--src/com/android/browser/PreferenceKeys.java13
-rw-r--r--src/com/android/browser/Tab.java5
-rw-r--r--src/com/android/browser/TabBar.java33
-rw-r--r--src/com/android/browser/UrlHandler.java2
-rw-r--r--src/com/android/browser/XLargeUi.java8
-rw-r--r--src/com/android/browser/view/PieStackView.java2
-rwxr-xr-xtests/assets/bindings_test.html239
-rw-r--r--tests/src/com/android/browser/JNIBindingsTest.java288
-rw-r--r--tests/src/com/android/browser/JNIBindingsTestApp.java274
72 files changed, 427 insertions, 1305 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 3a281c9..3fafc18 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -41,6 +41,8 @@
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
+ <uses-permission android:name="android.permission.READ_PROFILE" />
+ <uses-permission android:name="android.permission.READ_CONTACTS" />
<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="com.android.launcher.permission.INSTALL_SHORTCUT"/>
diff --git a/res/layout-port/autofill_settings_fragment.xml b/res/layout-port/autofill_settings_fragment.xml
index 097074b..9f26fd9 100644
--- a/res/layout-port/autofill_settings_fragment.xml
+++ b/res/layout-port/autofill_settings_fragment.xml
@@ -43,37 +43,19 @@
android:layout_width="match_parent" />
<TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center_vertical"
- android:layout_margin="2dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
+ style="@style/AutofillProfileTextView"
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:gravity="center_vertical"
- android:layout_margin="2dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:inputType="textPersonName|textCapWords"
- android:singleLine="true"
- android:imeOptions="actionNext" />
+ style="@style/AutofillProfileEditText"
+ android:inputType="textPersonName|textCapWords" />
+
<TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center_vertical"
- android:layout_margin="2dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
+ style="@style/AutofillProfileTextView"
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:gravity="center_vertical"
- android:layout_margin="2dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:inputType="textCapWords"
- android:singleLine="true"
- android:imeOptions="actionNext" />
+ style="@style/AutofillProfileEditText"
+ android:inputType="textCapWords" />
+
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@@ -93,14 +75,9 @@
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:gravity="center_vertical"
- android:layout_margin="2dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:inputType="textCapWords"
- android:singleLine="true"
- android:imeOptions="actionNext" />
+ style="@style/AutofillProfileEditText"
+ android:inputType="textCapWords" />
+
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@@ -120,122 +97,51 @@
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:gravity="bottom"
- android:layout_margin="2dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:inputType="textCapWords"
- android:singleLine="true"
- android:imeOptions="actionNext" />
+ style="@style/AutofillProfileEditText"
+ android:inputType="textCapWords" />
+
<TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center_vertical"
- android:layout_margin="2dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
+ style="@style/AutofillProfileTextView"
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:gravity="center_vertical"
- android:layout_margin="2dip"
- android:inputType="textCapWords"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:singleLine="true"
- android:imeOptions="actionNext" />
+ style="@style/AutofillProfileEditText"
+ android:inputType="textCapWords" />
+
<TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center_vertical"
- android:layout_margin="2dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
+ style="@style/AutofillProfileTextView"
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:gravity="center_vertical"
- android:layout_margin="2dip"
- android:inputType="textCapWords"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:singleLine="true"
- android:imeOptions="actionNext" />
+ style="@style/AutofillProfileEditText"
+ android:inputType="textCapWords" />
+
<TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center_vertical"
- android:layout_margin="2dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
+ style="@style/AutofillProfileTextView"
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:gravity="center_vertical"
- android:layout_margin="2dip"
- android:inputType="textCapCharacters"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:singleLine="true"
- android:imeOptions="actionNext" />
+ style="@style/AutofillProfileEditText"
+ android:inputType="textCapCharacters" />
+
<TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center_vertical"
- android:layout_margin="2dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
+ style="@style/AutofillProfileTextView"
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:gravity="center_vertical"
- android:layout_margin="2dip"
- android:inputType="textCapWords"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:singleLine="true"
- android:imeOptions="actionNext" />
+ style="@style/AutofillProfileEditText"
+ android:inputType="textCapWords" />
+
<TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center_vertical"
- android:layout_margin="2dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
+ style="@style/AutofillProfileTextView"
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:gravity="center_vertical"
- android:layout_margin="2dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:singleLine="true"
- android:phoneNumber="true"
- android:imeOptions="actionNext" />
+ style="@style/AutofillProfileEditText"
+ android:phoneNumber="true" />
+
<TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center_vertical"
- android:layout_margin="2dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
+ style="@style/AutofillProfileTextView"
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:gravity="center_vertical"
- android:layout_margin="2dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
+ style="@style/AutofillProfileEditText"
android:inputType="textEmailAddress"
- android:singleLine="true"
- android:imeOptions="actionDone" />
+ android:imeOptions="actionDone|flagNoExtractUi" />
</LinearLayout>
</ScrollView>
-
- <View
- android:layout_height="12dip"
- android:layout_width="match_parent" />
-
- <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" />
-
</LinearLayout>
diff --git a/res/layout/autofill_settings_fragment.xml b/res/layout/autofill_settings_fragment.xml
index 44bf8f0..e667b86 100644
--- a/res/layout/autofill_settings_fragment.xml
+++ b/res/layout/autofill_settings_fragment.xml
@@ -49,39 +49,19 @@
android:stretchColumns="1">
<TableRow>
<TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center_vertical"
- android:layout_margin="2dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
+ style="@style/AutofillProfileTextView"
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:gravity="center_vertical"
- android:layout_margin="2dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:inputType="textPersonName|textCapWords"
- android:singleLine="true"
- android:imeOptions="actionNext" />
+ style="@style/AutofillProfileEditText"
+ android:inputType="textPersonName|textCapWords" />
</TableRow>
<TableRow>
<TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center_vertical"
- android:layout_margin="2dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
+ style="@style/AutofillProfileTextView"
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:gravity="center_vertical"
- android:layout_margin="2dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:inputType="textCapWords"
- android:singleLine="true"
- android:imeOptions="actionNext" />
+ style="@style/AutofillProfileEditText"
+ android:inputType="textCapWords" />
</TableRow>
<TableRow>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
@@ -103,14 +83,8 @@
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:gravity="center_vertical"
- android:layout_margin="2dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:inputType="textCapWords"
- android:singleLine="true"
- android:imeOptions="actionNext" />
+ style="@style/AutofillProfileEditText"
+ android:inputType="textCapWords" />
</TableRow>
<TableRow>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
@@ -132,137 +106,60 @@
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:gravity="bottom"
- android:layout_margin="2dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:inputType="textCapWords"
- android:singleLine="true"
- android:imeOptions="actionNext" />
+ style="@style/AutofillProfileEditText"
+ android:inputType="textCapWords" />
</TableRow>
<TableRow>
<TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center_vertical"
- android:layout_margin="2dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
+ style="@style/AutofillProfileTextView"
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:gravity="center_vertical"
- android:layout_margin="2dip"
- android:inputType="textCapWords"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:singleLine="true"
- android:imeOptions="actionNext" />
+ style="@style/AutofillProfileEditText"
+ android:inputType="textCapWords" />
</TableRow>
<TableRow>
<TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center_vertical"
- android:layout_margin="2dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
+ style="@style/AutofillProfileTextView"
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:gravity="center_vertical"
- android:layout_margin="2dip"
- android:inputType="textCapWords"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:singleLine="true"
- android:imeOptions="actionNext" />
+ style="@style/AutofillProfileEditText"
+ android:inputType="textCapWords" />
</TableRow>
<TableRow>
<TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center_vertical"
- android:layout_margin="2dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
+ style="@style/AutofillProfileTextView"
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:gravity="center_vertical"
- android:layout_margin="2dip"
- android:inputType="textCapCharacters"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:singleLine="true"
- android:imeOptions="actionNext" />
+ style="@style/AutofillProfileEditText"
+ android:inputType="textCapCharacters" />
</TableRow>
<TableRow>
<TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center_vertical"
- android:layout_margin="2dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
+ style="@style/AutofillProfileTextView"
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:gravity="center_vertical"
- android:layout_margin="2dip"
- android:inputType="textCapWords"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:singleLine="true"
- android:imeOptions="actionNext" />
+ style="@style/AutofillProfileEditText"
+ android:inputType="textCapWords" />
</TableRow>
<TableRow>
<TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center_vertical"
- android:layout_margin="2dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
+ style="@style/AutofillProfileTextView"
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:gravity="center_vertical"
- android:layout_margin="2dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:singleLine="true"
- android:phoneNumber="true"
- android:imeOptions="actionNext" />
+ style="@style/AutofillProfileEditText"
+ android:phoneNumber="true" />
</TableRow>
<TableRow>
<TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center_vertical"
- android:layout_margin="2dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
+ style="@style/AutofillProfileTextView"
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:gravity="center_vertical"
- android:layout_margin="2dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
+ style="@style/AutofillProfileEditText"
android:inputType="textEmailAddress"
- android:singleLine="true"
- android:imeOptions="actionDone" />
+ android:imeOptions="actionDone|flagNoExtractUi" />
</TableRow>
</TableLayout>
</LinearLayout>
</ScrollView>
-
- <View
- android:layout_height="12dip"
- android:layout_width="match_parent" />
-
- <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" />
-
</LinearLayout>
diff --git a/res/menu/autofill_profile_editor.xml b/res/menu/autofill_profile_editor.xml
index 4e746e5..9dab635 100644
--- a/res/menu/autofill_profile_editor.xml
+++ b/res/menu/autofill_profile_editor.xml
@@ -15,6 +15,11 @@
-->
<menu xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:id="@+id/autofill_profile_editor_save_profile_menu_id"
+ android:title="@string/autofill_profile_editor_save_profile"
+ android:icon="@android:drawable/ic_menu_save"
+ android:showAsAction="ifRoom|withText" />
+
<item android:id="@+id/autofill_profile_editor_delete_profile_menu_id"
android:title="@string/autofill_profile_editor_delete_profile"
android:icon="@android:drawable/ic_menu_delete"
diff --git a/res/menu/browser.xml b/res/menu/browser.xml
index bd40c51..b0c25ea 100644
--- a/res/menu/browser.xml
+++ b/res/menu/browser.xml
@@ -96,10 +96,6 @@
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/view_downloads_menu_id"
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 9896b3b..2c966a6 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"Outo-invul-teks gestoor."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Outo-invul-teks uitgevee."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Vee uit"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Die blaaier kan outomaties webvorms soos hierdie een voltooi. Wil jy jou outo-invul-teks opstel?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Die blaaier kan outomaties webvorms soos hierdie een voltooi. Wil jy jou outo-invul-teks opstel?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Jy kan altyd jou outo-invul-teks opstel in Blaaier &gt; Instellings &gt; Algemeen."</string>
<string name="disable_autofill" msgid="8305901059849400354">"Deaktiveer outo-invul"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"Privaatheid en sekuriteit"</string>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index fa00ae7..323d0f3 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"ራስ ሰር-ሙላ ጽሑፍ ተቀምጧል::"</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"ራስ ሰር-ሙላ ጽሑፍ ተሰርዟል::"</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"ሰርዝ"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"አሳሹ እንደዚህ ዓይነቶቹን የድር ቅርጾች በራስ ሰር ያሟላል፡፡ የራስህን ራስ-ሙላ ጽሑፍ ማዘጋጀት ትፈልጋለህ?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"አሳሹ እንደዚህ ዓይነቶቹን የድር ቅርጾች በራስ ሰር ያሟላል፡፡ የራስህን ራስ-ሙላ ጽሑፍ ማዘጋጀት ትፈልጋለህ?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"የራስህን ራስ ሰር ሙላ ጽሑፍ ከአሳሽ ላይ&gt; ቅንጅቶች&gt; አጠቃላይ ማያ ላይ ሁልጊዜ ማዘጋጀት ትችላለህ፡፡"</string>
<string name="disable_autofill" msgid="8305901059849400354">"ራስ-ሙላ አቦዝን"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"ግላዊነት&amp; ደህንነት"</string>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index bad1e41..36d2170 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"تم حفظ نص الملء التلقائي."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"تم حذف نص الملء التلقائي."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"حذف"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"يمكن للمتصفح إكمال نماذج الويب مثل هذه تلقائيًا. هل تريد إعداد نص الملء التلقائي؟"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"يمكن للمتصفح إكمال نماذج الويب مثل هذه تلقائيًا. هل تريد إعداد نص الملء التلقائي؟"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"يمكنك دائمًا إعداد نص الملء التلقائي من المتصفح &gt; الإعدادات &gt; الشاشة العامة."</string>
<string name="disable_autofill" msgid="8305901059849400354">"تعطيل الملء التلقائي"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"الخصوصية والأمان"</string>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index fa35317..51f8dad 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"Текстът за автоматично попълване е запазен."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Текстът за автоматично попълване е изтрит."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Изтриване"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Браузърът може автоматично да попълва уеб формуляри като този. Искате ли да зададете текст за автоматично попълване?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Браузърът може автоматично да попълва уеб формуляри като този. Искате ли да зададете текст за автоматично попълване?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Винаги можете да зададете текст за автоматично попълване от екрана „Браузър“ &gt; „Настройки“ &gt; „Общи“."</string>
<string name="disable_autofill" msgid="8305901059849400354">"Деактивиране на автоматичното попълване"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"Поверителност и сигурност"</string>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index f72a50e..f921a75 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"S\'ha desat el text d\'emplenament automàtic."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"S\'ha suprimit el text d\'emplenament automàtic."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Suprimeix"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"El navegador pot emplenar automàticament formularis web com aquest. Vols configurar el text d\'emplenament automàtic?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"El navegador pot emplenar automàticament formularis web com aquest. Vols configurar el text d\'emplenament automàtic?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Pots configurar el text d\'emplenament automàtic sempre que vulguis des de la pantalla Navegador &gt; Configuració &gt; General."</string>
<string name="disable_autofill" msgid="8305901059849400354">"Desactiva l\'emplenament automàtic"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"Privadesa i seguretat"</string>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 5057707..c1e0378 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"Text pro automatické vyplňování byl uložen."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Text automatického vyplňování byl smazán."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Smazat"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Podobné webové formuláře může prohlížeč vyplňovat automaticky. Chcete nastavit automatické vyplňování textu?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Podobné webové formuláře může prohlížeč vyplňovat automaticky. Chcete nastavit automatické vyplňování textu?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Automatické vyplňování můžete kdykoliv nastavit na obrazovce Prohlížeč &gt; Nastavení &gt; Obecné."</string>
<string name="disable_autofill" msgid="8305901059849400354">"Vypnout automatické vyplňování"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"Ochrana osobních údajů a zabezpečení"</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 71f40a8..0a84101 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"AutoFyld-tekst er gemt."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"AutoFyld-teksten er slettet."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Slet"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Browseren kan automatisk udfylde webformularer som denne. Vil du oprette din AutoFyld-tekst?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Browseren kan automatisk udfylde webformularer som denne. Vil du oprette din AutoFyld-tekst?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Du kan altid oprette din AutoFyld-tekst fra skærmen Browser &gt; Indstillinger &gt; Generelt."</string>
<string name="disable_autofill" msgid="8305901059849400354">"Deaktiver AutoFyld"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"Sikkerhed og personlige oplysninger"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 2d6f48f..61db540 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"AutoFill-Text gespeichert"</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"AutoFill-Text gelöscht"</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Löschen"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Webformulare dieser Art können vom Browser automatisch ausgefüllt werden. Möchten Sie Formulare automatisch ausfüllen?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Webformulare dieser Art können vom Browser automatisch ausgefüllt werden. Möchten Sie Formulare automatisch ausfüllen?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Den AutoFill-Text können Sie jederzeit im Browser unter &gt; \"Einstellungen\" &gt; \"Allgemein\" einrichten."</string>
<string name="disable_autofill" msgid="8305901059849400354">"AutoFill deaktivieren"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"Datenschutz &amp; Sicherheit"</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index beabfd2..cb6a127 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"Το κείμενο αυτόματης συμπλήρωσης αποθηκεύτηκε."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Το κείμενο αυτόματης συμπλήρωσης διαγράφηκε."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Διαγραφή"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Το πρόγραμμα περιήγησης μπορεί να συμπληρώσει αυτόματα φόρμες ιστού όπως αυτή. Θέλετε να ρυθμίσετε το κείμενο αυτόματης συμπλήρωσης;"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Το πρόγραμμα περιήγησης μπορεί να συμπληρώσει αυτόματα φόρμες ιστού όπως αυτή. Θέλετε να ρυθμίσετε το κείμενο αυτόματης συμπλήρωσης;"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Μπορείτε πάντα να ρυθμίσετε το κείμενο αυτόματης συμπλήρωσης από το στοιχείο Πρόγραμμα περιήγησης &gt; Ρυθμίσεις &gt; Γενική οθόνη."</string>
<string name="disable_autofill" msgid="8305901059849400354">"Απενεργοποιήστε τη λειτουργία αυτόματης συμπλήρωσης"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"Απόρρητο και ασφάλεια"</string>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index af16d4b..9a251c1 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"Auto-fill text saved."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Auto-fill text deleted."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Delete"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"The browser can automatically complete web forms like this one. Would you like to set up your auto-fill text?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"The browser can automatically complete web forms like this one. Would you like to set up your auto-fill text?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"You can always set up your auto-fill text from the Browser &gt; Settings &gt; General screen."</string>
<string name="disable_autofill" msgid="8305901059849400354">"Disable auto-fill"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"Privacy &amp; security"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 7db85bb..1ef240b 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"Texto de autocompletado guardado"</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Texto autocompletado eliminado"</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Borrar"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"El navegador puede completar formularios web como este de forma automática. ¿Te gustaría configurar el completado automático de texto?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"El navegador puede completar formularios web como este de forma automática. ¿Te gustaría configurar el completado automático de texto?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Siempre puedes configurar el autocompletado de texto desde la pantalla Navegador &gt; Configuración &gt; General."</string>
<string name="disable_autofill" msgid="8305901059849400354">"Inhabilitar Autocompletar"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"Privacidad &amp; seguridad"</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 76f6a9c..0914f1c 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"Se ha guardado el texto de la función Autocompletar."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Se ha eliminado el texto de la función Autocompletar."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Eliminar"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"El navegador puede completar automáticamente formularios web como el que aparece a continuación. ¿Quieres configurar la función Autocompletar?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"El navegador puede completar automáticamente formularios web como el que aparece a continuación. ¿Quieres configurar la función Autocompletar?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Siempre puedes configurar la opción Autocompletar desde la pantalla Navegador &gt; Ajustes &gt; Generales."</string>
<string name="disable_autofill" msgid="8305901059849400354">"Inhabilitar autocompletar"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"Seguridad y privacidad"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 992de1f..4c669e7 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"نوشتاری که بطور خودکار تکمیل شده ذخیره شد."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"تکمیل خودکار نوشتار حذف شد."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"حذف"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"مرورگر می‌تواند به طور خودکار فرم‌های وب مثل این را کامل کند. آیا می‌خواهید تکمیل خودکار نوشتار را تنظیم کنید؟"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"مرورگر می‌تواند به طور خودکار فرم‌های وب مثل این را کامل کند. آیا می‌خواهید تکمیل خودکار نوشتار را تنظیم کنید؟"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"شما همیشه می‌توانید تکمیل خودکار نوشتار خود را از مرورگر &amp;gt؛ تنظیمات &amp;gt؛ صفحه عمومی تنظیم کنید."</string>
<string name="disable_autofill" msgid="8305901059849400354">"غیرفعال کردن تکمیل خودکار"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"حریم خصوصی و امنیت"</string>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 5e8f60a..a509705 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"Automaattisen täytön teksti tallennettu."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Automaattisen täytön teksti poistettu."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Poista"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Selain voi täyttää automaattisesti tällaiset verkkolomakkeet. Haluatko määrittää automaattisen täytön tekstin?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Selain voi täyttää automaattisesti tällaiset verkkolomakkeet. Haluatko määrittää automaattisen täytön tekstin?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Voit määrittää automaattisen täytön tekstin kohdassa Selain &gt; Asetukset &gt; Yleisasetukset."</string>
<string name="disable_autofill" msgid="8305901059849400354">"Poista automaattinen täyttö käytöstä"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"Tietosuoja ja turvallisuus"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 1a08f4d..3a4e999 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"Texte de saisie automatique enregistré."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Texte de saisie automatique supprimé."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Supprimer"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Le navigateur peut remplir automatiquement les formulaires Web similaires à celui-ci. Voulez-vous créer un texte de saisie automatique ?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Le navigateur peut remplir automatiquement les formulaires Web similaires à celui-ci. Voulez-vous créer un texte de saisie automatique ?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Vous pourrez définir un texte de saisie automatique en accédant à Navigateur &gt; Paramètres &gt; Général."</string>
<string name="disable_autofill" msgid="8305901059849400354">"Désactiver la saisie automatique"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"Confidentialité et sécurité"</string>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 4dc836b..2966f92 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"स्‍वत: भरण पाठ सहेजा गया."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"स्‍वत: भरण पाठ हटाया गया."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"हटाएं"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"इसी की तरह ब्राउज़र स्‍वचालित रूप से वेब फ़ॉर्म पूर्ण कर सकता है. क्‍या आप अपना स्‍वत: भरण पाठ सेट करना चाहते हैं?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"इसी की तरह ब्राउज़र स्‍वचालित रूप से वेब फ़ॉर्म पूर्ण कर सकता है. क्‍या आप अपना स्‍वत: भरण पाठ सेट करना चाहते हैं?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"आप कभी भी ब्राउज़र &gt; सेटिंग &gt; सामान्‍य स्‍क्रीन से अपना स्‍वत: भरण पाठ सेट कर सकते हैं."</string>
<string name="disable_autofill" msgid="8305901059849400354">"स्‍वत: भरण अक्षम करें"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"गोपनीयता और सुरक्षा"</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 008c05d..809249f 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"Tekst automatskog ispunjavanja spremljen."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Tekst automatskog ispunjavanja izbrisan."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Izbriši"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Preglednik može automatski ispuniti web-obrasce kao što je ovaj. Želite li postaviti svoj tekst za automatsko ispunjavanje?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Preglednik može automatski ispuniti web-obrasce kao što je ovaj. Želite li postaviti svoj tekst za automatsko ispunjavanje?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Uvijek možete postaviti tekst za automatsko ispunjavanje sa zaslona Preglednik &gt; Postavke &gt; Općenito."</string>
<string name="disable_autofill" msgid="8305901059849400354">"Onemogući automatsko popunjavanje"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"Privatnost i sigurnost"</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 604e7c5..d6d0f53 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"Automatikus kitöltés szövege elmentve."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Automatikus kitöltés szövege törölve."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Törlés"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"A böngésző automatikusan kitölti az ehhez hasonló webes űrlapokat. Szeretné létrehozni az automatikus kitöltés szövegét?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"A böngésző automatikusan kitölti az ehhez hasonló webes űrlapokat. Szeretné létrehozni az automatikus kitöltés szövegét?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Bármikor beállíthatja az automatikus kitöltése szövegét a Böngésző &gt; Beállítások &gt; Általános képernyőn."</string>
<string name="disable_autofill" msgid="8305901059849400354">"Automatikus kitöltés letiltása"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"Adatvédelem és biztonság"</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 7a2210c..0f6b62a 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"Teks isi-otomatis disimpan."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Teks isi-otomatis dihapus."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Hapus"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Peramban dapat melengkapi formulir web seperti ini secara otomatis. Apakah Anda ingin menyiapkan teks isi-otomatis?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Peramban dapat melengkapi formulir web seperti ini secara otomatis. Apakah Anda ingin menyiapkan teks isi-otomatis?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Anda selalu dapat menyiapkan teks isi-otomatis dari layar Peramban &gt; Setelan &gt; Umum."</string>
<string name="disable_autofill" msgid="8305901059849400354">"Nonaktifkan isi-otomatis"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"Privasi &amp; keamanan"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 925c684..0e8fccb 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"Testo per compilazione automatica salvato."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Testo per compilazione automatica eliminato."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Elimina"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Il browser può completare automaticamente i moduli web come questo. Vuoi impostare il testo per la compilazione automatica?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Il browser può completare automaticamente i moduli web come questo. Vuoi impostare il testo per la compilazione automatica?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Puoi sempre impostare il testo per la compilazione automatica dalla schermata Browser &gt; Impostazioni &gt; Generali."</string>
<string name="disable_autofill" msgid="8305901059849400354">"Disattiva compilazione automatica"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"Privacy e sicurezza"</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 8b52381..8915719 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"מילוי אוטומטי של טקסט נשמר."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"מילוי אוטומטי של טקסט נמחק."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"מחק"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"הדפדפן יכול למלא באופן אוטומטי טופסי אינטרנט כמו זה. האם תרצה להגדיר מילוי אוטומטי של טקסט?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"הדפדפן יכול למלא באופן אוטומטי טופסי אינטרנט כמו זה. האם תרצה להגדיר מילוי אוטומטי של טקסט?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"תוכל תמיד להגדיר את המילוי האוטומטי של הטקסט דרך המסך \'דפדפן\' &gt; \'הגדרות\' &gt; \'כללי\'."</string>
<string name="disable_autofill" msgid="8305901059849400354">"השבת את \'מילוי אוטומטי\'"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"פרטיות ואבטחה"</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index e597b5f..5eaab66 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"自動入力テキストを保存しました。"</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"自動入力テキストを削除しました。"</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"削除"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"このようにウェブフォームのデータを自動的に入力できます。自動入力テキストを設定しますか?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"このようにウェブフォームのデータを自動的に入力できます。自動入力テキストを設定しますか?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"自動入力テキストは[ブラウザ] &gt; [設定] &gt; [全般]でいつでも設定できます。"</string>
<string name="disable_autofill" msgid="8305901059849400354">"自動入力を無効にする"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"プライバシーとセキュリティ"</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 3619ffa..62d34c9 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"자동 입력 텍스트를 저장했습니다."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"자동 입력 텍스트가 삭제되었습니다."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"삭제"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"브라우저에서 이 양식과 같은 웹 양식을 자동으로 완성할 수 있습니다. 자동 입력 텍스트를 설정하시겠습니까?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"브라우저에서 이 양식과 같은 웹 양식을 자동으로 완성할 수 있습니다. 자동 입력 텍스트를 설정하시겠습니까?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"브라우저 &gt; 설정 &gt; 일반 화면에서 언제든지 자동 입력 텍스트를 설정할 수 있습니다."</string>
<string name="disable_autofill" msgid="8305901059849400354">"자동 입력 사용중지"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"개인정보 보호 및 보안"</string>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 6836328..3692dfc 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"Automatinio pildymo tekstas išsaugotas."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Automatinis teksto pildymas ištrintas."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Ištrinti"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Naršyklė gali automatiškai užpildyti tokias žiniatinklio formas kaip ši. Ar norėtumėte nustatyti automatinį teksto pildymą?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Naršyklė gali automatiškai užpildyti tokias žiniatinklio formas kaip ši. Ar norėtumėte nustatyti automatinį teksto pildymą?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Automatinį teksto pildymą galite bet kada nustatyti ekrane „Naršyklė“ &gt; „Nustatymai“ &gt; „Bendra“."</string>
<string name="disable_autofill" msgid="8305901059849400354">"Neleisti automatinio pildymo"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"Privatumas ir sauga"</string>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 2e31833..3f9623b 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"Automātiskās aizpildes teksts saglabāts."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Automātiskās aizpildes teksts ir izdzēsts."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Dzēst"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Pārlūkprogramma var automātiski aizpildīt šādas tīmekļa veidlapas. Vai vēlaties iestatīt automātiskās aizpildes tekstu?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Pārlūkprogramma var automātiski aizpildīt šādas tīmekļa veidlapas. Vai vēlaties iestatīt automātiskās aizpildes tekstu?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Jebkurā laikā varat iestatīt automātiskās aizpildes tekstu, atverot šādus ekrānus: Pārlūkprogramma &gt; Iestatījumi &gt; Vispārīgi."</string>
<string name="disable_autofill" msgid="8305901059849400354">"Atspējot automātisko aizpildi"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"Konfidencialitāte un drošība"</string>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index 46649a7..85c4c9b 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"Teks auto isi disimpan."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Teks auto-isi dipadamkan."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Padam"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Penyemak imbas boleh melengkapkan borang web seperti ini secara automatik. Adakah anda ingin menyediakan teks auto-isi anda?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Penyemak imbas boleh melengkapkan borang web seperti ini secara automatik. Adakah anda ingin menyediakan teks auto-isi anda?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Anda boleh menyediakan teks auto-isi anda daripada skrin Penyemak Imbas &gt; Tetapan &gt; Umum."</string>
<string name="disable_autofill" msgid="8305901059849400354">"Lumpuhkan auto isi"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"Privasi &amp; keselamatan"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 91a2f86..8a0bcd3 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"Tekst for automatisk utfylling lagret."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Tekst for automatisk utfylling er slettet."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Slett"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Nettleseren kan automatisk fullføre nettskjemaer som dette. Vil du konfigurere tekst for automatisk utfylling?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Nettleseren kan automatisk fullføre nettskjemaer som dette. Vil du konfigurere tekst for automatisk utfylling?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Du kan konfigurere tekst for automatisk utfylling senere, fra skjermen Nettleser &gt; Innstillinger &gt; Generelt."</string>
<string name="disable_autofill" msgid="8305901059849400354">"Deaktiver automatisk utfylling"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"Personvern og sikkerhet"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 3ec3af6..a6ec060 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"Tekst voor automatisch aanvullen opgeslagen."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Tekst voor automatisch aanvullen verwijderd."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Verwijderen"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"De browser kan webformulieren zoals deze automatisch invullen. Wilt u uw instellingen voor het automatisch aanvullen van tekst opgeven?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"De browser kan webformulieren zoals deze automatisch invullen. Wilt u uw instellingen voor het automatisch aanvullen van tekst opgeven?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"U kunt de tekst voor automatisch aanvullen altijd instellen via \'Browser\' &gt; \'Instellingen\' &gt; \'Algemeen\'."</string>
<string name="disable_autofill" msgid="8305901059849400354">"Automatisch aanvullen uitschakelen"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"Privacy en beveiliging"</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index e4873c6..a552265 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"Autouzupełniany tekst został zapisany."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Autouzupełniany tekst został usunięty."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Usuń"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Przeglądarka może automatycznie wypełniać takie formularze internetowe. Chcesz skonfigurować autouzupełniany tekst?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Przeglądarka może automatycznie wypełniać takie formularze internetowe. Chcesz skonfigurować autouzupełniany tekst?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Zawsze możesz skonfigurować autouzupełniany tekst na ekranie Przeglądarka &gt; Ustawienia &gt; Ogólne."</string>
<string name="disable_autofill" msgid="8305901059849400354">"Wyłącz autouzupełnianie"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"Prywatność i bezpieczeństwo"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 80d0650..f8c1514 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"Texto de preenchimento automático guardado."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Texto de preenchimento automático eliminado."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Eliminar"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"O navegador pode preencher automaticamente formulários Web como este. Pretende configurar o texto de preenchimento automático?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"O navegador pode preencher automaticamente formulários Web como este. Pretende configurar o texto de preenchimento automático?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Pode sempre configurar o texto de preenchimento automático no ecrã Navegador &gt; Definições &gt; Geral."</string>
<string name="disable_autofill" msgid="8305901059849400354">"Desativar preenchimento automático"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"Privacidade e segurança"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 1093de7..fee32be 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"Texto de preenchimento automático salvo."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Texto de preenchimento automático excluído."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Excluir"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"O navegador pode preencher automaticamente formulários da web como este. Deseja configurar o preenchimento automático de texto?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"O navegador pode preencher automaticamente formulários da web como este. Deseja configurar o preenchimento automático de texto?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"É possível configurar o preenchimento automático de texto na tela Navegador &gt; Configurações &gt; Geral."</string>
<string name="disable_autofill" msgid="8305901059849400354">"Desativar o preenchimento automático"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"Privacidade e segurança"</string>
diff --git a/res/values-rm/strings.xml b/res/values-rm/strings.xml
index 290b4ec..7af5b33 100644
--- a/res/values-rm/strings.xml
+++ b/res/values-rm/strings.xml
@@ -239,7 +239,7 @@
<skip />
<!-- no translation found for autofill_profile_editor_delete_profile (3098369314558164153) -->
<skip />
- <!-- no translation found for autofill_setup_dialog_message (1096164985825394616) -->
+ <!-- no translation found for autofill_setup_dialog_message (7123905786076456503) -->
<skip />
<!-- no translation found for autofill_setup_dialog_negative_toast (3288881675232206984) -->
<skip />
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index f5f44f2..91d561f 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"Textul pentru completare automată a fost salvat."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Textul pentru completarea automată a fost şters."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Ştergeţi"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Browserul poate completa automat formulare web ca acesta. Doriţi să configuraţi textul pentru completarea automată?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Browserul poate completa automat formulare web ca acesta. Doriţi să configuraţi textul pentru completarea automată?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Puteţi configura oricând textul dvs. pentru completarea automată din ecranul Browser &gt; Setări &gt; General."</string>
<string name="disable_autofill" msgid="8305901059849400354">"Dezactivaţi completarea automată"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"Confidenţialitate şi securitate"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 25e2f87..591fbd4 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"Текст автозаполнения сохранен."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Текст автозаполнения удален."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Удалить"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Браузер может автоматически заполнять такие веб-формы. Включить автозаполнение?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Браузер может автоматически заполнять такие веб-формы. Включить автозаполнение?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Автозаполнение можно настроить в общих настройках браузера."</string>
<string name="disable_autofill" msgid="8305901059849400354">"Отключить автозаполнение"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"Личные данные"</string>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 1a5155d..92c7597 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"Automaticky dopĺňaný text bol uložený."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Automaticky dopĺňaný text bol odstránený."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Odstrániť"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Podobné webové formuláre môže prehliadač vypĺňať automaticky. Chcete nastaviť automatické dopĺňanie textu?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Podobné webové formuláre môže prehliadač vypĺňať automaticky. Chcete nastaviť automatické dopĺňanie textu?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Automatické dopĺňanie textu môžete v prehliadači kedykoľvek nastaviť v časti Nastavenia &gt; Hlavná obrazovka."</string>
<string name="disable_autofill" msgid="8305901059849400354">"Zakázať automatické dopĺňanie"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"Ochrana osobných údajov a zabezpečenie"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 730daa9..be70e67 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"Besedilo za samodejno izpolnjevanje je bilo shranjeno."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Besedilo za samodejno izpolnjevanje je bilo izbrisano."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Izbriši"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Brskalnik lahko samodejno izpolni spletne obrazce, kot je ta. Ali želite nastaviti besedilo za samodejno izpolnjevanje?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Brskalnik lahko samodejno izpolni spletne obrazce, kot je ta. Ali želite nastaviti besedilo za samodejno izpolnjevanje?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Besedilo za samodejno izpolnjevanje lahko vedno nastavite na zaslonu Brskalnik &gt; Nastavitve &gt; Splošno."</string>
<string name="disable_autofill" msgid="8305901059849400354">"Onemogoči samodejno izpolnjevanje"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"Zasebnost in varnost"</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 463ef30..a947f5e 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"Текст за аутоматско попуњавање је сачуван."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Текст за аутоматско попуњавање је избрисан."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Избриши"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Прегледач може аутоматски да попуњава веб обрасце попут овог. Желите ли да подесите текст за аутоматско попуњавање?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Прегледач може аутоматски да попуњава веб обрасце попут овог. Желите ли да подесите текст за аутоматско попуњавање?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Увек можете да подесите текст за аутоматско попуњавање на екрану Прегледач &gt; Подешавања &gt; Опште."</string>
<string name="disable_autofill" msgid="8305901059849400354">"Онемогући аутоматско попуњавање"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"Приватност и безбедност"</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index b4b2c2c..8aad8a9 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"Text för autofyll har sparats."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Text för autofyll har tagits bort."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Ta bort"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Den här typen av webbformulär kan fyllas i automatiskt. Vill du ange en text för autofyll?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Den här typen av webbformulär kan fyllas i automatiskt. Vill du ange en text för autofyll?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Du kan alltid ange texten för autofyll på skärmen Webbläsare &gt; Inställningar &gt; Allmänt."</string>
<string name="disable_autofill" msgid="8305901059849400354">"Inaktivera Autofyll"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"Sekretess och säkerhet"</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 2226e6e..950914a 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"Maandishi kujaza-oto yamehifadhiwa."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Maandishi ya oto-kujaza imefutwa."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Futa"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Kivinjari inaweza kukamilisha kiotomatiki fomu za wavuti kama hii. Je ungependa kusanidi maandishi ya kujaza-oto?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Kivinjari inaweza kukamilisha kiotomatiki fomu za wavuti kama hii. Je ungependa kusanidi maandishi ya kujaza-oto?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Wakati wowote unaweza kusanidi oto-kujaza maandishi kutoka kwa Broswer &gt; Settings &gt; Skrini ya kawaida."</string>
<string name="disable_autofill" msgid="8305901059849400354">"Zima uwezo wa kujaza kiotomatiki"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"Faragha na Usalama"</string>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index a15fd2b..aa13679 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"บันทึกการป้อนข้อความอัตโนมัติแล้ว"</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"ลบการป้อนข้อความอัตโนมัติแล้ว"</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"ลบ"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"เบราว์เซอร์สามารถกรอกเว็บฟอร์มโดยอัตโนมัติได้เหมือนกับฟอร์มนี้ คุณต้องการตั้งค่าการป้อนข้อความอัตโนมัติหรือไม่"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"เบราว์เซอร์สามารถกรอกเว็บฟอร์มโดยอัตโนมัติได้เหมือนกับฟอร์มนี้ คุณต้องการตั้งค่าการป้อนข้อความอัตโนมัติหรือไม่"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"คุณสามารถตั้งค่าการป้อนข้อความอัตโนมัติจากหน้าจอเบราว์เซอร์ &gt; การตั้งค่า &gt; ทั่วไป ได้เสมอ"</string>
<string name="disable_autofill" msgid="8305901059849400354">"ปิดใช้งานการป้อนอัตโนมัติ"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"ข้อมูลส่วนบุคคลและความปลอดภัย"</string>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index e7f01ce..fc5201c 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"Na-save ang auto-fill text."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Tinanggal ang auto-fill text."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Tanggalin"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Maaaring awtomatikong kumpletuhin ng browser ang mga web form tulad nito. Gusto mo bang i-set up ang iyong auto-fill text?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Maaaring awtomatikong kumpletuhin ng browser ang mga web form tulad nito. Gusto mo bang i-set up ang iyong auto-fill text?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Maaari mong i-set up ang iyong auto-fill text anumang oras mula sa Browser &gt; Mga Setting &gt; Pangkalahatang screen."</string>
<string name="disable_autofill" msgid="8305901059849400354">"Huwag paganahin ang auto-fill"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"Privacy at seguridad"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 7ed35f3..419932b 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"Otomatik doldurma metni kaydedildi."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Otomatik doldurma metni silindi."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Sil"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Tarayıcı, bunun gibi web formlarını otomatik olarak doldurabilir. Otomatik doldurma metninizi ayarlamak ister misiniz?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Tarayıcı, bunun gibi web formlarını otomatik olarak doldurabilir. Otomatik doldurma metninizi ayarlamak ister misiniz?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Otomatik doldurma metninizi istediğiniz zaman Tarayıcı &gt; Ayarlar &gt; Genel ekranından ayarlayabilirsiniz."</string>
<string name="disable_autofill" msgid="8305901059849400354">"Otomatik doldurmayı devre dışı bırak"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"Gizlilik ve güvenlik"</string>
@@ -379,7 +379,7 @@
<string name="accessibility_button_newtab" msgid="4116986240706315748">"Yeni sekme aç"</string>
<string name="accessibility_button_newincognitotab" msgid="5254901889040012964">"Yeni gizli sekme aç"</string>
<string name="accessibility_button_clear" msgid="6943152307986161598">"Girdiyi temizle"</string>
- <string name="accessibility_button_uaswitch" msgid="6286804719724282339">"User agent\'ı değiştir"</string>
+ <string name="accessibility_button_uaswitch" msgid="6286804719724282339">"Kullanıcı aracısını değiştir"</string>
<string name="accessibility_button_go" msgid="1182818872083055958">"Git"</string>
<string name="accessibility_button_navscreen" msgid="9142904748728713075">"Sayfa yöneticisi"</string>
<string name="accessibility_button_more" msgid="3054251446394224216">"Diğer seçenekler"</string>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index ecba5a0..b2d5fcf 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"Текст автозаповнення збережено."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Текст автозаповнення видалено."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Видалити"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Веб-переглядач може автоматично заповнювати подібні веб-форми. Налаштувати текст автозаповнення?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Веб-переглядач може автоматично заповнювати подібні веб-форми. Налаштувати текст автозаповнення?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Ви завжди можете налаштувати текст автозаповнення на екрані Веб-переглядач &gt; Налаштування &gt; Загальні."</string>
<string name="disable_autofill" msgid="8305901059849400354">"Вимкнути автозаповнення"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"Конфіденційність і безпека"</string>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 4841c2d..1a7b1b5 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"Đã lưu văn bản tự động điền."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Đã xóa văn bản tự động điền."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Xóa"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Trình duyệt có thể tự động hoàn tất các biểu mẫu web giống như biểu mẫu này. Bạn có muốn thiết lập văn bản tự động điền của mình không?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Trình duyệt có thể tự động hoàn tất các biểu mẫu web giống như biểu mẫu này. Bạn có muốn thiết lập văn bản tự động điền của mình không?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Bạn luôn có thể thiết lập văn bản tự động điền của mình từ màn hình Trình duyệt &gt; Cài đặt &gt; Chung."</string>
<string name="disable_autofill" msgid="8305901059849400354">"Tắt tính năng tự động điền"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"Riêng tư &amp; bảo mật"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 3e2c628..21535cd 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"自动填充文本已保存。"</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"自动填充文本已删除。"</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"删除"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"浏览器可以自动填写与此类似的网络表单。您要设置自动填充文本吗?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"浏览器可以自动填写与此类似的网络表单。您要设置自动填充文本吗?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"您可以随时通过“浏览器”&gt;“设置”&gt;“常规”屏幕设置自动填充文本。"</string>
<string name="disable_autofill" msgid="8305901059849400354">"停用自动填充"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"隐私和安全"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 126c165..e54afb1 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"已儲存自動填入文字。"</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"已刪除自動填入文字。"</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"刪除"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"瀏覽器可以自動完成這類網路表單,您要設定自動填入文字嗎?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"瀏覽器可以自動完成這類網路表單,您要設定自動填入文字嗎?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"您隨時可以前往 [瀏覽器] &gt; [設定] &gt; [一般] 畫面設定自動填入文字。"</string>
<string name="disable_autofill" msgid="8305901059849400354">"停用自動填入功能"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"隱私權與安全性"</string>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 1541eee..9fa3b7f 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -181,7 +181,7 @@
<string name="autofill_profile_successful_save" msgid="5691459703493331983">"Ukuzifakekela kombhalo kulondoloziwe."</string>
<string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Ukuzifakekela kwamagama kususiwe."</string>
<string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Susa"</string>
- <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Isiphequluli singazigcwalisela amafomu ewebhu afana nalawa. Ungathanda ukulungisa uhlelo lokuzigcwalisela umbhalo?"</string>
+ <!-- outdated translation 1096164985825394616 --> <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Isiphequluli singazigcwalisela amafomu ewebhu afana nalawa. Ungathanda ukulungisa uhlelo lokuzigcwalisela umbhalo?"</string>
<string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Ungakwazi njalo ukuthi usethe ukuzifakekela kombhalo usuka Esipheqululini; Izilungiselelosetho; Iskrini esijwayelekile."</string>
<string name="disable_autofill" msgid="8305901059849400354">"Khubaza ukufaka-okuzenzakalelayo"</string>
<string name="pref_privacy_security_title" msgid="3480313968942160914">"Ubumfihlo nokuvikela"</string>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 6a1a6f1..2de5e58 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -408,7 +408,7 @@
<string name="autofill_profile_editor_delete_profile">Delete</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">The browser can automatically complete web forms like this one. Would you like to set up your auto-fill text?</string>
+ <string name="autofill_setup_dialog_message">The browser can automatically complete web forms like this one. Do you want to set up your auto-fill text?</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">You can always set up your auto-fill text from the Browser &gt; Settings &gt; General screen.</string>
@@ -762,8 +762,6 @@
<!-- Do not translate. Testing only -->
<string name="dump_nav" translatable="false">Dump navigation cache</string>
- <!-- Do not translate. Testing only -->
- <string name="dump_counters" translatable="false">Dump V8 counters</string>
<!-- The default homepage. If it starts with "http://www.google" and the
user signs up the device with a Google sites account, the site's
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 361702e..17c5eb2 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -80,4 +80,17 @@
<item name="android:textColor">?android:attr/textColorSecondary</item>
<item name="android:textStyle">normal</item>
</style>
+
+ <style name="AutofillProfileTextView">
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:gravity">center_vertical</item>
+ <item name="android:layout_margin">2dip</item>
+ <item name="android:textAppearance">?android:attr/textAppearanceMedium</item>
+ </style>
+ <style name="AutofillProfileEditText" parent="@style/AutofillProfileTextView">
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:imeOptions">flagNoExtractUi|actionNext</item>
+ <item name="android:singleLine">true</item>
+ </style>
</resources>
diff --git a/src/com/android/browser/AutoFillSettingsFragment.java b/src/com/android/browser/AutoFillSettingsFragment.java
index 04f45b5..7be657d 100644
--- a/src/com/android/browser/AutoFillSettingsFragment.java
+++ b/src/com/android/browser/AutoFillSettingsFragment.java
@@ -52,7 +52,9 @@ public class AutoFillSettingsFragment extends Fragment {
private EditText mCountryEdit;
private EditText mPhoneEdit;
- private Button mSaveButton;
+ private MenuItem mSaveMenuItem;
+
+ private boolean mInitialised;
// Used to display toast after DB interactions complete.
private Handler mHandler;
@@ -87,7 +89,7 @@ public class AutoFillSettingsFragment extends Fragment {
mPhoneEdit.setError(null);
}
- updateButtonState();
+ updateSaveMenuItemState();
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
@@ -99,7 +101,7 @@ public class AutoFillSettingsFragment extends Fragment {
private class FieldChangedListener implements TextWatcher {
public void afterTextChanged(Editable s) {
- updateButtonState();
+ updateSaveMenuItemState();
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
@@ -147,11 +149,14 @@ public class AutoFillSettingsFragment extends Fragment {
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.autofill_profile_editor, menu);
+ mSaveMenuItem = menu.findItem(R.id.autofill_profile_editor_save_profile_menu_id);
+ updateSaveMenuItemState();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
- if (item.getItemId() == R.id.autofill_profile_editor_delete_profile_menu_id) {
+ switch (item.getItemId()) {
+ case R.id.autofill_profile_editor_delete_profile_menu_id:
// Clear the UI.
mFullNameEdit.setText("");
mEmailEdit.setText("");
@@ -168,10 +173,30 @@ public class AutoFillSettingsFragment extends Fragment {
// trigger the current profile to get deleted from the DB.
mSettings.setAutoFillProfile(null,
mHandler.obtainMessage(PROFILE_DELETED_MSG));
- updateButtonState();
+ updateSaveMenuItemState();
+ return true;
+
+ case R.id.autofill_profile_editor_save_profile_menu_id:
+ 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());
+
+ mSettings.setAutoFillProfile(newProfile,
+ mHandler.obtainMessage(PROFILE_SAVED_MSG));
return true;
+
+ default:
+ return false;
}
- return false;
}
@Override
@@ -203,27 +228,6 @@ public class AutoFillSettingsFragment extends Fragment {
mCountryEdit.addTextChangedListener(mFieldChangedListener);
mPhoneEdit.addTextChangedListener(new PhoneNumberValidator());
- mSaveButton = (Button)v.findViewById(R.id.autofill_profile_editor_save_button);
- mSaveButton.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());
-
- mSettings.setAutoFillProfile(newProfile,
- mHandler.obtainMessage(PROFILE_SAVED_MSG));
- }
- });
-
// Populate the text boxes with any pre existing AutoFill data.
AutoFillProfile activeProfile = mSettings.getAutoFillProfile();
if (activeProfile != null) {
@@ -239,14 +243,25 @@ public class AutoFillSettingsFragment extends Fragment {
mPhoneEdit.setText(activeProfile.getPhoneNumber());
}
- updateButtonState();
+ mInitialised = true;
+
+ updateSaveMenuItemState();
return v;
}
- public void updateButtonState() {
+ private void updateSaveMenuItemState() {
+ if (mSaveMenuItem == null) {
+ return;
+ }
- boolean valid = (mFullNameEdit.getText().toString().length() > 0 ||
+ if (!mInitialised) {
+ mSaveMenuItem.setEnabled(false);
+ return;
+ }
+
+ boolean currentState = mSaveMenuItem.isEnabled();
+ boolean newState = (mFullNameEdit.getText().toString().length() > 0 ||
mEmailEdit.getText().toString().length() > 0 ||
mCompanyEdit.getText().toString().length() > 0 ||
mAddressLine1Edit.getText().toString().length() > 0 ||
@@ -257,9 +272,9 @@ public class AutoFillSettingsFragment extends Fragment {
mCountryEdit.getText().toString().length() > 0) &&
mPhoneEdit.getError() == null;
- // Only enable the save buttons if we have at least one field completed
- // and the phone number (if present is valid).
- mSaveButton.setEnabled(valid);
+ if (currentState != newState) {
+ mSaveMenuItem.setEnabled(newState);
+ }
}
private void closeEditor() {
diff --git a/src/com/android/browser/AutofillHandler.java b/src/com/android/browser/AutofillHandler.java
index c4b14d7..dc23d00 100644
--- a/src/com/android/browser/AutofillHandler.java
+++ b/src/com/android/browser/AutofillHandler.java
@@ -21,9 +21,11 @@ import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.database.Cursor;
+import android.net.Uri;
import android.os.AsyncTask;
import android.os.Message;
import android.preference.PreferenceManager;
+import android.provider.ContactsContract;
import android.webkit.WebSettings.AutoFillProfile;
import java.util.concurrent.CountDownLatch;
@@ -114,8 +116,58 @@ public class AutofillHandler {
c.close();
autoFillDb.close();
+ if (mAutoFillProfile == null) {
+ // We did not load a profile from disk. Try to populate one with the user's
+ // "me" contact.
+ final Uri profileUri = Uri.withAppendedPath(ContactsContract.Profile.CONTENT_URI,
+ ContactsContract.Contacts.Data.CONTENT_DIRECTORY);
+
+ String name = getContactField(profileUri,
+ ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,
+ ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
+ // Only attempt to read other data and set a profile if we could successfully
+ // get a name.
+ if (name != null) {
+ String email = getContactField(profileUri,
+ ContactsContract.CommonDataKinds.Email.ADDRESS,
+ ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE);
+ String phone = getContactField(profileUri,
+ ContactsContract.CommonDataKinds.Phone.NUMBER,
+ ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
+ String company = getContactField(profileUri,
+ ContactsContract.CommonDataKinds.Organization.COMPANY,
+ ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE);
+
+ // Can't easily get structured postal address information (even using
+ // CommonDataKinds.StructuredPostal) so omit prepopulating that for now.
+ // When querying structured postal data, it often all comes back as a string
+ // inside the "street" field.
+
+ mAutoFillProfile = new AutoFillProfile(
+ 1, name, email, company, null, null, null, null,
+ null, null, phone);
+ }
+ }
+
mLoaded.countDown();
}
+
+ private String getContactField(Uri uri, String field, String itemType) {
+ String result = null;
+
+ Cursor c = mContext.getContentResolver().query(uri, new String[] { field },
+ ContactsContract.Data.MIMETYPE + "=?", new String[] { itemType }, null);
+
+ try {
+ // Just use the first returned value if we get more than one.
+ if (c.moveToFirst()) {
+ result = c.getString(0);
+ }
+ } finally {
+ c.close();
+ }
+ return result;
+ }
}
public void setAutoFillProfile(AutoFillProfile profile, Message msg) {
diff --git a/src/com/android/browser/BaseUi.java b/src/com/android/browser/BaseUi.java
index 69063eb..e1d7047 100644
--- a/src/com/android/browser/BaseUi.java
+++ b/src/com/android/browser/BaseUi.java
@@ -236,6 +236,7 @@ public abstract class BaseUi implements UI {
@Override
public void setActiveTab(final Tab tab) {
+ if (tab == null) return;
mHandler.removeMessages(MSG_HIDE_TITLEBAR);
if ((tab != mActiveTab) && (mActiveTab != null)) {
removeTabFromContentView(mActiveTab);
diff --git a/src/com/android/browser/BrowserActivity.java b/src/com/android/browser/BrowserActivity.java
index 23aeed5..77fac4f 100644
--- a/src/com/android/browser/BrowserActivity.java
+++ b/src/com/android/browser/BrowserActivity.java
@@ -62,7 +62,7 @@ public class BrowserActivity extends Activity {
finish();
return;
}
- mController = new Controller(this, icicle == null);
+ mController = new Controller(this);
boolean xlarge = isTablet(this);
if (xlarge) {
mUi = new XLargeUi(this, mController);
@@ -71,12 +71,8 @@ public class BrowserActivity extends Activity {
}
mController.setUi(mUi);
- Bundle state = getIntent().getBundleExtra(EXTRA_STATE);
- if (state != null && icicle == null) {
- icicle = state;
- }
-
- mController.start(icicle, getIntent());
+ Intent intent = (icicle == null) ? getIntent() : null;
+ mController.start(intent);
}
public static boolean isTablet(Context context) {
diff --git a/src/com/android/browser/BrowserSettings.java b/src/com/android/browser/BrowserSettings.java
index 2369554..dd7bb56 100644
--- a/src/com/android/browser/BrowserSettings.java
+++ b/src/com/android/browser/BrowserSettings.java
@@ -174,8 +174,6 @@ public class BrowserSettings implements OnSharedPreferenceChangeListener,
mWebStorageSizeManager = new WebStorageSizeManager(mContext,
new WebStorageSizeManager.StatFsDiskInfo(getAppCachePath()),
new WebStorageSizeManager.WebKitAppCacheInfo(getAppCachePath()));
- // Workaround b/5253777
- CookieManager.getInstance().acceptCookie();
// Workaround b/5254577
mPrefs.registerOnSharedPreferenceChangeListener(BrowserSettings.this);
if (Build.VERSION.CODENAME.equals("REL")) {
@@ -847,4 +845,47 @@ public class BrowserSettings implements OnSharedPreferenceChangeListener,
return mPrefs.getString(PREF_DATA_PRELOAD, getDefaultPreloadSetting());
}
+ // -----------------------------
+ // getter/setters for browser recovery
+ // -----------------------------
+ /**
+ * The last time browser was started.
+ * @return The last browser start time as System.currentTimeMillis. This
+ * can be 0 if this is the first time or the last tab was closed.
+ */
+ public long getLastRecovered() {
+ return mPrefs.getLong(KEY_LAST_RECOVERED, 0);
+ }
+
+ /**
+ * Sets the last browser start time.
+ * @param time The last time as System.currentTimeMillis that the browser
+ * was started. This should be set to 0 if the last tab is closed.
+ */
+ public void setLastRecovered(long time) {
+ mPrefs.edit()
+ .putLong(KEY_LAST_RECOVERED, time)
+ .apply();
+ }
+
+ /**
+ * Used to determine whether or not the previous browser run crashed. Once
+ * the previous state has been determined, the value will be set to false
+ * until a pause is received.
+ * @return true if the last browser run was paused or false if it crashed.
+ */
+ public boolean wasLastRunPaused() {
+ return mPrefs.getBoolean(KEY_LAST_RUN_PAUSED, false);
+ }
+
+ /**
+ * Sets whether or not the last run was a pause or crash.
+ * @param isPaused Set to true When a pause is received or false after
+ * resuming.
+ */
+ public void setLastRunPaused(boolean isPaused) {
+ mPrefs.edit()
+ .putBoolean(KEY_LAST_RUN_PAUSED, isPaused)
+ .apply();
+ }
}
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index 8238d77..67be22e 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -218,15 +218,13 @@ public class Controller
private boolean mBlockEvents;
- public Controller(Activity browser, boolean preloadCrashState) {
+ public Controller(Activity browser) {
mActivity = browser;
mSettings = BrowserSettings.getInstance();
mTabControl = new TabControl(this);
mSettings.setController(this);
mCrashRecoveryHandler = CrashRecoveryHandler.initialize(this);
- if (preloadCrashState) {
- mCrashRecoveryHandler.preloadCrashState();
- }
+ mCrashRecoveryHandler.preloadCrashState();
mFactory = new BrowserWebViewFactory(browser);
mUrlHandler = new UrlHandler(this);
@@ -256,16 +254,12 @@ public class Controller
openIconDatabase();
}
- void start(final Bundle icicle, final Intent intent) {
- boolean noCrashRecovery = intent.getBooleanExtra(NO_CRASH_RECOVERY, false);
- if (icicle != null || noCrashRecovery) {
- doStart(icicle, intent, false);
- } else {
- mCrashRecoveryHandler.startRecovery(intent);
- }
+ void start(final Intent intent) {
+ // mCrashRecoverHandler has any previously saved state.
+ mCrashRecoveryHandler.startRecovery(intent);
}
- void doStart(final Bundle icicle, final Intent intent, final boolean fromCrash) {
+ void doStart(final Bundle icicle, final Intent intent) {
// Unless the last browser usage was within 24 hours, destroy any
// remaining incognito tabs.
@@ -293,36 +287,42 @@ public class Controller
GoogleAccountLogin.startLoginIfNeeded(mActivity,
new Runnable() {
@Override public void run() {
- onPreloginFinished(icicle, intent, currentTabId, restoreIncognitoTabs,
- fromCrash);
+ onPreloginFinished(icicle, intent, currentTabId,
+ restoreIncognitoTabs);
}
});
}
private void onPreloginFinished(Bundle icicle, Intent intent, long currentTabId,
- boolean restoreIncognitoTabs, boolean fromCrash) {
+ boolean restoreIncognitoTabs) {
if (currentTabId == -1) {
BackgroundHandler.execute(new PruneThumbnails(mActivity, null));
- 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 = IntentHandler.getUrlDataFromIntent(intent);
- Tab t = null;
- if (urlData.isEmpty()) {
- t = openTabToHomePage();
+ if (intent == null) {
+ // This won't happen under common scenarios. The icicle is
+ // not null, but there aren't any tabs to restore.
+ openTabToHomePage();
} else {
- t = openTab(urlData);
- }
- if (t != null) {
- t.setAppId(intent.getStringExtra(Browser.EXTRA_APPLICATION_ID));
- }
- WebView webView = t.getWebView();
- if (extra != null) {
- int scale = extra.getInt(Browser.INITIAL_ZOOM_LEVEL, 0);
- if (scale > 0 && scale <= 1000) {
- webView.setInitialScale(scale);
+ 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 = IntentHandler.getUrlDataFromIntent(intent);
+ Tab t = null;
+ if (urlData.isEmpty()) {
+ t = openTabToHomePage();
+ } else {
+ t = openTab(urlData);
+ }
+ if (t != null) {
+ t.setAppId(intent.getStringExtra(Browser.EXTRA_APPLICATION_ID));
+ }
+ WebView webView = t.getWebView();
+ if (extra != null) {
+ int scale = extra.getInt(Browser.INITIAL_ZOOM_LEVEL, 0);
+ if (scale > 0 && scale <= 1000) {
+ webView.setInitialScale(scale);
+ }
}
}
mUi.updateTabs(mTabControl.getTabs());
@@ -342,9 +342,9 @@ public class Controller
// TabControl.restoreState() will create a new tab even if
// restoring the state fails.
setActiveTab(mTabControl.getCurrentTab());
- // Handle the intent if needed. If icicle != null, we are restoring
- // and the intent will be stale - ignore it.
- if (icicle == null || fromCrash) {
+ // Intent is non-null when framework thinks the browser should be
+ // launching with a new intent (icicle is null).
+ if (intent != null) {
mIntentHandler.onNewIntent(intent);
}
}
@@ -353,7 +353,8 @@ public class Controller
if (jsFlags.trim().length() != 0) {
getCurrentWebView().setJsFlags(jsFlags);
}
- if (BrowserActivity.ACTION_SHOW_BOOKMARKS.equals(intent.getAction())) {
+ if (intent != null
+ && BrowserActivity.ACTION_SHOW_BOOKMARKS.equals(intent.getAction())) {
bookmarksOrHistoryPicker(ComboViews.Bookmarks);
}
}
@@ -651,18 +652,27 @@ public class Controller
}
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);
- if (!outState.isEmpty()) {
+ Bundle saveState = createSaveState();
+
+ // crash recovery manages all save & restore state
+ mCrashRecoveryHandler.writeState(saveState);
+ mSettings.setLastRunPaused(true);
+ }
+
+ /**
+ * Save the current state to outState. Does not write the state to
+ * disk.
+ * @return Bundle containing the current state of all tabs.
+ */
+ /* package */ Bundle createSaveState() {
+ Bundle saveState = new Bundle();
+ mTabControl.saveState(saveState);
+ if (!saveState.isEmpty()) {
// Save time so that we know how old incognito tabs (if any) are.
- outState.putSerializable("lastActiveDate", Calendar.getInstance());
+ saveState.putSerializable("lastActiveDate", Calendar.getInstance());
}
+ return saveState;
}
void onResume() {
@@ -670,6 +680,7 @@ public class Controller
Log.e(LOGTAG, "BrowserActivity is already resumed.");
return;
}
+ mSettings.setLastRunPaused(false);
mActivityPaused = false;
Tab current = mTabControl.getCurrentTab();
if (current != null) {
@@ -831,7 +842,8 @@ public class Controller
mUi.onTabDataChanged(tab);
if (!tab.isPrivateBrowsingEnabled()
&& !TextUtils.isEmpty(tab.getUrl())
- && !tab.isSnapshot()) {
+ && !tab.isSnapshot()
+ && !tab.inPageLoad()) {
// Only update the bookmark screenshot if the user did not
// cancel the load early and there is not already
// a pending update for the tab.
@@ -1282,6 +1294,7 @@ public class Controller
// Show the correct menu group
final String extra = result.getExtra();
+ if (extra == null) return;
menu.setGroupVisible(R.id.PHONE_MENU,
type == WebView.HitTestResult.PHONE_TYPE);
menu.setGroupVisible(R.id.EMAIL_MENU,
@@ -1509,9 +1522,6 @@ public class Controller
nav.setEnabled(isNavDump);
boolean showDebugSettings = mSettings.isDebugEnabled();
- final MenuItem counter = menu.findItem(R.id.dump_counters_menu_id);
- counter.setVisible(showDebugSettings);
- counter.setEnabled(showDebugSettings);
final MenuItem uaSwitcher = menu.findItem(R.id.ua_desktop_menu_id);
uaSwitcher.setChecked(isDesktopUa);
menu.setGroupVisible(R.id.LIVE_MENU, isLive);
@@ -1666,10 +1676,6 @@ public class Controller
getCurrentTopWebView().debugDump();
break;
- case R.id.dump_counters_menu_id:
- getCurrentTopWebView().dumpV8Counters();
- break;
-
case R.id.zoom_in_menu_id:
getCurrentTopWebView().zoomIn();
break;
@@ -2006,7 +2012,6 @@ public class Controller
}
final String url = tab.getUrl();
final String originalUrl = view.getOriginalUrl();
-
if (TextUtils.isEmpty(url)) {
return;
}
@@ -2107,7 +2112,7 @@ public class Controller
manager.addCompletedDownload(target.getName(),
mActivity.getTitle().toString(), false,
uri.getMimeType(), target.getAbsolutePath(),
- (long)uri.getData().length, false);
+ (long)uri.getData().length, true);
} catch (IOException e) {
Log.e(LOGTAG, "Could not save data URL");
} finally {
@@ -2565,8 +2570,11 @@ public class Controller
* returns the current tab if it can't advance
*/
private Tab getNextTab() {
- return mTabControl.getTab(Math.min(mTabControl.getTabCount() - 1,
- mTabControl.getCurrentPosition() + 1));
+ int pos = mTabControl.getCurrentPosition() + 1;
+ if (pos >= mTabControl.getTabCount()) {
+ pos = 0;
+ }
+ return mTabControl.getTab(pos);
}
/**
@@ -2574,8 +2582,11 @@ public class Controller
* returns the current tab if it can't advance
*/
private Tab getPrevTab() {
- return mTabControl.getTab(Math.max(0,
- mTabControl.getCurrentPosition() - 1));
+ int pos = mTabControl.getCurrentPosition() - 1;
+ if ( pos < 0) {
+ pos = mTabControl.getTabCount() - 1;
+ }
+ return mTabControl.getTab(pos);
}
/**
diff --git a/src/com/android/browser/CrashRecoveryHandler.java b/src/com/android/browser/CrashRecoveryHandler.java
index 3202016..822e82a 100644
--- a/src/com/android/browser/CrashRecoveryHandler.java
+++ b/src/com/android/browser/CrashRecoveryHandler.java
@@ -37,8 +37,6 @@ public class CrashRecoveryHandler {
private static final boolean LOGV_ENABLED = Browser.LOGV_ENABLED;
private static final String LOGTAG = "BrowserCrashRecovery";
private static final String STATE_FILE = "browser_state.parcel";
- private static final String RECOVERY_PREFERENCES = "browser_recovery_prefs";
- private static final String KEY_LAST_RECOVERED = "last_recovered";
private static final int BUFFER_SIZE = 4096;
private static final long BACKUP_DELAY = 500; // 500ms between writes
/* This is the duration for which we will prompt to restore
@@ -85,31 +83,8 @@ public class CrashRecoveryHandler {
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_WRITE_STATE:
- if (LOGV_ENABLED) {
- Log.v(LOGTAG, "Saving crash recovery state");
- }
- Parcel p = Parcel.obtain();
- try {
- Bundle state = (Bundle) msg.obj;
- state.writeToParcel(p, 0);
- File stateJournal = new File(mContext.getCacheDir(),
- STATE_FILE + ".journal");
- FileOutputStream fout = new FileOutputStream(stateJournal);
- fout.write(p.marshall());
- fout.close();
- File stateFile = new File(mContext.getCacheDir(),
- STATE_FILE);
- if (!stateJournal.renameTo(stateFile)) {
- // Failed to rename, try deleting the existing
- // file and try again
- stateFile.delete();
- stateJournal.renameTo(stateFile);
- }
- } catch (Throwable e) {
- Log.i(LOGTAG, "Failed to save persistent state", e);
- } finally {
- p.recycle();
- }
+ Bundle saveState = (Bundle) msg.obj;
+ writeState(saveState);
break;
case MSG_CLEAR_STATE:
if (LOGV_ENABLED) {
@@ -142,8 +117,7 @@ public class CrashRecoveryHandler {
@Override
public void run() {
try {
- final Bundle state = new Bundle();
- mController.onSaveInstanceState(state);
+ final Bundle state = mController.createSaveState();
Message.obtain(mBackgroundHandler, MSG_WRITE_STATE, state)
.sendToTarget();
// Remove any queued up saves
@@ -162,28 +136,24 @@ public class CrashRecoveryHandler {
}
private boolean shouldRestore() {
- SharedPreferences prefs = mContext.getSharedPreferences(
- RECOVERY_PREFERENCES, Context.MODE_PRIVATE);
- long lastRecovered = prefs.getLong(KEY_LAST_RECOVERED, 0);
+ BrowserSettings browserSettings = BrowserSettings.getInstance();
+ long lastRecovered = browserSettings.getLastRecovered();
long timeSinceLastRecover = System.currentTimeMillis() - lastRecovered;
- if (timeSinceLastRecover > PROMPT_INTERVAL) {
- return true;
- }
- return false;
+ return (timeSinceLastRecover > PROMPT_INTERVAL)
+ || browserSettings.wasLastRunPaused();
}
private void updateLastRecovered(long time) {
- SharedPreferences prefs = mContext.getSharedPreferences(
- RECOVERY_PREFERENCES, Context.MODE_PRIVATE);
- prefs.edit()
- .putLong(KEY_LAST_RECOVERED, time)
- .apply();
+ BrowserSettings browserSettings = BrowserSettings.getInstance();
+ browserSettings.setLastRecovered(time);
}
- private Bundle loadCrashState() {
+ synchronized private Bundle loadCrashState() {
if (!shouldRestore()) {
return null;
}
+ BrowserSettings browserSettings = BrowserSettings.getInstance();
+ browserSettings.setLastRunPaused(false);
Bundle state = null;
Parcel parcel = Parcel.obtain();
FileInputStream fin = null;
@@ -231,7 +201,7 @@ public class CrashRecoveryHandler {
}
updateLastRecovered(mRecoveryState != null
? System.currentTimeMillis() : 0);
- mController.doStart(mRecoveryState, intent, true);
+ mController.doStart(mRecoveryState, intent);
mRecoveryState = null;
}
@@ -245,4 +215,35 @@ public class CrashRecoveryHandler {
mBackgroundHandler.sendEmptyMessage(MSG_PRELOAD_STATE);
}
-}
+ /**
+ * Writes the crash recovery state to a file synchronously.
+ * Errors are swallowed, but logged.
+ * @param state The state to write out
+ */
+ synchronized void writeState(Bundle state) {
+ if (LOGV_ENABLED) {
+ Log.v(LOGTAG, "Saving crash recovery state");
+ }
+ Parcel p = Parcel.obtain();
+ try {
+ state.writeToParcel(p, 0);
+ File stateJournal = new File(mContext.getCacheDir(),
+ STATE_FILE + ".journal");
+ FileOutputStream fout = new FileOutputStream(stateJournal);
+ fout.write(p.marshall());
+ fout.close();
+ File stateFile = new File(mContext.getCacheDir(),
+ STATE_FILE);
+ if (!stateJournal.renameTo(stateFile)) {
+ // Failed to rename, try deleting the existing
+ // file and try again
+ stateFile.delete();
+ stateJournal.renameTo(stateFile);
+ }
+ } catch (Throwable e) {
+ Log.i(LOGTAG, "Failed to save persistent state", e);
+ } finally {
+ p.recycle();
+ }
+ }
+} \ No newline at end of file
diff --git a/src/com/android/browser/NavigationBarTablet.java b/src/com/android/browser/NavigationBarTablet.java
index 04f372a..026e903 100644
--- a/src/com/android/browser/NavigationBarTablet.java
+++ b/src/com/android/browser/NavigationBarTablet.java
@@ -261,7 +261,9 @@ public class NavigationBarTablet extends NavigationBarBase {
if (mTitleBar.isInLoad()) {
mUiController.stopLoading();
} else {
- mUiController.getCurrentTopWebView().reload();
+ if (mUiController.getCurrentTopWebView() != null) {
+ mUiController.getCurrentTopWebView().reload();
+ }
}
}
diff --git a/src/com/android/browser/PhoneUi.java b/src/com/android/browser/PhoneUi.java
index 4da0668..1bc0f77 100644
--- a/src/com/android/browser/PhoneUi.java
+++ b/src/com/android/browser/PhoneUi.java
@@ -434,7 +434,7 @@ public class PhoneUi extends BaseUi {
mNavScreen.mScroller.finishScroller();
ImageView target = tabview.mImage;
int toLeft = 0;
- int toTop = getTitleBar().getHeight();
+ int toTop = (tab.getWebView() != null) ? tab.getWebView().getVisibleTitleHeight() : 0;
int toRight = mContentView.getWidth();
int width = target.getDrawable().getIntrinsicWidth();
int height = target.getDrawable().getIntrinsicHeight();
diff --git a/src/com/android/browser/PreferenceKeys.java b/src/com/android/browser/PreferenceKeys.java
index ecab008..1a20495 100644
--- a/src/com/android/browser/PreferenceKeys.java
+++ b/src/com/android/browser/PreferenceKeys.java
@@ -104,4 +104,17 @@ public interface PreferenceKeys {
static final String PREF_DATA_PRELOAD = "preload_when";
static final String PREF_LOAD_IMAGES = "load_images";
+ // ----------------------
+ // Keys for browser recovery
+ // ----------------------
+ /**
+ * The last time recovery was started as System.currentTimeMillis.
+ * 0 if not set.
+ */
+ static final String KEY_LAST_RECOVERED = "last_recovered";
+
+ /**
+ * Key for whether or not the last run was paused.
+ */
+ static final String KEY_LAST_RUN_PAUSED = "last_paused";
}
diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java
index 0abc86b..a7598c2 100644
--- a/src/com/android/browser/Tab.java
+++ b/src/com/android/browser/Tab.java
@@ -610,11 +610,6 @@ class Tab implements PictureListener {
@Override
public void onPageFinished(WebView view, String url) {
- if (!mInPageLoad) {
- // In page navigation links (www.something.com#footer) will
- // trigger an onPageFinished which we don't care about.
- return;
- }
if (!isPrivateBrowsingEnabled()) {
LogTag.logPageFinishedLoading(
url, SystemClock.uptimeMillis() - mLoadStartTime);
diff --git a/src/com/android/browser/TabBar.java b/src/com/android/browser/TabBar.java
index d549ac3..bd17c74 100644
--- a/src/com/android/browser/TabBar.java
+++ b/src/com/android/browser/TabBar.java
@@ -31,10 +31,7 @@ import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Shader;
-import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
-import android.graphics.drawable.LayerDrawable;
-import android.graphics.drawable.PaintDrawable;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
@@ -253,7 +250,6 @@ public class TabBar extends LinearLayout implements OnClickListener {
ImageView mLock;
ImageView mClose;
boolean mSelected;
- boolean mInLoad;
Path mPath;
Path mFocusPath;
int[] mWindowPos;
@@ -281,7 +277,6 @@ public class TabBar extends LinearLayout implements OnClickListener {
mIncognito = mTabContent.findViewById(R.id.incognito);
mSnapshot = mTabContent.findViewById(R.id.snapshot);
mSelected = false;
- mInLoad = false;
// update the status
updateFromTab();
}
@@ -299,7 +294,6 @@ public class TabBar extends LinearLayout implements OnClickListener {
displayTitle = mTab.getUrl();
}
setDisplayTitle(displayTitle);
- setProgress(mTab.getLoadProgress());
if (mTab.getFavicon() != null) {
setFavicon(mUi.getFaviconDrawable(mTab.getFavicon()));
}
@@ -352,16 +346,6 @@ public class TabBar extends LinearLayout implements OnClickListener {
}
}
- void setProgress(int newProgress) {
- if (newProgress >= PROGRESS_MAX) {
- mInLoad = false;
- } else {
- if (!mInLoad && getWindowToken() != null) {
- mInLoad = true;
- }
- }
- }
-
private void closeTab() {
if (mTab == mTabControl.getCurrentTab()) {
mUiController.closeCurrentTab();
@@ -503,10 +487,6 @@ public class TabBar extends LinearLayout implements OnClickListener {
public void onSetActiveTab(Tab tab) {
mTabs.setSelectedTab(mTabControl.getTabPosition(tab));
- TabView tv = mTabMap.get(tab);
- if (tv != null) {
- tv.setProgress(tv.mTab.getLoadProgress());
- }
}
public void onFavicon(Tab tab, Bitmap favicon) {
@@ -521,13 +501,6 @@ public class TabBar extends LinearLayout implements OnClickListener {
animateTabIn(tab, tv);
}
- public void onProgress(Tab tab, int progress) {
- TabView tv = mTabMap.get(tab);
- if (tv != null) {
- tv.setProgress(progress);
- }
- }
-
public void onRemoveTab(Tab tab) {
TabView tv = mTabMap.get(tab);
if (tv != null) {
@@ -550,9 +523,9 @@ public class TabBar extends LinearLayout implements OnClickListener {
}
private boolean isLoading() {
- TabView tv = mTabMap.get(mTabControl.getCurrentTab());
- if (tv != null) {
- return tv.mInLoad;
+ Tab tab = mTabControl.getCurrentTab();
+ if (tab != null) {
+ return tab.inPageLoad();
} else {
return false;
}
diff --git a/src/com/android/browser/UrlHandler.java b/src/com/android/browser/UrlHandler.java
index 73b265d..a4df999 100644
--- a/src/com/android/browser/UrlHandler.java
+++ b/src/com/android/browser/UrlHandler.java
@@ -209,7 +209,7 @@ public class UrlHandler {
// Error on the side of staying in the browser, ignore
continue;
}
- if (filter.countDataAuthorities() == 0 || filter.countDataPaths() == 0) {
+ if (filter.countDataAuthorities() == 0 && filter.countDataPaths() == 0) {
// Generic handler, skip
continue;
}
diff --git a/src/com/android/browser/XLargeUi.java b/src/com/android/browser/XLargeUi.java
index c828df4..17153b6 100644
--- a/src/com/android/browser/XLargeUi.java
+++ b/src/com/android/browser/XLargeUi.java
@@ -162,9 +162,15 @@ public class XLargeUi extends BaseUi {
@Override
public void onProgressChanged(Tab tab) {
int progress = tab.getLoadProgress();
- mTabBar.onProgress(tab, progress);
if (tab.inForeground()) {
mTitleBar.setProgress(progress);
+ if (mUseQuickControls) {
+ if (progress == 100) {
+ mTitleBar.setShowProgressOnly(false);
+ } else if (!mTitleBar.isEditingUrl()) {
+ mTitleBar.setShowProgressOnly(true);
+ }
+ }
}
}
diff --git a/src/com/android/browser/view/PieStackView.java b/src/com/android/browser/view/PieStackView.java
index ca641f9..7e1922d 100644
--- a/src/com/android/browser/view/PieStackView.java
+++ b/src/com/android/browser/view/PieStackView.java
@@ -84,7 +84,7 @@ public class PieStackView extends BasePieView {
@Override
public void draw(Canvas canvas) {
- if (mViews != null) {
+ if ((mViews != null) && (mCurrent > -1)) {
final int n = mViews.size();
for (int i = 0; i < mCurrent; i++) {
drawView(mViews.get(i), canvas);
diff --git a/tests/assets/bindings_test.html b/tests/assets/bindings_test.html
deleted file mode 100755
index 7218f58..0000000
--- a/tests/assets/bindings_test.html
+++ /dev/null
@@ -1,239 +0,0 @@
-<html>
-<head>
-<script type="text/javascript">
-
-function testPrimitiveTypes() {
- return JNIBindingsTest.testPrimitiveTypes(100, 'c', 123.34567890, 456.789, 1234567, 1234567890, 6000, true);
-}
-
-function testObjectTypes() {
- return JNIBindingsTest.testObjectTypes("Foo", "", null, {"foo":"bar"}, {});
-}
-
-function testArray() {
- return JNIBindingsTest.testArray([1,2,3], ['d', 'o', 'g'], [1.2, 2.3, 3.4], [4.5,5.6,6.7], [1,2,3], [4,5,6], [7,8,9], [true, false]);
-}
-
-function testObjectArray() {
- return JNIBindingsTest.testObjectArray(['Hello', 'World', '!'], [], [{"foo":"bar"}]);
-}
-
-function testObjectMembers() {
- var foo = {"bool":true,
- "byte":101,
- "char":'d',
- "double":123.456,
- "float":456.789,
- "int":102,
- "long":103,
- "short":104,
- "string":"Hello World",
- "array": [1,2,3],
- "objArray":["foo", "bar", "baz"],
- "object": {"foo":1}
- };
- return JNIBindingsTest.testObjectMembers(foo.bool, foo.byte, foo.char, foo.double, foo.float, foo.int, foo.long, foo.short, foo.string, foo.array, foo.objArray, foo.object);
-}
-
-function testJSPrimitivesToStringsInJava() {
- return JNIBindingsTest.testJSPrimitivesToStringsInJava(123, null, 456.789, true, 'd', undefined);
-}
-
-function testJavaReturnTypes() {
- var expectedBoolReturn = true;
- var expectedByteReturn = 1;
- var expectedCharReturn = 98; // 'b'; Currently bindings in JSC and V8 return chars as their ASCII equivalent.
- var expectedDoubleReturn = 123.456;
- var expectedFloatReturn = 456.789;
- var expectedIntReturn = 123;
- var expectedLongReturn = 1234;
- var expectedShortReturn = 12345;
- var expectedStringReturn = "Hello World!";
-
- var returned = JNIBindingsTest.returnBool();
- if (returned != expectedBoolReturn) {
- appendLog("returnBool() failed: expected "+ expectedBoolReturn +", got " + returned);
- return false;
- }
-
- returned = JNIBindingsTest.returnByte();
- if (returned != expectedByteReturn) {
- appendLog("returnByte() failed: expected "+ expectedByteReturn +", got " + returned);
- return false;
- }
-
- returned = JNIBindingsTest.returnChar();
- if (returned != expectedCharReturn) {
- appendLog("returnChar() failed: expected "+ expectedCharReturn +", got " + returned);
- return false;
- }
-
- returned = JNIBindingsTest.returnDouble();
- if (returned != expectedDoubleReturn) {
- appendLog("returnDouble() failed: expected "+ expectedDoubleReturn +", got " + returned);
- return false;
- }
-
- returned = JNIBindingsTest.returnFloat();
- if (Math.abs(returned - expectedFloatReturn) > 0.001) {
- appendLog("returnFloat() failed: expected "+ expectedFloatReturn +", got " + returned);
- return false;
- }
-
- returned = JNIBindingsTest.returnInt();
- if (returned != expectedIntReturn) {
- appendLog("returnInt() failed: expected "+ expectedIntReturn +", got " + returned);
- return false;
- }
-
- returned = JNIBindingsTest.returnLong();
- if (returned != expectedLongReturn) {
- appendLog("returnLong() failed: expected "+ expectedLongReturn +", got " + returned);
- return false;
- }
-
- returned = JNIBindingsTest.returnShort();
- if (returned != expectedShortReturn) {
- appendLog("returnShort() failed: expected "+ expectedShortReturn +", got " + returned);
- return false;
- }
-
- returned = JNIBindingsTest.returnString();
- if (returned != expectedStringReturn) {
- appendLog("returnString() failed: expected "+ expectedStringReturn +", got " + returned);
- return false;
- }
-
- returned = JNIBindingsTest.returnNullString();
- if (returned !== undefined) {
- appendLog("returnNullString() failed: expected undefined, got " + returned);
- return false;
- }
-
- returned = JNIBindingsTest.returnObject();
- if (returned == null) {
- appendLog("returnObject() failed: expected non-null, got " + returned);
- return false;
- } else if (returned.x != undefined) {
- // We do not support getting object properties.
- appendLog("returnObject() failed: expected 'x' property undefined, got " + returned.x)
- return false;
- } else if (returned.s != undefined) {
- // We do not support getting object properties.
- appendLog("returnObject() failed: expected 's' property undefined, got " + returned.s);
- return false;
- } else if (!returned.aMethod()) {
- appendLog("returnObject() failed: expected 'aMethod' method to return true, got " + returned.aMethod());
- return false;
- } else if (returned.anotherMethod() != "Hello World") {
- appendLog("returnObject() failed: expected 'anotherMethod' to return 'Hello World' got "+ returned.anotherMethod());
- return false;
- }
-
- returned = JNIBindingsTest.returnArray();
- if (returned != null) {
- appendLog("returnArray() failed: expected null, got " + returned);
- return false;
- }
-
- returned = JNIBindingsTest.returnVoid();
- if (returned != null) {
- appendLog("returnVoid() failed: expected null, got " + returned);
- return false;
- }
-
- return true;
-}
-
-function getIfaceProperties() {
- if (JNIBindingsTest.mInt != undefined) {
- // We do not support getting object properties.
- appendLog("getIfaceProperties() failed: expected mInt = undefined, got " + JNIBindingsTest.mInt);
- return false;
- }
-
- if (JNIBindingsTest.mString != undefined) {
- // We do not support getting object properties.
- appendLog("getIfaceProperties() failed: expected mString = undefined, got " + JNIBindingsTest.mString);
- return false;
- }
-
- return true;
-}
-
-function testParameterTypeMismatch() {
- return JNIBindingsTest.testParameterTypeMismatch("dog");
-}
-
-function appendLog(msg) {
- var log = document.getElementById("status");
- log.innerHTML += "<br/>" + msg;
-}
-
-function runTests() {
-
- // Assume that if the test isn't done after 10s that we failed.
- window.setTimeout(function() { JNIBindingsTest.notifyComplete(); }, 10000);
-
- if (testPrimitiveTypes()) {
- appendLog("testPrimitiveTypes passed!");
- } else {
- appendLog("testPrimtiveTypes failed!");
- }
-
- if (testObjectTypes()) {
- appendLog("testObjectTypes passed!");
- } else {
- appendLog("testObjectTypes failed!");
- }
-
- if (testArray()) {
- appendLog("testArray passed!");
- } else {
- appendLog("testArray failed!");
- }
-
- if (testObjectArray()) {
- appendLog("testObjectArray passed!");
- } else {
- appendLog("testObjectArray failed!");
- }
-
- if (testObjectMembers()) {
- appendLog("testObjectMembers passed!");
- } else {
- appendLog("<br/>testObjectMembers failed!");
- }
-
- if (testJSPrimitivesToStringsInJava()) {
- appendLog("testJSPrimitivesToStringsInJava passed!");
- } else {
- appendLog("testJSPrimitivesToStringsInJava failed!");
- }
-
- if (testJavaReturnTypes()) {
- appendLog("testJavaReturnTypes passed!");
- } else {
- appendLog("testJavaReturnTypes failed!");
- }
-
- if (getIfaceProperties()) {
- appendLog("getIfaceProperties passed!");
- } else {
- appendLog("getIfaceProperties failed!");
- }
-
- if (testParameterTypeMismatch()) {
- appendLog("testParameterTypeMismatch passed!");
- } else {
- appendLog("testParameterTypeMismatch failed!");
- }
-
- JNIBindingsTest.notifyComplete();
-}
-</script>
-
-<body onload="runTests();">
-<p id="status">Running JNI Bindings test...</p>
-</body>
-</html>
diff --git a/tests/src/com/android/browser/JNIBindingsTest.java b/tests/src/com/android/browser/JNIBindingsTest.java
deleted file mode 100644
index ae694c9..0000000
--- a/tests/src/com/android/browser/JNIBindingsTest.java
+++ /dev/null
@@ -1,288 +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.test.AndroidTestCase;
-import android.util.Log;
-
-import java.util.Arrays;
-
-import junit.framework.AssertionFailedError;
-
-public class JNIBindingsTest extends AndroidTestCase {
-
- private final static String LOGTAG = "JNIBindingsTest";
- private JNIBindingsTestApp mTestApp;
-
- public int mInt = 123;
- public String mString = "Hello World";
-
- public JNIBindingsTest(JNIBindingsTestApp testApp) {
- mTestApp = testApp;
- }
-
- public void notifyComplete() {
- Log.v(LOGTAG, "Completing the test.");
- mTestApp.notifyComplete();
- }
-
- public void printAssertionFailed(AssertionFailedError e) {
- Log.e(LOGTAG, "");
- Log.e(LOGTAG, "*** ASSERTION FAILED: " + e.getMessage());
- Log.e(LOGTAG, "*** Stack trace:");
- StackTraceElement[] trace = e.getStackTrace();
- for(StackTraceElement elem : trace) {
- Log.e(LOGTAG, "***\t" + elem.toString());
- }
- Log.e(LOGTAG, "");
- }
-
- public boolean testPrimitiveTypes(byte byteParam, char charParam, double doubleParam,
- float floatParam, int intParam, long longParam, short shortParam,
- boolean booleanParam) {
- byte expectedByteParam = 100;
- char expectedCharParam = 'c';
- double expectedDoubleParam = 123.34567890;
- float expectedFloatParam = 456.789f;
- int expectedIntParam = 1234567;
- long expectedLongParam = 1234567890L;
- short expectedShortParam = 6000;
- boolean expectedBooleanParam = true;
-
- try {
- assertEquals(expectedByteParam, byteParam);
-
- // EMULATE_JSC_BINDINGS: JSC does not pass chars correctly
- // assertEquals(expectedCharParam, charParam);
-
- assertEquals(expectedDoubleParam, doubleParam);
- assertEquals(expectedFloatParam, floatParam);
- assertEquals(expectedIntParam, intParam);
- assertEquals(expectedLongParam, longParam);
- assertEquals(expectedShortParam, shortParam);
- assertEquals(expectedBooleanParam, booleanParam);
- } catch (AssertionFailedError e) {
- printAssertionFailed(e);
- return false;
- }
- return true;
- }
-
- public boolean testObjectTypes(String stringParam, String emptyString, String nullString,
- Object objectParam, Object emptyObject) {
- String expectedString = "Foo";
- String expectedEmptyString = "";
-
- try {
- assertNotNull(stringParam);
- assertNotNull(emptyString);
- assertEquals(expectedString, stringParam);
- assertEquals(expectedEmptyString, emptyString);
- assertNull(nullString);
- assertNull(objectParam);
- assertNull(emptyObject);
- } catch (AssertionFailedError e) {
- printAssertionFailed(e);
- return false;
- }
- return true;
- }
-
- public boolean testArray(byte[] byteArray, char[] charArray, double[] doubleArray,
- float[] floatArray, int[] intArray, long[] longArray, short[] shortArray,
- boolean[] booleanArray) {
- byte[] expectedByteArray = { 1,2,3};
- char[] expectedCharArray = {'d', 'o', 'g'};
- double[] expectedDoubleArray = {1.2,2.3,3.4};
- float[] expectedFloatArray = {4.5F,5.6F,6.7F};
- int[] expectedIntArray = {1,2,3};
- long[] expectedLongArray = {4L,5L,6L};
- short[] expectedShortArray = {7,8,9};
- boolean[] expectedBooleanArray = {true, false};
-
- try {
- assertNotNull(byteArray);
- assertNotNull(charArray);
- assertNotNull(doubleArray);
- assertNotNull(floatArray);
- assertNotNull(intArray);
- assertNotNull(longArray);
- assertNotNull(shortArray);
- assertNotNull(booleanArray);
- assertEquals(Arrays.toString(expectedByteArray), Arrays.toString(byteArray));
- assertEquals(Arrays.toString(expectedCharArray), Arrays.toString(charArray));
- assertEquals(Arrays.toString(expectedDoubleArray), Arrays.toString(doubleArray));
- assertEquals(Arrays.toString(expectedFloatArray), Arrays.toString(floatArray));
- assertEquals(Arrays.toString(expectedIntArray), Arrays.toString(intArray));
- assertEquals(Arrays.toString(expectedLongArray), Arrays.toString(longArray));
- assertEquals(Arrays.toString(expectedShortArray), Arrays.toString(shortArray));
- assertEquals(Arrays.toString(expectedBooleanArray), Arrays.toString(booleanArray));
- } catch (AssertionFailedError e) {
- printAssertionFailed(e);
- return false;
- }
- return true;
- }
-
- public boolean testObjectArray(String[] stringArray, Object[] emptyArray,
- Object[] objectArray) {
- String[] expectedStringArray = {"Hello", "World", "!"};
- String expectedStringArrayClassName = "[Ljava.lang.String;";
- Object[] expectedObjectArray = {};
-
- try {
- assertNotNull(stringArray);
-
- // EMULATE_JSC_BINDINGS JSC pass null for object arrays that are not strings.
- // Should be an empty array?
- assertNull(emptyArray);
- assertNull(objectArray);
-
- assertEquals(Arrays.toString(expectedStringArray), Arrays.toString(stringArray));
- assertEquals(expectedStringArrayClassName, stringArray.getClass().getName());
-
- // EMULATE_JSC_BINDINGS
- // assertEquals(Arrays.toString(expectedObjectArray), Arrays.toString(emptyArray));
- // assertEquals(expectedObjectArrayClassName, emptyArray.getClass().getName());
- // assertEquals(Arrays.toString(expectedObjectArray), Arrays.toString(objectArray));
- // assertEquals(expectedStringObjectClassName, objectArray.getClass().getName());
-
- } catch (AssertionFailedError e) {
- printAssertionFailed(e);
- return false;
- }
- return true;
- }
-
- public boolean testObjectMembers(boolean boolParam, byte byteParam, char charParam,
- double doubleParam, float floatParam, int intParam, long longParam, short shortParam,
- String stringParam, int[] intArrayParam, String[] stringArrayParam,
- Object objectParam) {
- boolean expectedBoolParam = true;
- byte expectedByteParam = 101;
- char expectedCharParam = 'd';
- double expectedDoubleParam = 123.456;
- float expectedFloatParam = 456.789F;
- int expectedIntParam = 102;
- long expectedLongParam = 103L;
- short expectedShortParam = 104;
- String expectedStringParam = "Hello World";
- int[] expectedIntArray = {1,2,3};
- String[] expectedStringArrayParam = {"foo", "bar", "baz"};
- String expectedStringArrayClassName = "[Ljava.lang.String;";
-
- try {
- assertEquals(expectedBoolParam, boolParam);
- assertEquals(expectedByteParam, byteParam);
-
- // EMULATE_JSC_BINDINGS: JSC does not pass chars correctly. (chars are strings in JS)
- // assertEquals(expectedCharParam, charParam);
-
- assertEquals(expectedDoubleParam, doubleParam);
- assertEquals(expectedFloatParam, floatParam);
- assertEquals(expectedIntParam, intParam);
- assertEquals(expectedLongParam, longParam);
- assertEquals(expectedShortParam, shortParam);
- assertEquals(expectedStringParam, stringParam);
- assertEquals(Arrays.toString(expectedIntArray), Arrays.toString(intArrayParam));
- assertEquals(Arrays.toString(expectedStringArrayParam),
- Arrays.toString(stringArrayParam));
- assertEquals(expectedStringArrayClassName, stringArrayParam.getClass().getName());
- assertNull(objectParam);
- } catch (AssertionFailedError e) {
- printAssertionFailed(e);
- return false;
- }
- return true;
- }
-
- public boolean testJSPrimitivesToStringsInJava(String intParam, String nullParam,
- String doubleParam, String booleanParam, String charParam,
- String undefinedParam) {
- String expectedIntParam = "123";
- String expectedDoubleParam = "456.789";
- String expectedBooleanParam = "true";
- String expectedCharParam = "d";
-
- // EMULATE_JSC_BINDINGS JSC passes "undefined" for undefined types. Should be null?
- String expectedUndefinedParam = "undefined";
-
- try {
- assertNotNull(intParam);
- assertNull(nullParam);
- assertNotNull(doubleParam);
- assertNotNull(booleanParam);
- assertNotNull(charParam);
-
- // EMULATE_JSC_BINDINGS JSC passes "undefined" for undefined types.
- assertNotNull(undefinedParam);
-
- assertEquals(expectedIntParam, intParam);
- assertEquals(expectedDoubleParam, doubleParam);
- assertEquals(expectedBooleanParam, booleanParam);
- assertEquals(expectedCharParam, charParam);
-
- // EMULATE_JSC_BINDINGS JSC passes "undefined" for undefined types.
- assertEquals(expectedUndefinedParam, undefinedParam);
-
- } catch (AssertionFailedError e) {
- printAssertionFailed(e);
- return false;
- }
- return true;
- }
-
- public boolean testParameterTypeMismatch(String[] stringArrayParam) {
- // The JS test will pass a string, not an array to this test.
- try {
- assertNull(stringArrayParam);
- } catch (AssertionFailedError e) {
- printAssertionFailed(e);
- return false;
- }
-
- return true;
- }
-
- public boolean returnBool() { return true; }
- public byte returnByte() { return 1; }
- public char returnChar() { return 'b'; }
- public double returnDouble() { return 123.456; }
- public float returnFloat() { return 456.789F; }
- public int returnInt() { return 123; }
- public long returnLong() { return 1234L; }
- public short returnShort() { return 12345; }
- public String returnString() { return "Hello World!"; }
- public String returnNullString() { return null; }
-
- public class TestObject {
- public int x = 123;
- public String s = "Hello World!";
-
- public boolean aMethod() { return true; }
- public String anotherMethod() { return "Hello World"; }
- }
-
- public TestObject returnObject() { return new TestObject(); }
-
- public int[] returnArray() {
- int[] array = {1,2,3,4,5};
- return array;
- }
-
- public void returnVoid() { }
-}
diff --git a/tests/src/com/android/browser/JNIBindingsTestApp.java b/tests/src/com/android/browser/JNIBindingsTestApp.java
deleted file mode 100644
index 5d1fd0d..0000000
--- a/tests/src/com/android/browser/JNIBindingsTestApp.java
+++ /dev/null
@@ -1,274 +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.app.Instrumentation;
-import android.net.http.SslError;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import android.test.ActivityInstrumentationTestCase2;
-import android.util.Log;
-import android.webkit.ClientCertRequestHandler;
-import android.webkit.JsPromptResult;
-import android.webkit.JsResult;
-import android.webkit.SslErrorHandler;
-import android.webkit.WebView;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-/**
- * 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> {
-
- private final static String TAG = "JNIBindingsTest";
-
- private static final String SDCARD_BINDINGS_TEST_HTML = "/sdcard/bindings_test.html";
-
- 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;
- private String mWebKitResult;
-
- private String mExpectedWebKitResult = "Running JNI Bindings test...\n" +
- "testPrimitiveTypes passed!\n" +
- "testObjectTypes passed!\n" +
- "testArray passed!\n" +
- "testObjectArray passed!\n" +
- "testObjectMembers passed!\n" +
- "testJSPrimitivesToStringsInJava passed!\n" +
- "testJavaReturnTypes passed!\n" +
- "getIfaceProperties passed!\n" +
- "testParameterTypeMismatch passed!\n";
-
-
- private class GetWebKitDataThread extends Thread {
- private JNIBindingsTestApp mTestApp;
- private WebView mWebView;
- private Handler mHandler;
-
- GetWebKitDataThread(JNIBindingsTestApp testApp, WebView webView) {
- mTestApp = testApp;
- mWebView = webView;
- }
-
- @Override
- public void run() {
- Looper.prepare();
- mHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MSG_WEBKIT_DATA_READY: {
- mTestApp.setWebKitResult((String)msg.obj);
- Looper.myLooper().quit();
- }
- default: super.handleMessage(msg); break;
- }
- }
- };
- mWebView.documentAsText(mHandler.obtainMessage(MSG_WEBKIT_DATA_READY, 1, 0));
- Looper.loop();
- }
- }
-
- public synchronized void setWebKitResult(String result) {
- mWebKitResult = result;
- notify();
- }
-
- public JNIBindingsTestApp() {
- super(BrowserActivity.class);
- }
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
-
- mActivity = getActivity();
- mController = mActivity.getController();
- mInst = getInstrumentation();
- mInst.waitForIdleSync();
-
- extractAsset();
- }
-
- @Override
- protected void tearDown() throws Exception {
- removeAsset();
- super.tearDown();
- }
-
- protected void extractAsset() throws IOException {
- InputStream in = getInstrumentation().getContext().getAssets().open("bindings_test.html");
- OutputStream out = new FileOutputStream(SDCARD_BINDINGS_TEST_HTML);
-
- byte[] buf = new byte[2048];
- int len;
-
- while ((len = in.read(buf)) >= 0 ) {
- out.write(buf, 0, len);
- }
- out.close();
- in.close();
- }
-
- protected void removeAsset(){
- File fileToDelete = new File(SDCARD_BINDINGS_TEST_HTML);
- fileToDelete.delete();
- }
-
- /**
- * Gets the browser ready for testing by starting the application
- * and wrapping the WebView's helper clients.
- */
- void setUpBrowser() {
- Tab tab = mController.getTabControl().getCurrentTab();
- WebView webView = tab.getWebView();
- webView.addJavascriptInterface(new JNIBindingsTest(this), "JNIBindingsTest");
-
- webView.setWebChromeClient(new TestWebChromeClient(webView.getWebChromeClient()) {
-
- /**
- * Dismisses and logs Javascript alerts.
- */
- @Override
- public boolean onJsAlert(WebView view, String url, String message,
- JsResult result) {
- String logMsg = String.format("JS Alert '%s' received from %s", message, url);
- Log.w(TAG, logMsg);
- result.confirm();
-
- return true;
- }
-
- /**
- * Confirms and logs Javascript alerts.
- */
- @Override
- public boolean onJsConfirm(WebView view, String url, String message,
- JsResult result) {
- String logMsg = String.format("JS Confirmation '%s' received from %s",
- message, url);
- Log.w(TAG, logMsg);
- result.confirm();
-
- return true;
- }
-
- /**
- * Confirms and logs Javascript alerts, providing the default value.
- */
- @Override
- public boolean onJsPrompt(WebView view, String url, String message,
- String defaultValue, JsPromptResult result) {
- String logMsg = String.format("JS Prompt '%s' received from %s; " +
- "Giving default value '%s'", message, url, defaultValue);
- Log.w(TAG, logMsg);
- result.confirm(defaultValue);
-
- return true;
- }
- });
-
- webView.setWebViewClient(new TestWebViewClient(webView.getWebViewClient()) {
-
- /**
- * Bypasses and logs errors.
- */
- @Override
- public void onReceivedError(WebView view, int errorCode,
- String description, String failingUrl) {
- String message = String.format("Error '%s' (%d) loading url: %s",
- description, errorCode, failingUrl);
- Log.w(TAG, message);
- }
-
- /**
- * Ignores and logs SSL errors.
- */
- @Override
- public void onReceivedSslError(WebView view, SslErrorHandler handler,
- SslError error) {
- Log.w(TAG, "SSL error: " + error);
- handler.proceed();
- }
-
- /**
- * Ignores and logs SSL client certificate requests.
- */
- @Override
- public void onReceivedClientCertRequest(WebView view, ClientCertRequestHandler handler,
- String host_and_port) {
- Log.w(TAG, "SSL client certificate request: " + host_and_port);
- handler.cancel();
- }
-
- });
- }
-
- public synchronized void notifyComplete() {
- mTestDone = true;
- notify();
- }
-
- public void testJNIBindings() {
- setUpBrowser();
-
- Tab tab = mController.getTabControl().getCurrentTab();
- WebView webView = tab.getWebView();
- webView.loadUrl("file://" + SDCARD_BINDINGS_TEST_HTML);
- synchronized(this) {
- while(!mTestDone) {
- try {
- wait();
- } catch (InterruptedException e) {}
- }
- }
-
- // Now the tests are complete grab the DOM content and compare to the reference.
- GetWebKitDataThread getWKData = new GetWebKitDataThread(this, webView);
- mWebKitResult = null;
- getWKData.start();
-
- synchronized(this) {
- while(mWebKitResult == null) {
- try {
- wait();
- } catch (InterruptedException e) {}
- }
- }
-
- Log.v(TAG, "WebKit result:");
- Log.v(TAG, mWebKitResult);
- assertEquals("Bindings test failed! See logcat for more details!", mExpectedWebKitResult,
- mWebKitResult);
- }
-}