WebsiteSettingsFragment.java revision ee0d639003a5dec32cf45416b0c751def2d4d25a
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;
34e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.webkit.WebIconDatabase;
35e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.webkit.WebStorage;
36e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.widget.ArrayAdapter;
37e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.widget.AdapterView;
38e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.widget.AdapterView.OnItemClickListener;
39e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.widget.ImageView;
40e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.widget.TextView;
41e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
42e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport java.util.HashMap;
43ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Blockimport java.util.HashSet;
44e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport java.util.Iterator;
45e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport java.util.Set;
46e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport java.util.Vector;
47e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
48e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard/**
49e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard * Manage the settings for an origin.
50e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard * We use it to keep track of the HTML5 settings, i.e. database (webstorage).
51e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard */
52e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardpublic class WebsiteSettingsActivity extends ListActivity {
53e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
54e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard    private String LOGTAG = "WebsiteSettingsActivity";
55e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard    private static String sMBStored = null;
56e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard    private SiteAdapter mAdapter = null;
57e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
58e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard    class Site {
59e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        private String mOrigin;
60e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        private String mTitle;
61e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        private Bitmap mIcon;
62e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
631ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block        public Site(String origin) {
64e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            mOrigin = origin;
651ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block            mTitle = null;
661ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block            mIcon = null;
67e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
68e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
69e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        public String getOrigin() {
70e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            return mOrigin;
71e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
72e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
73e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        public void setTitle(String title) {
74e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            mTitle = title;
75e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
76e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
77e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        public void setIcon(Bitmap icon) {
78e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            mIcon = icon;
79e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
80e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
81e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        public Bitmap getIcon() {
82e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            return mIcon;
83e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
841ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block
851ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block        public String getPrettyOrigin() {
861ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block            return mTitle == null ? null : hideHttp(mOrigin);
871ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block        }
881ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block
891ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block        public String getPrettyTitle() {
901ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block            return mTitle == null ? hideHttp(mOrigin) : mTitle;
911ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block        }
921ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block
931ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block        private String hideHttp(String str) {
941ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block            Uri uri = Uri.parse(str);
951ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block            return "http".equals(uri.getScheme()) ?  str.substring(7) : str;
961ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block        }
97e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard    }
98e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
99e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard    class SiteAdapter extends ArrayAdapter<Site>
100e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            implements AdapterView.OnItemClickListener {
101e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        private int mResource;
102e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        private LayoutInflater mInflater;
103e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        private Bitmap mDefaultIcon;
104e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        private Site mCurrentSite;
105e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        private final static int STORED_DATA = 0;
106e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
107e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        public SiteAdapter(Context context, int rsc) {
108e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            super(context, rsc);
109e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            mResource = rsc;
110e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
111e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            mDefaultIcon = BitmapFactory.decodeResource(getResources(),
112e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                    R.drawable.ic_launcher_shortcut_browser_bookmark);
113e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            populateOrigins();
114e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
115e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
116e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        public void populateOrigins() {
117e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            clear();
118e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
119e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            // Get the list of origins we want to display
120824faebe51bae769395ec1d7f590530df94b58d3Andrei Popescu            Set origins = WebStorage.getInstance().getOrigins();
121ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block            Set sites = new HashSet<Site>();
122e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            if (origins != null) {
123824faebe51bae769395ec1d7f590530df94b58d3Andrei Popescu                Iterator<String> iter = origins.iterator();
124824faebe51bae769395ec1d7f590530df94b58d3Andrei Popescu                while (iter.hasNext()) {
125824faebe51bae769395ec1d7f590530df94b58d3Andrei Popescu                    String origin = iter.next();
1261ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block                    Site site = new Site(origin);
127ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block                    sites.add(site);
128e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                }
129e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            }
130e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
131ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block            // Create a map from host to origin. This is used to add metadata
132ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block            // (title, icon) for this origin from the bookmarks DB.
133ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block            HashMap hosts = new HashMap<String, Set<Site> >();
134ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block            Iterator<Site> sitesIter = sites.iterator();
135ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block            while (sitesIter.hasNext()) {
136ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block                Site site = sitesIter.next();
137ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block                String host = Uri.parse(site.getOrigin()).getHost();
138ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block                Set hostSites = null;
139ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block                if (hosts.containsKey(host)) {
140ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block                    hostSites = (Set) hosts.get(host);
141ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block                } else {
142ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block                    hostSites = new HashSet<Site>();
143ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block                    hosts.put(host, hostSites);
144ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block                }
145ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block                hostSites.add(site);
146ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block            }
147ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block
148ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block            // Check the bookmark DB. If we have data for a host used by any of
149ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block            // our origins, use it to set their title and favicon
150e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            Cursor c = getContext().getContentResolver().query(Browser.BOOKMARKS_URI,
151e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                    new String[] { Browser.BookmarkColumns.URL, Browser.BookmarkColumns.TITLE,
152e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                    Browser.BookmarkColumns.FAVICON }, "bookmark = 1", null, null);
153e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
154e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            if ((c != null) && c.moveToFirst()) {
155e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                int urlIndex = c.getColumnIndex(Browser.BookmarkColumns.URL);
156e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                int titleIndex = c.getColumnIndex(Browser.BookmarkColumns.TITLE);
157e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                int faviconIndex = c.getColumnIndex(Browser.BookmarkColumns.FAVICON);
158e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                do {
159e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                    String url = c.getString(urlIndex);
160e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                    String host = Uri.parse(url).getHost();
161ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block                    if (hosts.containsKey(host)) {
162e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                        String title = c.getString(titleIndex);
163ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block                        Bitmap bmp = null;
164e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                        byte[] data = c.getBlob(faviconIndex);
165e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                        if (data != null) {
166ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block                            bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
167ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block                        }
168ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block                        Set matchingSites = (Set) hosts.get(host);
169ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block                        sitesIter = matchingSites.iterator();
170ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block                        while (sitesIter.hasNext()) {
171ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block                            Site site = sitesIter.next();
172ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block                            site.setTitle(title);
173e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                            if (bmp != null) {
174e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                                site.setIcon(bmp);
175e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                            }
176e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                        }
177e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                    }
178e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                } while (c.moveToNext());
179e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            }
180e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
181e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            // We can now simply populate our array with Site instances
182ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block            sitesIter = sites.iterator();
183ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block            while (sitesIter.hasNext()) {
184ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block                Site site = sitesIter.next();
185e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                add(site);
186e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            }
187e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
188e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            if (getCount() == 0) {
189e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                finish(); // we close the screen
190e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            }
191e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
192e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
193e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        public int getCount() {
194e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            if (mCurrentSite == null) {
195e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                return super.getCount();
196e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            }
197e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            return 1; // db view
198e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
199e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
200e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        public String sizeValueToString(long value) {
201e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            float mb = (float) value / (1024.0F * 1024.0F);
202e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            int val = (int) (mb * 10);
203e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            float ret = (float) (val / 10.0F);
204e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            if (ret <= 0) {
205e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                return "0";
206e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            }
207e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            return String.valueOf(ret);
208e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
209e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
210e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        /*
211e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard         * If we receive the back event and are displaying
212e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard         * site's settings, we want to go back to the main
213e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard         * list view. If not, we just do nothing (see
214e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard         * dispatchKeyEvent() below).
215e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard         */
216e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        public boolean backKeyPressed() {
217e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            if (mCurrentSite != null) {
218e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                mCurrentSite = null;
219e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                populateOrigins();
220e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                notifyDataSetChanged();
221e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                return true;
222e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            }
223e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            return false;
224e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
225e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
226e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        public View getView(int position, View convertView, ViewGroup parent) {
227e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            View view;
228e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            TextView title;
229e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            TextView subtitle;
230e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            ImageView icon;
231e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
232e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            if (convertView == null) {
233e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                view = mInflater.inflate(mResource, parent, false);
234e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            } else {
235e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                view = convertView;
236e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            }
237e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
238e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            title = (TextView) view.findViewById(R.id.title);
239e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            subtitle = (TextView) view.findViewById(R.id.subtitle);
240e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            icon = (ImageView) view.findViewById(R.id.icon);
241e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
242e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            if (mCurrentSite == null) {
243e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                Site site = getItem(position);
2441ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block                title.setText(site.getPrettyTitle());
2451ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block                subtitle.setText(site.getPrettyOrigin());
246e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                icon.setVisibility(View.VISIBLE);
247e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                Bitmap bmp = site.getIcon();
248e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                if (bmp == null) {
249e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                    bmp = mDefaultIcon;
250e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                }
251e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                icon.setImageBitmap(bmp);
252e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                // We set the site as the view's tag,
253e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                // so that we can get it in onItemClick()
254e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                view.setTag(site);
255e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            } else {
256e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                icon.setVisibility(View.GONE);
257e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                if (position == STORED_DATA) {
258e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                    String origin = mCurrentSite.getOrigin();
259e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                    long usageValue = WebStorage.getInstance().getUsageForOrigin(origin);
260e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                    String usage = sizeValueToString(usageValue) + " " + sMBStored;
261e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
262e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                    title.setText(R.string.webstorage_clear_data_title);
263e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                    subtitle.setText(usage);
264e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                }
265e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            }
266e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
267e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            return view;
268e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
269e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
270e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        public void onItemClick(AdapterView<?> parent,
271e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                                View view,
272e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                                int position,
273e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                                long id) {
274e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            if (mCurrentSite != null) {
275e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                if (position == STORED_DATA) {
276e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                    new AlertDialog.Builder(getContext())
277e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                        .setTitle(R.string.webstorage_clear_data_dialog_title)
278e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                        .setMessage(R.string.webstorage_clear_data_dialog_message)
279e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                        .setPositiveButton(R.string.webstorage_clear_data_dialog_ok_button,
280e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                                           new AlertDialog.OnClickListener() {
281e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                            public void onClick(DialogInterface dlg, int which) {
282e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                                WebStorage.getInstance().deleteOrigin(mCurrentSite.getOrigin());
283e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                                mCurrentSite = null;
284e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                                populateOrigins();
285e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                                notifyDataSetChanged();
286e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                            }})
287e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                        .setNegativeButton(R.string.webstorage_clear_data_dialog_cancel_button, null)
288e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                        .setIcon(android.R.drawable.ic_dialog_alert)
289e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                        .show();
290e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                }
291e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            } else {
292e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                mCurrentSite = (Site) view.getTag();
293e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                notifyDataSetChanged();
294e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            }
295e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
296e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard    }
297e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
298e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard    /**
299e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard     * Intercepts the back key to immediately notify
300e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard     * NativeDialog that we are done.
301e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard     */
302e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard    public boolean dispatchKeyEvent(KeyEvent event) {
303e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        if ((event.getKeyCode() == KeyEvent.KEYCODE_BACK)
304e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            && (event.getAction() == KeyEvent.ACTION_DOWN)) {
305e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            if ((mAdapter != null) && (mAdapter.backKeyPressed())){
306e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                return true; // event consumed
307e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            }
308e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
309e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        return super.dispatchKeyEvent(event);
310e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard    }
311e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
312e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard    @Override
313e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard    protected void onCreate(Bundle icicle) {
314e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        super.onCreate(icicle);
315e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        if (sMBStored == null) {
316e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            sMBStored = getString(R.string.webstorage_origin_summary_mb_stored);
317e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
318e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        mAdapter = new SiteAdapter(this, R.layout.application);
319e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        setListAdapter(mAdapter);
320e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        getListView().setOnItemClickListener(mAdapter);
321e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard    }
322e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard}
323