summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndroid (Google) Code Review <android-gerrit@google.com>2009-07-30 02:14:03 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2009-07-30 02:14:03 -0700
commit734d07bb3ce3b65b51289143ca51013df01c1bd6 (patch)
tree391ef8cb2888e312aa0fc32a016052a8db8c1e10
parent438c5e64fc822cf1bac0648d7964988972d7d4e0 (diff)
parent089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5b (diff)
downloadpackages_apps_Browser-734d07bb3ce3b65b51289143ca51013df01c1bd6.zip
packages_apps_Browser-734d07bb3ce3b65b51289143ca51013df01c1bd6.tar.gz
packages_apps_Browser-734d07bb3ce3b65b51289143ca51013df01c1bd6.tar.bz2
Merge change 8986
* changes: Generalizes WebsiteSettingsActivity to handle more than just database permissions.
-rw-r--r--src/com/android/browser/WebsiteSettingsActivity.java152
1 files changed, 114 insertions, 38 deletions
diff --git a/src/com/android/browser/WebsiteSettingsActivity.java b/src/com/android/browser/WebsiteSettingsActivity.java
index f91879f..fc21967 100644
--- a/src/com/android/browser/WebsiteSettingsActivity.java
+++ b/src/com/android/browser/WebsiteSettingsActivity.java
@@ -42,12 +42,14 @@ import android.widget.TextView;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
+import java.util.Map;
import java.util.Set;
import java.util.Vector;
/**
* Manage the settings for an origin.
- * We use it to keep track of the HTML5 settings, i.e. database (webstorage).
+ * We use it to keep track of the 'HTML5' settings, i.e. database (webstorage)
+ * and Geolocation.
*/
public class WebsiteSettingsActivity extends ListActivity {
@@ -59,11 +61,58 @@ public class WebsiteSettingsActivity extends ListActivity {
private String mOrigin;
private String mTitle;
private Bitmap mIcon;
+ private int mFeatures;
+
+ // These constants provide the set of features that a site may support
+ // They must be consecutive. To add a new feature, add a new FEATURE_XXX
+ // variable with value equal to the current value of FEATURE_COUNT, then
+ // increment FEATURE_COUNT.
+ private final static int FEATURE_WEB_STORAGE = 0;
+ // The number of features available.
+ private final static int FEATURE_COUNT = 1;
public Site(String origin) {
mOrigin = origin;
mTitle = null;
mIcon = null;
+ mFeatures = 0;
+ }
+
+ public void addFeature(int feature) {
+ mFeatures |= (1 << feature);
+ }
+
+ public boolean hasFeature(int feature) {
+ return (mFeatures & (1 << feature)) != 0;
+ }
+
+ /**
+ * Gets the number of features supported by this site.
+ */
+ public int getFeatureCount() {
+ int count = 0;
+ for (int i = 0; i < FEATURE_COUNT; ++i) {
+ count += hasFeature(i) ? 1 : 0;
+ }
+ return count;
+ }
+
+ /**
+ * Gets the ID of the nth (zero-based) feature supported by this site.
+ * The return value is a feature ID - one of the FEATURE_XXX values.
+ * This is required to determine which feature is displayed at a given
+ * position in the list of features for this site. This is used both
+ * when populateing the view and when responding to clicks on the list.
+ */
+ public int getFeatureByIndex(int n) {
+ int j = -1;
+ for (int i = 0; i < FEATURE_COUNT; ++i) {
+ j += hasFeature(i) ? 1 : 0;
+ if (j == n) {
+ return i;
+ }
+ }
+ return -1;
}
public String getOrigin() {
@@ -102,7 +151,6 @@ public class WebsiteSettingsActivity extends ListActivity {
private LayoutInflater mInflater;
private Bitmap mDefaultIcon;
private Site mCurrentSite;
- private final static int STORED_DATA = 0;
public SiteAdapter(Context context, int rsc) {
super(context, rsc);
@@ -113,28 +161,50 @@ public class WebsiteSettingsActivity extends ListActivity {
populateOrigins();
}
+ /**
+ * Adds the specified feature to the site corresponding to supplied
+ * origin in the map. Creates the site if it does not already exist.
+ */
+ private void addFeatureToSite(Map sites, String origin, int feature) {
+ Site site = null;
+ if (sites.containsKey(origin)) {
+ site = (Site) sites.get(origin);
+ } else {
+ site = new Site(origin);
+ sites.put(origin, site);
+ }
+ site.addFeature(feature);
+ }
+
public void populateOrigins() {
clear();
- // Get the list of origins we want to display
+ // 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
+ // safe to group origins here. Note that WebCore::SecurityOrigin
+ // uses 0 (which is not printed) for the port if the port is the
+ // 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();
- Set sites = new HashSet<Site>();
+ Map sites = new HashMap<String, Site>();
if (origins != null) {
Iterator<String> iter = origins.iterator();
while (iter.hasNext()) {
- String origin = iter.next();
- Site site = new Site(origin);
- sites.add(site);
+ addFeatureToSite(sites, iter.next(), Site.FEATURE_WEB_STORAGE);
}
}
// 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> >();
- Iterator<Site> sitesIter = sites.iterator();
- while (sitesIter.hasNext()) {
- Site site = sitesIter.next();
- String host = Uri.parse(site.getOrigin()).getHost();
+ Set keys = sites.keySet();
+ Iterator<String> originIter = keys.iterator();
+ while (originIter.hasNext()) {
+ String origin = originIter.next();
+ Site site = (Site) sites.get(origin);
+ String host = Uri.parse(origin).getHost();
Set hostSites = null;
if (hosts.containsKey(host)) {
hostSites = (Set) hosts.get(host);
@@ -166,7 +236,7 @@ public class WebsiteSettingsActivity extends ListActivity {
bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
}
Set matchingSites = (Set) hosts.get(host);
- sitesIter = matchingSites.iterator();
+ Iterator<Site> sitesIter = matchingSites.iterator();
while (sitesIter.hasNext()) {
Site site = sitesIter.next();
site.setTitle(title);
@@ -179,9 +249,11 @@ public class WebsiteSettingsActivity extends ListActivity {
}
// We can now simply populate our array with Site instances
- sitesIter = sites.iterator();
- while (sitesIter.hasNext()) {
- Site site = sitesIter.next();
+ keys = sites.keySet();
+ originIter = keys.iterator();
+ while (originIter.hasNext()) {
+ String origin = originIter.next();
+ Site site = (Site) sites.get(origin);
add(site);
}
@@ -194,7 +266,7 @@ public class WebsiteSettingsActivity extends ListActivity {
if (mCurrentSite == null) {
return super.getCount();
}
- return 1; // db view
+ return mCurrentSite.getFeatureCount();
}
public String sizeValueToString(long value) {
@@ -254,13 +326,15 @@ public class WebsiteSettingsActivity extends ListActivity {
view.setTag(site);
} else {
icon.setVisibility(View.GONE);
- if (position == STORED_DATA) {
- String origin = mCurrentSite.getOrigin();
- long usageValue = WebStorage.getInstance().getUsageForOrigin(origin);
- String usage = sizeValueToString(usageValue) + " " + sMBStored;
-
- title.setText(R.string.webstorage_clear_data_title);
- subtitle.setText(usage);
+ 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);
+ break;
}
}
@@ -272,21 +346,23 @@ public class WebsiteSettingsActivity extends ListActivity {
int position,
long id) {
if (mCurrentSite != null) {
- if (position == STORED_DATA) {
- new AlertDialog.Builder(getContext())
- .setTitle(R.string.webstorage_clear_data_dialog_title)
- .setMessage(R.string.webstorage_clear_data_dialog_message)
- .setPositiveButton(R.string.webstorage_clear_data_dialog_ok_button,
- new AlertDialog.OnClickListener() {
- public void onClick(DialogInterface dlg, int which) {
- WebStorage.getInstance().deleteOrigin(mCurrentSite.getOrigin());
- mCurrentSite = null;
- populateOrigins();
- notifyDataSetChanged();
- }})
- .setNegativeButton(R.string.webstorage_clear_data_dialog_cancel_button, null)
- .setIcon(android.R.drawable.ic_dialog_alert)
- .show();
+ switch (mCurrentSite.getFeatureByIndex(position)) {
+ case Site.FEATURE_WEB_STORAGE:
+ new AlertDialog.Builder(getContext())
+ .setTitle(R.string.webstorage_clear_data_dialog_title)
+ .setMessage(R.string.webstorage_clear_data_dialog_message)
+ .setPositiveButton(R.string.webstorage_clear_data_dialog_ok_button,
+ new AlertDialog.OnClickListener() {
+ public void onClick(DialogInterface dlg, int which) {
+ WebStorage.getInstance().deleteOrigin(mCurrentSite.getOrigin());
+ mCurrentSite = null;
+ populateOrigins();
+ notifyDataSetChanged();
+ }})
+ .setNegativeButton(R.string.webstorage_clear_data_dialog_cancel_button, null)
+ .setIcon(android.R.drawable.ic_dialog_alert)
+ .show();
+ break;
}
} else {
mCurrentSite = (Site) view.getTag();