summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Murdoch <benm@google.com>2010-09-10 22:09:30 +0100
committerBen Murdoch <benm@google.com>2010-10-06 11:37:57 +0100
commitaf55452d7f37c20201663b80ca77b64457323361 (patch)
treee5eea2b93464fdd5a121fcaf07e636b8ffa497bc
parent3d4e011ab9f87ff7f1b467ed7d92c6d89157d192 (diff)
downloadpackages_apps_Browser-af55452d7f37c20201663b80ca77b64457323361.zip
packages_apps_Browser-af55452d7f37c20201663b80ca77b64457323361.tar.gz
packages_apps_Browser-af55452d7f37c20201663b80ca77b64457323361.tar.bz2
AutoFill Profile editor UI initial checkin
Make a start on a simple AutoFill profile editor so that we can get rid of the default John Smith profile we've been using for testing. This CL also moves the autofill settings from the Privacy Preferences page to the Personal Preferences page. Note that this is just the profile editor in the Browser and although the data entered is persisted to disk, it is not yet synced with the native AutoFill code so for now we continue to use the canned profile native side. Change-Id: Ie609c5f25fffc914267605efdb10444379c29388
-rw-r--r--res/layout/autofill_settings_fragment.xml71
-rw-r--r--res/values/strings.xml19
-rw-r--r--res/xml/browser_preferences.xml6
-rw-r--r--res/xml/personal_preferences.xml11
-rw-r--r--res/xml/privacy_preferences.xml26
-rw-r--r--src/com/android/browser/AutoFillProfileDatabase.java101
-rw-r--r--src/com/android/browser/AutoFillSettingsFragment.java142
-rw-r--r--src/com/android/browser/BrowserSettings.java4
-rw-r--r--src/com/android/browser/preferences/PersonalPreferencesFragment.java6
9 files changed, 362 insertions, 24 deletions
diff --git a/res/layout/autofill_settings_fragment.xml b/res/layout/autofill_settings_fragment.xml
new file mode 100644
index 0000000..35dfbe6
--- /dev/null
+++ b/res/layout/autofill_settings_fragment.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+<TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:text="@string/pref_autofill_profile_editor" />
+
+<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:stretchColumns="1"
+ android:paddingLeft="100dip"
+ android:paddingRight="100dip" >
+
+ <TableRow>
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="center_vertical"
+ android:padding="10dip"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:text="@string/autofill_profile_editor_name" />
+ <EditText android:id="@+id/autofill_profile_editor_name_edit"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:singleLine="true" />
+ </TableRow>
+ <TableRow>
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="center_vertical"
+ android:padding="10dip"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:text="@string/autofill_profile_editor_email_address" />
+ <EditText android:id="@+id/autofill_profile_editor_email_address_edit"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:singleLine="true" />
+ </TableRow>
+</TableLayout>
+
+<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/values/strings.xml b/res/values/strings.xml
index 54e8f63..29d8703 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -341,6 +341,21 @@
<!-- Dialog title used when asking the user which Google account they want to use to sync data between Android Browser and Google Chrome [CHAR-LIMIT=20] -->
<string name="pref_personal_account_dialog_title">Select Google account to share with</string>
+ <!-- Checkbox setting for enabling/disabling the form AutoFill feature [CHAR-LIMIT=32] -->
+ <string name="pref_autofill_enabled">Form AutoFill</string>
+ <!-- Settings summary for the form AutoFill feature. [CHAR-LIMIT=none] -->
+ <string name="pref_autofill_enabled_summary">Fill out web forms in a single click</string>
+ <!-- Label for option that when clicked opens the AutoFill settings screen. Also used as the title of that AutoFill Settings screen. [CHAR-LIMIT=32] -->
+ <string name="pref_autofill_profile_editor">AutoFill Settings</string>
+ <!-- Summary for the AutoFill Settings preference [CHAR-LIMIT=none] -->
+ <string name="pref_autofill_profile_editor_summary">Set up &amp; manage data for AutoFilled forms</string>
+ <!-- String for the user's full name in the AutoFill profile editor. [CHAR-LIMIT=32] -->
+ <string name="autofill_profile_editor_name">Full Name:</string>
+ <!-- String for the user's e-mail address in the AutoFill profile editor. [CHAR-LIMIT=32] -->
+ <string name="autofill_profile_editor_email_address">e-mail Address:</string>
+ <!-- Button text to save the AutoFill profile [CHAR-LIMIT=20] -->
+ <string name="autofill_profile_editor_save_profile">Save profile</string>
+
<!-- Settings screen, section title -->
<string name="pref_privacy_title">Privacy settings</string>
<!-- Settings label -->
@@ -393,10 +408,6 @@
<string name="pref_security_save_form_data">Remember form data</string>
<!-- Settings summary -->
<string name="pref_security_save_form_data_summary">Remember data I type in forms for later use</string>
- <!-- Settings label for enabling/disabling the form AutoFill feature -->
- <string name="pref_autoFill_enabled">AutoFill forms</string>
- <!-- Settings summary for the form AutoFill feature. -->
- <string name="pref_autoFill_enabled_summary">Automatically fill out forms where possible</string>
<!-- Settings label -->
<string name="pref_security_show_security_warning">Show security warnings</string>
<!-- Settings summmary -->
diff --git a/res/xml/browser_preferences.xml b/res/xml/browser_preferences.xml
index cc9b18a..cb4e0b5 100644
--- a/res/xml/browser_preferences.xml
+++ b/res/xml/browser_preferences.xml
@@ -140,10 +140,10 @@
android:summary="@string/pref_security_save_form_data_summary" />
<CheckBoxPreference
- android:key="autoFill_enabled"
+ android:key="autofill_enabled"
android:defaultValue="false"
- android:title="@string/pref_autoFill_enabled"
- android:summary="@string/pref_autoFill_enabled_summary" />
+ android:title="@string/pref_autofill_enabled"
+ android:summary="@string/pref_autofill_enabled_summary" />
<com.android.browser.BrowserYesNoPreference
android:key="privacy_clear_form_data"
diff --git a/res/xml/personal_preferences.xml b/res/xml/personal_preferences.xml
index 14b057c..939d14c 100644
--- a/res/xml/personal_preferences.xml
+++ b/res/xml/personal_preferences.xml
@@ -21,4 +21,15 @@
android:summary="@string/pref_personal_sync_with_chrome_summary"
/>
+ <CheckBoxPreference android:key="autofill_enabled"
+ android:title="@string/pref_autofill_enabled"
+ android:summary="@string/pref_autofill_enabled_summary"
+ />
+
+ <PreferenceScreen
+ android:fragment="com.android.browser.AutoFillSettingsFragment"
+ android:key="autofill_profile"
+ android:title="@string/pref_autofill_profile_editor"
+ android:summary="@string/pref_autofill_profile_editor_summary" />
+
</PreferenceScreen>
diff --git a/res/xml/privacy_preferences.xml b/res/xml/privacy_preferences.xml
index f8a8d91..a6ea16b 100644
--- a/res/xml/privacy_preferences.xml
+++ b/res/xml/privacy_preferences.xml
@@ -21,16 +21,16 @@
android:key="privacy_clear_cache"
android:title="@string/pref_privacy_clear_cache"
android:summary="@string/pref_privacy_clear_cache_summary"
- android:dialogMessage="@string/pref_privacy_clear_cache_dlg"
- android:dialogTitle="@string/clear"
+ android:dialogMessage="@string/pref_privacy_clear_cache_dlg"
+ android:dialogTitle="@string/clear"
android:dialogIcon="@android:drawable/ic_dialog_alert" />
-
+
<com.android.browser.BrowserYesNoPreference
android:key="privacy_clear_history"
android:title="@string/pref_privacy_clear_history"
android:summary="@string/pref_privacy_clear_history_summary"
- android:dialogMessage="@string/pref_privacy_clear_history_dlg"
- android:dialogTitle="@string/clear"
+ android:dialogMessage="@string/pref_privacy_clear_history_dlg"
+ android:dialogTitle="@string/clear"
android:dialogIcon="@android:drawable/ic_dialog_alert"/>
<CheckBoxPreference
@@ -38,13 +38,13 @@
android:defaultValue="true"
android:title="@string/pref_security_accept_cookies"
android:summary="@string/pref_security_accept_cookies_summary" />
-
+
<com.android.browser.BrowserYesNoPreference
android:key="privacy_clear_cookies"
android:title="@string/pref_privacy_clear_cookies"
android:summary="@string/pref_privacy_clear_cookies_summary"
- android:dialogMessage="@string/pref_privacy_clear_cookies_dlg"
- android:dialogTitle="@string/clear"
+ android:dialogMessage="@string/pref_privacy_clear_cookies_dlg"
+ android:dialogTitle="@string/clear"
android:dialogIcon="@android:drawable/ic_dialog_alert"/>
<CheckBoxPreference
@@ -53,18 +53,12 @@
android:title="@string/pref_security_save_form_data"
android:summary="@string/pref_security_save_form_data_summary" />
- <CheckBoxPreference
- android:key="autoFill_enabled"
- android:defaultValue="false"
- android:title="@string/pref_autoFill_enabled"
- android:summary="@string/pref_autoFill_enabled_summary" />
-
<com.android.browser.BrowserYesNoPreference
android:key="privacy_clear_form_data"
android:title="@string/pref_privacy_clear_form_data"
android:summary="@string/pref_privacy_clear_form_data_summary"
- android:dialogMessage="@string/pref_privacy_clear_form_data_dlg"
- android:dialogTitle="@string/clear"
+ android:dialogMessage="@string/pref_privacy_clear_form_data_dlg"
+ android:dialogTitle="@string/clear"
android:dialogIcon="@android:drawable/ic_dialog_alert"/>
<CheckBoxPreference
diff --git a/src/com/android/browser/AutoFillProfileDatabase.java b/src/com/android/browser/AutoFillProfileDatabase.java
new file mode 100644
index 0000000..e3d6ea2
--- /dev/null
+++ b/src/com/android/browser/AutoFillProfileDatabase.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.provider.BaseColumns;
+import android.util.Log;
+
+public class AutoFillProfileDatabase {
+
+ static final String LOGTAG = "AutoFillProfileDatabase";
+
+ static final String DATABASE_NAME = "autofill.db";
+ static final int DATABASE_VERSION = 1;
+ static final String PROFILES_TABLE_NAME = "profiles";
+ private AutoFillProfileDatabaseHelper mOpenHelper;
+ private static AutoFillProfileDatabase sInstance;
+
+ public static final class Profiles implements BaseColumns {
+ private Profiles() { }
+
+ static final String FULL_NAME = "fullname";
+ static final String EMAIL_ADDRESS = "email";
+ }
+
+ private static class AutoFillProfileDatabaseHelper extends SQLiteOpenHelper {
+ AutoFillProfileDatabaseHelper(Context context) {
+ super(context, DATABASE_NAME, null, DATABASE_VERSION);
+ }
+
+ @Override
+ public void onCreate(SQLiteDatabase db) {
+ db.execSQL("CREATE TABLE " + PROFILES_TABLE_NAME + " ("
+ + Profiles._ID + " INTEGER PRIMARY KEY,"
+ + Profiles.FULL_NAME + " TEXT,"
+ + Profiles.EMAIL_ADDRESS + " TEXT"
+ + " );");
+ }
+
+ @Override
+ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+ Log.w(LOGTAG, "Upgrading database from version " + oldVersion + " to "
+ + newVersion + ", which will destroy all old data");
+ db.execSQL("DROP TABLE IF EXISTS " + PROFILES_TABLE_NAME);
+ onCreate(db);
+ }
+ }
+
+ private AutoFillProfileDatabase(Context context) {
+ mOpenHelper = new AutoFillProfileDatabaseHelper(context);
+ }
+
+ public static AutoFillProfileDatabase getInstance(Context context) {
+ if (sInstance == null) {
+ sInstance = new AutoFillProfileDatabase(context);
+ }
+ return sInstance;
+ }
+
+ private SQLiteDatabase getDatabase(boolean writable) {
+ return writable ? mOpenHelper.getWritableDatabase() : mOpenHelper.getReadableDatabase();
+ }
+
+ public void addOrUpdateProfile(final int id, final String fullName, final String email) {
+ final String SQL = "INSERT OR REPLACE INTO " + PROFILES_TABLE_NAME + " ("
+ + Profiles._ID + ","
+ + Profiles.FULL_NAME + ","
+ + Profiles.EMAIL_ADDRESS
+ + ") VALUES (?,?,?);";
+ final Object[] PARAMS = {id, fullName, email};
+ getDatabase(true).execSQL(SQL, PARAMS);
+ }
+
+ public Cursor getProfile(int id) {
+ final String[] COLS = {Profiles.FULL_NAME, Profiles.EMAIL_ADDRESS };
+ final String[] SEL_ARGS = { Integer.toString(id) };
+ return getDatabase(false).query(PROFILES_TABLE_NAME, COLS, Profiles._ID + "=?", SEL_ARGS,
+ null, null, null, "1");
+ }
+
+ public void close() {
+ mOpenHelper.close();
+ }
+}
diff --git a/src/com/android/browser/AutoFillSettingsFragment.java b/src/com/android/browser/AutoFillSettingsFragment.java
new file mode 100644
index 0000000..b650ede
--- /dev/null
+++ b/src/com/android/browser/AutoFillSettingsFragment.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import android.app.Fragment;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.View.OnClickListener;
+import android.view.LayoutInflater;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.Toast;
+
+public class AutoFillSettingsFragment extends Fragment {
+
+ private static final String LOGTAG = "AutoFillSettingsFragment";
+
+ // TODO: This will become dynamic once we support more than one profile.
+ private int mProfileId = 1;
+
+ public AutoFillSettingsFragment() {
+
+ }
+
+ @Override
+ public void onCreate(Bundle savedState) {
+ super.onCreate(savedState);
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ View v = inflater.inflate(R.layout.autofill_settings_fragment, container, false);
+
+ Button saveButton = (Button)v.findViewById(R.id.autofill_profile_editor_save_button);
+ saveButton.setOnClickListener(new OnClickListener() {
+ public void onClick(View button) {
+ View v = getView();
+ EditText fullName = (EditText)v.findViewById(
+ R.id.autofill_profile_editor_name_edit);
+ EditText email = (EditText)v.findViewById(
+ R.id.autofill_profile_editor_email_address_edit);
+ new SaveProfileToDbTask().execute(fullName.getText().toString(),
+ email.getText().toString());
+ }
+ });
+
+ // Load the profile and populate the text views in the background
+ new LoadProfileFromDbTask().execute(mProfileId);
+
+ return v;
+ }
+
+ @Override
+ public void onPause() {
+ AutoFillProfileDatabase db =
+ AutoFillProfileDatabase.getInstance(getActivity());
+ db.close();
+ super.onPause();
+ }
+
+ private class SaveProfileToDbTask extends AsyncTask<String, Void, Void> {
+ protected Void doInBackground(String... values) {
+ AutoFillProfileDatabase db =
+ AutoFillProfileDatabase.getInstance(getActivity());
+ db.addOrUpdateProfile(mProfileId, values[0], values[1]);
+ return null;
+ }
+
+ protected void onPostExecute(Void result) {
+ Toast.makeText(getActivity(), "Saved profile", Toast.LENGTH_SHORT).show();
+ }
+ }
+
+ private static class LoadedProfileData {
+ private String mFullName;
+ private String mEmailAddress;
+
+ public LoadedProfileData(String fullName, String emailAddress) {
+ mFullName = fullName;
+ mEmailAddress = emailAddress;
+ }
+
+ public String getFullName() { return mFullName; }
+ public String getEmailAddress() { return mEmailAddress; }
+ }
+
+ private class LoadProfileFromDbTask extends AsyncTask<Integer, Void, LoadedProfileData> {
+ protected LoadedProfileData doInBackground(Integer... id) {
+ AutoFillProfileDatabase db = AutoFillProfileDatabase.getInstance(getActivity());
+ Cursor c = db.getProfile(id[0]);
+ c.moveToFirst();
+
+ LoadedProfileData profileData = null;
+
+ if (c.getCount() > 0) {
+ String fullName = c.getString(c.getColumnIndex(
+ AutoFillProfileDatabase.Profiles.FULL_NAME));
+ String email = c.getString(c.getColumnIndex(
+ AutoFillProfileDatabase.Profiles.EMAIL_ADDRESS));
+ profileData = new LoadedProfileData(fullName, email);
+ }
+ c.close();
+ return profileData;
+ }
+
+ protected void onPostExecute(LoadedProfileData data) {
+ if (data == null) {
+ return;
+ }
+
+ View v = getView();
+ if (v != null) {
+ EditText fullName = (EditText)v.findViewById(
+ R.id.autofill_profile_editor_name_edit);
+ EditText email = (EditText)v.findViewById(
+ R.id.autofill_profile_editor_email_address_edit);
+ fullName.setText(data.getFullName());
+ email.setText(data.getEmailAddress());
+ }
+ }
+ }
+}
diff --git a/src/com/android/browser/BrowserSettings.java b/src/com/android/browser/BrowserSettings.java
index dfec48f..4c798a0 100644
--- a/src/com/android/browser/BrowserSettings.java
+++ b/src/com/android/browser/BrowserSettings.java
@@ -147,6 +147,8 @@ public class BrowserSettings extends Observable {
"default_text_encoding";
public final static String PREF_CLEAR_GEOLOCATION_ACCESS =
"privacy_clear_geolocation_access";
+ public final static String PREF_AUTOFILL_ENABLED = "autofill_enabled";
+ public final static String PREF_AUTOFILL_PROFILE = "autofill_profile";
private static final String DESKTOP_USERAGENT = "Mozilla/5.0 (Macintosh; " +
"U; Intel Mac OS X 10_6_3; en-us) AppleWebKit/533.16 (KHTML, " +
@@ -340,7 +342,7 @@ public class BrowserSettings extends Observable {
rememberPasswords);
saveFormData = p.getBoolean("save_formdata",
saveFormData);
- autoFillEnabled = p.getBoolean("autoFill_enabled", autoFillEnabled);
+ autoFillEnabled = p.getBoolean("autofill_enabled", autoFillEnabled);
boolean accept_cookies = p.getBoolean("accept_cookies",
CookieManager.getInstance().acceptCookie());
CookieManager.getInstance().setAcceptCookie(accept_cookies);
diff --git a/src/com/android/browser/preferences/PersonalPreferencesFragment.java b/src/com/android/browser/preferences/PersonalPreferencesFragment.java
index 12751c5..f8a7563 100644
--- a/src/com/android/browser/preferences/PersonalPreferencesFragment.java
+++ b/src/com/android/browser/preferences/PersonalPreferencesFragment.java
@@ -17,6 +17,7 @@
package com.android.browser.preferences;
import com.android.browser.BrowserBookmarksPage;
+import com.android.browser.BrowserSettings;
import com.android.browser.R;
import android.accounts.Account;
@@ -39,6 +40,7 @@ import android.preference.Preference;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
+import android.preference.PreferenceScreen;
import android.provider.BrowserContract;
import android.provider.BrowserContract.Bookmarks;
import android.provider.BrowserContract.ChromeSyncColumns;
@@ -101,6 +103,10 @@ public class PersonalPreferencesFragment extends PreferenceFragment
}
mChromeSync.setOnPreferenceClickListener(this);
}
+
+ PreferenceScreen autoFillSettings =
+ (PreferenceScreen)findPreference(BrowserSettings.PREF_AUTOFILL_PROFILE);
+ autoFillSettings.setDependency(BrowserSettings.PREF_AUTOFILL_ENABLED);
}
@Override