WebsiteSettingsFragment.java revision f344d03c0b01d30575ba1ddd1ed340705c6f5a97
1e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard/* 2e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard * Copyright (C) 2009 The Android Open Source Project 3e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard * 4e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard * Licensed under the Apache License, Version 2.0 (the "License"); 5e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard * you may not use this file except in compliance with the License. 6e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard * You may obtain a copy of the License at 7e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard * 8e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard * http://www.apache.org/licenses/LICENSE-2.0 9e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard * 10e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard * Unless required by applicable law or agreed to in writing, software 11e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard * distributed under the License is distributed on an "AS IS" BASIS, 12e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard * See the License for the specific language governing permissions and 14e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard * limitations under the License. 15e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard */ 16e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard 17e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardpackage com.android.browser; 18e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard 19e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.app.AlertDialog; 20e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.app.ListActivity; 21e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.content.Context; 22e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.content.DialogInterface; 23e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.database.Cursor; 24e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.graphics.Bitmap; 25e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.graphics.BitmapFactory; 26e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.net.Uri; 27e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.os.Bundle; 28e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.provider.Browser; 29e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.util.Log; 30e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.view.KeyEvent; 31e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.view.LayoutInflater; 32e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.view.View; 33e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.view.ViewGroup; 34f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Blockimport android.webkit.GeolocationPermissions; 35e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.webkit.WebIconDatabase; 36e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.webkit.WebStorage; 37e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.widget.ArrayAdapter; 38e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.widget.AdapterView; 39e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.widget.AdapterView.OnItemClickListener; 40e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.widget.ImageView; 41e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.widget.TextView; 42e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard 43e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport java.util.HashMap; 44ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Blockimport java.util.HashSet; 45e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport java.util.Iterator; 46089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Blockimport java.util.Map; 47e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport java.util.Set; 48e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport java.util.Vector; 49e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard 50e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard/** 51e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard * Manage the settings for an origin. 52089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block * We use it to keep track of the 'HTML5' settings, i.e. database (webstorage) 53089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block * and Geolocation. 54e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard */ 55e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardpublic class WebsiteSettingsActivity extends ListActivity { 56e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard 57e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard private String LOGTAG = "WebsiteSettingsActivity"; 58e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard private static String sMBStored = null; 59e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard private SiteAdapter mAdapter = null; 60e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard 61e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard class Site { 62e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard private String mOrigin; 63e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard private String mTitle; 64e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard private Bitmap mIcon; 65089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block private int mFeatures; 66089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block 67089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block // These constants provide the set of features that a site may support 68089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block // They must be consecutive. To add a new feature, add a new FEATURE_XXX 69089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block // variable with value equal to the current value of FEATURE_COUNT, then 70089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block // increment FEATURE_COUNT. 71089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block private final static int FEATURE_WEB_STORAGE = 0; 72f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block private final static int FEATURE_GEOLOCATION = 1; 73089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block // The number of features available. 74f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block private final static int FEATURE_COUNT = 2; 75e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard 761ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block public Site(String origin) { 77e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard mOrigin = origin; 781ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block mTitle = null; 791ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block mIcon = null; 80089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block mFeatures = 0; 81089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block } 82089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block 83089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block public void addFeature(int feature) { 84089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block mFeatures |= (1 << feature); 85089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block } 86089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block 87089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block public boolean hasFeature(int feature) { 88089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block return (mFeatures & (1 << feature)) != 0; 89089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block } 90089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block 91089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block /** 92089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block * Gets the number of features supported by this site. 93089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block */ 94089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block public int getFeatureCount() { 95089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block int count = 0; 96089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block for (int i = 0; i < FEATURE_COUNT; ++i) { 97089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block count += hasFeature(i) ? 1 : 0; 98089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block } 99089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block return count; 100089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block } 101089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block 102089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block /** 103089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block * Gets the ID of the nth (zero-based) feature supported by this site. 104089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block * The return value is a feature ID - one of the FEATURE_XXX values. 105089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block * This is required to determine which feature is displayed at a given 106089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block * position in the list of features for this site. This is used both 107f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block * when populating the view and when responding to clicks on the list. 108089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block */ 109089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block public int getFeatureByIndex(int n) { 110089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block int j = -1; 111089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block for (int i = 0; i < FEATURE_COUNT; ++i) { 112089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block j += hasFeature(i) ? 1 : 0; 113089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block if (j == n) { 114089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block return i; 115089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block } 116089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block } 117089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block return -1; 118e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } 119e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard 120e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard public String getOrigin() { 121e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard return mOrigin; 122e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } 123e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard 124e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard public void setTitle(String title) { 125e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard mTitle = title; 126e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } 127e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard 128e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard public void setIcon(Bitmap icon) { 129e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard mIcon = icon; 130e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } 131e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard 132e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard public Bitmap getIcon() { 133e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard return mIcon; 134e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } 1351ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block 1361ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block public String getPrettyOrigin() { 1371ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block return mTitle == null ? null : hideHttp(mOrigin); 1381ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block } 1391ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block 1401ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block public String getPrettyTitle() { 1411ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block return mTitle == null ? hideHttp(mOrigin) : mTitle; 1421ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block } 1431ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block 1441ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block private String hideHttp(String str) { 1451ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block Uri uri = Uri.parse(str); 1461ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block return "http".equals(uri.getScheme()) ? str.substring(7) : str; 1471ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block } 148e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } 149e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard 150e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard class SiteAdapter extends ArrayAdapter<Site> 151e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard implements AdapterView.OnItemClickListener { 152e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard private int mResource; 153e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard private LayoutInflater mInflater; 154e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard private Bitmap mDefaultIcon; 155e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard private Site mCurrentSite; 156e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard 157e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard public SiteAdapter(Context context, int rsc) { 158e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard super(context, rsc); 159e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard mResource = rsc; 160e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 161e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard mDefaultIcon = BitmapFactory.decodeResource(getResources(), 162e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard R.drawable.ic_launcher_shortcut_browser_bookmark); 163e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard populateOrigins(); 164e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } 165e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard 166089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block /** 167089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block * Adds the specified feature to the site corresponding to supplied 168089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block * origin in the map. Creates the site if it does not already exist. 169089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block */ 170089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block private void addFeatureToSite(Map sites, String origin, int feature) { 171089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block Site site = null; 172089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block if (sites.containsKey(origin)) { 173089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block site = (Site) sites.get(origin); 174089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block } else { 175089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block site = new Site(origin); 176089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block sites.put(origin, site); 177089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block } 178089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block site.addFeature(feature); 179089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block } 180089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block 181e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard public void populateOrigins() { 182e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard clear(); 183e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard 184089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block // Get the list of origins we want to display. 185089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block // All 'HTML 5 modules' (Database, Geolocation etc) form these 186089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block // origin strings using WebCore::SecurityOrigin::toString(), so it's 187089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block // safe to group origins here. Note that WebCore::SecurityOrigin 188089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block // uses 0 (which is not printed) for the port if the port is the 189089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block // default for the protocol. Eg http://www.google.com and 190089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block // http://www.google.com:80 both record a port of 0 and hence 191089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block // toString() == 'http://www.google.com' for both. 192824faebe51bae769395ec1d7f590530df94b58d3Andrei Popescu Set origins = WebStorage.getInstance().getOrigins(); 193089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block Map sites = new HashMap<String, Site>(); 194e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard if (origins != null) { 195824faebe51bae769395ec1d7f590530df94b58d3Andrei Popescu Iterator<String> iter = origins.iterator(); 196824faebe51bae769395ec1d7f590530df94b58d3Andrei Popescu while (iter.hasNext()) { 197089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block addFeatureToSite(sites, iter.next(), Site.FEATURE_WEB_STORAGE); 198e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } 199e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } 200f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block origins = GeolocationPermissions.getInstance().getOrigins(); 201f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block if (origins != null) { 202f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block Iterator<String> iter = origins.iterator(); 203f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block while (iter.hasNext()) { 204f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block addFeatureToSite(sites, iter.next(), Site.FEATURE_GEOLOCATION); 205f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block } 206f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block } 207e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard 208ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block // Create a map from host to origin. This is used to add metadata 209ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block // (title, icon) for this origin from the bookmarks DB. 210ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block HashMap hosts = new HashMap<String, Set<Site> >(); 211089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block Set keys = sites.keySet(); 212089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block Iterator<String> originIter = keys.iterator(); 213089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block while (originIter.hasNext()) { 214089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block String origin = originIter.next(); 215089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block Site site = (Site) sites.get(origin); 216089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block String host = Uri.parse(origin).getHost(); 217ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block Set hostSites = null; 218ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block if (hosts.containsKey(host)) { 219ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block hostSites = (Set) hosts.get(host); 220ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block } else { 221ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block hostSites = new HashSet<Site>(); 222ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block hosts.put(host, hostSites); 223ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block } 224ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block hostSites.add(site); 225ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block } 226ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block 227ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block // Check the bookmark DB. If we have data for a host used by any of 228ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block // our origins, use it to set their title and favicon 229e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard Cursor c = getContext().getContentResolver().query(Browser.BOOKMARKS_URI, 230e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard new String[] { Browser.BookmarkColumns.URL, Browser.BookmarkColumns.TITLE, 231e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard Browser.BookmarkColumns.FAVICON }, "bookmark = 1", null, null); 232e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard 233e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard if ((c != null) && c.moveToFirst()) { 234e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard int urlIndex = c.getColumnIndex(Browser.BookmarkColumns.URL); 235e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard int titleIndex = c.getColumnIndex(Browser.BookmarkColumns.TITLE); 236e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard int faviconIndex = c.getColumnIndex(Browser.BookmarkColumns.FAVICON); 237e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard do { 238e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard String url = c.getString(urlIndex); 239e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard String host = Uri.parse(url).getHost(); 240ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block if (hosts.containsKey(host)) { 241e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard String title = c.getString(titleIndex); 242ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block Bitmap bmp = null; 243e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard byte[] data = c.getBlob(faviconIndex); 244e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard if (data != null) { 245ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block bmp = BitmapFactory.decodeByteArray(data, 0, data.length); 246ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block } 247ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block Set matchingSites = (Set) hosts.get(host); 248089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block Iterator<Site> sitesIter = matchingSites.iterator(); 249ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block while (sitesIter.hasNext()) { 250ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block Site site = sitesIter.next(); 251ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block site.setTitle(title); 252e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard if (bmp != null) { 253e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard site.setIcon(bmp); 254e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } 255e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } 256e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } 257e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } while (c.moveToNext()); 258e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } 259e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard 260e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard // We can now simply populate our array with Site instances 261089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block keys = sites.keySet(); 262089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block originIter = keys.iterator(); 263089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block while (originIter.hasNext()) { 264089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block String origin = originIter.next(); 265089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block Site site = (Site) sites.get(origin); 266e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard add(site); 267e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } 268e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard 269e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard if (getCount() == 0) { 270e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard finish(); // we close the screen 271e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } 272e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } 273e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard 274e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard public int getCount() { 275e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard if (mCurrentSite == null) { 276e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard return super.getCount(); 277e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } 278089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block return mCurrentSite.getFeatureCount(); 279e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } 280e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard 281e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard public String sizeValueToString(long value) { 282e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard float mb = (float) value / (1024.0F * 1024.0F); 283e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard int val = (int) (mb * 10); 284e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard float ret = (float) (val / 10.0F); 285e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard if (ret <= 0) { 286e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard return "0"; 287e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } 288e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard return String.valueOf(ret); 289e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } 290e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard 291e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard /* 292e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard * If we receive the back event and are displaying 293e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard * site's settings, we want to go back to the main 294e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard * list view. If not, we just do nothing (see 295e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard * dispatchKeyEvent() below). 296e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard */ 297e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard public boolean backKeyPressed() { 298e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard if (mCurrentSite != null) { 299e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard mCurrentSite = null; 300e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard populateOrigins(); 301e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard notifyDataSetChanged(); 302e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard return true; 303e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } 304e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard return false; 305e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } 306e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard 307e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard public View getView(int position, View convertView, ViewGroup parent) { 308e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard View view; 309e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard TextView title; 310e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard TextView subtitle; 311e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard ImageView icon; 312e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard 313e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard if (convertView == null) { 314e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard view = mInflater.inflate(mResource, parent, false); 315e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } else { 316e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard view = convertView; 317e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } 318e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard 319e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard title = (TextView) view.findViewById(R.id.title); 320e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard subtitle = (TextView) view.findViewById(R.id.subtitle); 321e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard icon = (ImageView) view.findViewById(R.id.icon); 322e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard 323e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard if (mCurrentSite == null) { 324e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard Site site = getItem(position); 3251ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block title.setText(site.getPrettyTitle()); 3261ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block subtitle.setText(site.getPrettyOrigin()); 327e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard icon.setVisibility(View.VISIBLE); 328e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard Bitmap bmp = site.getIcon(); 329e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard if (bmp == null) { 330e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard bmp = mDefaultIcon; 331e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } 332e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard icon.setImageBitmap(bmp); 333e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard // We set the site as the view's tag, 334e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard // so that we can get it in onItemClick() 335e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard view.setTag(site); 336e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } else { 337e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard icon.setVisibility(View.GONE); 338089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block String origin = mCurrentSite.getOrigin(); 339089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block switch (mCurrentSite.getFeatureByIndex(position)) { 340089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block case Site.FEATURE_WEB_STORAGE: 341089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block long usageValue = WebStorage.getInstance().getUsageForOrigin(origin); 342089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block String usage = sizeValueToString(usageValue) + " " + sMBStored; 343089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block 344089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block title.setText(R.string.webstorage_clear_data_title); 345089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block subtitle.setText(usage); 346089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block break; 347f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block case Site.FEATURE_GEOLOCATION: 348f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block title.setText(R.string.geolocation_settings_page_title); 349f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block boolean allowed = GeolocationPermissions.getInstance().getAllowed(origin); 350f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block subtitle.setText(allowed ? 351f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block R.string.geolocation_settings_page_summary_allowed : 352f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block R.string.geolocation_settings_page_summary_not_allowed); 353f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block break; 354e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } 355e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } 356e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard 357e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard return view; 358e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } 359e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard 360e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard public void onItemClick(AdapterView<?> parent, 361e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard View view, 362e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard int position, 363e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard long id) { 364e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard if (mCurrentSite != null) { 365089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block switch (mCurrentSite.getFeatureByIndex(position)) { 366089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block case Site.FEATURE_WEB_STORAGE: 367089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block new AlertDialog.Builder(getContext()) 368089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block .setTitle(R.string.webstorage_clear_data_dialog_title) 369089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block .setMessage(R.string.webstorage_clear_data_dialog_message) 370089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block .setPositiveButton(R.string.webstorage_clear_data_dialog_ok_button, 371089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block new AlertDialog.OnClickListener() { 372089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block public void onClick(DialogInterface dlg, int which) { 373089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block WebStorage.getInstance().deleteOrigin(mCurrentSite.getOrigin()); 374089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block mCurrentSite = null; 375089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block populateOrigins(); 376089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block notifyDataSetChanged(); 377089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block }}) 378089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block .setNegativeButton(R.string.webstorage_clear_data_dialog_cancel_button, null) 379089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block .setIcon(android.R.drawable.ic_dialog_alert) 380089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block .show(); 381089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block break; 382f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block case Site.FEATURE_GEOLOCATION: 383f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block new AlertDialog.Builder(getContext()) 384f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block .setTitle(R.string.geolocation_settings_page_dialog_title) 385f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block .setMessage(R.string.geolocation_settings_page_dialog_message) 386f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block .setPositiveButton(R.string.geolocation_settings_page_dialog_ok_button, 387f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block new AlertDialog.OnClickListener() { 388f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block public void onClick(DialogInterface dlg, int which) { 389f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block GeolocationPermissions.getInstance().clear(mCurrentSite.getOrigin()); 390f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block mCurrentSite = null; 391f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block populateOrigins(); 392f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block notifyDataSetChanged(); 393f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block }}) 394f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block .setNegativeButton(R.string.geolocation_settings_page_dialog_cancel_button, null) 395f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block .setIcon(android.R.drawable.ic_dialog_alert) 396f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block .show(); 397f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block break; 398e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } 399e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } else { 400e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard mCurrentSite = (Site) view.getTag(); 401e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard notifyDataSetChanged(); 402e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } 403e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } 404e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } 405e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard 406e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard /** 407e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard * Intercepts the back key to immediately notify 408e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard * NativeDialog that we are done. 409e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard */ 410e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard public boolean dispatchKeyEvent(KeyEvent event) { 411e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard if ((event.getKeyCode() == KeyEvent.KEYCODE_BACK) 412e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard && (event.getAction() == KeyEvent.ACTION_DOWN)) { 413e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard if ((mAdapter != null) && (mAdapter.backKeyPressed())){ 414e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard return true; // event consumed 415e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } 416e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } 417e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard return super.dispatchKeyEvent(event); 418e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } 419e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard 420e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard @Override 421e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard protected void onCreate(Bundle icicle) { 422e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard super.onCreate(icicle); 423e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard if (sMBStored == null) { 424e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard sMBStored = getString(R.string.webstorage_origin_summary_mb_stored); 425e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } 426e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard mAdapter = new SiteAdapter(this, R.layout.application); 427e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard setListAdapter(mAdapter); 428e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard getListView().setOnItemClickListener(mAdapter); 429e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard } 430e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard} 431