Reimplement the settings to use async callbacks
diff --git a/src/com/android/browser/WebsiteSettingsActivity.java b/src/com/android/browser/WebsiteSettingsActivity.java
index 640a32d..5d5fc09 100644
--- a/src/com/android/browser/WebsiteSettingsActivity.java
+++ b/src/com/android/browser/WebsiteSettingsActivity.java
@@ -35,6 +35,7 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.webkit.GeolocationPermissions;
+import android.webkit.ValueCallback;
 import android.webkit.WebIconDatabase;
 import android.webkit.WebStorage;
 import android.widget.ArrayAdapter;
@@ -178,7 +179,7 @@
                     R.drawable.usage_high);
             mLocationIcon = BitmapFactory.decodeResource(getResources(),
                     R.drawable.location);
-            populateOrigins();
+            askForOrigins();
         }
 
         /**
@@ -196,9 +197,7 @@
             site.addFeature(feature);
         }
 
-        public void populateOrigins() {
-            clear();
-
+        public void askForOrigins() {
             // Get the list of origins we want to display.
             // All 'HTML 5 modules' (Database, Geolocation etc) form these
             // origin strings using WebCore::SecurityOrigin::toString(), so it's
@@ -207,22 +206,37 @@
             // default for the protocol. Eg http://www.google.com and
             // http://www.google.com:80 both record a port of 0 and hence
             // toString() == 'http://www.google.com' for both.
-            Set origins = WebStorage.getInstance().getOrigins();
-            Map sites = new HashMap<String, Site>();
-            if (origins != null) {
-                Iterator<String> iter = origins.iterator();
-                while (iter.hasNext()) {
-                    addFeatureToSite(sites, iter.next(), Site.FEATURE_WEB_STORAGE);
-                }
-            }
-            origins = GeolocationPermissions.getInstance().getOrigins();
-            if (origins != null) {
-                Iterator<String> iter = origins.iterator();
-                while (iter.hasNext()) {
-                    addFeatureToSite(sites, iter.next(), Site.FEATURE_GEOLOCATION);
-                }
-            }
 
+            WebStorage.getInstance().getOrigins(new ValueCallback<Map>() {
+                public void onReceiveValue(Map origins) {
+                    Map sites = new HashMap<String, Site>();
+                    if (origins != null) {
+                        Iterator<String> iter = origins.keySet().iterator();
+                        while (iter.hasNext()) {
+                            addFeatureToSite(sites, iter.next(), Site.FEATURE_WEB_STORAGE);
+                        }
+                    }
+                    askForGeolocation(sites);
+                }
+            });
+        }
+
+        public void askForGeolocation(final Map sites) {
+            GeolocationPermissions.getInstance().getOrigins(new ValueCallback<Set>() {
+                public void onReceiveValue(Set origins) {
+                    if (origins != null) {
+                        Iterator<String> iter = origins.iterator();
+                        while (iter.hasNext()) {
+                            addFeatureToSite(sites, iter.next(), Site.FEATURE_GEOLOCATION);
+                        }
+                    }
+                    populateIcons(sites);
+                    populateOrigins(sites);
+                }
+            });
+        }
+
+        public void populateIcons(Map sites) {
             // Create a map from host to origin. This is used to add metadata
             // (title, icon) for this origin from the bookmarks DB.
             HashMap hosts = new HashMap<String, Set<Site> >();
@@ -276,16 +290,23 @@
             }
 
             c.close();
+        }
+
+
+        public void populateOrigins(Map sites) {
+            clear();
 
             // We can now simply populate our array with Site instances
-            keys = sites.keySet();
-            originIter = keys.iterator();
+            Set keys = sites.keySet();
+            Iterator<String> originIter = keys.iterator();
             while (originIter.hasNext()) {
                 String origin = originIter.next();
                 Site site = (Site) sites.get(origin);
                 add(site);
             }
 
+            notifyDataSetChanged();
+
             if (getCount() == 0) {
                 finish(); // we close the screen
             }
@@ -320,19 +341,43 @@
         public boolean backKeyPressed() {
             if (mCurrentSite != null) {
                 mCurrentSite = null;
-                populateOrigins();
-                notifyDataSetChanged();
+                askForOrigins();
                 return true;
             }
             return false;
         }
 
+        /**
+         * @hide
+         * Utility function
+         * Set the icon according to the usage
+         */
+        public void setIconForUsage(ImageView usageIcon, long usageInBytes) {
+            float usageInMegabytes = (float) usageInBytes / (1024.0F * 1024.0F);
+            usageIcon.setVisibility(View.VISIBLE);
+
+            // We set the correct icon:
+            // 0 < empty < 0.1MB
+            // 0.1MB < low < 3MB
+            // 3MB < medium < 6MB
+            // 6MB < high
+            if (usageInMegabytes <= 0.1) {
+                usageIcon.setImageBitmap(mUsageEmptyIcon);
+            } else if (usageInMegabytes > 0.1 && usageInMegabytes <= 3) {
+                usageIcon.setImageBitmap(mUsageLowIcon);
+            } else if (usageInMegabytes > 3 && usageInMegabytes <= 6) {
+                usageIcon.setImageBitmap(mUsageMediumIcon);
+            } else if (usageInMegabytes > 6) {
+                usageIcon.setImageBitmap(mUsageHighIcon);
+            }
+        }
+
         public View getView(int position, View convertView, ViewGroup parent) {
             View view;
-            TextView title;
-            TextView subtitle;
+            final TextView title;
+            final TextView subtitle;
             ImageView icon;
-            ImageView usageIcon;
+            final ImageView usageIcon;
             ImageView locationIcon;
 
             if (convertView == null) {
@@ -369,24 +414,13 @@
 
                 if (site.hasFeature(Site.FEATURE_WEB_STORAGE)) {
                   String origin = site.getOrigin();
-                  long usageInBytes = WebStorage.getInstance().getUsageForOrigin(origin);
-                  float usageInMegabytes = (float) usageInBytes / (1024.0F * 1024.0F);
-                  usageIcon.setVisibility(View.VISIBLE);
-
-                  // We set the correct icon:
-                  // 0 < empty < 0.1MB
-                  // 0.1MB < low < 3MB
-                  // 3MB < medium < 6MB
-                  // 6MB < high
-                  if (usageInMegabytes <= 0.1) {
-                    usageIcon.setImageBitmap(mUsageEmptyIcon);
-                  } else if (usageInMegabytes > 0.1 && usageInMegabytes <= 3) {
-                    usageIcon.setImageBitmap(mUsageLowIcon);
-                  } else if (usageInMegabytes > 3 && usageInMegabytes <= 6) {
-                    usageIcon.setImageBitmap(mUsageMediumIcon);
-                  } else if (usageInMegabytes > 6) {
-                    usageIcon.setImageBitmap(mUsageHighIcon);
-                  }
+                  WebStorage.getInstance().getUsageForOrigin(origin, new ValueCallback<Long>() {
+                      public void onReceiveValue(Long value) {
+                          if (value != null) {
+                              setIconForUsage(usageIcon, value.longValue());
+                          }
+                      }
+                  });
                 }
 
                 if (site.hasFeature(Site.FEATURE_GEOLOCATION)) {
@@ -399,18 +433,29 @@
                 String origin = mCurrentSite.getOrigin();
                 switch (mCurrentSite.getFeatureByIndex(position)) {
                     case Site.FEATURE_WEB_STORAGE:
-                        long usageValue = WebStorage.getInstance().getUsageForOrigin(origin);
-                        String usage = sizeValueToString(usageValue) + " " + sMBStored;
-
-                        title.setText(R.string.webstorage_clear_data_title);
-                        subtitle.setText(usage);
+                        WebStorage.getInstance().getUsageForOrigin(origin, new ValueCallback<Long>() {
+                            public void onReceiveValue(Long value) {
+                                if (value != null) {
+                                    String usage = sizeValueToString(value.longValue()) + " " + sMBStored;
+                                    title.setText(R.string.webstorage_clear_data_title);
+                                    subtitle.setText(usage);
+                                }
+                            }
+                        });
                         break;
                     case Site.FEATURE_GEOLOCATION:
                         title.setText(R.string.geolocation_settings_page_title);
-                        boolean allowed = GeolocationPermissions.getInstance().getAllowed(origin);
-                        subtitle.setText(allowed ?
-                                         R.string.geolocation_settings_page_summary_allowed :
-                                         R.string.geolocation_settings_page_summary_not_allowed);
+                        GeolocationPermissions.getInstance().getAllowed(origin, new ValueCallback<Boolean>() {
+                            public void onReceiveValue(Boolean allowed) {
+                                if (allowed != null) {
+                                    if (allowed.booleanValue()) {
+                                        subtitle.setText(R.string.geolocation_settings_page_summary_allowed);
+                                    } else {
+                                        subtitle.setText(R.string.geolocation_settings_page_summary_not_allowed);
+                                    }
+                                }
+                            }
+                        });
                         break;
                 }
             }
@@ -433,8 +478,7 @@
                                 public void onClick(DialogInterface dlg, int which) {
                                     WebStorage.getInstance().deleteOrigin(mCurrentSite.getOrigin());
                                     mCurrentSite = null;
-                                    populateOrigins();
-                                    notifyDataSetChanged();
+                                    askForOrigins();
                                 }})
                             .setNegativeButton(R.string.webstorage_clear_data_dialog_cancel_button, null)
                             .setIcon(android.R.drawable.ic_dialog_alert)
@@ -449,8 +493,7 @@
                                 public void onClick(DialogInterface dlg, int which) {
                                     GeolocationPermissions.getInstance().clear(mCurrentSite.getOrigin());
                                     mCurrentSite = null;
-                                    populateOrigins();
-                                    notifyDataSetChanged();
+                                    askForOrigins();
                                 }})
                             .setNegativeButton(R.string.geolocation_settings_page_dialog_cancel_button, null)
                             .setIcon(android.R.drawable.ic_dialog_alert)
@@ -515,8 +558,8 @@
                                     public void onClick(DialogInterface dlg, int which) {
                                         WebStorage.getInstance().deleteAllData();
                                         GeolocationPermissions.getInstance().clearAll();
-                                        mAdapter.populateOrigins();
-                                        mAdapter.notifyDataSetChanged();
+                                        mAdapter.askForOrigins();
+                                        finish();
                                     }})
                         .setNegativeButton(R.string.website_settings_clear_all_dialog_cancel_button, null)
                         .setIcon(android.R.drawable.ic_dialog_alert)