Chromium Code Reviews| 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 d337bfa5cfa160abd38b16dbc86a7d8ce70e987a..61c10129699653584b9a365b503b3d0eb05be256 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 |
| @@ -7,6 +7,7 @@ |
| import android.app.AlertDialog; |
| import android.content.Context; |
| import android.content.DialogInterface; |
| +import android.net.Uri; |
| import android.os.Bundle; |
| import android.preference.ListPreference; |
| import android.preference.Preference; |
| @@ -14,19 +15,31 @@ |
| import android.preference.Preference.OnPreferenceClickListener; |
| import android.preference.PreferenceFragment; |
| import android.preference.PreferenceScreen; |
| +import android.text.TextUtils; |
| import android.text.format.Formatter; |
| import android.widget.ListAdapter; |
| import org.chromium.chrome.R; |
| import org.chromium.chrome.browser.ContentSettingsType; |
| +import java.util.ArrayList; |
| +import java.util.List; |
| +import java.util.Map; |
| +import java.util.Set; |
| + |
| /** |
| * Shows a list of HTML5 settings for a single website. |
| */ |
| public class SingleWebsitePreferences extends PreferenceFragment |
| implements DialogInterface.OnClickListener, OnPreferenceChangeListener, |
| OnPreferenceClickListener { |
| + // SingleWebsitePreferences expects either EXTRA_SITE (a Website) or |
| + // EXTRA_ADDRESS (a WebsiteAddress) to be present (but not both). If |
| + // EXTRA_SITE is present, the fragment will display the permissions in that |
| + // Website object. If EXTRA_ADDRESS is present, the fragment will find all |
| + // permissions for that website address and display those. |
| public static final String EXTRA_SITE = "org.chromium.chrome.preferences.site"; |
| + public static final String EXTRA_ADDRESS = "org.chromium.chrome.preferences.address"; |
| // Preference keys, see single_website_preferences.xml |
| // Headings: |
| @@ -51,13 +64,112 @@ |
| // The website this page is displaying details about. |
| private Website mSite; |
| + |
| + // The address of the site we want to display. Used only if EXTRA_ADDRESS is provided. |
| + private WebsiteAddress mSiteAddress; |
| + |
| // A list of possible options for each list preference summary. |
| private String[] mListPreferenceSummaries; |
| + private class SingleWebsitePermissionsPopulator |
|
Miguel Garcia
2015/02/18 21:40:46
Let's at least add a TODO for some heavy refactori
Michael van Ouwerkerk
2015/02/19 17:19:35
Done.
|
| + implements WebsitePermissionsFetcher.WebsitePermissionsCallback { |
| + @Override |
| + public void onWebsitePermissionsAvailable( |
| + Map<String, Set<Website>> sitesByOrigin, Map<String, Set<Website>> sitesByHost) { |
| + // This method may be called after the activity has been destroyed. |
| + // In that case, bail out. |
| + if (getActivity() == null) return; |
| + |
| + // TODO(mvanouwerkerk): Do this at data retrieval time, instead of now. |
| + List<Set<Website>> allSites = new ArrayList<>(); |
| + allSites.addAll(sitesByOrigin.values()); |
| + allSites.addAll(sitesByHost.values()); |
| + mSite = mergeWebsiteSettings(mSiteAddress, allSites); |
| + displaySitePermissions(); |
| + } |
| + } |
| + |
| + /** |
| + * Creates a Bundle with the correct arguments for opening this fragment for |
| + * the website with the given url. |
| + * |
| + * @param url The URL to open the fragment with. This is a complete url including scheme, |
| + * domain, port, path, etc. |
| + * @return The bundle to attach to the preferences intent. |
| + */ |
| + public static Bundle createFragmentArgsForSite(String url) { |
| + Bundle fragmentArgs = new Bundle(); |
| + String origin = getOrigin(url); |
| + fragmentArgs.putSerializable( |
| + SingleWebsitePreferences.EXTRA_ADDRESS, WebsiteAddress.create(origin)); |
| + return fragmentArgs; |
| + } |
| + |
| @Override |
| public void onActivityCreated(Bundle savedInstanceState) { |
| getActivity().setTitle(R.string.prefs_content_settings); |
| - mSite = (Website) getArguments().getSerializable(EXTRA_SITE); |
| + Object extraSite = getArguments().getSerializable(EXTRA_SITE); |
| + Object extraAddress = getArguments().getSerializable(EXTRA_ADDRESS); |
| + |
| + if (extraSite != null && extraAddress == null) { |
| + mSite = (Website) extraSite; |
| + displaySitePermissions(); |
| + } else if (extraAddress != null && extraSite == null) { |
| + mSiteAddress = (WebsiteAddress) extraAddress; |
| + WebsitePermissionsFetcher fetcher = |
| + new WebsitePermissionsFetcher(new SingleWebsitePermissionsPopulator()); |
| + fetcher.fetchAllPreferences(); |
| + } else { |
| + assert false : "Exactly one of EXTRA_SITE or EXTRA_SITE_ADDRESS must be provided."; |
| + } |
| + |
| + super.onActivityCreated(savedInstanceState); |
| + } |
| + |
| + private static String getOrigin(String url) { |
| + Uri uri = Uri.parse(url); |
|
Miguel Garcia
2015/02/18 21:40:46
Would getOriginForDisplay in UrlUtilities.java do
Michael van Ouwerkerk
2015/02/19 17:19:34
Done.
|
| + String scheme = uri.getScheme(); |
| + String host = uri.getHost(); |
| + int port = uri.getPort(); |
| + |
| + if (TextUtils.isEmpty(scheme) || TextUtils.isEmpty(host)) { |
| + return url; |
| + } |
| + |
| + if (port == -1 || (port == 80 && "http".equals(scheme)) |
| + || (port == 443 && "https".equals(scheme))) { |
| + return scheme + "://" + host; |
| + } |
| + return scheme + "://" + host + ":" + port; |
| + } |
| + |
| + /** |
| + * Given an address and a list of sets of websites, returns a new site with the same origin |
|
Miguel Garcia
2015/02/18 21:40:46
quadratic complexity with JNI in each call!.
Comp
Michael van Ouwerkerk
2015/02/19 17:19:35
Done. I've removed the JNI call from it, and added
|
| + * as |address| which has merged into it all preferences and settings of the matching input |
| + * sites. |
| + * |
| + * @param address The address to search for. |
| + * @param websiteSets The websites to search in. |
| + * @return The merged website. |
| + */ |
| + private static Website mergeWebsiteSettings( |
| + WebsiteAddress address, List<Set<Website>> websiteSets) { |
| + Website mergedSite = new Website(address); |
| + for (Set<Website> websiteSet : websiteSets) { |
| + for (Website website : websiteSet) { |
| + if (address.hasSameContentSettingsOrigin(website.getAddress())) { |
| + mergedSite.merge(website); |
| + } |
| + } |
| + } |
| + return mergedSite; |
| + } |
| + |
| + /** |
| + * Updates the permissions displayed in the UI by fetching them from mSite. |
| + * Must only be called once mSite is set. |
| + */ |
| + private void displaySitePermissions() { |
| addPreferencesFromResource(R.xml.single_website_preferences); |
| mListPreferenceSummaries = getActivity().getResources().getStringArray( |
| R.array.website_settings_permission_options); |
| @@ -91,11 +203,7 @@ public void onActivityCreated(Bundle savedInstanceState) { |
| } else if (PREF_PROTECTED_MEDIA_IDENTIFIER_PERMISSION.equals(preference.getKey())) { |
| setUpListPreference(preference, mSite.getProtectedMediaIdentifierPermission()); |
| } else if (PREF_PUSH_NOTIFICATIONS_PERMISSION.equals(preference.getKey())) { |
| - if (ContentPreferences.pushNotificationsSupported()) { |
| - setUpListPreference(preference, mSite.getPushNotificationPermission()); |
| - } else { |
| - getPreferenceScreen().removePreference(preference); |
| - } |
| + setUpListPreference(preference, mSite.getPushNotificationPermission()); |
| } else if (PREF_VOICE_AND_VIDEO_CAPTURE_PERMISSION.equals(preference.getKey())) { |
| configureVoiceAndVideoPreference(preference); |
| } |
| @@ -111,8 +219,6 @@ public void onActivityCreated(Bundle savedInstanceState) { |
| Preference heading = preferenceScreen.findPreference(PREF_PERMISSIONS); |
| preferenceScreen.removePreference(heading); |
| } |
| - |
| - super.onActivityCreated(savedInstanceState); |
| } |
| private boolean hasUsagePreferences() { |