Commit 406820b3 authored by Christian Dullweber's avatar Christian Dullweber Committed by Commit Bot

Restructure url display for new PageInfo UI

Create a wrapper that contains the URL and header for subpages and
a placeholder that can be filled with either the main page or a subpage.

Bug: 1077766
Change-Id: I812ddd8a4e593b8c74cc6fef52bee012a264e5c4
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2396239
Commit-Queue: Christian Dullweber <dullweber@chromium.org>
Reviewed-by: default avatarEhimare Okoyomon <eokoyomon@chromium.org>
Cr-Commit-Position: refs/heads/master@{#805735}
parent 423bc8f5
...@@ -104,7 +104,7 @@ public class PageInfoControllerTest { ...@@ -104,7 +104,7 @@ public class PageInfoControllerTest {
new PageInfoController(tab.getWebContents(), ConnectionSecurityLevel.NONE, new PageInfoController(tab.getWebContents(), ConnectionSecurityLevel.NONE,
/*publisher=*/null, chromePageInfoControllerDelegate, /*publisher=*/null, chromePageInfoControllerDelegate,
chromePermissionParamsListBuilderDelegate); chromePermissionParamsListBuilderDelegate);
PageInfoView pageInfoView = pageInfo.getPageInfoViewForTesting(); PageInfoView pageInfoView = (PageInfoView) pageInfo.getPageInfoViewForTesting();
// Test that the title contains the Unicode hostname rather than strict equality, as // Test that the title contains the Unicode hostname rather than strict equality, as
// the test server will be bound to a random port. // the test server will be bound to a random port.
Assert.assertTrue( Assert.assertTrue(
......
...@@ -41,7 +41,6 @@ import org.chromium.components.content_settings.CookieControlsMode; ...@@ -41,7 +41,6 @@ import org.chromium.components.content_settings.CookieControlsMode;
import org.chromium.components.location.LocationUtils; import org.chromium.components.location.LocationUtils;
import org.chromium.components.page_info.PageInfoController; import org.chromium.components.page_info.PageInfoController;
import org.chromium.components.page_info.PageInfoFeatureList; import org.chromium.components.page_info.PageInfoFeatureList;
import org.chromium.components.page_info.PageInfoView;
import org.chromium.components.user_prefs.UserPrefs; import org.chromium.components.user_prefs.UserPrefs;
import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.content_public.browser.test.util.TestThreadUtils;
import org.chromium.content_public.common.ContentSwitches; import org.chromium.content_public.common.ContentSwitches;
...@@ -90,10 +89,10 @@ public class PageInfoViewTest { ...@@ -90,10 +89,10 @@ public class PageInfoViewTest {
onView(withId(R.id.location_bar_status_icon)).perform(click()); onView(withId(R.id.location_bar_status_icon)).perform(click());
} }
private PageInfoView getPageInfoView() { private View getPageInfoView() {
PageInfoController controller = PageInfoController.getLastPageInfoControllerForTesting(); PageInfoController controller = PageInfoController.getLastPageInfoControllerForTesting();
assertNotNull(controller); assertNotNull(controller);
PageInfoView view = controller.getPageInfoViewForTesting(); View view = controller.getPageInfoViewForTesting();
assertNotNull(view); assertNotNull(view);
return view; return view;
} }
...@@ -266,9 +265,8 @@ public class PageInfoViewTest { ...@@ -266,9 +265,8 @@ public class PageInfoViewTest {
@Features.EnableFeatures(PageInfoFeatureList.PAGE_INFO_V2) @Features.EnableFeatures(PageInfoFeatureList.PAGE_INFO_V2)
public void testShowConnectionInfoSubpage() throws IOException { public void testShowConnectionInfoSubpage() throws IOException {
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(mPath)); loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(mPath));
View dialog = (View) getPageInfoView().getParent();
onView(withId(R.id.page_info_connection_row)).perform(click()); onView(withId(R.id.page_info_connection_row)).perform(click());
mRenderTestRule.render(dialog, "PageInfo_ConnectionInfoSubpage"); mRenderTestRule.render(getPageInfoView(), "PageInfo_ConnectionInfoSubpage");
} }
/** /**
...@@ -280,9 +278,8 @@ public class PageInfoViewTest { ...@@ -280,9 +278,8 @@ public class PageInfoViewTest {
@Features.EnableFeatures(PageInfoFeatureList.PAGE_INFO_V2) @Features.EnableFeatures(PageInfoFeatureList.PAGE_INFO_V2)
public void testShowPermissionsSubpage() throws IOException { public void testShowPermissionsSubpage() throws IOException {
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(mPath)); loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(mPath));
View dialog = (View) getPageInfoView().getParent();
onView(withId(R.id.page_info_permissions_row)).perform(click()); onView(withId(R.id.page_info_permissions_row)).perform(click());
mRenderTestRule.render(dialog, "PageInfo_PermissionsSubpage"); mRenderTestRule.render(getPageInfoView(), "PageInfo_PermissionsSubpage");
} }
/** /**
...@@ -295,9 +292,8 @@ public class PageInfoViewTest { ...@@ -295,9 +292,8 @@ public class PageInfoViewTest {
public void testShowCookiesSubpage() throws IOException { public void testShowCookiesSubpage() throws IOException {
setThirdPartyCookieBlocking(CookieControlsMode.BLOCK_THIRD_PARTY); setThirdPartyCookieBlocking(CookieControlsMode.BLOCK_THIRD_PARTY);
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(mPath)); loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(mPath));
View dialog = (View) getPageInfoView().getParent();
onView(withId(R.id.page_info_cookies_row)).perform(click()); onView(withId(R.id.page_info_cookies_row)).perform(click());
mRenderTestRule.render(dialog, "PageInfo_CookiesSubpage"); mRenderTestRule.render(getPageInfoView(), "PageInfo_CookiesSubpage");
} }
// TODO(1071762): Add tests for preview pages, offline pages, offline state and other states. // TODO(1071762): Add tests for preview pages, offline pages, offline state and other states.
......
...@@ -51,9 +51,9 @@ android_resources("java_resources") { ...@@ -51,9 +51,9 @@ android_resources("java_resources") {
"java/res/layout/connection_info.xml", "java/res/layout/connection_info.xml",
"java/res/layout/cookie_controls_view.xml", "java/res/layout/cookie_controls_view.xml",
"java/res/layout/page_info.xml", "java/res/layout/page_info.xml",
"java/res/layout/page_info_container.xml",
"java/res/layout/page_info_permission_row.xml", "java/res/layout/page_info_permission_row.xml",
"java/res/layout/page_info_row.xml", "java/res/layout/page_info_row.xml",
"java/res/layout/page_info_subpage.xml",
"java/res/layout/page_info_v2.xml", "java/res/layout/page_info_v2.xml",
"java/res/values/colors.xml", "java/res/values/colors.xml",
"java/res/values/dimens.xml", "java/res/values/dimens.xml",
...@@ -77,16 +77,16 @@ android_library("java") { ...@@ -77,16 +77,16 @@ android_library("java") {
"java/src/org/chromium/components/page_info/ConnectionInfoView.java", "java/src/org/chromium/components/page_info/ConnectionInfoView.java",
"java/src/org/chromium/components/page_info/CookieControlsView.java", "java/src/org/chromium/components/page_info/CookieControlsView.java",
"java/src/org/chromium/components/page_info/PageInfoConnectionController.java", "java/src/org/chromium/components/page_info/PageInfoConnectionController.java",
"java/src/org/chromium/components/page_info/PageInfoContainer.java",
"java/src/org/chromium/components/page_info/PageInfoController.java", "java/src/org/chromium/components/page_info/PageInfoController.java",
"java/src/org/chromium/components/page_info/PageInfoControllerDelegate.java", "java/src/org/chromium/components/page_info/PageInfoControllerDelegate.java",
"java/src/org/chromium/components/page_info/PageInfoCookiesController.java", "java/src/org/chromium/components/page_info/PageInfoCookiesController.java",
"java/src/org/chromium/components/page_info/PageInfoCookiesPreference.java", "java/src/org/chromium/components/page_info/PageInfoCookiesPreference.java",
"java/src/org/chromium/components/page_info/PageInfoDialog.java", "java/src/org/chromium/components/page_info/PageInfoDialog.java",
"java/src/org/chromium/components/page_info/PageInfoFeatureList.java", "java/src/org/chromium/components/page_info/PageInfoFeatureList.java",
"java/src/org/chromium/components/page_info/PageInfoMainPageController.java", "java/src/org/chromium/components/page_info/PageInfoMainController.java",
"java/src/org/chromium/components/page_info/PageInfoPermissionsController.java", "java/src/org/chromium/components/page_info/PageInfoPermissionsController.java",
"java/src/org/chromium/components/page_info/PageInfoRowView.java", "java/src/org/chromium/components/page_info/PageInfoRowView.java",
"java/src/org/chromium/components/page_info/PageInfoSubpage.java",
"java/src/org/chromium/components/page_info/PageInfoSubpageController.java", "java/src/org/chromium/components/page_info/PageInfoSubpageController.java",
"java/src/org/chromium/components/page_info/PageInfoView.java", "java/src/org/chromium/components/page_info/PageInfoView.java",
"java/src/org/chromium/components/page_info/PageInfoViewV2.java", "java/src/org/chromium/components/page_info/PageInfoViewV2.java",
......
...@@ -14,14 +14,26 @@ ...@@ -14,14 +14,26 @@
android:background="@color/sheet_bg_color" android:background="@color/sheet_bg_color"
android:orientation="vertical"> android:orientation="vertical">
<TextView
android:id="@+id/page_info_truncated_url"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:ellipsize="end"
android:layout_marginVertical="16dp"
android:lineSpacingExtra="6dp"
android:textAlignment="center"
android:textAppearance="@style/TextAppearance.TextLarge.Primary" />
<view <view
android:id="@+id/subpage_url" android:id="@+id/page_info_url"
class="org.chromium.components.page_info.PageInfoView$ElidedUrlTextView" class="org.chromium.components.page_info.PageInfoView$ElidedUrlTextView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:ellipsize="end" android:ellipsize="end"
android:lineSpacingExtra="6dp" android:lineSpacingExtra="6dp"
android:paddingVertical="16dp" android:paddingVertical="16dp"
android:visibility="gone"
android:textAlignment="center" android:textAlignment="center"
android:textAppearance="@style/TextAppearance.TextLarge.Primary" /> android:textAppearance="@style/TextAppearance.TextLarge.Primary" />
...@@ -30,7 +42,8 @@ ...@@ -30,7 +42,8 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal" android:orientation="horizontal"
android:gravity="center_vertical" android:gravity="center_vertical"
android:paddingHorizontal="16dp"> android:paddingHorizontal="16dp"
android:id="@+id/page_info_subpage_header">
<org.chromium.ui.widget.ChromeImageButton <org.chromium.ui.widget.ChromeImageButton
android:id="@+id/subpage_back_button" android:id="@+id/subpage_back_button"
...@@ -45,7 +58,7 @@ ...@@ -45,7 +58,7 @@
app:tint="@color/default_icon_color" /> app:tint="@color/default_icon_color" />
<TextView <TextView
android:id="@+id/subpage_title" android:id="@+id/page_info_subpage_title"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginVertical="12dp" android:layout_marginVertical="12dp"
...@@ -54,7 +67,7 @@ ...@@ -54,7 +67,7 @@
<!-- Programmatically add page specific inner view here --> <!-- Programmatically add page specific inner view here -->
<FrameLayout <FrameLayout
android:id="@+id/placeholder" android:id="@+id/page_info_content"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" /> android:layout_height="match_parent" />
......
...@@ -17,32 +17,7 @@ ...@@ -17,32 +17,7 @@
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical" android:orientation="vertical">
android:paddingBottom="12dp"
android:paddingEnd="@dimen/page_info_popup_padding_sides"
android:paddingStart="@dimen/page_info_popup_padding_sides" >
<TextView
android:id="@+id/page_info_truncated_url"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:ellipsize="end"
android:layout_marginTop="16dp"
android:lineSpacingExtra="6dp"
android:textAlignment="center"
android:textAppearance="@style/TextAppearance.TextLarge.Primary" />
<view class="org.chromium.components.page_info.PageInfoView$ElidedUrlTextView"
android:id="@+id/page_info_url"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:lineSpacingExtra="6dp"
android:layout_marginTop="16dp"
android:textAlignment="viewStart"
android:textAppearance="@style/TextAppearance.TextLarge.Primary" />
<View <View
android:id="@+id/page_info_preview_separator" android:id="@+id/page_info_preview_separator"
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
......
...@@ -17,7 +17,7 @@ import org.chromium.content_public.browser.WebContents; ...@@ -17,7 +17,7 @@ import org.chromium.content_public.browser.WebContents;
*/ */
public class PageInfoConnectionController public class PageInfoConnectionController
implements PageInfoSubpageController, ConnectionInfoView.ConnectionInfoDelegate { implements PageInfoSubpageController, ConnectionInfoView.ConnectionInfoDelegate {
private PageInfoMainPageController mMainController; private PageInfoMainController mMainController;
private final WebContents mWebContents; private final WebContents mWebContents;
private final VrHandler mVrHandler; private final VrHandler mVrHandler;
private PageInfoRowView mRowView; private PageInfoRowView mRowView;
...@@ -25,8 +25,8 @@ public class PageInfoConnectionController ...@@ -25,8 +25,8 @@ public class PageInfoConnectionController
private ConnectionInfoView mInfoView; private ConnectionInfoView mInfoView;
private ViewGroup mContainer; private ViewGroup mContainer;
public PageInfoConnectionController(PageInfoMainPageController mainController, public PageInfoConnectionController(PageInfoMainController mainController, PageInfoRowView view,
PageInfoRowView view, WebContents webContents, VrHandler vrHandler) { WebContents webContents, VrHandler vrHandler) {
mMainController = mainController; mMainController = mainController;
mWebContents = webContents; mWebContents = webContents;
mVrHandler = vrHandler; mVrHandler = vrHandler;
......
// Copyright 2020 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.components.page_info;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.TextView;
import org.chromium.ui.widget.ChromeImageButton;
/**
* Represents the url, a sub page header and container for page info content.
*/
public class PageInfoContainer extends FrameLayout {
/** Parameters to configure the view of page info subpage. */
public static class Params {
// Whether the URL title should be shown.
public boolean urlTitleShown;
// The URL to be shown at the top of the page.
public CharSequence url;
// The length of the URL's origin in number of characters.
public int urlOriginLength;
// The URL to show in truncated state.
public String truncatedUrl;
public Runnable urlTitleClickCallback;
public Runnable urlTitleLongClickCallback;
public Runnable backButtonClickCallback;
}
private PageInfoView.ElidedUrlTextView mUrlTitle;
private TextView mTruncatedUrlTitle;
private final View mSubpageHeader;
private TextView mSubpageTitle;
private final FrameLayout mContent;
public PageInfoContainer(Context context) {
super(context);
LayoutInflater.from(context).inflate(R.layout.page_info_container, this, true);
mSubpageHeader = findViewById(R.id.page_info_subpage_header);
mSubpageTitle = findViewById(R.id.page_info_subpage_title);
mContent = findViewById(R.id.page_info_content);
}
public void setParams(Params params) {
mUrlTitle = findViewById(R.id.page_info_url);
initializeUrlView(mUrlTitle, params);
mUrlTitle.setUrl(params.url, params.urlOriginLength);
// Adjust the mUrlTitle for displaying the non-truncated URL.
mUrlTitle.toggleTruncation();
mTruncatedUrlTitle = findViewById(R.id.page_info_truncated_url);
// Use a separate view for truncated URL display.
initializeUrlView(mTruncatedUrlTitle, params);
mTruncatedUrlTitle = findViewById(R.id.page_info_truncated_url);
mTruncatedUrlTitle.setText(params.truncatedUrl);
ChromeImageButton backButton = findViewById(R.id.subpage_back_button);
backButton.setOnClickListener(v -> params.backButtonClickCallback.run());
}
private void initializeUrlView(View view, Params params) {
if (!params.urlTitleShown) {
view.setVisibility(GONE);
}
if (params.urlTitleClickCallback != null) {
view.setOnClickListener(v -> { params.urlTitleClickCallback.run(); });
}
if (params.urlTitleLongClickCallback != null) {
view.setOnLongClickListener(v -> {
params.urlTitleLongClickCallback.run();
return true;
});
}
}
public void toggleUrlTruncation() {
mUrlTitle.setVisibility(mTruncatedUrlTitle.getVisibility());
mTruncatedUrlTitle.setVisibility(mUrlTitle.getVisibility() == VISIBLE ? GONE : VISIBLE);
}
public void setFavicon(Drawable favicon) {
int padding =
getResources().getDimensionPixelSize(R.dimen.page_info_popup_button_padding_sides);
int size = getResources().getDimensionPixelSize(R.dimen.page_info_favicon_size);
favicon.setBounds(0, 0, size, size);
mTruncatedUrlTitle.setCompoundDrawablePadding(padding);
mTruncatedUrlTitle.setCompoundDrawablesRelative(favicon, null, null, null);
}
public void showPage(View view, CharSequence title, boolean isMainPage) {
mContent.removeAllViews();
mContent.addView(view);
mSubpageHeader.setVisibility(isMainPage ? GONE : VISIBLE);
mSubpageTitle.setText(title);
}
}
...@@ -18,9 +18,7 @@ import android.text.TextUtils; ...@@ -18,9 +18,7 @@ import android.text.TextUtils;
import android.text.style.ForegroundColorSpan; import android.text.style.ForegroundColorSpan;
import android.text.style.TextAppearanceSpan; import android.text.style.TextAppearanceSpan;
import android.view.View; import android.view.View;
import android.view.ViewGroup;
import android.view.Window; import android.view.Window;
import android.widget.FrameLayout;
import androidx.annotation.IntDef; import androidx.annotation.IntDef;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
...@@ -66,9 +64,9 @@ import java.lang.ref.WeakReference; ...@@ -66,9 +64,9 @@ import java.lang.ref.WeakReference;
/** /**
* Java side of Android implementation of the page info UI. * Java side of Android implementation of the page info UI.
*/ */
public class PageInfoController public class PageInfoController implements PageInfoMainController, ModalDialogProperties.Controller,
implements PageInfoMainPageController, ModalDialogProperties.Controller, SystemSettingsActivityRequiredListener,
SystemSettingsActivityRequiredListener, CookieControlsObserver { CookieControlsObserver {
@IntDef({OpenedFromSource.MENU, OpenedFromSource.TOOLBAR, OpenedFromSource.VR}) @IntDef({OpenedFromSource.MENU, OpenedFromSource.TOOLBAR, OpenedFromSource.VR})
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
public @interface OpenedFromSource { public @interface OpenedFromSource {
...@@ -85,9 +83,12 @@ public class PageInfoController ...@@ -85,9 +83,12 @@ public class PageInfoController
// A pointer to the C++ object for this UI. // A pointer to the C++ object for this UI.
private long mNativePageInfoController; private long mNativePageInfoController;
// The view inside the popup. // The view inside the popup or the main PageInfo view.
private PageInfoView mView; private PageInfoView mView;
// The view inside the popup (V2).
private PageInfoContainer mContainer;
// The dialog the view is placed in. // The dialog the view is placed in.
private PageInfoDialog mDialog; private PageInfoDialog mDialog;
...@@ -95,12 +96,6 @@ public class PageInfoController ...@@ -95,12 +96,6 @@ public class PageInfoController
// URL'. // URL'.
private String mFullUrl; private String mFullUrl;
// The URL to be shown at the top of the page info views.
private SpannableStringBuilder mDisplayUrlBuilder;
// The length of the URL's origin in number of characters.
private int mUrlOriginLength;
// Whether or not this page is an internal chrome page (e.g. the // Whether or not this page is an internal chrome page (e.g. the
// chrome://settings page). // chrome://settings page).
private boolean mIsInternalPage; private boolean mIsInternalPage;
...@@ -123,15 +118,13 @@ public class PageInfoController ...@@ -123,15 +118,13 @@ public class PageInfoController
// Whether Version 2 of the PageInfoView is enabled. // Whether Version 2 of the PageInfoView is enabled.
private boolean mIsV2Enabled; private boolean mIsV2Enabled;
// Used to show Site settings from Page Info UI. // Used to show Site settings from Page Info UI.
private final PermissionParamsListBuilder mPermissionParamsListBuilder; private final PermissionParamsListBuilder mPermissionParamsListBuilder;
// Delegate used by PermissionParamsListBuilder. // Delegate used by PermissionParamsListBuilder.
private final PermissionParamsListBuilderDelegate mPermissionParamsListBuilderDelegate; private final PermissionParamsListBuilderDelegate mPermissionParamsListBuilderDelegate;
// The specific subpage being shown at any time, if any.
private PageInfoSubpage mSubpage;
// The current page info subpage controller, if any. // The current page info subpage controller, if any.
private PageInfoSubpageController mSubpageController; private PageInfoSubpageController mSubpageController;
...@@ -197,33 +190,29 @@ public class PageInfoController ...@@ -197,33 +190,29 @@ public class PageInfoController
if (mDelegate.isShowingOfflinePage()) { if (mDelegate.isShowingOfflinePage()) {
displayUrl = UrlUtilities.stripScheme(mFullUrl); displayUrl = UrlUtilities.stripScheme(mFullUrl);
} }
mDisplayUrlBuilder = new SpannableStringBuilder(displayUrl); SpannableStringBuilder displayUrlBuilder = new SpannableStringBuilder(displayUrl);
AutocompleteSchemeClassifier autocompleteSchemeClassifier = AutocompleteSchemeClassifier autocompleteSchemeClassifier =
delegate.createAutocompleteSchemeClassifier(); delegate.createAutocompleteSchemeClassifier();
if (mSecurityLevel == ConnectionSecurityLevel.SECURE) { if (mSecurityLevel == ConnectionSecurityLevel.SECURE) {
OmniboxUrlEmphasizer.EmphasizeComponentsResponse emphasizeResponse = OmniboxUrlEmphasizer.EmphasizeComponentsResponse emphasizeResponse =
OmniboxUrlEmphasizer.parseForEmphasizeComponents( OmniboxUrlEmphasizer.parseForEmphasizeComponents(
mDisplayUrlBuilder.toString(), autocompleteSchemeClassifier); displayUrlBuilder.toString(), autocompleteSchemeClassifier);
if (emphasizeResponse.schemeLength > 0) { if (emphasizeResponse.schemeLength > 0) {
mDisplayUrlBuilder.setSpan( displayUrlBuilder.setSpan(
new TextAppearanceSpan(mContext, R.style.TextAppearance_RobotoMediumStyle), new TextAppearanceSpan(mContext, R.style.TextAppearance_RobotoMediumStyle),
0, emphasizeResponse.schemeLength, Spannable.SPAN_EXCLUSIVE_INCLUSIVE); 0, emphasizeResponse.schemeLength, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
} }
} }
boolean useDarkText = !ColorUtils.inNightMode(mContext); boolean useDarkText = !ColorUtils.inNightMode(mContext);
OmniboxUrlEmphasizer.emphasizeUrl(mDisplayUrlBuilder, mContext.getResources(), OmniboxUrlEmphasizer.emphasizeUrl(displayUrlBuilder, mContext.getResources(),
autocompleteSchemeClassifier, mSecurityLevel, mIsInternalPage, useDarkText, autocompleteSchemeClassifier, mSecurityLevel, mIsInternalPage, useDarkText,
/*emphasizeScheme=*/true); /*emphasizeScheme=*/true);
viewParams.url = mDisplayUrlBuilder; viewParams.url = displayUrlBuilder;
mUrlOriginLength = OmniboxUrlEmphasizer.getOriginEndIndex( viewParams.urlOriginLength = OmniboxUrlEmphasizer.getOriginEndIndex(
mDisplayUrlBuilder.toString(), autocompleteSchemeClassifier); displayUrlBuilder.toString(), autocompleteSchemeClassifier);
viewParams.urlOriginLength = mUrlOriginLength;
autocompleteSchemeClassifier.destroy(); autocompleteSchemeClassifier.destroy();
viewParams.truncatedUrl =
UrlFormatter.formatUrlForSecurityDisplay(url, SchemeDisplay.OMIT_HTTP_AND_HTTPS);
if (mDelegate.isSiteSettingsAvailable()) { if (mDelegate.isSiteSettingsAvailable()) {
viewParams.siteSettingsButtonClickCallback = () -> { viewParams.siteSettingsButtonClickCallback = () -> {
// Delay while the dialog closes. // Delay while the dialog closes.
...@@ -265,20 +254,30 @@ public class PageInfoController ...@@ -265,20 +254,30 @@ public class PageInfoController
: new PageInfoView(mContext, viewParams); : new PageInfoView(mContext, viewParams);
if (isSheet(mContext)) mView.setBackgroundColor(Color.WHITE); if (isSheet(mContext)) mView.setBackgroundColor(Color.WHITE);
if (mIsV2Enabled) { if (mIsV2Enabled) {
mSubpage = new PageInfoSubpage(mContext); mContainer = new PageInfoContainer(mContext);
mSubpage.setBackButtonOnClickListener(view -> exitSubpage()); PageInfoContainer.Params containerParams = new PageInfoContainer.Params();
containerParams.url = viewParams.url;
containerParams.urlOriginLength = viewParams.urlOriginLength;
containerParams.truncatedUrl = UrlFormatter.formatUrlForSecurityDisplay(
url, SchemeDisplay.OMIT_HTTP_AND_HTTPS);
containerParams.backButtonClickCallback = this::exitSubpage;
containerParams.urlTitleClickCallback = mContainer::toggleUrlTruncation;
containerParams.urlTitleLongClickCallback = viewParams.urlTitleLongClickCallback;
containerParams.urlTitleShown = viewParams.urlTitleShown;
mContainer.setParams(containerParams);
mContainer.showPage(mView, "", true);
PageInfoViewV2 view2 = (PageInfoViewV2) mView; PageInfoViewV2 view2 = (PageInfoViewV2) mView;
mConnectionController = new PageInfoConnectionController( mConnectionController = new PageInfoConnectionController(
this, view2.getConnectionRowView(), mWebContents, mDelegate.getVrHandler()); this, view2.getConnectionRowView(), mWebContents, mDelegate.getVrHandler());
mPermissionsController = new PageInfoPermissionsController( mPermissionsController = new PageInfoPermissionsController(
this, view2.getPermissionsRowView(), mDelegate, mDisplayUrlBuilder.toString()); this, view2.getPermissionsRowView(), mDelegate, mFullUrl);
mCookiesController = new PageInfoCookiesController(this, view2.getCookiesRowView(), mCookiesController = new PageInfoCookiesController(this, view2.getCookiesRowView(),
mDelegate, viewParams.cookieControlsShown, mFullUrl); mDelegate, viewParams.cookieControlsShown, mFullUrl);
mDelegate.getFavicon(mFullUrl, favicon -> { mDelegate.getFavicon(mFullUrl, favicon -> {
if (favicon != null) { if (favicon != null) {
mView.setFavicon(favicon); mContainer.setFavicon(favicon);
} else { } else {
mView.setFavicon( mContainer.setFavicon(
SettingsUtils.getTintedIcon(mContext, R.drawable.ic_globe_24dp)); SettingsUtils.getTintedIcon(mContext, R.drawable.ic_globe_24dp));
} }
}); });
...@@ -336,7 +335,7 @@ public class PageInfoController ...@@ -336,7 +335,7 @@ public class PageInfoController
} }
}; };
mDialog = new PageInfoDialog(mContext, mView, mSubpage, mDialog = new PageInfoDialog(mContext, mView, mContainer,
webContents.getViewAndroidDelegate().getContainerView(), isSheet(mContext), webContents.getViewAndroidDelegate().getContainerView(), isSheet(mContext),
delegate.getModalDialogManager(), this); delegate.getModalDialogManager(), this);
mDialog.show(); mDialog.show();
...@@ -503,9 +502,8 @@ public class PageInfoController ...@@ -503,9 +502,8 @@ public class PageInfoController
} }
@VisibleForTesting @VisibleForTesting
public PageInfoView getPageInfoViewForTesting() { public View getPageInfoViewForTesting() {
// Check that this view is active. if (mContainer != null) return mContainer;
assert mView.getParent() != null;
return mView; return mView;
} }
...@@ -584,33 +582,16 @@ public class PageInfoController ...@@ -584,33 +582,16 @@ public class PageInfoController
@Override @Override
public void launchSubpage(PageInfoSubpageController controller) { public void launchSubpage(PageInfoSubpageController controller) {
mSubpageController = controller; mSubpageController = controller;
PageInfoSubpage.Params subpageParams = new PageInfoSubpage.Params(); CharSequence title = mSubpageController.getSubpageTitle();
subpageParams.url = mDisplayUrlBuilder; View subview = mSubpageController.createViewForSubpage(mContainer);
subpageParams.urlOriginLength = mUrlOriginLength; mContainer.showPage(subview, title, false);
subpageParams.subpageTitle = mSubpageController.getSubpageTitle();
mSubpage.updateSubpage(subpageParams);
View subview = mSubpageController.createViewForSubpage(mSubpage);
((FrameLayout) mSubpage.findViewById(R.id.placeholder)).addView(subview);
replaceView(mView, mSubpage);
controller.onSubPageAttached(); controller.onSubPageAttached();
} }
@Override @Override
public void exitSubpage() { public void exitSubpage() {
replaceView(mSubpage, mView); mContainer.showPage(mView, "", true);
((FrameLayout) mSubpage.findViewById(R.id.placeholder)).removeAllViews();
mSubpageController.onSubpageRemoved(); mSubpageController.onSubpageRemoved();
mSubpageController = null; mSubpageController = null;
} }
private void replaceView(View currentView, View newView) {
assert currentView.getParent() != null;
assert newView.getParent() == null;
ViewGroup parent = (ViewGroup) currentView.getParent();
final int index = parent.indexOfChild(currentView);
parent.removeView(currentView);
parent.addView(newView, index);
}
} }
...@@ -23,7 +23,7 @@ import org.chromium.components.embedder_support.util.Origin; ...@@ -23,7 +23,7 @@ import org.chromium.components.embedder_support.util.Origin;
*/ */
public class PageInfoCookiesController public class PageInfoCookiesController
implements PageInfoSubpageController, CookieControlsObserver { implements PageInfoSubpageController, CookieControlsObserver {
private PageInfoMainPageController mMainController; private PageInfoMainController mMainController;
private PageInfoRowView mRowView; private PageInfoRowView mRowView;
private CookieControlsBridge mBridge; private CookieControlsBridge mBridge;
private PageInfoControllerDelegate mDelegate; private PageInfoControllerDelegate mDelegate;
...@@ -36,9 +36,8 @@ public class PageInfoCookiesController ...@@ -36,9 +36,8 @@ public class PageInfoCookiesController
private int mStatus; private int mStatus;
private boolean mIsEnforced; private boolean mIsEnforced;
public PageInfoCookiesController(PageInfoMainPageController mainController, public PageInfoCookiesController(PageInfoMainController mainController, PageInfoRowView rowView,
PageInfoRowView rowView, PageInfoControllerDelegate delegate, boolean isVisible, PageInfoControllerDelegate delegate, boolean isVisible, String fullUrl) {
String fullUrl) {
mMainController = mainController; mMainController = mainController;
mRowView = rowView; mRowView = rowView;
mDelegate = delegate; mDelegate = delegate;
......
...@@ -39,7 +39,7 @@ public class PageInfoDialog { ...@@ -39,7 +39,7 @@ public class PageInfoDialog {
@NonNull @NonNull
private final PageInfoView mView; private final PageInfoView mView;
private final PageInfoSubpage mSubpageView; private final PageInfoContainer mContainerView;
private final boolean mIsSheet; private final boolean mIsSheet;
// The dialog implementation. // The dialog implementation.
// mSheetDialog is set if the dialog appears as a sheet. Otherwise, mModalDialog is set. // mSheetDialog is set if the dialog appears as a sheet. Otherwise, mModalDialog is set.
...@@ -68,11 +68,11 @@ public class PageInfoDialog { ...@@ -68,11 +68,11 @@ public class PageInfoDialog {
* *
*/ */
public PageInfoDialog(Context context, @NonNull PageInfoView view, public PageInfoDialog(Context context, @NonNull PageInfoView view,
@Nullable PageInfoSubpage subpageView, View containerView, boolean isSheet, @Nullable PageInfoContainer subpageView, View containerView, boolean isSheet,
@NonNull ModalDialogManager manager, @NonNull ModalDialogManager manager,
@NonNull ModalDialogProperties.Controller controller) { @NonNull ModalDialogProperties.Controller controller) {
mView = view; mView = view;
mSubpageView = subpageView; mContainerView = subpageView;
mIsSheet = isSheet; mIsSheet = isSheet;
mManager = manager; mManager = manager;
mController = controller; mController = controller;
...@@ -99,7 +99,7 @@ public class PageInfoDialog { ...@@ -99,7 +99,7 @@ public class PageInfoDialog {
container = new ScrollView(context); container = new ScrollView(context);
} }
container.addView(mView); container.addView(mContainerView != null ? mContainerView : mView);
if (isSheet) { if (isSheet) {
mSheetDialog = createSheetDialog(context, container); mSheetDialog = createSheetDialog(context, container);
...@@ -163,8 +163,8 @@ public class PageInfoDialog { ...@@ -163,8 +163,8 @@ public class PageInfoDialog {
// Delay the cleanup by a tiny amount to give this frame a chance to // Delay the cleanup by a tiny amount to give this frame a chance to
// be displayed before we destroy the dialog. // be displayed before we destroy the dialog.
mView.postDelayed(this::superDismiss, CLOSE_CLEANUP_DELAY_MS); mView.postDelayed(this::superDismiss, CLOSE_CLEANUP_DELAY_MS);
if (mSubpageView != null) { if (mContainerView != null) {
mSubpageView.postDelayed(this::superDismiss, CLOSE_CLEANUP_DELAY_MS); mContainerView.postDelayed(this::superDismiss, CLOSE_CLEANUP_DELAY_MS);
} }
}).start(); }).start();
} }
...@@ -238,8 +238,8 @@ public class PageInfoDialog { ...@@ -238,8 +238,8 @@ public class PageInfoDialog {
private Animator createAllAnimations(boolean isEnter, Runnable onAnimationEnd) { private Animator createAllAnimations(boolean isEnter, Runnable onAnimationEnd) {
Animator dialogAnimation = Animator dialogAnimation =
mIsSheet ? createDialogSlideAnimaton(isEnter, mView) : new AnimatorSet(); mIsSheet ? createDialogSlideAnimaton(isEnter, mView) : new AnimatorSet();
Animator subpageDialogAnimation = mIsSheet && mSubpageView != null Animator subpageDialogAnimation = mIsSheet && mContainerView != null
? createDialogSlideAnimaton(isEnter, mSubpageView) ? createDialogSlideAnimaton(isEnter, mContainerView)
: new AnimatorSet(); : new AnimatorSet();
Animator viewAnimation = mView.createEnterExitAnimation(isEnter); Animator viewAnimation = mView.createEnterExitAnimation(isEnter);
AnimatorSet allAnimations = new AnimatorSet(); AnimatorSet allAnimations = new AnimatorSet();
......
...@@ -9,7 +9,7 @@ import org.chromium.components.embedder_support.browser_context.BrowserContextHa ...@@ -9,7 +9,7 @@ import org.chromium.components.embedder_support.browser_context.BrowserContextHa
/** /**
* Interface for a page info main page controller. * Interface for a page info main page controller.
*/ */
public interface PageInfoMainPageController { public interface PageInfoMainController {
/** /**
* Launches the PageInfoSubpage provided by |pageInfoCookiesController|. * Launches the PageInfoSubpage provided by |pageInfoCookiesController|.
* @param controller The controller providing a PageInfoSubpage. * @param controller The controller providing a PageInfoSubpage.
......
...@@ -17,14 +17,14 @@ import org.chromium.components.browser_ui.site_settings.SingleWebsiteSettings; ...@@ -17,14 +17,14 @@ import org.chromium.components.browser_ui.site_settings.SingleWebsiteSettings;
* 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 PageInfoMainController mMainController;
private PageInfoRowView mRowView; private PageInfoRowView mRowView;
private PageInfoControllerDelegate mDelegate; private PageInfoControllerDelegate mDelegate;
private String mTitle; private String mTitle;
private String mPageUrl; private String mPageUrl;
private SingleWebsiteSettings mSubpageFragment; private SingleWebsiteSettings mSubpageFragment;
public PageInfoPermissionsController(PageInfoMainPageController mainController, public PageInfoPermissionsController(PageInfoMainController mainController,
PageInfoRowView view, PageInfoControllerDelegate delegate, String pageUrl) { PageInfoRowView view, PageInfoControllerDelegate delegate, String pageUrl) {
mMainController = mainController; mMainController = mainController;
mRowView = view; mRowView = view;
......
// Copyright 2020 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.components.page_info;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.TextView;
import org.chromium.ui.widget.ChromeImageButton;
/**
* Represents a particular page info subpage.
*/
public class PageInfoSubpage extends FrameLayout {
/** Parameters to configure the view of page info subpage. */
public static class Params {
// The URL to be shown at the top of the page.
public CharSequence url;
// The length of the URL's origin in number of characters.
public int urlOriginLength;
// The name of the subpage to be displayed.
public String subpageTitle;
}
private PageInfoView.ElidedUrlTextView mUrlTitle;
private TextView mSubpageTitle;
public PageInfoSubpage(Context context) {
super(context);
LayoutInflater.from(context).inflate(R.layout.page_info_subpage, this, true);
mUrlTitle = findViewById(R.id.subpage_url);
mSubpageTitle = findViewById(R.id.subpage_title);
}
public void updateSubpage(Params params) {
mUrlTitle.setUrl(params.url, params.urlOriginLength);
mSubpageTitle.setText(params.subpageTitle);
}
public void setBackButtonOnClickListener(View.OnClickListener listener) {
ChromeImageButton backButton = findViewById(R.id.subpage_back_button);
backButton.setOnClickListener(listener);
}
}
...@@ -8,7 +8,6 @@ import android.animation.Animator; ...@@ -8,7 +8,6 @@ import android.animation.Animator;
import android.animation.AnimatorSet; import android.animation.AnimatorSet;
import android.animation.ObjectAnimator; import android.animation.ObjectAnimator;
import android.content.Context; import android.content.Context;
import android.graphics.drawable.Drawable;
import android.text.Layout; import android.text.Layout;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.LayoutInflater; import android.view.LayoutInflater;
...@@ -174,7 +173,6 @@ public class PageInfoView extends FrameLayout implements OnClickListener { ...@@ -174,7 +173,6 @@ public class PageInfoView extends FrameLayout implements OnClickListener {
public CharSequence url; public CharSequence url;
public CharSequence previewLoadOriginalMessage; public CharSequence previewLoadOriginalMessage;
public int urlOriginLength; public int urlOriginLength;
public CharSequence truncatedUrl;
} }
/** Parameters to configure the permission info section */ /** Parameters to configure the permission info section */
...@@ -344,13 +342,6 @@ public class PageInfoView extends FrameLayout implements OnClickListener { ...@@ -344,13 +342,6 @@ public class PageInfoView extends FrameLayout implements OnClickListener {
mOnUiClosingCallback.run(); mOnUiClosingCallback.run();
} }
/**
* Sets a favicon for the current page.
*/
public void setFavicon(Drawable favicon) {
// Not implemented.
}
public void setPermissions(PermissionParams params) { public void setPermissions(PermissionParams params) {
mPermissionsList.removeAllViews(); mPermissionsList.removeAllViews();
// If we have at least one permission show the lower permissions area. // If we have at least one permission show the lower permissions area.
......
...@@ -5,11 +5,9 @@ ...@@ -5,11 +5,9 @@
package org.chromium.components.page_info; package org.chromium.components.page_info;
import android.content.Context; import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
...@@ -23,7 +21,6 @@ public class PageInfoViewV2 extends PageInfoView { ...@@ -23,7 +21,6 @@ public class PageInfoViewV2 extends PageInfoView {
private PageInfoRowView mConnectionRow; private PageInfoRowView mConnectionRow;
private PageInfoRowView mPermissionsRow; private PageInfoRowView mPermissionsRow;
private PageInfoRowView mCookiesRow; private PageInfoRowView mCookiesRow;
private TextView mTruncatedUrlTitle;
public PageInfoViewV2(Context context, PageInfoView.PageInfoViewParams params) { public PageInfoViewV2(Context context, PageInfoView.PageInfoViewParams params) {
super(context); super(context);
...@@ -31,17 +28,6 @@ public class PageInfoViewV2 extends PageInfoView { ...@@ -31,17 +28,6 @@ public class PageInfoViewV2 extends PageInfoView {
init(params); init(params);
} }
@Override
public void setFavicon(Drawable favicon) {
int padding =
getResources().getDimensionPixelSize(R.dimen.page_info_popup_button_padding_sides);
int size = getResources().getDimensionPixelSize(R.dimen.page_info_favicon_size);
favicon.setBounds(0, 0, size, size);
mTruncatedUrlTitle.setCompoundDrawablePadding(padding);
mTruncatedUrlTitle.setCompoundDrawablesRelative(favicon, null, null, null);
}
@Override @Override
protected void init(PageInfoView.PageInfoViewParams params) { protected void init(PageInfoView.PageInfoViewParams params) {
super.init(params); super.init(params);
...@@ -51,23 +37,7 @@ public class PageInfoViewV2 extends PageInfoView { ...@@ -51,23 +37,7 @@ public class PageInfoViewV2 extends PageInfoView {
@Override @Override
protected void initUrlTitle(PageInfoView.PageInfoViewParams params) { protected void initUrlTitle(PageInfoView.PageInfoViewParams params) {
super.initUrlTitle(params); // URL is initialized in PageInfoContainer.
// Adjust the mUrlTitle for displaying the non-truncated URL.
mUrlTitle.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
mUrlTitle.setAlpha(1.0f);
mUrlTitle.setVisibility(GONE);
mUrlTitle.toggleTruncation();
// Use a separate view for truncated URL display.
mTruncatedUrlTitle = findViewById(R.id.page_info_truncated_url);
mTruncatedUrlTitle.setText(params.truncatedUrl);
if (params.urlTitleLongClickCallback != null) {
mTruncatedUrlTitle.setOnLongClickListener(v -> {
params.urlTitleLongClickCallback.run();
return true;
});
}
initializePageInfoViewChild(
mTruncatedUrlTitle, params.urlTitleShown, 0f, params.urlTitleClickCallback);
} }
@Override @Override
...@@ -108,8 +78,7 @@ public class PageInfoViewV2 extends PageInfoView { ...@@ -108,8 +78,7 @@ public class PageInfoViewV2 extends PageInfoView {
@Override @Override
public void toggleUrlTruncation() { public void toggleUrlTruncation() {
mUrlTitle.setVisibility(mTruncatedUrlTitle.getVisibility()); throw new RuntimeException();
mTruncatedUrlTitle.setVisibility(mUrlTitle.getVisibility() == VISIBLE ? GONE : VISIBLE);
} }
/** /**
...@@ -118,7 +87,7 @@ public class PageInfoViewV2 extends PageInfoView { ...@@ -118,7 +87,7 @@ public class PageInfoViewV2 extends PageInfoView {
@Override @Override
protected List<View> collectAnimatableViews() { protected List<View> collectAnimatableViews() {
// TODO(crbug.com/1077766): Sort and use rows instead of the rowWrapper. // TODO(crbug.com/1077766): Sort and use rows instead of the rowWrapper.
return Arrays.asList(mTruncatedUrlTitle, mPreviewMessage, mPreviewLoadOriginal, return Arrays.asList(mPreviewMessage, mPreviewLoadOriginal, mPreviewSeparator,
mPreviewSeparator, mInstantAppButton, mRowWrapper, mSiteSettingsButton); mInstantAppButton, mRowWrapper, mSiteSettingsButton);
} }
} }
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