WebsiteSettingsFragment.java revision 5a72f1858c2f73be3558c6cdaa2c84b4c36fa748
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
1710200795554ffeb16bf5662fd66ae6442c6f5cf0John Reckpackage com.android.browser.preferences;
1810200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck
1910200795554ffeb16bf5662fd66ae6442c6f5cf0John Reckimport com.android.browser.R;
2010200795554ffeb16bf5662fd66ae6442c6f5cf0John Reckimport com.android.browser.WebStorageSizeManager;
21e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
22e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.app.AlertDialog;
2310200795554ffeb16bf5662fd66ae6442c6f5cf0John Reckimport android.app.FragmentTransaction;
2410200795554ffeb16bf5662fd66ae6442c6f5cf0John Reckimport android.app.ListFragment;
25e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.content.Context;
26e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.content.DialogInterface;
2710200795554ffeb16bf5662fd66ae6442c6f5cf0John Reckimport android.content.res.Resources;
28e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.database.Cursor;
29e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.graphics.Bitmap;
30e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.graphics.BitmapFactory;
31e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.net.Uri;
32a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdochimport android.os.AsyncTask;
33e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.os.Bundle;
3410200795554ffeb16bf5662fd66ae6442c6f5cf0John Reckimport android.preference.PreferenceActivity;
3510200795554ffeb16bf5662fd66ae6442c6f5cf0John Reckimport android.preference.PreferenceFragment;
36b4b87c66e241a7bda0c6c571a82d461775032438Ben Murdochimport android.provider.BrowserContract.Bookmarks;
37e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.util.Log;
38e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.view.LayoutInflater;
39b9daacb7513c5a42000285ad456cc614af1915c0Ben Murdochimport android.view.MenuItem;
40e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.view.View;
4110200795554ffeb16bf5662fd66ae6442c6f5cf0John Reckimport android.view.View.OnClickListener;
42e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.view.ViewGroup;
43f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Blockimport android.webkit.GeolocationPermissions;
4499b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roardimport android.webkit.ValueCallback;
45e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.webkit.WebStorage;
46e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.widget.AdapterView;
47e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.widget.AdapterView.OnItemClickListener;
4810200795554ffeb16bf5662fd66ae6442c6f5cf0John Reckimport android.widget.ArrayAdapter;
49e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.widget.ImageView;
50e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.widget.TextView;
51e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
5210200795554ffeb16bf5662fd66ae6442c6f5cf0John Reckimport java.io.Serializable;
53e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport java.util.HashMap;
54ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Blockimport java.util.HashSet;
55e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport java.util.Iterator;
56089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Blockimport java.util.Map;
57e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport java.util.Set;
58e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
59e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard/**
60e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard * Manage the settings for an origin.
61089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block * We use it to keep track of the 'HTML5' settings, i.e. database (webstorage)
62089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block * and Geolocation.
63e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard */
6410200795554ffeb16bf5662fd66ae6442c6f5cf0John Reckpublic class WebsiteSettingsFragment extends ListFragment implements OnClickListener {
65e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
6610200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck    private static final String EXTRA_SITE = "site";
67e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard    private String LOGTAG = "WebsiteSettingsActivity";
68e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard    private static String sMBStored = null;
69e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard    private SiteAdapter mAdapter = null;
7010200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck    private Site mSite = null;
71e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
7210200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck    static class Site implements Serializable {
73e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        private String mOrigin;
74e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        private String mTitle;
75e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        private Bitmap mIcon;
76089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block        private int mFeatures;
77089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block
78089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block        // These constants provide the set of features that a site may support
79089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block        // They must be consecutive. To add a new feature, add a new FEATURE_XXX
80089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block        // variable with value equal to the current value of FEATURE_COUNT, then
81089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block        // increment FEATURE_COUNT.
82089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block        private final static int FEATURE_WEB_STORAGE = 0;
83f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block        private final static int FEATURE_GEOLOCATION = 1;
84089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block        // The number of features available.
85f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block        private final static int FEATURE_COUNT = 2;
86e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
871ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block        public Site(String origin) {
88e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            mOrigin = origin;
891ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block            mTitle = null;
901ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block            mIcon = null;
91089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            mFeatures = 0;
92089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block        }
93089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block
94089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block        public void addFeature(int feature) {
95089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            mFeatures |= (1 << feature);
96089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block        }
97089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block
98be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch        public void removeFeature(int feature) {
99be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch            mFeatures &= ~(1 << feature);
100be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch        }
101be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch
102089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block        public boolean hasFeature(int feature) {
103089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            return (mFeatures & (1 << feature)) != 0;
104089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block        }
105089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block
106089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block        /**
107089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block         * Gets the number of features supported by this site.
108089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block         */
109089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block        public int getFeatureCount() {
110089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            int count = 0;
111089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            for (int i = 0; i < FEATURE_COUNT; ++i) {
112089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                count += hasFeature(i) ? 1 : 0;
113089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            }
114089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            return count;
115089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block        }
116089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block
117089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block        /**
118089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block         * Gets the ID of the nth (zero-based) feature supported by this site.
119089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block         * The return value is a feature ID - one of the FEATURE_XXX values.
120089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block         * This is required to determine which feature is displayed at a given
121089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block         * position in the list of features for this site. This is used both
122f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block         * when populating the view and when responding to clicks on the list.
123089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block         */
124089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block        public int getFeatureByIndex(int n) {
125089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            int j = -1;
126089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            for (int i = 0; i < FEATURE_COUNT; ++i) {
127089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                j += hasFeature(i) ? 1 : 0;
128089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                if (j == n) {
129089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                    return i;
130089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                }
131089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            }
132089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            return -1;
133e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
134e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
135e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        public String getOrigin() {
136e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            return mOrigin;
137e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
138e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
139e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        public void setTitle(String title) {
140e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            mTitle = title;
141e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
142e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
143e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        public void setIcon(Bitmap icon) {
144e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            mIcon = icon;
145e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
146e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
147e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        public Bitmap getIcon() {
148e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            return mIcon;
149e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
1501ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block
1511ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block        public String getPrettyOrigin() {
1521ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block            return mTitle == null ? null : hideHttp(mOrigin);
1531ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block        }
1541ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block
1551ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block        public String getPrettyTitle() {
1561ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block            return mTitle == null ? hideHttp(mOrigin) : mTitle;
1571ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block        }
1581ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block
1591ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block        private String hideHttp(String str) {
1601ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block            Uri uri = Uri.parse(str);
1611ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block            return "http".equals(uri.getScheme()) ?  str.substring(7) : str;
1621ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block        }
163e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard    }
164e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
165e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard    class SiteAdapter extends ArrayAdapter<Site>
166e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            implements AdapterView.OnItemClickListener {
167e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        private int mResource;
168e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        private LayoutInflater mInflater;
169e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        private Bitmap mDefaultIcon;
170c5702320cd0c66520de57ce8fea9676476cc042aNicolas Roard        private Bitmap mUsageEmptyIcon;
171c5702320cd0c66520de57ce8fea9676476cc042aNicolas Roard        private Bitmap mUsageLowIcon;
172c5702320cd0c66520de57ce8fea9676476cc042aNicolas Roard        private Bitmap mUsageHighIcon;
1739cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard        private Bitmap mLocationAllowedIcon;
1749cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard        private Bitmap mLocationDisallowedIcon;
175e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        private Site mCurrentSite;
176e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
177e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        public SiteAdapter(Context context, int rsc) {
17810200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck            this(context, rsc, null);
17910200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck        }
18010200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck
18110200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck        public SiteAdapter(Context context, int rsc, Site site) {
182e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            super(context, rsc);
183e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            mResource = rsc;
184e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
185e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            mDefaultIcon = BitmapFactory.decodeResource(getResources(),
186be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                    R.drawable.app_web_browser_sm);
187c5702320cd0c66520de57ce8fea9676476cc042aNicolas Roard            mUsageEmptyIcon = BitmapFactory.decodeResource(getResources(),
1889cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                    R.drawable.ic_list_data_off);
189c5702320cd0c66520de57ce8fea9676476cc042aNicolas Roard            mUsageLowIcon = BitmapFactory.decodeResource(getResources(),
1909cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                    R.drawable.ic_list_data_small);
191c5702320cd0c66520de57ce8fea9676476cc042aNicolas Roard            mUsageHighIcon = BitmapFactory.decodeResource(getResources(),
1929cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                    R.drawable.ic_list_data_large);
1939cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard            mLocationAllowedIcon = BitmapFactory.decodeResource(getResources(),
1945a72f1858c2f73be3558c6cdaa2c84b4c36fa748Michael Kolb                    R.drawable.ic_gps_on_holo_dark);
1959cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard            mLocationDisallowedIcon = BitmapFactory.decodeResource(getResources(),
1965a72f1858c2f73be3558c6cdaa2c84b4c36fa748Michael Kolb                    R.drawable.ic_gps_denied_holo_dark);
19710200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck            mCurrentSite = site;
19810200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck            if (mCurrentSite == null) {
19910200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                askForOrigins();
20010200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck            }
201e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
202e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
203089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block        /**
204089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block         * Adds the specified feature to the site corresponding to supplied
205089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block         * origin in the map. Creates the site if it does not already exist.
206089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block         */
20798f42de9a48ee87c007a2d233b6d790779b494b5Henrik Baard        private void addFeatureToSite(Map<String, Site> sites, String origin, int feature) {
208089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            Site site = null;
209089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            if (sites.containsKey(origin)) {
210089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                site = (Site) sites.get(origin);
211089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            } else {
212089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                site = new Site(origin);
213089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                sites.put(origin, site);
214089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            }
215089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            site.addFeature(feature);
216089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block        }
217089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block
21899b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard        public void askForOrigins() {
219089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            // Get the list of origins we want to display.
220089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            // All 'HTML 5 modules' (Database, Geolocation etc) form these
221089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            // origin strings using WebCore::SecurityOrigin::toString(), so it's
222089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            // safe to group origins here. Note that WebCore::SecurityOrigin
223089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            // uses 0 (which is not printed) for the port if the port is the
224089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            // default for the protocol. Eg http://www.google.com and
225089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            // http://www.google.com:80 both record a port of 0 and hence
226089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            // toString() == 'http://www.google.com' for both.
22799b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard
22899b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard            WebStorage.getInstance().getOrigins(new ValueCallback<Map>() {
22999b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                public void onReceiveValue(Map origins) {
23098f42de9a48ee87c007a2d233b6d790779b494b5Henrik Baard                    Map<String, Site> sites = new HashMap<String, Site>();
23199b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                    if (origins != null) {
23299b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                        Iterator<String> iter = origins.keySet().iterator();
23399b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                        while (iter.hasNext()) {
23499b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                            addFeatureToSite(sites, iter.next(), Site.FEATURE_WEB_STORAGE);
23599b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                        }
23699b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                    }
23799b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                    askForGeolocation(sites);
238e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                }
23999b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard            });
24099b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard        }
24199b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard
24298f42de9a48ee87c007a2d233b6d790779b494b5Henrik Baard        public void askForGeolocation(final Map<String, Site> sites) {
2432a6a0f478fb9b67bf7398b1ba7c54ca9c9e430bfSteve Block            GeolocationPermissions.getInstance().getOrigins(new ValueCallback<Set<String> >() {
2442a6a0f478fb9b67bf7398b1ba7c54ca9c9e430bfSteve Block                public void onReceiveValue(Set<String> origins) {
24599b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                    if (origins != null) {
24699b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                        Iterator<String> iter = origins.iterator();
24799b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                        while (iter.hasNext()) {
24899b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                            addFeatureToSite(sites, iter.next(), Site.FEATURE_GEOLOCATION);
24999b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                        }
25099b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                    }
25199b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                    populateIcons(sites);
25299b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                    populateOrigins(sites);
253f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block                }
25499b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard            });
25599b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard        }
256e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
25798f42de9a48ee87c007a2d233b6d790779b494b5Henrik Baard        public void populateIcons(Map<String, Site> sites) {
258ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block            // Create a map from host to origin. This is used to add metadata
259a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch            // (title, icon) for this origin from the bookmarks DB. We must do
260a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch            // the DB access on a background thread.
261a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch            new UpdateFromBookmarksDbTask(this.getContext(), sites).execute();
262a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch        }
263a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch
264a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch        private class UpdateFromBookmarksDbTask extends AsyncTask<Void, Void, Void> {
265a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch
266a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch            private Context mContext;
267a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch            private boolean mDataSetChanged;
268a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch            private Map<String, Site> mSites;
269a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch
270a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch            public UpdateFromBookmarksDbTask(Context ctx, Map<String, Site> sites) {
271a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                mContext = ctx;
272a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                mSites = sites;
273ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block            }
274ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block
275a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch            protected Void doInBackground(Void... unused) {
276a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                HashMap<String, Set<Site>> hosts = new HashMap<String, Set<Site>>();
277a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                Set<Map.Entry<String, Site>> elements = mSites.entrySet();
278a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                Iterator<Map.Entry<String, Site>> originIter = elements.iterator();
279a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                while (originIter.hasNext()) {
280a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                    Map.Entry<String, Site> entry = originIter.next();
281a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                    Site site = entry.getValue();
282a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                    String host = Uri.parse(entry.getKey()).getHost();
283a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                    Set<Site> hostSites = null;
284a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                    if (hosts.containsKey(host)) {
285a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                        hostSites = (Set<Site>)hosts.get(host);
286a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                    } else {
287a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                        hostSites = new HashSet<Site>();
288a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                        hosts.put(host, hostSites);
289a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                    }
290a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                    hostSites.add(site);
291a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                }
292a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch
293a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                // Check the bookmark DB. If we have data for a host used by any of
294a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                // our origins, use it to set their title and favicon
295a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                Cursor c = mContext.getContentResolver().query(Bookmarks.CONTENT_URI,
296a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                        new String[] { Bookmarks.URL, Bookmarks.TITLE, Bookmarks.FAVICON },
297a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                        Bookmarks.IS_FOLDER + " == 0", null, null);
298a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch
299a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                if (c != null) {
300a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                    if (c.moveToFirst()) {
301a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                        int urlIndex = c.getColumnIndex(Bookmarks.URL);
302a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                        int titleIndex = c.getColumnIndex(Bookmarks.TITLE);
303a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                        int faviconIndex = c.getColumnIndex(Bookmarks.FAVICON);
304a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                        do {
305a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                            String url = c.getString(urlIndex);
306a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                            String host = Uri.parse(url).getHost();
307a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                            if (hosts.containsKey(host)) {
308a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                String title = c.getString(titleIndex);
309a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                Bitmap bmp = null;
310a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                byte[] data = c.getBlob(faviconIndex);
311a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                if (data != null) {
312a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                    bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
313fbbd2aced9ace1d063ad166d96a605446a9d2f7eThe Android Open Source Project                                }
314a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                Set matchingSites = (Set) hosts.get(host);
315a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                Iterator<Site> sitesIter = matchingSites.iterator();
316a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                while (sitesIter.hasNext()) {
317a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                    Site site = sitesIter.next();
318a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                    // We should only set the title if the bookmark is for the root
319a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                    // (i.e. www.google.com), as website settings act on the origin
320a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                    // as a whole rather than a single page under that origin. If the
321a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                    // user has bookmarked a page under the root but *not* the root,
322a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                    // then we risk displaying the title of that page which may or
323a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                    // may not have any relevance to the origin.
324a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                    if (url.equals(site.getOrigin()) ||
325a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                            (new String(site.getOrigin()+"/")).equals(url)) {
326a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                        mDataSetChanged = true;
327a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                        site.setTitle(title);
328a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                    }
329a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch
330a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                    if (bmp != null) {
331a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                        mDataSetChanged = true;
332a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                        site.setIcon(bmp);
333a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                    }
33498f42de9a48ee87c007a2d233b6d790779b494b5Henrik Baard                                }
335e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                            }
336a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                        } while (c.moveToNext());
337a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                    }
338a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                    c.close();
339a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                }
340a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch            return null;
341a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch            }
342a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch
343a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch            protected void onPostExecute(Void unused) {
344a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                if (mDataSetChanged) {
345a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                    notifyDataSetChanged();
34698f42de9a48ee87c007a2d233b6d790779b494b5Henrik Baard                }
347e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            }
34899b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard        }
34999b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard
35099b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard
35198f42de9a48ee87c007a2d233b6d790779b494b5Henrik Baard        public void populateOrigins(Map<String, Site> sites) {
35299b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard            clear();
353d95fb21110c4787a9a37c1616ab8490020ceb531Nicolas Roard
354e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            // We can now simply populate our array with Site instances
35598f42de9a48ee87c007a2d233b6d790779b494b5Henrik Baard            Set<Map.Entry<String, Site>> elements = sites.entrySet();
35698f42de9a48ee87c007a2d233b6d790779b494b5Henrik Baard            Iterator<Map.Entry<String, Site>> entryIterator = elements.iterator();
35798f42de9a48ee87c007a2d233b6d790779b494b5Henrik Baard            while (entryIterator.hasNext()) {
35898f42de9a48ee87c007a2d233b6d790779b494b5Henrik Baard                Map.Entry<String, Site> entry = entryIterator.next();
35998f42de9a48ee87c007a2d233b6d790779b494b5Henrik Baard                Site site = entry.getValue();
360e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                add(site);
361e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            }
362e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
36399b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard            notifyDataSetChanged();
36499b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard
365e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            if (getCount() == 0) {
366e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                finish(); // we close the screen
367e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            }
368e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
369e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
370e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        public int getCount() {
371e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            if (mCurrentSite == null) {
372e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                return super.getCount();
373e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            }
374089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            return mCurrentSite.getFeatureCount();
375e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
376e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
377764f0c9765aadeaadd3fbad11b18ab67dd96967dSteve Block        public String sizeValueToString(long bytes) {
378764f0c9765aadeaadd3fbad11b18ab67dd96967dSteve Block            // We display the size in MB, to 1dp, rounding up to the next 0.1MB.
379764f0c9765aadeaadd3fbad11b18ab67dd96967dSteve Block            // bytes should always be greater than zero.
380764f0c9765aadeaadd3fbad11b18ab67dd96967dSteve Block            if (bytes <= 0) {
381be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                Log.e(LOGTAG, "sizeValueToString called with non-positive value: " + bytes);
382e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                return "0";
383e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            }
384764f0c9765aadeaadd3fbad11b18ab67dd96967dSteve Block            float megabytes = (float) bytes / (1024.0F * 1024.0F);
385764f0c9765aadeaadd3fbad11b18ab67dd96967dSteve Block            int truncated = (int) Math.ceil(megabytes * 10.0F);
386764f0c9765aadeaadd3fbad11b18ab67dd96967dSteve Block            float result = (float) (truncated / 10.0F);
387764f0c9765aadeaadd3fbad11b18ab67dd96967dSteve Block            return String.valueOf(result);
388e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
389e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
390e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        /*
391e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard         * If we receive the back event and are displaying
392e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard         * site's settings, we want to go back to the main
393e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard         * list view. If not, we just do nothing (see
394e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard         * dispatchKeyEvent() below).
395e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard         */
396e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        public boolean backKeyPressed() {
397e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            if (mCurrentSite != null) {
398e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                mCurrentSite = null;
39999b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                askForOrigins();
400e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                return true;
401e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            }
402e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            return false;
403e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
404e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
40599b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard        /**
40699b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard         * @hide
40799b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard         * Utility function
40899b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard         * Set the icon according to the usage
40999b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard         */
41099b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard        public void setIconForUsage(ImageView usageIcon, long usageInBytes) {
41199b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard            float usageInMegabytes = (float) usageInBytes / (1024.0F * 1024.0F);
41299b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard            // We set the correct icon:
41399b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard            // 0 < empty < 0.1MB
4149cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard            // 0.1MB < low < 5MB
4159cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard            // 5MB < high
41699b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard            if (usageInMegabytes <= 0.1) {
41799b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                usageIcon.setImageBitmap(mUsageEmptyIcon);
4189cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard            } else if (usageInMegabytes > 0.1 && usageInMegabytes <= 5) {
41999b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                usageIcon.setImageBitmap(mUsageLowIcon);
4209cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard            } else if (usageInMegabytes > 5) {
42199b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                usageIcon.setImageBitmap(mUsageHighIcon);
42299b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard            }
42399b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard        }
42499b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard
42510200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck        @Override
426e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        public View getView(int position, View convertView, ViewGroup parent) {
427e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            View view;
42899b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard            final TextView title;
42999b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard            final TextView subtitle;
430be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch            final ImageView icon;
43199b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard            final ImageView usageIcon;
4329cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard            final ImageView locationIcon;
433be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch            final ImageView featureIcon;
434e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
435e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            if (convertView == null) {
436e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                view = mInflater.inflate(mResource, parent, false);
437e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            } else {
438e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                view = convertView;
439e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            }
440e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
441e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            title = (TextView) view.findViewById(R.id.title);
442e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            subtitle = (TextView) view.findViewById(R.id.subtitle);
443e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            icon = (ImageView) view.findViewById(R.id.icon);
444be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch            featureIcon = (ImageView) view.findViewById(R.id.feature_icon);
445c5702320cd0c66520de57ce8fea9676476cc042aNicolas Roard            usageIcon = (ImageView) view.findViewById(R.id.usage_icon);
446c5702320cd0c66520de57ce8fea9676476cc042aNicolas Roard            locationIcon = (ImageView) view.findViewById(R.id.location_icon);
447c5702320cd0c66520de57ce8fea9676476cc042aNicolas Roard            usageIcon.setVisibility(View.GONE);
448c5702320cd0c66520de57ce8fea9676476cc042aNicolas Roard            locationIcon.setVisibility(View.GONE);
449e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
450e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            if (mCurrentSite == null) {
4514d055a532447cd1adfeac2abebdf365b38fb8a15Steve Block
452e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                Site site = getItem(position);
4531ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block                title.setText(site.getPrettyTitle());
454be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                String subtitleText = site.getPrettyOrigin();
455be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                if (subtitleText != null) {
456be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                    title.setMaxLines(1);
457be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                    title.setSingleLine(true);
458be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                    subtitle.setVisibility(View.VISIBLE);
459be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                    subtitle.setText(subtitleText);
460be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                } else {
461be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                    subtitle.setVisibility(View.GONE);
462be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                    title.setMaxLines(2);
463be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                    title.setSingleLine(false);
464be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                }
465be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch
466e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                icon.setVisibility(View.VISIBLE);
467c5702320cd0c66520de57ce8fea9676476cc042aNicolas Roard                usageIcon.setVisibility(View.INVISIBLE);
468c5702320cd0c66520de57ce8fea9676476cc042aNicolas Roard                locationIcon.setVisibility(View.INVISIBLE);
469be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                featureIcon.setVisibility(View.GONE);
470e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                Bitmap bmp = site.getIcon();
471e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                if (bmp == null) {
472e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                    bmp = mDefaultIcon;
473e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                }
474e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                icon.setImageBitmap(bmp);
475e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                // We set the site as the view's tag,
476e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                // so that we can get it in onItemClick()
477e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                view.setTag(site);
478c5702320cd0c66520de57ce8fea9676476cc042aNicolas Roard
4799cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                String origin = site.getOrigin();
480c5702320cd0c66520de57ce8fea9676476cc042aNicolas Roard                if (site.hasFeature(Site.FEATURE_WEB_STORAGE)) {
4819cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                    WebStorage.getInstance().getUsageForOrigin(origin, new ValueCallback<Long>() {
4829cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                        public void onReceiveValue(Long value) {
4839cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                            if (value != null) {
4849cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                                setIconForUsage(usageIcon, value.longValue());
485be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                                usageIcon.setVisibility(View.VISIBLE);
4869cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                            }
4879cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                        }
4889cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                    });
489c5702320cd0c66520de57ce8fea9676476cc042aNicolas Roard                }
490c5702320cd0c66520de57ce8fea9676476cc042aNicolas Roard
491c5702320cd0c66520de57ce8fea9676476cc042aNicolas Roard                if (site.hasFeature(Site.FEATURE_GEOLOCATION)) {
4929cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                    locationIcon.setVisibility(View.VISIBLE);
4939cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                    GeolocationPermissions.getInstance().getAllowed(origin, new ValueCallback<Boolean>() {
4949cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                        public void onReceiveValue(Boolean allowed) {
4959cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                            if (allowed != null) {
4969cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                                if (allowed.booleanValue()) {
4979cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                                    locationIcon.setImageBitmap(mLocationAllowedIcon);
4989cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                                } else {
4999cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                                    locationIcon.setImageBitmap(mLocationDisallowedIcon);
5009cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                                }
5019cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                            }
5029cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                        }
5039cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                    });
504c5702320cd0c66520de57ce8fea9676476cc042aNicolas Roard                }
505e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            } else {
506e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                icon.setVisibility(View.GONE);
507be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                locationIcon.setVisibility(View.GONE);
508be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                usageIcon.setVisibility(View.GONE);
509be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                featureIcon.setVisibility(View.VISIBLE);
510089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                String origin = mCurrentSite.getOrigin();
511089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                switch (mCurrentSite.getFeatureByIndex(position)) {
512089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                    case Site.FEATURE_WEB_STORAGE:
51399b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                        WebStorage.getInstance().getUsageForOrigin(origin, new ValueCallback<Long>() {
51499b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                            public void onReceiveValue(Long value) {
51599b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                                if (value != null) {
51699b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                                    String usage = sizeValueToString(value.longValue()) + " " + sMBStored;
51799b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                                    title.setText(R.string.webstorage_clear_data_title);
51899b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                                    subtitle.setText(usage);
519be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                                    subtitle.setVisibility(View.VISIBLE);
520be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                                    setIconForUsage(featureIcon, value.longValue());
52199b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                                }
52299b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                            }
52399b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                        });
524089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                        break;
525f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block                    case Site.FEATURE_GEOLOCATION:
526f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block                        title.setText(R.string.geolocation_settings_page_title);
52799b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                        GeolocationPermissions.getInstance().getAllowed(origin, new ValueCallback<Boolean>() {
52899b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                            public void onReceiveValue(Boolean allowed) {
52999b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                                if (allowed != null) {
53099b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                                    if (allowed.booleanValue()) {
53199b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                                        subtitle.setText(R.string.geolocation_settings_page_summary_allowed);
532be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                                        featureIcon.setImageBitmap(mLocationAllowedIcon);
53399b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                                    } else {
53499b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                                        subtitle.setText(R.string.geolocation_settings_page_summary_not_allowed);
535be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                                        featureIcon.setImageBitmap(mLocationDisallowedIcon);
53699b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                                    }
537be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                                    subtitle.setVisibility(View.VISIBLE);
53899b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                                }
53999b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                            }
54099b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                        });
541f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block                        break;
542e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                }
543e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            }
544e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
545e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            return view;
546e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
547e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
548e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        public void onItemClick(AdapterView<?> parent,
549e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                                View view,
550e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                                int position,
551e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                                long id) {
552e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            if (mCurrentSite != null) {
553089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                switch (mCurrentSite.getFeatureByIndex(position)) {
554089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                    case Site.FEATURE_WEB_STORAGE:
555089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                        new AlertDialog.Builder(getContext())
556089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                            .setTitle(R.string.webstorage_clear_data_dialog_title)
557089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                            .setMessage(R.string.webstorage_clear_data_dialog_message)
558089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                            .setPositiveButton(R.string.webstorage_clear_data_dialog_ok_button,
559089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                                               new AlertDialog.OnClickListener() {
560089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                                public void onClick(DialogInterface dlg, int which) {
561089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                                    WebStorage.getInstance().deleteOrigin(mCurrentSite.getOrigin());
562be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                                    // If this site has no more features, then go back to the
563be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                                    // origins list.
564be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                                    mCurrentSite.removeFeature(Site.FEATURE_WEB_STORAGE);
565be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                                    if (mCurrentSite.getFeatureCount() == 0) {
56610200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                                        finish();
567be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                                    }
56899b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                                    askForOrigins();
569be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                                    notifyDataSetChanged();
570089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                                }})
571089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                            .setNegativeButton(R.string.webstorage_clear_data_dialog_cancel_button, null)
572089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                            .setIcon(android.R.drawable.ic_dialog_alert)
573089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                            .show();
574089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                        break;
575f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block                    case Site.FEATURE_GEOLOCATION:
576f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block                        new AlertDialog.Builder(getContext())
577f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block                            .setTitle(R.string.geolocation_settings_page_dialog_title)
578f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block                            .setMessage(R.string.geolocation_settings_page_dialog_message)
579f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block                            .setPositiveButton(R.string.geolocation_settings_page_dialog_ok_button,
580f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block                                               new AlertDialog.OnClickListener() {
581f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block                                public void onClick(DialogInterface dlg, int which) {
582f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block                                    GeolocationPermissions.getInstance().clear(mCurrentSite.getOrigin());
583be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                                    mCurrentSite.removeFeature(Site.FEATURE_GEOLOCATION);
584be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                                    if (mCurrentSite.getFeatureCount() == 0) {
58510200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                                        finish();
586be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                                    }
58799b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                                    askForOrigins();
588be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                                    notifyDataSetChanged();
589f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block                                }})
590f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block                            .setNegativeButton(R.string.geolocation_settings_page_dialog_cancel_button, null)
591f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block                            .setIcon(android.R.drawable.ic_dialog_alert)
592f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block                            .show();
593f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block                        break;
594e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                }
595e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            } else {
59610200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                Site site = (Site) view.getTag();
59710200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                PreferenceActivity activity = (PreferenceActivity) getActivity();
59810200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                if (activity != null) {
59910200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                    Bundle args = new Bundle();
60010200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                    args.putSerializable(EXTRA_SITE, site);
60110200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                    activity.startPreferencePanel(WebsiteSettingsFragment.class.getName(), args, 0,
60210200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                            site.getPrettyTitle(), null, 0);
60310200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                }
604e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            }
605e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
6069e19e44f0b27f12cd07913548c23a885d822e716Ben Murdoch
6079e19e44f0b27f12cd07913548c23a885d822e716Ben Murdoch        public Site currentSite() {
6089e19e44f0b27f12cd07913548c23a885d822e716Ben Murdoch            return mCurrentSite;
6099e19e44f0b27f12cd07913548c23a885d822e716Ben Murdoch        }
610e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard    }
611e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
61210200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck    @Override
61310200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck    public View onCreateView(LayoutInflater inflater, ViewGroup container,
61410200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck            Bundle savedInstanceState) {
61510200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck        View view = inflater.inflate(R.layout.website_settings, container, false);
61610200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck        Bundle args = getArguments();
61710200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck        if (args != null) {
61810200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck            mSite = (Site) args.getSerializable(EXTRA_SITE);
61910200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck        }
62010200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck        if (mSite == null) {
62110200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck            View clear = view.findViewById(R.id.clear_all_button);
62210200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck            clear.setVisibility(View.VISIBLE);
62310200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck            clear.setOnClickListener(this);
624e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
62510200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck        return view;
626e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard    }
627e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
628e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard    @Override
62910200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck    public void onActivityCreated(Bundle savedInstanceState) {
63010200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck        super.onActivityCreated(savedInstanceState);
631e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        if (sMBStored == null) {
632e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            sMBStored = getString(R.string.webstorage_origin_summary_mb_stored);
633e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
63410200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck        mAdapter = new SiteAdapter(getActivity(), R.layout.website_settings_row);
63510200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck        if (mSite != null) {
63610200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck            mAdapter.mCurrentSite = mSite;
63710200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck        }
63810200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck        getListView().setAdapter(mAdapter);
639e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        getListView().setOnItemClickListener(mAdapter);
640e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard    }
641b9daacb7513c5a42000285ad456cc614af1915c0Ben Murdoch
64210200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck    private void finish() {
64310200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck        PreferenceActivity activity = (PreferenceActivity) getActivity();
64410200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck        if (activity != null) {
64510200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck            activity.finishPreferencePanel(this, 0, null);
64610200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck        }
647b9daacb7513c5a42000285ad456cc614af1915c0Ben Murdoch    }
648b9daacb7513c5a42000285ad456cc614af1915c0Ben Murdoch
649b9daacb7513c5a42000285ad456cc614af1915c0Ben Murdoch    @Override
65010200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck    public void onClick(View v) {
65110200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck        switch (v.getId()) {
65210200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck        case R.id.clear_all_button:
65310200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck         // Show the prompt to clear all origins of their data and geolocation permissions.
65410200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck            new AlertDialog.Builder(getActivity())
65510200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                    .setTitle(R.string.website_settings_clear_all_dialog_title)
65610200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                    .setMessage(R.string.website_settings_clear_all_dialog_message)
65710200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                    .setPositiveButton(R.string.website_settings_clear_all_dialog_ok_button,
65810200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                            new AlertDialog.OnClickListener() {
65910200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                                public void onClick(DialogInterface dlg, int which) {
66010200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                                    WebStorage.getInstance().deleteAllData();
66110200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                                    GeolocationPermissions.getInstance().clearAll();
66210200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                                    WebStorageSizeManager.resetLastOutOfSpaceNotificationTime();
66310200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                                    mAdapter.askForOrigins();
66410200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                                    finish();
66510200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                                }})
66610200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                    .setNegativeButton(R.string.website_settings_clear_all_dialog_cancel_button, null)
66710200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                    .setIcon(android.R.drawable.ic_dialog_alert)
66810200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                    .show();
66910200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck            break;
670b9daacb7513c5a42000285ad456cc614af1915c0Ben Murdoch        }
671b9daacb7513c5a42000285ad456cc614af1915c0Ben Murdoch    }
672e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard}
673