Commit 6b313bc2 authored by Ehimare Okoyomon's avatar Ehimare Okoyomon Committed by Commit Bot

[Android] Page info permissions subpage

Reuse SingleWebsiteSettings as a fragment for the permissions subpage of
page info. Will fix UI and reset functionality in a separate CL.

Screenshot: https://screenshot.googleplex.com/FyTQETNXefz.png
Bug: 1077766
Change-Id: I9f47ae80bcfdbd92c1399670948f5cdfea6f4e08
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2252183Reviewed-by: default avatarTheresa  <twellington@chromium.org>
Reviewed-by: default avatarMugdha Lakhani <nator@chromium.org>
Reviewed-by: default avatarFinnur Thorarinsson <finnur@chromium.org>
Reviewed-by: default avatarChristian Dullweber <dullweber@chromium.org>
Commit-Queue: Ehimare Okoyomon <eokoyomon@chromium.org>
Cr-Commit-Position: refs/heads/master@{#790793}
parent 181bc2fe
...@@ -6,12 +6,14 @@ package org.chromium.chrome.browser.page_info; ...@@ -6,12 +6,14 @@ package org.chromium.chrome.browser.page_info;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle;
import android.text.SpannableString; import android.text.SpannableString;
import android.text.TextUtils; import android.text.TextUtils;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import androidx.fragment.app.Fragment;
import org.chromium.base.Consumer; import org.chromium.base.Consumer;
import org.chromium.base.supplier.Supplier; import org.chromium.base.supplier.Supplier;
...@@ -28,7 +30,9 @@ import org.chromium.chrome.browser.performance_hints.PerformanceHintsObserver.Pe ...@@ -28,7 +30,9 @@ import org.chromium.chrome.browser.performance_hints.PerformanceHintsObserver.Pe
import org.chromium.chrome.browser.previews.PreviewsAndroidBridge; import org.chromium.chrome.browser.previews.PreviewsAndroidBridge;
import org.chromium.chrome.browser.previews.PreviewsUma; import org.chromium.chrome.browser.previews.PreviewsUma;
import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.site_settings.ChromeSiteSettingsClient;
import org.chromium.chrome.browser.vr.VrModuleProvider; import org.chromium.chrome.browser.vr.VrModuleProvider;
import org.chromium.components.browser_ui.site_settings.SingleWebsiteSettings;
import org.chromium.components.content_settings.CookieControlsBridge; import org.chromium.components.content_settings.CookieControlsBridge;
import org.chromium.components.content_settings.CookieControlsObserver; import org.chromium.components.content_settings.CookieControlsObserver;
import org.chromium.components.embedder_support.browser_context.BrowserContextHandle; import org.chromium.components.embedder_support.browser_context.BrowserContextHandle;
...@@ -263,6 +267,19 @@ public class ChromePageInfoControllerDelegate extends PageInfoControllerDelegate ...@@ -263,6 +267,19 @@ public class ChromePageInfoControllerDelegate extends PageInfoControllerDelegate
return mProfile; return mProfile;
} }
/**
* {@inheritDoc}
*/
@Override
@NonNull
public Fragment getPermissionsSubpageFragmentForUrl(String url) {
Bundle fragmentArgs = SingleWebsiteSettings.createFragmentArgsForSite(url);
SingleWebsiteSettings fragment = (SingleWebsiteSettings) Fragment.instantiate(
mContext, SingleWebsiteSettings.class.getName(), fragmentArgs);
fragment.setSiteSettingsClient(new ChromeSiteSettingsClient(mContext, getBrowserContext()));
return fragment;
}
@VisibleForTesting @VisibleForTesting
void setOfflinePageStateForTesting(@OfflinePageState int offlinePageState) { void setOfflinePageStateForTesting(@OfflinePageState int offlinePageState) {
mOfflinePageState = offlinePageState; mOfflinePageState = offlinePageState;
......
...@@ -272,7 +272,8 @@ public class SettingsActivity extends ChromeBaseAppCompatActivity ...@@ -272,7 +272,8 @@ public class SettingsActivity extends ChromeBaseAppCompatActivity
public void onAttachFragment(Fragment fragment) { public void onAttachFragment(Fragment fragment) {
if (fragment instanceof SiteSettingsPreferenceFragment) { if (fragment instanceof SiteSettingsPreferenceFragment) {
((SiteSettingsPreferenceFragment) fragment) ((SiteSettingsPreferenceFragment) fragment)
.setSiteSettingsClient(new ChromeSiteSettingsClient(this)); .setSiteSettingsClient(new ChromeSiteSettingsClient(
this, Profile.getLastUsedRegularProfile()));
} else if (fragment instanceof FragmentSettingsLauncher) { } else if (fragment instanceof FragmentSettingsLauncher) {
FragmentSettingsLauncher framentSettingsLauncher = (FragmentSettingsLauncher) fragment; FragmentSettingsLauncher framentSettingsLauncher = (FragmentSettingsLauncher) fragment;
framentSettingsLauncher.setSettingsLauncher(mSettingsLauncher); framentSettingsLauncher.setSettingsLauncher(mSettingsLauncher);
......
...@@ -46,17 +46,19 @@ public class ChromeSiteSettingsClient implements SiteSettingsClient { ...@@ -46,17 +46,19 @@ public class ChromeSiteSettingsClient implements SiteSettingsClient {
private static final float FAVICON_TEXT_SIZE_FRACTION = 0.625f; private static final float FAVICON_TEXT_SIZE_FRACTION = 0.625f;
private final Context mContext; private final Context mContext;
private final BrowserContextHandle mBrowserContext;
private ChromeSiteSettingsHelpClient mChromeSiteSettingsHelpClient; private ChromeSiteSettingsHelpClient mChromeSiteSettingsHelpClient;
private ChromeWebappSettingsClient mChromeWebappSettingsClient; private ChromeWebappSettingsClient mChromeWebappSettingsClient;
private ManagedPreferenceDelegate mManagedPreferenceDelegate; private ManagedPreferenceDelegate mManagedPreferenceDelegate;
public ChromeSiteSettingsClient(Context context) { public ChromeSiteSettingsClient(Context context, BrowserContextHandle browserContext) {
mContext = context; mContext = context;
mBrowserContext = browserContext;
} }
@Override @Override
public BrowserContextHandle getBrowserContextHandle() { public BrowserContextHandle getBrowserContextHandle() {
return Profile.getLastUsedRegularProfile(); return mBrowserContext;
} }
@Override @Override
......
...@@ -20,9 +20,11 @@ import org.chromium.base.test.util.CallbackHelper; ...@@ -20,9 +20,11 @@ import org.chromium.base.test.util.CallbackHelper;
import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.CommandLineFlags;
import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.flags.ChromeSwitches;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.test.ChromeActivityTestRule; import org.chromium.chrome.test.ChromeActivityTestRule;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.content_public.browser.UiThreadTaskTraits; import org.chromium.content_public.browser.UiThreadTaskTraits;
import org.chromium.content_public.browser.test.util.TestThreadUtils;
import java.util.concurrent.TimeoutException; import java.util.concurrent.TimeoutException;
...@@ -35,6 +37,7 @@ public class ChromeSiteSettingsClientTest { ...@@ -35,6 +37,7 @@ public class ChromeSiteSettingsClientTest {
@Rule @Rule
public ChromeActivityTestRule<ChromeActivity> mActivityTestRule = public ChromeActivityTestRule<ChromeActivity> mActivityTestRule =
new ChromeActivityTestRule<>(ChromeActivity.class); new ChromeActivityTestRule<>(ChromeActivity.class);
ChromeSiteSettingsClient mSiteSettingsClient;
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
...@@ -46,15 +49,17 @@ public class ChromeSiteSettingsClientTest { ...@@ -46,15 +49,17 @@ public class ChromeSiteSettingsClientTest {
@Test @Test
@SmallTest @SmallTest
public void testFallbackFaviconLoads() throws TimeoutException { public void testFallbackFaviconLoads() throws TimeoutException {
ChromeSiteSettingsClient client = TestThreadUtils.runOnUiThreadBlocking(() -> {
new ChromeSiteSettingsClient(mActivityTestRule.getActivity()); mSiteSettingsClient = new ChromeSiteSettingsClient(
mActivityTestRule.getActivity(), Profile.getLastUsedRegularProfile());
});
// Hold the Bitmap in an array because it gets assigned to in a closure, and all captured // Hold the Bitmap in an array because it gets assigned to in a closure, and all captured
// variables have to be effectively final. // variables have to be effectively final.
Bitmap[] holder = new Bitmap[1]; Bitmap[] holder = new Bitmap[1];
CallbackHelper helper = new CallbackHelper(); CallbackHelper helper = new CallbackHelper();
PostTask.postTask(UiThreadTaskTraits.DEFAULT, () -> { PostTask.postTask(UiThreadTaskTraits.DEFAULT, () -> {
client.getFaviconImageForURL("url.with.no.favicon", favicon -> { mSiteSettingsClient.getFaviconImageForURL("url.with.no.favicon", favicon -> {
holder[0] = favicon; holder[0] = favicon;
helper.notifyCalled(); helper.notifyCalled();
}); });
......
...@@ -269,8 +269,8 @@ public class PageInfoController ...@@ -269,8 +269,8 @@ public class PageInfoController
PageInfoViewV2 view2 = (PageInfoViewV2) mView; PageInfoViewV2 view2 = (PageInfoViewV2) mView;
mConnectionController = mConnectionController =
new PageInfoConnectionController(this, view2.getConnectionRowView()); new PageInfoConnectionController(this, view2.getConnectionRowView());
mPermissionsController = mPermissionsController = new PageInfoPermissionsController(
new PageInfoPermissionsController(this, view2.getPermissionsRowView()); this, view2.getPermissionsRowView(), mDelegate, mDisplayUrlBuilder.toString());
mCookiesController = new PageInfoCookiesController( mCookiesController = new PageInfoCookiesController(
this, view2.getCookiesRowView(), viewParams.cookieControlsShown, mFullUrl); this, view2.getCookiesRowView(), viewParams.cookieControlsShown, mFullUrl);
} else { } else {
......
...@@ -9,6 +9,7 @@ import android.content.Intent; ...@@ -9,6 +9,7 @@ import android.content.Intent;
import androidx.annotation.IntDef; import androidx.annotation.IntDef;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import org.chromium.base.Consumer; import org.chromium.base.Consumer;
import org.chromium.base.supplier.Supplier; import org.chromium.base.supplier.Supplier;
...@@ -212,4 +213,10 @@ public abstract class PageInfoControllerDelegate { ...@@ -212,4 +213,10 @@ public abstract class PageInfoControllerDelegate {
*/ */
@NonNull @NonNull
public abstract BrowserContextHandle getBrowserContext(); public abstract BrowserContextHandle getBrowserContext();
/**
* @return Returns the fragment to be used for the permissions subpage of page info.
*/
@NonNull
public abstract Fragment getPermissionsSubpageFragmentForUrl(String url);
} }
...@@ -7,18 +7,26 @@ package org.chromium.components.page_info; ...@@ -7,18 +7,26 @@ package org.chromium.components.page_info;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
/** /**
* Class for controlling the page info permissions section. * Class for controlling the page info permissions section.
*/ */
public class PageInfoPermissionsController implements PageInfoSubpageController { public class PageInfoPermissionsController implements PageInfoSubpageController {
private PageInfoMainPageController mMainController; private PageInfoMainPageController mMainController;
private PageInfoRowView mRowView; private PageInfoRowView mRowView;
private PageInfoControllerDelegate mDelegate;
private String mTitle; private String mTitle;
private String mPageUrl;
private Fragment mSubpageFragment;
public PageInfoPermissionsController( public PageInfoPermissionsController(PageInfoMainPageController mainController,
PageInfoMainPageController mainController, PageInfoRowView view) { PageInfoRowView view, PageInfoControllerDelegate delegate, String pageUrl) {
mMainController = mainController; mMainController = mainController;
mRowView = view; mRowView = view;
mDelegate = delegate;
mPageUrl = pageUrl;
} }
private void launchSubpage() { private void launchSubpage() {
...@@ -32,15 +40,22 @@ public class PageInfoPermissionsController implements PageInfoSubpageController ...@@ -32,15 +40,22 @@ public class PageInfoPermissionsController implements PageInfoSubpageController
@Override @Override
public View createViewForSubpage(ViewGroup parent) { public View createViewForSubpage(ViewGroup parent) {
// TODO(crbug.com/1077766): Create and set the permissions specific view. assert mSubpageFragment == null;
return null; mSubpageFragment = mDelegate.getPermissionsSubpageFragmentForUrl(mPageUrl);
AppCompatActivity host = (AppCompatActivity) mRowView.getContext();
host.getSupportFragmentManager().beginTransaction().add(mSubpageFragment, null).commitNow();
return mSubpageFragment.getView();
} }
@Override @Override
public void onSubPageAttached() {} public void onSubPageAttached() {}
@Override @Override
public void onSubpageRemoved() {} public void onSubpageRemoved() {
AppCompatActivity host = (AppCompatActivity) mRowView.getContext();
host.getSupportFragmentManager().beginTransaction().remove(mSubpageFragment).commitNow();
mSubpageFragment = null;
}
public void setPermissions(PageInfoView.PermissionParams params) { public void setPermissions(PageInfoView.PermissionParams params) {
mTitle = mRowView.getContext().getResources().getString( mTitle = mRowView.getContext().getResources().getString(
......
...@@ -6,11 +6,14 @@ package org.chromium.weblayer_private; ...@@ -6,11 +6,14 @@ package org.chromium.weblayer_private;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import org.chromium.base.StrictModeContext; import org.chromium.base.StrictModeContext;
import org.chromium.base.supplier.Supplier; import org.chromium.base.supplier.Supplier;
import org.chromium.components.browser_ui.site_settings.SingleWebsiteSettings;
import org.chromium.components.content_settings.CookieControlsBridge; import org.chromium.components.content_settings.CookieControlsBridge;
import org.chromium.components.content_settings.CookieControlsObserver; import org.chromium.components.content_settings.CookieControlsObserver;
import org.chromium.components.embedder_support.browser_context.BrowserContextHandle; import org.chromium.components.embedder_support.browser_context.BrowserContextHandle;
...@@ -81,6 +84,19 @@ public class PageInfoControllerDelegateImpl extends PageInfoControllerDelegate { ...@@ -81,6 +84,19 @@ public class PageInfoControllerDelegateImpl extends PageInfoControllerDelegate {
return mProfile; return mProfile;
} }
/**
* {@inheritDoc}
*/
@Override
@NonNull
public Fragment getPermissionsSubpageFragmentForUrl(String url) {
Bundle fragmentArgs = SingleWebsiteSettings.createFragmentArgsForSite(url);
SingleWebsiteSettings fragment = (SingleWebsiteSettings) Fragment.instantiate(
mContext, SingleWebsiteSettings.class.getName(), fragmentArgs);
fragment.setSiteSettingsClient(new WebLayerSiteSettingsClient(getBrowserContext()));
return fragment;
}
private static boolean isHttpOrHttps(GURL url) { private static boolean isHttpOrHttps(GURL url) {
String scheme = url.getScheme(); String scheme = url.getScheme();
return UrlConstants.HTTP_SCHEME.equals(scheme) || UrlConstants.HTTPS_SCHEME.equals(scheme); return UrlConstants.HTTP_SCHEME.equals(scheme) || UrlConstants.HTTPS_SCHEME.equals(scheme);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment