diff options
Diffstat (limited to 'src/com/android')
-rw-r--r-- | src/com/android/browser/BrowserPreferencesPage.java | 38 | ||||
-rw-r--r-- | src/com/android/browser/BrowserQuotaPreference.java | 99 | ||||
-rw-r--r-- | src/com/android/browser/BrowserSettings.java | 11 | ||||
-rw-r--r-- | src/com/android/browser/BrowserYesNoPreference.java | 17 | ||||
-rw-r--r-- | src/com/android/browser/OriginSettings.java | 146 | ||||
-rw-r--r-- | src/com/android/browser/WebsiteSettingsActivity.java | 291 |
6 files changed, 311 insertions, 291 deletions
diff --git a/src/com/android/browser/BrowserPreferencesPage.java b/src/com/android/browser/BrowserPreferencesPage.java index c6ce8a6..3a9505f 100644 --- a/src/com/android/browser/BrowserPreferencesPage.java +++ b/src/com/android/browser/BrowserPreferencesPage.java @@ -71,29 +71,25 @@ public class BrowserPreferencesPage extends PreferenceActivity e.setOnPreferenceClickListener(this); PreferenceScreen manageDatabases = (PreferenceScreen) - findPreference(BrowserSettings.PREF_WEBSTORAGE_SETTINGS); - - Preference clearDatabases = - findPreference(BrowserSettings.PREF_WEBSTORAGE_CLEAR_ALL); + findPreference(BrowserSettings.PREF_WEBSITE_SETTINGS); + Intent intent = new Intent(this, WebsiteSettingsActivity.class); + manageDatabases.setIntent(intent); + } - Vector origins = WebStorage.getInstance().getOrigins(); + /* + * We need to set the manageDatabases PreferenceScreen state + * in the onResume(), as the number of origins with databases + * could have changed after calling the WebsiteSettingsActivity. + */ + @Override + protected void onResume() { + super.onResume(); + PreferenceScreen manageDatabases = (PreferenceScreen) + findPreference(BrowserSettings.PREF_WEBSITE_SETTINGS); manageDatabases.setEnabled(false); - clearDatabases.setEnabled(false); - if (origins != null) { - if (origins.size() > 0) { - manageDatabases.setEnabled(true); - clearDatabases.setEnabled(true); - } - for (int i = 0; i < origins.size(); i++) { - OriginSettings origin = - new OriginSettings(this, (String) origins.get(i)); - PreferenceScreen screen = - getPreferenceManager().createPreferenceScreen(this); - origin.setScreen(screen); - origin.setRootScreen(manageDatabases); - origin.setup(); - manageDatabases.addPreference(screen); - } + Vector origins = WebStorage.getInstance().getOrigins(); + if ((origins != null) && (origins.size() > 0)) { + manageDatabases.setEnabled(true); } } diff --git a/src/com/android/browser/BrowserQuotaPreference.java b/src/com/android/browser/BrowserQuotaPreference.java deleted file mode 100644 index e635bb2..0000000 --- a/src/com/android/browser/BrowserQuotaPreference.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (C) 2009 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.browser; - -import android.preference.ListPreference; -import android.content.Context; -import android.preference.PreferenceScreen; -import android.util.AttributeSet; -import android.util.Log; -import android.view.View; -import android.webkit.WebStorage; - -import java.util.Vector; - -/** - * Utility class to display and manage the choosen quota - * for an origin (HTML5 WebStorage feature) - */ -class BrowserQuotaPreference extends ListPreference { - - private String TAG = "BrowserQuotaPreference"; - private OriginSettings mOrigin = null; - private static long sOneMB = 1024 * 1024; - - // This is the constructor called by the inflater - public BrowserQuotaPreference(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public BrowserQuotaPreference(Context context, OriginSettings origin) { - super(context); - mOrigin = origin; - } - - /** - * Find the minimum quota fitting the current usage - * and only show larger quotas in the list - */ - public void setQuotaList () { - CharSequence[] entries = getEntries(); - CharSequence[] values = getEntryValues(); - Vector<CharSequence> listEntries = new Vector<CharSequence>(); - Vector<CharSequence> listValues = new Vector<CharSequence>(); - long usage = 0; - if (mOrigin != null) { - usage = mOrigin.getUsage(); - } - for (int i = 0; i < values.length; i++) { - long value = Long.parseLong(values[i].toString()); - value *= sOneMB; // the string array is expressed in MB - if (value >= usage) { - listEntries.add(entries[i]); - listValues.add(values[i]); - } - } - CharSequence[] newEntries = new CharSequence[listEntries.size()]; - CharSequence[] newValues = new CharSequence[listValues.size()]; - for (int i = 0; i < listEntries.size(); i++) { - newEntries[i] = listEntries.get(i); - newValues[i] = listValues.get(i); - } - setEntries(newEntries); - setEntryValues(newValues); - setValueIndex(0); - } - - @Override - protected View onCreateDialogView() { - setQuotaList(); - return super.onCreateDialogView(); - } - - @Override - protected void onDialogClosed(boolean positiveResult) { - super.onDialogClosed(positiveResult); - if (mOrigin == null) { - return; - } - if (positiveResult) { - long quota = Long.parseLong(getValue()); - quota *= sOneMB; // getValue() is in MB - mOrigin.setQuota(quota); - } - } -} diff --git a/src/com/android/browser/BrowserSettings.java b/src/com/android/browser/BrowserSettings.java index 5276ef9..2d2d39b 100644 --- a/src/com/android/browser/BrowserSettings.java +++ b/src/com/android/browser/BrowserSettings.java @@ -114,20 +114,13 @@ class BrowserSettings extends Observable { "privacy_clear_form_data"; public final static String PREF_CLEAR_PASSWORDS = "privacy_clear_passwords"; - public final static String PREF_CLEAR_DATABASES = - "webstorage_clear_databases"; - public final static String PREF_CLEAR_ALL_DATA = - "webstorage_clear_all_data"; - public final static String PREF_MANAGE_QUOTA = - "webstorage_manage_quota"; public final static String PREF_DEFAULT_QUOTA = "webstorage_default_quota"; public final static String PREF_EXTRAS_RESET_DEFAULTS = "reset_default_preferences"; public final static String PREF_DEBUG_SETTINGS = "debug_menu"; public final static String PREF_GEARS_SETTINGS = "gears_settings"; - public final static String PREF_WEBSTORAGE_SETTINGS = "webstorage_manage_databases"; - public final static String PREF_WEBSTORAGE_CLEAR_ALL = "webstorage_clear_databases"; + public final static String PREF_WEBSITE_SETTINGS = "website_settings"; public final static String PREF_TEXT_SIZE = "text_size"; public final static String PREF_DEFAULT_TEXT_ENCODING = "default_text_encoding"; @@ -491,7 +484,7 @@ class BrowserSettings extends Observable { // Remove all listed databases from the preferences PreferenceActivity activity = (PreferenceActivity) context; PreferenceScreen screen = (PreferenceScreen) - activity.findPreference(BrowserSettings.PREF_WEBSTORAGE_SETTINGS); + activity.findPreference(BrowserSettings.PREF_WEBSITE_SETTINGS); screen.removeAll(); screen.setEnabled(false); } diff --git a/src/com/android/browser/BrowserYesNoPreference.java b/src/com/android/browser/BrowserYesNoPreference.java index 11a577b..ae93882 100644 --- a/src/com/android/browser/BrowserYesNoPreference.java +++ b/src/com/android/browser/BrowserYesNoPreference.java @@ -23,21 +23,11 @@ import android.util.AttributeSet; class BrowserYesNoPreference extends YesNoPreference { - // This is used for the HTML5 pref UI, where we construct - // BrowserYesNoPreference objects on the fly and where we need - // to save the corresponding origin. - OriginSettings mOrigin = null; - // This is the constructor called by the inflater public BrowserYesNoPreference(Context context, AttributeSet attrs) { super(context, attrs); } - public BrowserYesNoPreference(Context context, OriginSettings origin) { - super(context); - mOrigin = origin; - } - @Override protected void onDialogClosed(boolean positiveResult) { super.onDialogClosed(positiveResult); @@ -48,6 +38,7 @@ class BrowserYesNoPreference extends YesNoPreference { Context context = getContext(); if (BrowserSettings.PREF_CLEAR_CACHE.equals(getKey())) { BrowserSettings.getInstance().clearCache(context); + BrowserSettings.getInstance().clearDatabases(context); } else if (BrowserSettings.PREF_CLEAR_COOKIES.equals(getKey())) { BrowserSettings.getInstance().clearCookies(context); } else if (BrowserSettings.PREF_CLEAR_HISTORY.equals(getKey())) { @@ -56,12 +47,6 @@ class BrowserYesNoPreference extends YesNoPreference { BrowserSettings.getInstance().clearFormData(context); } else if (BrowserSettings.PREF_CLEAR_PASSWORDS.equals(getKey())) { BrowserSettings.getInstance().clearPasswords(context); - } else if (BrowserSettings.PREF_CLEAR_DATABASES.equals(getKey())) { - BrowserSettings.getInstance().clearDatabases(context); - } else if (BrowserSettings.PREF_CLEAR_ALL_DATA.equals(getKey())) { - if (mOrigin != null) { - mOrigin.delete(); - } } else if (BrowserSettings.PREF_EXTRAS_RESET_DEFAULTS.equals( getKey())) { BrowserSettings.getInstance().resetDefaultPreferences(context); diff --git a/src/com/android/browser/OriginSettings.java b/src/com/android/browser/OriginSettings.java deleted file mode 100644 index e80888a..0000000 --- a/src/com/android/browser/OriginSettings.java +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright (C) 2009 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.browser; - -import android.content.Context; -import android.preference.Preference; -import android.preference.PreferenceActivity; -import android.preference.PreferenceScreen; -import android.util.Log; -import android.webkit.WebStorage; - -/** - * Manage the settings for an origin. - * We use it to keep track of the HTML5 settings, i.e. database (webstorage). - */ -class OriginSettings { - - private String TAG = "OriginSettings"; - private String mOrigin = null; - private long mQuota = 0; - private long mUsage = 0; - private PreferenceScreen mInfoScreen; - private PreferenceScreen mRootScreen; - private PreferenceActivity mActivity; - - private static String sMBUsed = null; - private static String sNoQuotaLeft = null; - private static String sMBLeft = null; - - public OriginSettings(PreferenceActivity activity, String origin) { - mOrigin = origin; - mUsage = WebStorage.getInstance().getUsageForOrigin(mOrigin); - mQuota = WebStorage.getInstance().getQuotaForOrigin(mOrigin); - mActivity = activity; - if (sMBUsed == null) { - sMBUsed = mActivity.getString( - R.string.webstorage_origin_summary_mb_used); - sNoQuotaLeft = mActivity.getString( - R.string.webstorage_origin_summary_no_quota_left); - sMBLeft = mActivity.getString( - R.string.webstorage_origin_summary_mb_left); - } - } - - public String getOrigin() { - return mOrigin; - } - - public long getQuota() { - return mQuota; - } - - public long getUsage() { - return mUsage; - } - - public void setScreen(PreferenceScreen screen) { - mInfoScreen = screen; - } - - public void setRootScreen(PreferenceScreen screen) { - mRootScreen = screen; - } - - private String sizeValueToString(long value) { - float mb = (float) value / (1024.0F * 1024.0F); - int val = (int) (mb * 10); - float ret = (float) (val / 10.0F); - if (ret <= 0) { - return "0"; - } - return String.valueOf(ret); - } - - public void updateSummary() { - String summary = sizeValueToString(mUsage) + " " + sMBUsed; - if ((mQuota <= 0) || ((mQuota - mUsage) <= 0)) { - summary += ", " + sNoQuotaLeft; - } else { - summary += " (" + sizeValueToString(mQuota - mUsage); - summary += " " + sMBLeft + ")"; - } - mInfoScreen.setSummary(summary); - mActivity.onContentChanged(); - } - - public void setup() { - mInfoScreen.setTitle(mOrigin); - mInfoScreen.setKey(mOrigin); - updateSummary(); - - BrowserQuotaPreference manageSite = new BrowserQuotaPreference(mActivity, this); - BrowserYesNoPreference clearAllData = new BrowserYesNoPreference(mActivity, this); - - manageSite.setTitle(R.string.webstorage_manage_quota_title); - manageSite.setSummary(R.string.webstorage_manage_quota_summary); - manageSite.setKey(BrowserSettings.PREF_MANAGE_QUOTA); - manageSite.setEntries(R.array.webstorage_quota_entries); - manageSite.setEntryValues(R.array.webstorage_quota_entries_values); - - clearAllData.setTitle(R.string.webstorage_clear_data_title); - clearAllData.setSummary(R.string.webstorage_clear_data_summary); - clearAllData.setKey(BrowserSettings.PREF_CLEAR_ALL_DATA); - clearAllData.setDialogTitle(R.string.webstorage_clear_data_dialog_title); - clearAllData.setDialogMessage(R.string.webstorage_clear_data_dialog_message); - clearAllData.setDialogIcon(android.R.drawable.ic_dialog_alert); - - mInfoScreen.addPreference(manageSite); - mInfoScreen.addPreference(clearAllData); - } - - public void setQuota(long quota) { - mQuota = quota; - WebStorage.getInstance().setQuotaForOrigin(mOrigin, mQuota); - mInfoScreen.getDialog().dismiss(); - updateSummary(); - } - - public void delete() { - WebStorage.getInstance().deleteOrigin(mOrigin); - mInfoScreen.removeAll(); - mRootScreen.removePreference(mInfoScreen); - mInfoScreen.getDialog().dismiss(); - if (mRootScreen.getPreferenceCount() == 0) { - mRootScreen.getDialog().dismiss(); - mRootScreen.setEnabled(false); - Preference clearDatabases = mActivity.findPreference( - BrowserSettings.PREF_WEBSTORAGE_CLEAR_ALL); - clearDatabases.setEnabled(false); - } - } -} diff --git a/src/com/android/browser/WebsiteSettingsActivity.java b/src/com/android/browser/WebsiteSettingsActivity.java new file mode 100644 index 0000000..7fea766 --- /dev/null +++ b/src/com/android/browser/WebsiteSettingsActivity.java @@ -0,0 +1,291 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.browser; + +import android.app.AlertDialog; +import android.app.ListActivity; +import android.content.Context; +import android.content.DialogInterface; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.net.Uri; +import android.os.Bundle; +import android.provider.Browser; +import android.util.Log; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.webkit.WebIconDatabase; +import android.webkit.WebStorage; +import android.widget.ArrayAdapter; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemClickListener; +import android.widget.ImageView; +import android.widget.TextView; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Set; +import java.util.Vector; + +/** + * Manage the settings for an origin. + * We use it to keep track of the HTML5 settings, i.e. database (webstorage). + */ +public class WebsiteSettingsActivity extends ListActivity { + + private String LOGTAG = "WebsiteSettingsActivity"; + private static String sMBStored = null; + private SiteAdapter mAdapter = null; + + class Site { + private String mOrigin; + private String mTitle; + private Bitmap mIcon; + + public Site(String origin, String title, Bitmap icon) { + mOrigin = origin; + mTitle = title; + mIcon = icon; + } + + public String getOrigin() { + return mOrigin; + } + + public void setTitle(String title) { + mTitle = title; + } + + public String getTitle() { + return mTitle; + } + + public void setIcon(Bitmap icon) { + mIcon = icon; + } + + public Bitmap getIcon() { + return mIcon; + } + } + + class SiteAdapter extends ArrayAdapter<Site> + implements AdapterView.OnItemClickListener { + private int mResource; + private LayoutInflater mInflater; + private Bitmap mDefaultIcon; + private Site mCurrentSite; + private final static int STORED_DATA = 0; + + public SiteAdapter(Context context, int rsc) { + super(context, rsc); + mResource = rsc; + mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + mDefaultIcon = BitmapFactory.decodeResource(getResources(), + R.drawable.ic_launcher_shortcut_browser_bookmark); + populateOrigins(); + } + + public void populateOrigins() { + clear(); + + // Get the list of origins we want to display + HashMap<String, Site> uris = new HashMap<String, Site>(); + Vector origins = WebStorage.getInstance().getOrigins(); + if (origins != null) { + for (int i = 0; i < origins.size(); i++) { + String origin = (String) origins.get(i); + Site site = new Site(origin, origin, null); + uris.put(Uri.parse(origin).getHost(), site); + } + } + + // Check the bookmark db -- if one of our origin matches, + // we set its title and favicon + Cursor c = getContext().getContentResolver().query(Browser.BOOKMARKS_URI, + new String[] { Browser.BookmarkColumns.URL, Browser.BookmarkColumns.TITLE, + Browser.BookmarkColumns.FAVICON }, "bookmark = 1", null, null); + + if ((c != null) && c.moveToFirst()) { + int urlIndex = c.getColumnIndex(Browser.BookmarkColumns.URL); + int titleIndex = c.getColumnIndex(Browser.BookmarkColumns.TITLE); + int faviconIndex = c.getColumnIndex(Browser.BookmarkColumns.FAVICON); + do { + String url = c.getString(urlIndex); + String host = Uri.parse(url).getHost(); + if (uris.containsKey(host)) { + String title = c.getString(titleIndex); + Site site = uris.get(host); + site.setTitle(title); + byte[] data = c.getBlob(faviconIndex); + if (data != null) { + Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length); + if (bmp != null) { + site.setIcon(bmp); + } + } + } + } while (c.moveToNext()); + } + + // We can now simply populate our array with Site instances + Set keys = uris.keySet(); + Iterator iter = keys.iterator(); + while (iter.hasNext()) { + String origin = (String) iter.next(); + Site site = uris.get(origin); + add(site); + } + + if (getCount() == 0) { + finish(); // we close the screen + } + } + + public int getCount() { + if (mCurrentSite == null) { + return super.getCount(); + } + return 1; // db view + } + + public String sizeValueToString(long value) { + float mb = (float) value / (1024.0F * 1024.0F); + int val = (int) (mb * 10); + float ret = (float) (val / 10.0F); + if (ret <= 0) { + return "0"; + } + return String.valueOf(ret); + } + + /* + * If we receive the back event and are displaying + * site's settings, we want to go back to the main + * list view. If not, we just do nothing (see + * dispatchKeyEvent() below). + */ + public boolean backKeyPressed() { + if (mCurrentSite != null) { + mCurrentSite = null; + populateOrigins(); + notifyDataSetChanged(); + return true; + } + return false; + } + + public View getView(int position, View convertView, ViewGroup parent) { + View view; + TextView title; + TextView subtitle; + ImageView icon; + + if (convertView == null) { + view = mInflater.inflate(mResource, parent, false); + } else { + view = convertView; + } + + title = (TextView) view.findViewById(R.id.title); + subtitle = (TextView) view.findViewById(R.id.subtitle); + icon = (ImageView) view.findViewById(R.id.icon); + + if (mCurrentSite == null) { + Site site = getItem(position); + title.setText(site.getTitle()); + subtitle.setText(site.getOrigin()); + icon.setVisibility(View.VISIBLE); + Bitmap bmp = site.getIcon(); + if (bmp == null) { + bmp = mDefaultIcon; + } + icon.setImageBitmap(bmp); + // We set the site as the view's tag, + // so that we can get it in onItemClick() + view.setTag(site); + } else { + icon.setVisibility(View.GONE); + if (position == STORED_DATA) { + String origin = mCurrentSite.getOrigin(); + long usageValue = WebStorage.getInstance().getUsageForOrigin(origin); + String usage = sizeValueToString(usageValue) + " " + sMBStored; + + title.setText(R.string.webstorage_clear_data_title); + subtitle.setText(usage); + } + } + + return view; + } + + public void onItemClick(AdapterView<?> parent, + View view, + int position, + long id) { + if (mCurrentSite != null) { + if (position == STORED_DATA) { + new AlertDialog.Builder(getContext()) + .setTitle(R.string.webstorage_clear_data_dialog_title) + .setMessage(R.string.webstorage_clear_data_dialog_message) + .setPositiveButton(R.string.webstorage_clear_data_dialog_ok_button, + new AlertDialog.OnClickListener() { + public void onClick(DialogInterface dlg, int which) { + WebStorage.getInstance().deleteOrigin(mCurrentSite.getOrigin()); + mCurrentSite = null; + populateOrigins(); + notifyDataSetChanged(); + }}) + .setNegativeButton(R.string.webstorage_clear_data_dialog_cancel_button, null) + .setIcon(android.R.drawable.ic_dialog_alert) + .show(); + } + } else { + mCurrentSite = (Site) view.getTag(); + notifyDataSetChanged(); + } + } + } + + /** + * Intercepts the back key to immediately notify + * NativeDialog that we are done. + */ + public boolean dispatchKeyEvent(KeyEvent event) { + if ((event.getKeyCode() == KeyEvent.KEYCODE_BACK) + && (event.getAction() == KeyEvent.ACTION_DOWN)) { + if ((mAdapter != null) && (mAdapter.backKeyPressed())){ + return true; // event consumed + } + } + return super.dispatchKeyEvent(event); + } + + @Override + protected void onCreate(Bundle icicle) { + super.onCreate(icicle); + if (sMBStored == null) { + sMBStored = getString(R.string.webstorage_origin_summary_mb_stored); + } + mAdapter = new SiteAdapter(this, R.layout.application); + setListAdapter(mAdapter); + getListView().setOnItemClickListener(mAdapter); + } +} |