Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(288)

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/preferences/website/Website.java

Issue 850813002: Upstream Site Settings. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@location_settings_singleton
Patch Set: use findbugs annotations; fix test Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/android/java/src/org/chromium/chrome/browser/preferences/website/Website.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/Website.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/Website.java
new file mode 100644
index 0000000000000000000000000000000000000000..b53f851e7f23fc6a5a68f7aad9aa57ee93be18cc
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/Website.java
@@ -0,0 +1,533 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.preferences.website;
+
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.ContentSettingsType;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Website is a class for storing information about a website and its associated permissions.
+ */
+public class Website implements Serializable {
+
+ static final int INVALID_CAMERA_OR_MICROPHONE_ACCESS = 0;
+ static final int CAMERA_ACCESS_ALLOWED = 1;
+ static final int MICROPHONE_AND_CAMERA_ACCESS_ALLOWED = 2;
+ static final int MICROPHONE_ACCESS_ALLOWED = 3;
+ static final int CAMERA_ACCESS_DENIED = 4;
+ static final int MICROPHONE_AND_CAMERA_ACCESS_DENIED = 5;
+ static final int MICROPHONE_ACCESS_DENIED = 6;
+
+ /**
+ * A website permission type (e.g. gelocation or popups) and associated data: the title and
+ * icon, and its possible permission states: Allow/Block or Ask/Block, etc.
+ */
+ public static class PermissionDataEntry {
+ /**
+ * The resource id of this permission entry's icon.
+ */
+ public int iconResourceId = 0;
+
+ /**
+ * The resource id of this permission entry's title (short version),
+ * shown on the Content Settings page and in the global toggle at the
+ * top of a Website Settings page.
+ */
+ public int titleResourceId = 0;
+
+ /**
+ * The resource id of this permission entry's title explanation,
+ * shown on the Website Details page.
+ */
+ public int explanationResourceId = 0;
+
+ /**
+ * What ContentSetting the global default is set to when enabled.
+ * Either Ask/Allow. Not required unless this entry describes a settings
+ * that appears on the content settings page and has a global toggle.
+ */
+ public ContentSetting defaultEnabledValue = null;
+
+ /**
+ * The ContentSetting for this entry when enabled. Usually Block. Not
+ * required unless this entry describes a settings that appears on the
+ * content settings page and has a global toggle.
+ */
+ public ContentSetting defaultDisabledValue = null;
+
+ /**
+ * The resource ID to use when the enabled state should have a custom
+ * summary. When 0 the default string will be used instead.
+ */
+ public int customEnabledSummary = 0;
+
+ /**
+ * The resource ID to use when the disabled state should have a custom
+ * summary. When 0 the default string will be used instead.
+ */
+ public int customDisabledSummary = 0;
+
+ /**
+ * Returns the string resource id for a given ContentSetting to show
+ * with a permission category.
+ * @param value The ContentSetting to convert to string id.
+ */
+ public int contentSettingToResourceIdForCategory(ContentSetting value) {
+ switch (value) {
+ case ALLOW:
+ return R.string.website_settings_category_allowed;
+ case BLOCK:
+ return R.string.website_settings_category_blocked;
+ case ASK:
+ return R.string.website_settings_category_ask;
+ }
+ return 0;
+ }
+
+ /**
+ * Returns the string resource id for a given ContentSetting to show
+ * with a particular website.
+ * @param value The ContentSetting to convert to string id.
+ */
+ public int contentSettingToResourceIdForSite(ContentSetting value) {
+ switch (value) {
+ case ALLOW:
+ return R.string.website_settings_permissions_allow;
+ case BLOCK:
+ return R.string.website_settings_permissions_block;
+ case ASK:
+ return 0; // We never show Ask as an option on individual permissions.
+ }
+ return 0;
+ }
+
+ /**
+ * Fetches the summary (resource id) to show when the entry is enabled.
+ */
+ public int getEnabledSummaryResourceId() {
+ if (customEnabledSummary != 0) {
+ return customEnabledSummary;
+ } else {
+ return contentSettingToResourceIdForCategory(defaultEnabledValue);
+ }
+ }
+
+ /**
+ * Fetches the summary (resource id) to show when the entry is disabled.
+ */
+ public int getDisabledSummaryResourceId() {
+ if (customDisabledSummary != 0) {
+ return customDisabledSummary;
+ } else {
+ return contentSettingToResourceIdForCategory(defaultDisabledValue);
+ }
+ }
+
+ /**
+ * Returns a PermissionDataEntry for a given ContentSettingsType.
+ * @param type The ContentSettingsType to look up.
+ */
+ public static PermissionDataEntry getPermissionDataEntry(int type) {
+ PermissionDataEntry entry = null;
+ switch (type) {
+ case ContentSettingsType.CONTENT_SETTINGS_TYPE_COOKIES:
+ entry = new PermissionDataEntry();
+ entry.iconResourceId = R.drawable.permission_cookie;
+ entry.titleResourceId = R.string.cookies_title;
+ entry.explanationResourceId = R.string.cookies_title;
+ entry.defaultEnabledValue = ContentSetting.ALLOW;
+ entry.defaultDisabledValue = ContentSetting.BLOCK;
+ entry.customEnabledSummary = R.string.website_settings_category_cookie_allowed;
+ entry.customDisabledSummary = R.string.website_settings_category_block_all;
+ return entry;
+ case ContentSettingsType.CONTENT_SETTINGS_TYPE_POPUPS:
+ entry = new PermissionDataEntry();
+ entry.iconResourceId = R.drawable.permission_popups;
+ entry.titleResourceId = R.string.popup_permission_title;
+ entry.explanationResourceId = R.string.popup_permission_title;
+ entry.defaultEnabledValue = ContentSetting.ALLOW;
+ entry.defaultDisabledValue = ContentSetting.BLOCK;
+ entry.customDisabledSummary =
+ R.string.website_settings_category_block_recommended;
+ return entry;
+ case ContentSettingsType.CONTENT_SETTINGS_TYPE_GEOLOCATION:
+ entry = new PermissionDataEntry();
+ entry.iconResourceId = R.drawable.permission_location;
+ entry.titleResourceId = R.string.website_settings_device_location;
+ entry.explanationResourceId = R.string.geolocation_permission_title;
+ entry.defaultEnabledValue = ContentSetting.ASK;
+ entry.defaultDisabledValue = ContentSetting.BLOCK;
+ entry.customEnabledSummary =
+ R.string.website_settings_category_ask_before_accessing;
+ entry.customDisabledSummary = R.string.website_settings_category_block_all;
+ return entry;
+ case ContentSettingsType.CONTENT_SETTINGS_TYPE_MEDIASTREAM:
+ entry = new PermissionDataEntry();
+ entry.iconResourceId = R.drawable.permission_media;
+ entry.titleResourceId = R.string.website_settings_use_camera_or_mic;
+ entry.explanationResourceId = 0; // Programmatically assigned.
+ entry.defaultEnabledValue = ContentSetting.ASK;
+ entry.defaultDisabledValue = ContentSetting.BLOCK;
+ entry.customEnabledSummary =
+ R.string.website_settings_category_ask_before_accessing_camera_mic;
+ return entry;
+ case ContentSettingsType.CONTENT_SETTINGS_TYPE_MIDI_SYSEX:
+ entry = new PermissionDataEntry();
+ // Midi does not appear as a category on the Content Settings page and
+ // therefore does not need as detailed values.
+ entry.iconResourceId = R.drawable.permission_midi;
+ entry.explanationResourceId = R.string.midi_sysex_permission_title;
+ return entry;
+ case ContentSettingsType.CONTENT_SETTINGS_TYPE_NOTIFICATIONS:
+ entry = new PermissionDataEntry();
+ entry.iconResourceId = R.drawable.permission_push_notification;
+ entry.titleResourceId = R.string.push_notifications_permission_title;
+ entry.explanationResourceId = R.string.push_notifications_permission_title;
+ entry.defaultEnabledValue = ContentSetting.ASK;
+ entry.defaultDisabledValue = ContentSetting.BLOCK;
+ entry.customEnabledSummary =
+ R.string.website_settings_category_ask_before_sending;
+ return entry;
+ case ContentSettingsType.CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER:
+ entry = new PermissionDataEntry();
+ // Protected Content appears only as a category on the Content Settings page
+ // but does not have a site-list like the others, so it does not need as
+ // detailed values.
+ entry.iconResourceId = R.drawable.permission_protected_media;
+ entry.titleResourceId = org.chromium.chrome.R.string.protected_content;
+ entry.defaultEnabledValue = ContentSetting.ASK;
+ entry.defaultDisabledValue = ContentSetting.BLOCK;
+ return entry;
+ default:
+ return null;
+ }
+ }
+ }
+
+ private final WebsiteAddress mAddress;
+ private final String mTitle;
+ private String mSummary;
+ private CookieInfo mCookieInfo;
+ private GeolocationInfo mGeolocationInfo;
+ private MidiInfo mMidiInfo;
+ private PopupExceptionInfo mPopupExceptionInfo;
+ private ProtectedMediaIdentifierInfo mProtectedMediaIdentifierInfo;
+ private PushNotificationInfo mPushNotificationInfo;
+ private VoiceAndVideoCaptureInfo mVoiceAndVideoCaptureInfo;
+ private LocalStorageInfo mLocalStorageInfo;
+ private final List<StorageInfo> mStorageInfo = new ArrayList<StorageInfo>();
+ private int mStorageInfoCallbacksLeft;
+
+ public Website(WebsiteAddress address) {
+ mAddress = address;
+ mTitle = address.getTitle();
+ }
+
+ public String getTitle() {
+ return mTitle;
+ }
+
+ public String getSummary() {
+ return mSummary;
+ }
+
+ public int compareByAddressTo(Website to) {
+ return this == to ? 0 : mAddress.compareTo(to.mAddress);
+ }
+
+ /**
+ * A comparison function for sorting by storage (most used first).
+ * @return which site uses more storage.
+ */
+ public int compareByStorageTo(Website to) {
+ if (this == to) return 0;
+ return getTotalUsage() < to.getTotalUsage() ? 1 : -1;
+ }
+
+ /**
+ * Sets the CookieInfo object for this site.
+ */
+ public void setCookieInfo(CookieInfo info) {
+ mCookieInfo = info;
+ WebsiteAddress embedder = WebsiteAddress.create(info.getEmbedder());
+ if (embedder != null) {
+ mSummary = embedder.getTitle();
+ }
+ }
+
+ /**
+ * Gets the permission that governs cookie preferences.
+ */
+ public ContentSetting getCookiePermission() {
+ return mCookieInfo != null ? mCookieInfo.getContentSetting() : null;
+ }
+
+ /**
+ * Sets the permission that govers cookie preferences for this site.
+ */
+ public void setCookiePermission(ContentSetting value) {
+ if (mCookieInfo != null) {
+ mCookieInfo.setContentSetting(value);
+ }
+ }
+
+ /**
+ * Sets the GeoLocationInfo object for this Website.
+ */
+ public void setGeolocationInfo(GeolocationInfo info) {
+ mGeolocationInfo = info;
+ WebsiteAddress embedder = WebsiteAddress.create(info.getEmbedder());
+ if (embedder != null) {
+ mSummary = embedder.getTitle();
+ }
+ }
+
+ /**
+ * Returns what permission governs geolocation access.
+ */
+ public ContentSetting getGeolocationPermission() {
+ return mGeolocationInfo != null ? mGeolocationInfo.getContentSetting() : null;
+ }
+
+ /**
+ * Configure geolocation access setting for this site.
+ */
+ public void setGeolocationPermission(ContentSetting value) {
+ if (mGeolocationInfo != null) {
+ mGeolocationInfo.setContentSetting(value);
+ }
+ }
+
+ /**
+ * Sets the MidiInfo object for this Website.
+ */
+ public void setMidiInfo(MidiInfo info) {
+ mMidiInfo = info;
+ WebsiteAddress embedder = WebsiteAddress.create(info.getEmbedder());
+ if (embedder != null) {
+ mSummary = embedder.getTitle();
+ }
+ }
+
+ /**
+ * Returns what permission governs MIDI usage access.
+ */
+ public ContentSetting getMidiPermission() {
+ return mMidiInfo != null ? mMidiInfo.getContentSetting() : null;
+ }
+
+ /**
+ * Configure Midi usage access setting for this site.
+ */
+ public void setMidiPermission(ContentSetting value) {
+ if (mMidiInfo != null) {
+ mMidiInfo.setContentSetting(value);
+ }
+ }
+
+ /**
+ * Sets the Popup exception info for this Website.
+ */
+ public void setPopupExceptionInfo(PopupExceptionInfo info) {
+ mPopupExceptionInfo = info;
+ }
+
+ /**
+ * Returns what permission governs Popup permission.
+ */
+ public ContentSetting getPopupPermission() {
+ if (mPopupExceptionInfo != null) return mPopupExceptionInfo.getContentSetting();
+ return null;
+ }
+
+ /**
+ * Configure Popup permission access setting for this site.
+ */
+ public void setPopupPermission(ContentSetting value) {
+ if (mPopupExceptionInfo != null) {
+ mPopupExceptionInfo.setContentSetting(value);
+ }
+ }
+
+ /**
+ * Sets protected media identifier access permission information class.
+ */
+ public void setProtectedMediaIdentifierInfo(ProtectedMediaIdentifierInfo info) {
+ mProtectedMediaIdentifierInfo = info;
+ WebsiteAddress embedder = WebsiteAddress.create(info.getEmbedder());
+ if (embedder != null) {
+ mSummary = embedder.getTitle();
+ }
+ }
+
+ /**
+ * Returns what permission governs Protected Media Identifier access.
+ */
+ public ContentSetting getProtectedMediaIdentifierPermission() {
+ return mProtectedMediaIdentifierInfo != null
+ ? mProtectedMediaIdentifierInfo.getContentSetting() : null;
+ }
+
+ /**
+ * Configure Protected Media Identifier access setting for this site.
+ */
+ public void setProtectedMediaIdentifierPermission(ContentSetting value) {
+ if (mProtectedMediaIdentifierInfo != null) {
+ mProtectedMediaIdentifierInfo.setContentSetting(value);
+ }
+ }
+
+ /**
+ * Sets Push Notification access permission information class.
+ */
+ public void setPushNotificationInfo(PushNotificationInfo info) {
+ mPushNotificationInfo = info;
+ }
+
+ /**
+ * Returns what setting governs push notification access.
+ */
+ public ContentSetting getPushNotificationPermission() {
+ return mPushNotificationInfo != null ? mPushNotificationInfo.getContentSetting() : null;
+ }
+
+ /**
+ * Configure push notification setting for this site.
+ */
+ public void setPushNotificationPermission(ContentSetting value) {
+ if (mPushNotificationInfo != null) {
+ mPushNotificationInfo.setContentSetting(value);
+ }
+ }
+
+ /**
+ * Sets voice and video capture info class.
+ */
+ public void setVoiceAndVideoCaptureInfo(VoiceAndVideoCaptureInfo info) {
+ mVoiceAndVideoCaptureInfo = info;
+ WebsiteAddress embedder = WebsiteAddress.create(info.getEmbedder());
+ if (embedder != null) {
+ mSummary = embedder.getTitle();
+ }
+ }
+
+ /**
+ * Returns what setting governs voice capture access.
+ */
+ public ContentSetting getVoiceCapturePermission() {
+ return mVoiceAndVideoCaptureInfo != null
+ ? mVoiceAndVideoCaptureInfo.getVoiceCapturePermission() : null;
+ }
+
+ /**
+ * Returns what setting governs video capture access.
+ */
+ public ContentSetting getVideoCapturePermission() {
+ return mVoiceAndVideoCaptureInfo != null
+ ? mVoiceAndVideoCaptureInfo.getVideoCapturePermission() : null;
+ }
+
+ /**
+ * Configure voice capture setting for this site.
+ */
+ public void setVoiceCapturePermission(ContentSetting value) {
+ if (mVoiceAndVideoCaptureInfo != null) {
+ mVoiceAndVideoCaptureInfo.setVoiceCapturePermission(value);
+ }
+ }
+
+ /**
+ * Configure video capture setting for this site.
+ */
+ public void setVideoCapturePermission(ContentSetting value) {
+ if (mVoiceAndVideoCaptureInfo != null) {
+ mVoiceAndVideoCaptureInfo.setVideoCapturePermission(value);
+ }
+ }
+
+ /**
+ * Returns the type of media that is being captured (audio/video/both).
+ */
+ public int getMediaAccessType() {
+ ContentSetting voice = getVoiceCapturePermission();
+ ContentSetting video = getVideoCapturePermission();
+ if (video != null) {
+ if (voice == null) {
+ if (video == ContentSetting.ALLOW) {
+ return CAMERA_ACCESS_ALLOWED;
+ } else {
+ return CAMERA_ACCESS_DENIED;
+ }
+ } else {
+ if (video != voice) {
+ return INVALID_CAMERA_OR_MICROPHONE_ACCESS;
+ }
+ if (video == ContentSetting.ALLOW && voice == ContentSetting.ALLOW) {
+ return MICROPHONE_AND_CAMERA_ACCESS_ALLOWED;
+ } else {
+ return MICROPHONE_AND_CAMERA_ACCESS_DENIED;
+ }
+ }
+ } else {
+ if (voice == null) return INVALID_CAMERA_OR_MICROPHONE_ACCESS;
+ if (voice == ContentSetting.ALLOW) {
+ return MICROPHONE_ACCESS_ALLOWED;
+ } else {
+ return MICROPHONE_ACCESS_DENIED;
+ }
+ }
+ }
+
+ public void setLocalStorageInfo(LocalStorageInfo info) {
+ mLocalStorageInfo = info;
+ }
+
+ public void addStorageInfo(StorageInfo info) {
+ mStorageInfo.add(info);
+ }
+
+ public void clearAllStoredData(final StoredDataClearedCallback callback) {
+ if (mLocalStorageInfo != null) {
+ mLocalStorageInfo.clear();
+ mLocalStorageInfo = null;
+ }
+ mStorageInfoCallbacksLeft = mStorageInfo.size();
+ if (mStorageInfoCallbacksLeft > 0) {
+ for (StorageInfo info : mStorageInfo) {
+ info.clear(new WebsitePreferenceBridge.StorageInfoClearedCallback() {
+ @Override
+ public void onStorageInfoCleared() {
+ if (--mStorageInfoCallbacksLeft == 0) callback.onStoredDataCleared();
+ }
+ });
+ }
+ mStorageInfo.clear();
+ } else {
+ callback.onStoredDataCleared();
+ }
+ }
+
+ /**
+ * An interface to implement to get a callback when storage info has been cleared.
+ */
+ public interface StoredDataClearedCallback {
+ public void onStoredDataCleared();
+ }
+
+ public long getTotalUsage() {
+ long usage = 0;
+ if (mLocalStorageInfo != null) {
+ usage += mLocalStorageInfo.getSize();
+ }
+ for (StorageInfo info : mStorageInfo) {
+ usage += info.getSize();
+ }
+ return usage;
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698