Sync Autofill profile data native side

When the user adds or edits the AutoFill profile, sync that
data to the native WebKit code through the BrowserSettings
object. Also sync the profile data on startup if it is
available.

Change-Id: I6146a842cb765f8ed91c109537038baad6b547fb
diff --git a/src/com/android/browser/AutoFillProfileDatabase.java b/src/com/android/browser/AutoFillProfileDatabase.java
index e3d6ea2..5557aaf 100644
--- a/src/com/android/browser/AutoFillProfileDatabase.java
+++ b/src/com/android/browser/AutoFillProfileDatabase.java
@@ -22,6 +22,7 @@
 import android.database.sqlite.SQLiteOpenHelper;
 import android.provider.BaseColumns;
 import android.util.Log;
+import android.webkit.WebSettings.AutoFillProfile;
 
 public class AutoFillProfileDatabase {
 
@@ -78,13 +79,13 @@
         return writable ? mOpenHelper.getWritableDatabase() : mOpenHelper.getReadableDatabase();
     }
 
-    public void addOrUpdateProfile(final int id, final String fullName, final String email) {
+    public void addOrUpdateProfile(final int id, AutoFillProfile profile) {
         final String SQL = "INSERT OR REPLACE INTO " + PROFILES_TABLE_NAME + " ("
                 + Profiles._ID + ","
                 + Profiles.FULL_NAME + ","
                 + Profiles.EMAIL_ADDRESS
                 + ") VALUES (?,?,?);";
-        final Object[] PARAMS = {id, fullName, email};
+        final Object[] PARAMS = { id, profile.getFullName(), profile.getEmailAddress() };
         getDatabase(true).execSQL(SQL, PARAMS);
     }
 
diff --git a/src/com/android/browser/AutoFillSettingsFragment.java b/src/com/android/browser/AutoFillSettingsFragment.java
index b650ede..e41ca56 100644
--- a/src/com/android/browser/AutoFillSettingsFragment.java
+++ b/src/com/android/browser/AutoFillSettingsFragment.java
@@ -17,26 +17,20 @@
 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.webkit.WebSettings.AutoFillProfile;
 import android.widget.Button;
 import android.widget.EditText;
-import android.widget.Toast;
 
 public class AutoFillSettingsFragment extends Fragment {
 
     private static final String LOGTAG = "AutoFillSettingsFragment";
 
-    // TODO: This will become dynamic once we support more than one profile.
-    private int mProfileId = 1;
-
     public AutoFillSettingsFragment() {
 
     }
@@ -59,13 +53,21 @@
                         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());
+                BrowserSettings.getInstance().setAutoFillProfile(getActivity(),
+                        new AutoFillProfile(
+                                fullName.getText().toString(),
+                                email.getText().toString()));
             }
         });
 
-        // Load the profile and populate the text views in the background
-        new LoadProfileFromDbTask().execute(mProfileId);
+        // Populate the text boxes with any pre existing AutoFill data.
+        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);
+        AutoFillProfile activeProfile = BrowserSettings.getInstance().getAutoFillProfile();
+        fullName.setText(activeProfile.getFullName());
+        email.setText(activeProfile.getEmailAddress());
 
         return v;
     }
@@ -77,66 +79,4 @@
         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 4c798a0..d3c1c00 100644
--- a/src/com/android/browser/BrowserSettings.java
+++ b/src/com/android/browser/BrowserSettings.java
@@ -28,10 +28,14 @@
 import android.content.SharedPreferences;
 import android.content.SharedPreferences.Editor;
 import android.database.ContentObserver;
+import android.database.Cursor;
 import android.net.Uri;
+import android.os.AsyncTask;
 import android.os.Handler;
 import android.preference.PreferenceActivity;
+import android.preference.PreferenceManager;
 import android.preference.PreferenceScreen;
+import android.provider.Browser;
 import android.provider.Settings;
 import android.util.Log;
 import android.webkit.CookieManager;
@@ -41,9 +45,9 @@
 import android.webkit.WebViewDatabase;
 import android.webkit.WebIconDatabase;
 import android.webkit.WebSettings;
+import android.webkit.WebSettings.AutoFillProfile;
 import android.webkit.WebStorage;
-import android.preference.PreferenceManager;
-import android.provider.Browser;
+import android.widget.Toast;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -127,6 +131,12 @@
         WebSettings.ZoomDensity.MEDIUM;
     private static int pageCacheCapacity;
 
+
+    private AutoFillProfile mAutoFillProfile;
+    // TODO: For now we only support one autofill profile. Add support for
+    // multiple profiles later.
+    private int mActiveAutoFillProfileId = 1;
+
     // Preference keys that are used outside this class
     public final static String PREF_CLEAR_CACHE = "privacy_clear_cache";
     public final static String PREF_CLEAR_COOKIES = "privacy_clear_cookies";
@@ -255,6 +265,9 @@
             s.setDatabasePath(b.databasePath);
             s.setGeolocationDatabasePath(b.geolocationDatabasePath);
 
+            // Active AutoFill profile data.
+            s.setAutoFillProfile(b.mAutoFillProfile);
+
             b.updateTabControlSettings();
         }
     }
@@ -300,6 +313,23 @@
             pageCacheCapacity = 1;
         }
 
+        // Load the autofill profile data from the database. We use a database separate
+        // to the browser preference DB to make it easier to support multiple profiles
+        // and switching between them.
+        mAutoFillProfile = new AutoFillProfile();
+        AutoFillProfileDatabase autoFillDb = AutoFillProfileDatabase.getInstance(ctx);
+        Cursor c = autoFillDb.getProfile(mActiveAutoFillProfileId);
+
+        if (c.getCount() > 0) {
+            c.moveToFirst();
+            mAutoFillProfile.setFullName(c.getString(c.getColumnIndex(
+                    AutoFillProfileDatabase.Profiles.FULL_NAME)));
+            mAutoFillProfile.setEmailAddress(c.getString(c.getColumnIndex(
+                    AutoFillProfileDatabase.Profiles.EMAIL_ADDRESS)));
+        }
+        c.close();
+        autoFillDb.close();
+
         // PreferenceManager.setDefaultValues is TOO SLOW, need to manually keep
         // the defaults in sync
         syncSharedPreferences(ctx, p);
@@ -477,6 +507,17 @@
         update();
     }
 
+    public void setAutoFillProfile(Context ctx, AutoFillProfile profile) {
+        mAutoFillProfile = profile;
+        // Update the AutoFill DB
+        new SaveProfileToDbTask(ctx).execute(mAutoFillProfile);
+
+    }
+
+    public AutoFillProfile getAutoFillProfile() {
+        return mAutoFillProfile;
+    }
+
     /**
      * Add a WebSettings object to the list of observers that will be updated
      * when update() is called.
@@ -641,4 +682,26 @@
         geolocationEnabled = true;
         workersEnabled = true;  // only affects V8. JSC does not have a similar setting
     }
+
+    private class SaveProfileToDbTask extends AsyncTask<AutoFillProfile, Void, Void> {
+
+        Context mContext;
+
+        public SaveProfileToDbTask(Context ctx) {
+            mContext = ctx;
+        }
+
+        protected Void doInBackground(AutoFillProfile... values) {
+            AutoFillProfileDatabase db =
+                    AutoFillProfileDatabase.getInstance(mContext);
+            db.addOrUpdateProfile(mActiveAutoFillProfileId, values[0]);
+            return null;
+        }
+
+        protected void onPostExecute(Void result) {
+            String message = mContext.getString(R.string.autofill_profile_successful_save);
+            Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show();
+        }
+    }
+
 }