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
19e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.app.AlertDialog;
2010200795554ffeb16bf5662fd66ae6442c6f5cf0John Reckimport android.app.ListFragment;
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;
27a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdochimport android.os.AsyncTask;
28e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.os.Bundle;
296128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reckimport android.os.Parcel;
306128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reckimport android.os.Parcelable;
3110200795554ffeb16bf5662fd66ae6442c6f5cf0John Reckimport android.preference.PreferenceActivity;
32b4b87c66e241a7bda0c6c571a82d461775032438Ben Murdochimport android.provider.BrowserContract.Bookmarks;
33e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.util.Log;
34e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.view.LayoutInflater;
35e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.view.View;
3610200795554ffeb16bf5662fd66ae6442c6f5cf0John Reckimport android.view.View.OnClickListener;
37e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.view.ViewGroup;
38f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Blockimport android.webkit.GeolocationPermissions;
3999b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roardimport android.webkit.ValueCallback;
40e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.webkit.WebStorage;
41e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.widget.AdapterView;
4210200795554ffeb16bf5662fd66ae6442c6f5cf0John Reckimport android.widget.ArrayAdapter;
43e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.widget.ImageView;
44e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport android.widget.TextView;
45e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
466128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reckimport com.android.browser.R;
476128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reckimport com.android.browser.WebStorageSizeManager;
486128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reck
49e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport java.util.HashMap;
50ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Blockimport java.util.HashSet;
51e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport java.util.Iterator;
52089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Blockimport java.util.Map;
53e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roardimport java.util.Set;
54e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
55e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard/**
56e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard * Manage the settings for an origin.
57089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block * We use it to keep track of the 'HTML5' settings, i.e. database (webstorage)
58089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block * and Geolocation.
59e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard */
6010200795554ffeb16bf5662fd66ae6442c6f5cf0John Reckpublic class WebsiteSettingsFragment extends ListFragment implements OnClickListener {
61e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
6210200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck    private static final String EXTRA_SITE = "site";
63e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard    private String LOGTAG = "WebsiteSettingsActivity";
64e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard    private static String sMBStored = null;
65e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard    private SiteAdapter mAdapter = null;
6610200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck    private Site mSite = null;
67e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
686128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reck    static class Site implements Parcelable {
69e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        private String mOrigin;
70e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        private String mTitle;
71e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        private Bitmap mIcon;
72089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block        private int mFeatures;
73089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block
74089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block        // These constants provide the set of features that a site may support
75089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block        // They must be consecutive. To add a new feature, add a new FEATURE_XXX
76089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block        // variable with value equal to the current value of FEATURE_COUNT, then
77089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block        // increment FEATURE_COUNT.
78089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block        private final static int FEATURE_WEB_STORAGE = 0;
79f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block        private final static int FEATURE_GEOLOCATION = 1;
80089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block        // The number of features available.
81f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block        private final static int FEATURE_COUNT = 2;
82e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
831ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block        public Site(String origin) {
84e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            mOrigin = origin;
851ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block            mTitle = null;
861ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block            mIcon = null;
87089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            mFeatures = 0;
88089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block        }
89089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block
90089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block        public void addFeature(int feature) {
91089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            mFeatures |= (1 << feature);
92089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block        }
93089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block
94be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch        public void removeFeature(int feature) {
95be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch            mFeatures &= ~(1 << feature);
96be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch        }
97be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch
98089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block        public boolean hasFeature(int feature) {
99089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            return (mFeatures & (1 << feature)) != 0;
100089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block        }
101089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block
102089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block        /**
103089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block         * Gets the number of features supported by this site.
104089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block         */
105089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block        public int getFeatureCount() {
106089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            int count = 0;
107089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            for (int i = 0; i < FEATURE_COUNT; ++i) {
108089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                count += hasFeature(i) ? 1 : 0;
109089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            }
110089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            return count;
111089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block        }
112089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block
113089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block        /**
114089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block         * Gets the ID of the nth (zero-based) feature supported by this site.
115089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block         * The return value is a feature ID - one of the FEATURE_XXX values.
116089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block         * This is required to determine which feature is displayed at a given
117089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block         * position in the list of features for this site. This is used both
118f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block         * when populating the view and when responding to clicks on the list.
119089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block         */
120089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block        public int getFeatureByIndex(int n) {
121089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            int j = -1;
122089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            for (int i = 0; i < FEATURE_COUNT; ++i) {
123089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                j += hasFeature(i) ? 1 : 0;
124089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                if (j == n) {
125089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                    return i;
126089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                }
127089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            }
128089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            return -1;
129e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
130e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
131e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        public String getOrigin() {
132e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            return mOrigin;
133e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
134e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
135e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        public void setTitle(String title) {
136e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            mTitle = title;
137e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
138e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
139e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        public void setIcon(Bitmap icon) {
140e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            mIcon = icon;
141e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
142e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
143e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        public Bitmap getIcon() {
144e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            return mIcon;
145e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
1461ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block
1471ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block        public String getPrettyOrigin() {
1481ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block            return mTitle == null ? null : hideHttp(mOrigin);
1491ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block        }
1501ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block
1511ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block        public String getPrettyTitle() {
1521ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block            return mTitle == null ? hideHttp(mOrigin) : mTitle;
1531ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block        }
1541ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block
1551ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block        private String hideHttp(String str) {
1561ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block            Uri uri = Uri.parse(str);
1571ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block            return "http".equals(uri.getScheme()) ?  str.substring(7) : str;
1581ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block        }
1596128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reck
1606128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reck        @Override
1616128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reck        public int describeContents() {
1626128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reck            return 0;
1636128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reck        }
1646128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reck
1656128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reck        @Override
1666128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reck        public void writeToParcel(Parcel dest, int flags) {
1676128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reck            dest.writeString(mOrigin);
1686128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reck            dest.writeString(mTitle);
1696128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reck            dest.writeInt(mFeatures);
1706128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reck            dest.writeParcelable(mIcon, flags);
1716128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reck        }
1726128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reck
1736128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reck        private Site(Parcel in) {
1746128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reck            mOrigin = in.readString();
1756128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reck            mTitle = in.readString();
1766128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reck            mFeatures = in.readInt();
1776128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reck            mIcon = in.readParcelable(null);
1786128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reck        }
1796128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reck
1806128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reck        public static final Parcelable.Creator<Site> CREATOR
1816128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reck                = new Parcelable.Creator<Site>() {
1826128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reck            public Site createFromParcel(Parcel in) {
1836128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reck                return new Site(in);
1846128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reck            }
1856128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reck
1866128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reck            public Site[] newArray(int size) {
1876128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reck                return new Site[size];
1886128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reck            }
1896128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reck        };
1906128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reck
191e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard    }
192e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
193e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard    class SiteAdapter extends ArrayAdapter<Site>
194e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            implements AdapterView.OnItemClickListener {
195e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        private int mResource;
196e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        private LayoutInflater mInflater;
197e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        private Bitmap mDefaultIcon;
198c5702320cd0c66520de57ce8fea9676476cc042aNicolas Roard        private Bitmap mUsageEmptyIcon;
199c5702320cd0c66520de57ce8fea9676476cc042aNicolas Roard        private Bitmap mUsageLowIcon;
200c5702320cd0c66520de57ce8fea9676476cc042aNicolas Roard        private Bitmap mUsageHighIcon;
2019cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard        private Bitmap mLocationAllowedIcon;
2029cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard        private Bitmap mLocationDisallowedIcon;
203e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        private Site mCurrentSite;
204e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
205e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        public SiteAdapter(Context context, int rsc) {
20610200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck            this(context, rsc, null);
20710200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck        }
20810200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck
20910200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck        public SiteAdapter(Context context, int rsc, Site site) {
210e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            super(context, rsc);
211e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            mResource = rsc;
212e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
213e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            mDefaultIcon = BitmapFactory.decodeResource(getResources(),
214be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                    R.drawable.app_web_browser_sm);
215c5702320cd0c66520de57ce8fea9676476cc042aNicolas Roard            mUsageEmptyIcon = BitmapFactory.decodeResource(getResources(),
2169cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                    R.drawable.ic_list_data_off);
217c5702320cd0c66520de57ce8fea9676476cc042aNicolas Roard            mUsageLowIcon = BitmapFactory.decodeResource(getResources(),
2189cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                    R.drawable.ic_list_data_small);
219c5702320cd0c66520de57ce8fea9676476cc042aNicolas Roard            mUsageHighIcon = BitmapFactory.decodeResource(getResources(),
2209cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                    R.drawable.ic_list_data_large);
2219cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard            mLocationAllowedIcon = BitmapFactory.decodeResource(getResources(),
2225a72f1858c2f73be3558c6cdaa2c84b4c36fa748Michael Kolb                    R.drawable.ic_gps_on_holo_dark);
2239cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard            mLocationDisallowedIcon = BitmapFactory.decodeResource(getResources(),
2245a72f1858c2f73be3558c6cdaa2c84b4c36fa748Michael Kolb                    R.drawable.ic_gps_denied_holo_dark);
22510200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck            mCurrentSite = site;
22610200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck            if (mCurrentSite == null) {
22710200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                askForOrigins();
22810200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck            }
229e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
230e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
231089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block        /**
232089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block         * Adds the specified feature to the site corresponding to supplied
233089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block         * origin in the map. Creates the site if it does not already exist.
234089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block         */
23598f42de9a48ee87c007a2d233b6d790779b494b5Henrik Baard        private void addFeatureToSite(Map<String, Site> sites, String origin, int feature) {
236089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            Site site = null;
237089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            if (sites.containsKey(origin)) {
238089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                site = (Site) sites.get(origin);
239089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            } else {
240089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                site = new Site(origin);
241089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                sites.put(origin, site);
242089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            }
243089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            site.addFeature(feature);
244089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block        }
245089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block
24699b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard        public void askForOrigins() {
247089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            // Get the list of origins we want to display.
248089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            // All 'HTML 5 modules' (Database, Geolocation etc) form these
249089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            // origin strings using WebCore::SecurityOrigin::toString(), so it's
250089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            // safe to group origins here. Note that WebCore::SecurityOrigin
251089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            // uses 0 (which is not printed) for the port if the port is the
252089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            // default for the protocol. Eg http://www.google.com and
253089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            // http://www.google.com:80 both record a port of 0 and hence
254089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            // toString() == 'http://www.google.com' for both.
25599b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard
25699b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard            WebStorage.getInstance().getOrigins(new ValueCallback<Map>() {
25799b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                public void onReceiveValue(Map origins) {
25898f42de9a48ee87c007a2d233b6d790779b494b5Henrik Baard                    Map<String, Site> sites = new HashMap<String, Site>();
25999b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                    if (origins != null) {
26099b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                        Iterator<String> iter = origins.keySet().iterator();
26199b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                        while (iter.hasNext()) {
26299b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                            addFeatureToSite(sites, iter.next(), Site.FEATURE_WEB_STORAGE);
26399b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                        }
26499b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                    }
26599b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                    askForGeolocation(sites);
266e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                }
26799b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard            });
26899b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard        }
26999b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard
27098f42de9a48ee87c007a2d233b6d790779b494b5Henrik Baard        public void askForGeolocation(final Map<String, Site> sites) {
2712a6a0f478fb9b67bf7398b1ba7c54ca9c9e430bfSteve Block            GeolocationPermissions.getInstance().getOrigins(new ValueCallback<Set<String> >() {
2722a6a0f478fb9b67bf7398b1ba7c54ca9c9e430bfSteve Block                public void onReceiveValue(Set<String> origins) {
27399b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                    if (origins != null) {
27499b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                        Iterator<String> iter = origins.iterator();
27599b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                        while (iter.hasNext()) {
27699b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                            addFeatureToSite(sites, iter.next(), Site.FEATURE_GEOLOCATION);
27799b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                        }
27899b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                    }
27999b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                    populateIcons(sites);
28099b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                    populateOrigins(sites);
281f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block                }
28299b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard            });
28399b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard        }
284e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
28598f42de9a48ee87c007a2d233b6d790779b494b5Henrik Baard        public void populateIcons(Map<String, Site> sites) {
286ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block            // Create a map from host to origin. This is used to add metadata
287a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch            // (title, icon) for this origin from the bookmarks DB. We must do
288a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch            // the DB access on a background thread.
289a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch            new UpdateFromBookmarksDbTask(this.getContext(), sites).execute();
290a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch        }
291a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch
292a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch        private class UpdateFromBookmarksDbTask extends AsyncTask<Void, Void, Void> {
293a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch
294a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch            private Context mContext;
295a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch            private boolean mDataSetChanged;
296a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch            private Map<String, Site> mSites;
297a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch
298a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch            public UpdateFromBookmarksDbTask(Context ctx, Map<String, Site> sites) {
299914c5591baeb86bf30a5bc28930071442a822d60Ben Murdoch                mContext = ctx.getApplicationContext();
300a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                mSites = sites;
301ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block            }
302ee0d639003a5dec32cf45416b0c751def2d4d25aSteve Block
303a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch            protected Void doInBackground(Void... unused) {
304a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                HashMap<String, Set<Site>> hosts = new HashMap<String, Set<Site>>();
305a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                Set<Map.Entry<String, Site>> elements = mSites.entrySet();
306a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                Iterator<Map.Entry<String, Site>> originIter = elements.iterator();
307a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                while (originIter.hasNext()) {
308a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                    Map.Entry<String, Site> entry = originIter.next();
309a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                    Site site = entry.getValue();
310a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                    String host = Uri.parse(entry.getKey()).getHost();
311a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                    Set<Site> hostSites = null;
312a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                    if (hosts.containsKey(host)) {
313a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                        hostSites = (Set<Site>)hosts.get(host);
314a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                    } else {
315a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                        hostSites = new HashSet<Site>();
316a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                        hosts.put(host, hostSites);
317a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                    }
318a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                    hostSites.add(site);
319a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                }
320a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch
321a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                // Check the bookmark DB. If we have data for a host used by any of
322a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                // our origins, use it to set their title and favicon
323a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                Cursor c = mContext.getContentResolver().query(Bookmarks.CONTENT_URI,
324a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                        new String[] { Bookmarks.URL, Bookmarks.TITLE, Bookmarks.FAVICON },
325a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                        Bookmarks.IS_FOLDER + " == 0", null, null);
326a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch
327a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                if (c != null) {
328a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                    if (c.moveToFirst()) {
329a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                        int urlIndex = c.getColumnIndex(Bookmarks.URL);
330a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                        int titleIndex = c.getColumnIndex(Bookmarks.TITLE);
331a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                        int faviconIndex = c.getColumnIndex(Bookmarks.FAVICON);
332a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                        do {
333a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                            String url = c.getString(urlIndex);
334a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                            String host = Uri.parse(url).getHost();
335a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                            if (hosts.containsKey(host)) {
336a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                String title = c.getString(titleIndex);
337a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                Bitmap bmp = null;
338a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                byte[] data = c.getBlob(faviconIndex);
339a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                if (data != null) {
340a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                    bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
341fbbd2aced9ace1d063ad166d96a605446a9d2f7eThe Android Open Source Project                                }
342a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                Set matchingSites = (Set) hosts.get(host);
343a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                Iterator<Site> sitesIter = matchingSites.iterator();
344a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                while (sitesIter.hasNext()) {
345a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                    Site site = sitesIter.next();
346a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                    // We should only set the title if the bookmark is for the root
347a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                    // (i.e. www.google.com), as website settings act on the origin
348a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                    // as a whole rather than a single page under that origin. If the
349a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                    // user has bookmarked a page under the root but *not* the root,
350a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                    // then we risk displaying the title of that page which may or
351a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                    // may not have any relevance to the origin.
352a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                    if (url.equals(site.getOrigin()) ||
353a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                            (new String(site.getOrigin()+"/")).equals(url)) {
354a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                        mDataSetChanged = true;
355a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                        site.setTitle(title);
356a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                    }
357a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch
358a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                    if (bmp != null) {
359a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                        mDataSetChanged = true;
360a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                        site.setIcon(bmp);
361a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                                    }
36298f42de9a48ee87c007a2d233b6d790779b494b5Henrik Baard                                }
363e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                            }
364a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                        } while (c.moveToNext());
365a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                    }
366a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                    c.close();
367a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                }
368a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch            return null;
369a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch            }
370a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch
371a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch            protected void onPostExecute(Void unused) {
372a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                if (mDataSetChanged) {
373a7c9a5505a0a1de5da3041a704070c3de9c129d9Ben Murdoch                    notifyDataSetChanged();
37498f42de9a48ee87c007a2d233b6d790779b494b5Henrik Baard                }
375e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            }
37699b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard        }
37799b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard
37899b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard
37998f42de9a48ee87c007a2d233b6d790779b494b5Henrik Baard        public void populateOrigins(Map<String, Site> sites) {
38099b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard            clear();
381d95fb21110c4787a9a37c1616ab8490020ceb531Nicolas Roard
382e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            // We can now simply populate our array with Site instances
38398f42de9a48ee87c007a2d233b6d790779b494b5Henrik Baard            Set<Map.Entry<String, Site>> elements = sites.entrySet();
38498f42de9a48ee87c007a2d233b6d790779b494b5Henrik Baard            Iterator<Map.Entry<String, Site>> entryIterator = elements.iterator();
38598f42de9a48ee87c007a2d233b6d790779b494b5Henrik Baard            while (entryIterator.hasNext()) {
38698f42de9a48ee87c007a2d233b6d790779b494b5Henrik Baard                Map.Entry<String, Site> entry = entryIterator.next();
38798f42de9a48ee87c007a2d233b6d790779b494b5Henrik Baard                Site site = entry.getValue();
388e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                add(site);
389e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            }
390e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
39199b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard            notifyDataSetChanged();
39299b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard
393e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            if (getCount() == 0) {
394e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                finish(); // we close the screen
395e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            }
396e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
397e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
398e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        public int getCount() {
399e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            if (mCurrentSite == null) {
400e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                return super.getCount();
401e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            }
402089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block            return mCurrentSite.getFeatureCount();
403e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
404e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
405764f0c9765aadeaadd3fbad11b18ab67dd96967dSteve Block        public String sizeValueToString(long bytes) {
406764f0c9765aadeaadd3fbad11b18ab67dd96967dSteve Block            // We display the size in MB, to 1dp, rounding up to the next 0.1MB.
407764f0c9765aadeaadd3fbad11b18ab67dd96967dSteve Block            // bytes should always be greater than zero.
408764f0c9765aadeaadd3fbad11b18ab67dd96967dSteve Block            if (bytes <= 0) {
409be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                Log.e(LOGTAG, "sizeValueToString called with non-positive value: " + bytes);
410e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                return "0";
411e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            }
412764f0c9765aadeaadd3fbad11b18ab67dd96967dSteve Block            float megabytes = (float) bytes / (1024.0F * 1024.0F);
413764f0c9765aadeaadd3fbad11b18ab67dd96967dSteve Block            int truncated = (int) Math.ceil(megabytes * 10.0F);
414764f0c9765aadeaadd3fbad11b18ab67dd96967dSteve Block            float result = (float) (truncated / 10.0F);
415764f0c9765aadeaadd3fbad11b18ab67dd96967dSteve Block            return String.valueOf(result);
416e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
417e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
418e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        /*
419e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard         * If we receive the back event and are displaying
420e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard         * site's settings, we want to go back to the main
421e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard         * list view. If not, we just do nothing (see
422e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard         * dispatchKeyEvent() below).
423e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard         */
424e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        public boolean backKeyPressed() {
425e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            if (mCurrentSite != null) {
426e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                mCurrentSite = null;
42799b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                askForOrigins();
428e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                return true;
429e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            }
430e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            return false;
431e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
432e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
43399b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard        /**
43499b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard         * @hide
43599b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard         * Utility function
43699b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard         * Set the icon according to the usage
43799b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard         */
43899b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard        public void setIconForUsage(ImageView usageIcon, long usageInBytes) {
43999b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard            float usageInMegabytes = (float) usageInBytes / (1024.0F * 1024.0F);
44099b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard            // We set the correct icon:
44199b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard            // 0 < empty < 0.1MB
4429cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard            // 0.1MB < low < 5MB
4439cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard            // 5MB < high
44499b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard            if (usageInMegabytes <= 0.1) {
44599b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                usageIcon.setImageBitmap(mUsageEmptyIcon);
4469cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard            } else if (usageInMegabytes > 0.1 && usageInMegabytes <= 5) {
44799b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                usageIcon.setImageBitmap(mUsageLowIcon);
4489cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard            } else if (usageInMegabytes > 5) {
44999b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                usageIcon.setImageBitmap(mUsageHighIcon);
45099b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard            }
45199b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard        }
45299b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard
45310200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck        @Override
454e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        public View getView(int position, View convertView, ViewGroup parent) {
455e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            View view;
45699b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard            final TextView title;
45799b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard            final TextView subtitle;
458be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch            final ImageView icon;
45999b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard            final ImageView usageIcon;
4609cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard            final ImageView locationIcon;
461be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch            final ImageView featureIcon;
462e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
463e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            if (convertView == null) {
464e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                view = mInflater.inflate(mResource, parent, false);
465e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            } else {
466e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                view = convertView;
467e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            }
468e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
469e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            title = (TextView) view.findViewById(R.id.title);
470e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            subtitle = (TextView) view.findViewById(R.id.subtitle);
471e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            icon = (ImageView) view.findViewById(R.id.icon);
472be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch            featureIcon = (ImageView) view.findViewById(R.id.feature_icon);
473c5702320cd0c66520de57ce8fea9676476cc042aNicolas Roard            usageIcon = (ImageView) view.findViewById(R.id.usage_icon);
474c5702320cd0c66520de57ce8fea9676476cc042aNicolas Roard            locationIcon = (ImageView) view.findViewById(R.id.location_icon);
475c5702320cd0c66520de57ce8fea9676476cc042aNicolas Roard            usageIcon.setVisibility(View.GONE);
476c5702320cd0c66520de57ce8fea9676476cc042aNicolas Roard            locationIcon.setVisibility(View.GONE);
477e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
478e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            if (mCurrentSite == null) {
4794d055a532447cd1adfeac2abebdf365b38fb8a15Steve Block
480e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                Site site = getItem(position);
4811ad98cf1e4fb36e7164024f8c1a1098ac2ecaed6Steve Block                title.setText(site.getPrettyTitle());
482be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                String subtitleText = site.getPrettyOrigin();
483be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                if (subtitleText != null) {
484be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                    title.setMaxLines(1);
485be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                    title.setSingleLine(true);
486be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                    subtitle.setVisibility(View.VISIBLE);
487be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                    subtitle.setText(subtitleText);
488be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                } else {
489be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                    subtitle.setVisibility(View.GONE);
490be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                    title.setMaxLines(2);
491be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                    title.setSingleLine(false);
492be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                }
493be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch
494e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                icon.setVisibility(View.VISIBLE);
495c5702320cd0c66520de57ce8fea9676476cc042aNicolas Roard                usageIcon.setVisibility(View.INVISIBLE);
496c5702320cd0c66520de57ce8fea9676476cc042aNicolas Roard                locationIcon.setVisibility(View.INVISIBLE);
497be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                featureIcon.setVisibility(View.GONE);
498e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                Bitmap bmp = site.getIcon();
499e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                if (bmp == null) {
500e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                    bmp = mDefaultIcon;
501e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                }
502e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                icon.setImageBitmap(bmp);
503e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                // We set the site as the view's tag,
504e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                // so that we can get it in onItemClick()
505e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                view.setTag(site);
506c5702320cd0c66520de57ce8fea9676476cc042aNicolas Roard
5079cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                String origin = site.getOrigin();
508c5702320cd0c66520de57ce8fea9676476cc042aNicolas Roard                if (site.hasFeature(Site.FEATURE_WEB_STORAGE)) {
5099cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                    WebStorage.getInstance().getUsageForOrigin(origin, new ValueCallback<Long>() {
5109cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                        public void onReceiveValue(Long value) {
5119cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                            if (value != null) {
5129cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                                setIconForUsage(usageIcon, value.longValue());
513be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                                usageIcon.setVisibility(View.VISIBLE);
5149cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                            }
5159cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                        }
5169cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                    });
517c5702320cd0c66520de57ce8fea9676476cc042aNicolas Roard                }
518c5702320cd0c66520de57ce8fea9676476cc042aNicolas Roard
519c5702320cd0c66520de57ce8fea9676476cc042aNicolas Roard                if (site.hasFeature(Site.FEATURE_GEOLOCATION)) {
5209cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                    locationIcon.setVisibility(View.VISIBLE);
5219cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                    GeolocationPermissions.getInstance().getAllowed(origin, new ValueCallback<Boolean>() {
5229cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                        public void onReceiveValue(Boolean allowed) {
5239cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                            if (allowed != null) {
5249cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                                if (allowed.booleanValue()) {
5259cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                                    locationIcon.setImageBitmap(mLocationAllowedIcon);
5269cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                                } else {
5279cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                                    locationIcon.setImageBitmap(mLocationDisallowedIcon);
5289cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                                }
5299cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                            }
5309cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                        }
5319cdaba5e3f22fe9bdfc3b89c45e71d7497f5e9daNicolas Roard                    });
532c5702320cd0c66520de57ce8fea9676476cc042aNicolas Roard                }
533e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            } else {
534e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                icon.setVisibility(View.GONE);
535be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                locationIcon.setVisibility(View.GONE);
536be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                usageIcon.setVisibility(View.GONE);
537be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                featureIcon.setVisibility(View.VISIBLE);
538089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                String origin = mCurrentSite.getOrigin();
539089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                switch (mCurrentSite.getFeatureByIndex(position)) {
540089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                    case Site.FEATURE_WEB_STORAGE:
54199b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                        WebStorage.getInstance().getUsageForOrigin(origin, new ValueCallback<Long>() {
54299b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                            public void onReceiveValue(Long value) {
54399b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                                if (value != null) {
54499b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                                    String usage = sizeValueToString(value.longValue()) + " " + sMBStored;
54599b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                                    title.setText(R.string.webstorage_clear_data_title);
54699b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                                    subtitle.setText(usage);
547be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                                    subtitle.setVisibility(View.VISIBLE);
548be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                                    setIconForUsage(featureIcon, value.longValue());
54999b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                                }
55099b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                            }
55199b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                        });
552089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                        break;
553f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block                    case Site.FEATURE_GEOLOCATION:
554f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block                        title.setText(R.string.geolocation_settings_page_title);
55599b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                        GeolocationPermissions.getInstance().getAllowed(origin, new ValueCallback<Boolean>() {
55699b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                            public void onReceiveValue(Boolean allowed) {
55799b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                                if (allowed != null) {
55899b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                                    if (allowed.booleanValue()) {
55999b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                                        subtitle.setText(R.string.geolocation_settings_page_summary_allowed);
560be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                                        featureIcon.setImageBitmap(mLocationAllowedIcon);
56199b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                                    } else {
56299b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                                        subtitle.setText(R.string.geolocation_settings_page_summary_not_allowed);
563be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                                        featureIcon.setImageBitmap(mLocationDisallowedIcon);
56499b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                                    }
565be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                                    subtitle.setVisibility(View.VISIBLE);
56699b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                                }
56799b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                            }
56899b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                        });
569f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block                        break;
570e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                }
571e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            }
572e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
573e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            return view;
574e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
575e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
576e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        public void onItemClick(AdapterView<?> parent,
577e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                                View view,
578e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                                int position,
579e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                                long id) {
580e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            if (mCurrentSite != null) {
581089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                switch (mCurrentSite.getFeatureByIndex(position)) {
582089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                    case Site.FEATURE_WEB_STORAGE:
583089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                        new AlertDialog.Builder(getContext())
584089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                            .setMessage(R.string.webstorage_clear_data_dialog_message)
585089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                            .setPositiveButton(R.string.webstorage_clear_data_dialog_ok_button,
586089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                                               new AlertDialog.OnClickListener() {
587089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                                public void onClick(DialogInterface dlg, int which) {
588089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                                    WebStorage.getInstance().deleteOrigin(mCurrentSite.getOrigin());
589be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                                    // If this site has no more features, then go back to the
590be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                                    // origins list.
591be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                                    mCurrentSite.removeFeature(Site.FEATURE_WEB_STORAGE);
592be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                                    if (mCurrentSite.getFeatureCount() == 0) {
59310200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                                        finish();
594be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                                    }
59599b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                                    askForOrigins();
596be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                                    notifyDataSetChanged();
597089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                                }})
598089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                            .setNegativeButton(R.string.webstorage_clear_data_dialog_cancel_button, null)
599089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                            .setIcon(android.R.drawable.ic_dialog_alert)
600089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                            .show();
601089ce3ae9bca8a7f5bb84605dfabb7c65aa8aa5bSteve Block                        break;
602f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block                    case Site.FEATURE_GEOLOCATION:
603f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block                        new AlertDialog.Builder(getContext())
604f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block                            .setMessage(R.string.geolocation_settings_page_dialog_message)
605f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block                            .setPositiveButton(R.string.geolocation_settings_page_dialog_ok_button,
606f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block                                               new AlertDialog.OnClickListener() {
607f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block                                public void onClick(DialogInterface dlg, int which) {
608f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block                                    GeolocationPermissions.getInstance().clear(mCurrentSite.getOrigin());
609be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                                    mCurrentSite.removeFeature(Site.FEATURE_GEOLOCATION);
610be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                                    if (mCurrentSite.getFeatureCount() == 0) {
61110200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                                        finish();
612be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                                    }
61399b3ae1a384981f96fca5432f3d20bf4e8d13667Nicolas Roard                                    askForOrigins();
614be9560dbeb44338070170816b1ca45b2125b7ad9Ben Murdoch                                    notifyDataSetChanged();
615f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block                                }})
616f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block                            .setNegativeButton(R.string.geolocation_settings_page_dialog_cancel_button, null)
617f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block                            .setIcon(android.R.drawable.ic_dialog_alert)
618f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block                            .show();
619f344d03c0b01d30575ba1ddd1ed340705c6f5a97Steve Block                        break;
620e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard                }
621e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            } else {
62210200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                Site site = (Site) view.getTag();
62310200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                PreferenceActivity activity = (PreferenceActivity) getActivity();
62410200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                if (activity != null) {
62510200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                    Bundle args = new Bundle();
6266128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reck                    args.putParcelable(EXTRA_SITE, site);
62710200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                    activity.startPreferencePanel(WebsiteSettingsFragment.class.getName(), args, 0,
62810200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                            site.getPrettyTitle(), null, 0);
62910200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                }
630e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            }
631e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
6329e19e44f0b27f12cd07913548c23a885d822e716Ben Murdoch
6339e19e44f0b27f12cd07913548c23a885d822e716Ben Murdoch        public Site currentSite() {
6349e19e44f0b27f12cd07913548c23a885d822e716Ben Murdoch            return mCurrentSite;
6359e19e44f0b27f12cd07913548c23a885d822e716Ben Murdoch        }
636e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard    }
637e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
63810200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck    @Override
63910200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck    public View onCreateView(LayoutInflater inflater, ViewGroup container,
64010200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck            Bundle savedInstanceState) {
64110200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck        View view = inflater.inflate(R.layout.website_settings, container, false);
64210200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck        Bundle args = getArguments();
64310200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck        if (args != null) {
6446128f87cd69a3faabfd6bf101fc7c60f453e7a4dJohn Reck            mSite = (Site) args.getParcelable(EXTRA_SITE);
64510200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck        }
64610200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck        if (mSite == null) {
64710200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck            View clear = view.findViewById(R.id.clear_all_button);
64810200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck            clear.setVisibility(View.VISIBLE);
64910200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck            clear.setOnClickListener(this);
650e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
65110200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck        return view;
652e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard    }
653e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard
654e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard    @Override
65510200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck    public void onActivityCreated(Bundle savedInstanceState) {
65610200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck        super.onActivityCreated(savedInstanceState);
657e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        if (sMBStored == null) {
658e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard            sMBStored = getString(R.string.webstorage_origin_summary_mb_stored);
659e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        }
66010200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck        mAdapter = new SiteAdapter(getActivity(), R.layout.website_settings_row);
66110200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck        if (mSite != null) {
66210200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck            mAdapter.mCurrentSite = mSite;
66310200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck        }
66410200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck        getListView().setAdapter(mAdapter);
665e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard        getListView().setOnItemClickListener(mAdapter);
666e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard    }
667b9daacb7513c5a42000285ad456cc614af1915c0Ben Murdoch
66879c702d5979e359b5513adc25eecf27dbae307fdJohn Reck    @Override
66979c702d5979e359b5513adc25eecf27dbae307fdJohn Reck    public void onResume() {
67079c702d5979e359b5513adc25eecf27dbae307fdJohn Reck        super.onResume();
67179c702d5979e359b5513adc25eecf27dbae307fdJohn Reck        mAdapter.askForOrigins();
67279c702d5979e359b5513adc25eecf27dbae307fdJohn Reck    }
67379c702d5979e359b5513adc25eecf27dbae307fdJohn Reck
67410200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck    private void finish() {
67510200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck        PreferenceActivity activity = (PreferenceActivity) getActivity();
67610200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck        if (activity != null) {
67710200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck            activity.finishPreferencePanel(this, 0, null);
67810200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck        }
679b9daacb7513c5a42000285ad456cc614af1915c0Ben Murdoch    }
680b9daacb7513c5a42000285ad456cc614af1915c0Ben Murdoch
681b9daacb7513c5a42000285ad456cc614af1915c0Ben Murdoch    @Override
68210200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck    public void onClick(View v) {
68310200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck        switch (v.getId()) {
68410200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck        case R.id.clear_all_button:
68510200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck         // Show the prompt to clear all origins of their data and geolocation permissions.
68610200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck            new AlertDialog.Builder(getActivity())
68710200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                    .setMessage(R.string.website_settings_clear_all_dialog_message)
68810200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                    .setPositiveButton(R.string.website_settings_clear_all_dialog_ok_button,
68910200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                            new AlertDialog.OnClickListener() {
69010200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                                public void onClick(DialogInterface dlg, int which) {
69110200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                                    WebStorage.getInstance().deleteAllData();
69210200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                                    GeolocationPermissions.getInstance().clearAll();
69310200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                                    WebStorageSizeManager.resetLastOutOfSpaceNotificationTime();
69410200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                                    mAdapter.askForOrigins();
69510200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                                    finish();
69610200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                                }})
69710200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                    .setNegativeButton(R.string.website_settings_clear_all_dialog_cancel_button, null)
69810200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                    .setIcon(android.R.drawable.ic_dialog_alert)
69910200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck                    .show();
70010200795554ffeb16bf5662fd66ae6442c6f5cf0John Reck            break;
701b9daacb7513c5a42000285ad456cc614af1915c0Ben Murdoch        }
702b9daacb7513c5a42000285ad456cc614af1915c0Ben Murdoch    }
703e46990ea925f41bdb4d504c91a681e826f4b6eb1Nicolas Roard}
704