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