Index: chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleWebsitePreferences.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleWebsitePreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleWebsitePreferences.java |
index bca422efd87c0f80d3702fa7b0c8fc3c3a3c887a..88a2a1ae6bfb233125e6db3d2e2f87bad5018ed5 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleWebsitePreferences.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleWebsitePreferences.java |
@@ -29,7 +29,10 @@ import org.chromium.chrome.browser.util.UrlUtilities; |
import org.chromium.content_public.browser.WebContents; |
import java.net.URI; |
+import java.util.Arrays; |
import java.util.Collection; |
+import java.util.HashSet; |
+import java.util.Set; |
/** |
* Shows the permissions and other settings for a particular website. |
@@ -49,6 +52,7 @@ public class SingleWebsitePreferences extends PreferenceFragment |
public static final String EXTRA_LOCATION = "org.chromium.chrome.preferences.location"; |
public static final String EXTRA_WEB_CONTENTS = "org.chromium.chrome.preferences.web_contents"; |
+ public static final String EXTRA_USB_INFO = "org.chromium.chrome.preferences.usb_info"; |
// Preference keys, see single_website_preferences.xml |
// Headings: |
@@ -103,6 +107,9 @@ public class SingleWebsitePreferences extends PreferenceFragment |
// The address of the site we want to display. Used only if EXTRA_ADDRESS is provided. |
private WebsiteAddress mSiteAddress; |
+ // The number of USB device permissions displayed. |
+ private int mUsbPermissionCount; |
+ |
private class SingleWebsitePermissionsPopulator |
implements WebsitePermissionsFetcher.WebsitePermissionsCallback { |
private final WebContents mWebContents; |
@@ -242,6 +249,9 @@ public class SingleWebsitePreferences extends PreferenceFragment |
merged.addStorageInfo(storageInfo); |
} |
} |
+ for (UsbInfo usbInfo : other.getUsbInfo()) { |
+ if (origin.equals(usbInfo.getOrigin())) merged.addUsbInfo(usbInfo); |
+ } |
// TODO(mvanouwerkerk): Make the various info types share a common interface that |
// supports reading the origin or host. |
@@ -266,6 +276,9 @@ public class SingleWebsitePreferences extends PreferenceFragment |
private void displaySitePermissions() { |
addPreferencesFromResource(R.xml.single_website_preferences); |
+ Set<String> permissionPreferenceKeys = |
+ new HashSet<>(Arrays.asList(PERMISSION_PREFERENCE_KEYS)); |
+ int maxPermissionOrder = 0; |
ListAdapter preferences = getPreferenceScreen().getRootAdapter(); |
for (int i = 0; i < preferences.getCount(); ++i) { |
Preference preference = (Preference) preferences.getItem(i); |
@@ -312,6 +325,22 @@ public class SingleWebsitePreferences extends PreferenceFragment |
} else if (PREF_PROTECTED_MEDIA_IDENTIFIER_PERMISSION.equals(preference.getKey())) { |
setUpListPreference(preference, mSite.getProtectedMediaIdentifierPermission()); |
} |
+ |
+ if (permissionPreferenceKeys.contains(preference.getKey())) { |
+ maxPermissionOrder = Math.max(maxPermissionOrder, preference.getOrder()); |
+ } |
+ } |
+ |
+ for (UsbInfo info : mSite.getUsbInfo()) { |
+ Preference preference = new Preference(getActivity()); |
+ preference.getExtras().putSerializable(EXTRA_USB_INFO, info); |
+ preference.setIcon(R.drawable.settings_usb); |
+ preference.setOnPreferenceClickListener(this); |
+ preference.setOrder(maxPermissionOrder++); |
+ preference.setTitle(info.getName()); |
+ preference.setWidgetLayoutResource(R.layout.usb_permission); |
+ getPreferenceScreen().addPreference(preference); |
+ mUsbPermissionCount++; |
} |
// Remove the 'permission is off in Android' message if not needed. |
@@ -396,6 +425,7 @@ public class SingleWebsitePreferences extends PreferenceFragment |
} |
private boolean hasPermissionsPreferences() { |
+ if (mUsbPermissionCount > 0) return true; |
PreferenceScreen screen = getPreferenceScreen(); |
for (String key : PERMISSION_PREFERENCE_KEYS) { |
if (screen.findPreference(key) != null) return true; |
@@ -600,6 +630,23 @@ public class SingleWebsitePreferences extends PreferenceFragment |
@Override |
public boolean onPreferenceClick(Preference preference) { |
+ Bundle extras = preference.peekExtras(); |
+ if (extras != null) { |
+ UsbInfo usbInfo = (UsbInfo) extras.getSerializable(EXTRA_USB_INFO); |
+ if (usbInfo != null) { |
+ usbInfo.revoke(); |
+ |
+ PreferenceScreen preferenceScreen = getPreferenceScreen(); |
+ preferenceScreen.removePreference(preference); |
+ mUsbPermissionCount--; |
+ if (!hasPermissionsPreferences()) { |
+ Preference heading = preferenceScreen.findPreference(PREF_PERMISSIONS); |
+ preferenceScreen.removePreference(heading); |
+ } |
+ return true; |
+ } |
+ } |
+ |
// Handle the Clear & Reset preference click by showing a confirmation. |
new AlertDialog.Builder(getActivity(), R.style.AlertDialogTheme) |
.setTitle(R.string.website_reset) |
@@ -646,6 +693,7 @@ public class SingleWebsitePreferences extends PreferenceFragment |
mSite.setNotificationPermission(ContentSetting.DEFAULT); |
mSite.setPopupPermission(ContentSetting.DEFAULT); |
mSite.setProtectedMediaIdentifierPermission(ContentSetting.DEFAULT); |
+ for (UsbInfo info : mSite.getUsbInfo()) info.revoke(); |
// Clear the storage and finish the activity if necessary. |
if (mSite.getTotalUsage() > 0) { |