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 {
new PageInfoController(tab.getWebContents(), ConnectionSecurityLevel.NONE,
/*publisher=*/null, chromePageInfoControllerDelegate,
chromePermissionParamsListBuilderDelegate);
PageInfoView pageInfoView = pageInfo.getPageInfoViewForTesting();
PageInfoView pageInfoView = (PageInfoView) pageInfo.getPageInfoViewForTesting();
// Test that the title contains the Unicode hostname rather than strict equality, as
// the test server will be bound to a random port.
Assert.assertTrue(
......
......@@ -41,7 +41,6 @@ import org.chromium.components.content_settings.CookieControlsMode;
import org.chromium.components.location.LocationUtils;
import org.chromium.components.page_info.PageInfoController;
import org.chromium.components.page_info.PageInfoFeatureList;
import org.chromium.components.page_info.PageInfoView;
import org.chromium.components.user_prefs.UserPrefs;
import org.chromium.content_public.browser.test.util.TestThreadUtils;
import org.chromium.content_public.common.ContentSwitches;
......@@ -90,10 +89,10 @@ public class PageInfoViewTest {
onView(withId(R.id.location_bar_status_icon)).perform(click());
}
private PageInfoView getPageInfoView() {
private View getPageInfoView() {
PageInfoController controller = PageInfoController.getLastPageInfoControllerForTesting();
assertNotNull(controller);
PageInfoView view = controller.getPageInfoViewForTesting();
View view = controller.getPageInfoViewForTesting();
assertNotNull(view);
return view;
}
......@@ -266,9 +265,8 @@ public class PageInfoViewTest {
@Features.EnableFeatures(PageInfoFeatureList.PAGE_INFO_V2)
public void testShowConnectionInfoSubpage() throws IOException {
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(mPath));
View dialog = (View) getPageInfoView().getParent();
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 {
@Features.EnableFeatures(PageInfoFeatureList.PAGE_INFO_V2)
public void testShowPermissionsSubpage() throws IOException {
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(mPath));
View dialog = (View) getPageInfoView().getParent();
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 {
public void testShowCookiesSubpage() throws IOException {
setThirdPartyCookieBlocking(CookieControlsMode.BLOCK_THIRD_PARTY);
loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(mPath));
View dialog = (View) getPageInfoView().getParent();
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.
......
......@@ -51,9 +51,9 @@ android_resources("java_resources") {
"java/res/layout/connection_info.xml",
"java/res/layout/cookie_controls_view.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_row.xml",
"java/res/layout/page_info_subpage.xml",
"java/res/layout/page_info_v2.xml",
"java/res/values/colors.xml",
"java/res/values/dimens.xml",
......@@ -77,16 +77,16 @@ android_library("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/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/PageInfoControllerDelegate.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/PageInfoDialog.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/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/PageInfoView.java",
"java/src/org/chromium/components/page_info/PageInfoViewV2.java",
......
......@@ -14,14 +14,26 @@
android:background="@color/sheet_bg_color"
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
android:id="@+id/subpage_url"
android:id="@+id/page_info_url"
class="org.chromium.components.page_info.PageInfoView$ElidedUrlTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:lineSpacingExtra="6dp"
android:paddingVertical="16dp"
android:visibility="gone"
android:textAlignment="center"
android:textAppearance="@style/TextAppearance.TextLarge.Primary" />
......@@ -30,7 +42,8 @@
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical"
android:paddingHorizontal="16dp">
android:paddingHorizontal="16dp"
android:id="@+id/page_info_subpage_header">
<org.chromium.ui.widget.ChromeImageButton
android:id="@+id/subpage_back_button"
......@@ -45,7 +58,7 @@
app:tint="@color/default_icon_color" />
<TextView
android:id="@+id/subpage_title"
android:id="@+id/page_info_subpage_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginVertical="12dp"
......@@ -54,7 +67,7 @@
<!-- Programmatically add page specific inner view here -->
<FrameLayout
android:id="@+id/placeholder"
android:id="@+id/page_info_content"
android:layout_width="match_parent"
android:layout_height="match_parent" />
......
......@@ -17,32 +17,7 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
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" />
android:orientation="vertical">
<View
android:id="@+id/page_info_preview_separator"
android:layout_marginTop="16dp"
......
......@@ -17,7 +17,7 @@ import org.chromium.content_public.browser.WebContents;
*/
public class PageInfoConnectionController
implements PageInfoSubpageController, ConnectionInfoView.ConnectionInfoDelegate {
private PageInfoMainPageController mMainController;
private PageInfoMainController mMainController;
private final WebContents mWebContents;
private final VrHandler mVrHandler;
private PageInfoRowView mRowView;
......@@ -25,8 +25,8 @@ public class PageInfoConnectionController
private ConnectionInfoView mInfoView;
private ViewGroup mContainer;
public PageInfoConnectionController(PageInfoMainPageController mainController,
PageInfoRowView view, WebContents webContents, VrHandler vrHandler) {
public PageInfoConnectionController(PageInfoMainController mainController, PageInfoRowView view,
WebContents webContents, VrHandler vrHandler) {
mMainController = mainController;
mWebContents = webContents;
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;
import android.text.style.ForegroundColorSpan;
import android.text.style.TextAppearanceSpan;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.FrameLayout;
import androidx.annotation.IntDef;
import androidx.annotation.VisibleForTesting;
......@@ -66,9 +64,9 @@ import java.lang.ref.WeakReference;
/**
* Java side of Android implementation of the page info UI.
*/
public class PageInfoController
implements PageInfoMainPageController, ModalDialogProperties.Controller,
SystemSettingsActivityRequiredListener, CookieControlsObserver {
public class PageInfoController implements PageInfoMainController, ModalDialogProperties.Controller,
SystemSettingsActivityRequiredListener,
CookieControlsObserver {
@IntDef({OpenedFromSource.MENU, OpenedFromSource.TOOLBAR, OpenedFromSource.VR})
@Retention(RetentionPolicy.SOURCE)
public @interface OpenedFromSource {
......@@ -85,9 +83,12 @@ public class PageInfoController
// A pointer to the C++ object for this UI.
private long mNativePageInfoController;
// The view inside the popup.
// The view inside the popup or the main PageInfo view.
private PageInfoView mView;
// The view inside the popup (V2).
private PageInfoContainer mContainer;
// The dialog the view is placed in.
private PageInfoDialog mDialog;
......@@ -95,12 +96,6 @@ public class PageInfoController
// URL'.
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
// chrome://settings page).
private boolean mIsInternalPage;
......@@ -123,15 +118,13 @@ public class PageInfoController
// Whether Version 2 of the PageInfoView is enabled.
private boolean mIsV2Enabled;
// Used to show Site settings from Page Info UI.
private final PermissionParamsListBuilder mPermissionParamsListBuilder;
// Delegate used by PermissionParamsListBuilder.
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.
private PageInfoSubpageController mSubpageController;
......@@ -197,33 +190,29 @@ public class PageInfoController
if (mDelegate.isShowingOfflinePage()) {
displayUrl = UrlUtilities.stripScheme(mFullUrl);
}
mDisplayUrlBuilder = new SpannableStringBuilder(displayUrl);
SpannableStringBuilder displayUrlBuilder = new SpannableStringBuilder(displayUrl);
AutocompleteSchemeClassifier autocompleteSchemeClassifier =
delegate.createAutocompleteSchemeClassifier();
if (mSecurityLevel == ConnectionSecurityLevel.SECURE) {
OmniboxUrlEmphasizer.EmphasizeComponentsResponse emphasizeResponse =
OmniboxUrlEmphasizer.parseForEmphasizeComponents(
mDisplayUrlBuilder.toString(), autocompleteSchemeClassifier);
displayUrlBuilder.toString(), autocompleteSchemeClassifier);
if (emphasizeResponse.schemeLength > 0) {
mDisplayUrlBuilder.setSpan(
displayUrlBuilder.setSpan(
new TextAppearanceSpan(mContext, R.style.TextAppearance_RobotoMediumStyle),
0, emphasizeResponse.schemeLength, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
}
}
boolean useDarkText = !ColorUtils.inNightMode(mContext);
OmniboxUrlEmphasizer.emphasizeUrl(mDisplayUrlBuilder, mContext.getResources(),
OmniboxUrlEmphasizer.emphasizeUrl(displayUrlBuilder, mContext.getResources(),
autocompleteSchemeClassifier, mSecurityLevel, mIsInternalPage, useDarkText,
/*emphasizeScheme=*/true);
viewParams.url = mDisplayUrlBuilder;
mUrlOriginLength = OmniboxUrlEmphasizer.getOriginEndIndex(
mDisplayUrlBuilder.toString(), autocompleteSchemeClassifier);
viewParams.urlOriginLength = mUrlOriginLength;
viewParams.url = displayUrlBuilder;
viewParams.urlOriginLength = OmniboxUrlEmphasizer.getOriginEndIndex(
displayUrlBuilder.toString(), autocompleteSchemeClassifier);
autocompleteSchemeClassifier.destroy();
viewParams.truncatedUrl =
UrlFormatter.formatUrlForSecurityDisplay(url, SchemeDisplay.OMIT_HTTP_AND_HTTPS);
if (mDelegate.isSiteSettingsAvailable()) {
viewParams.siteSettingsButtonClickCallback = () -> {
// Delay while the dialog closes.
......@@ -265,20 +254,30 @@ public class PageInfoController
: new PageInfoView(mContext, viewParams);
if (isSheet(mContext)) mView.setBackgroundColor(Color.WHITE);
if (mIsV2Enabled) {
mSubpage = new PageInfoSubpage(mContext);
mSubpage.setBackButtonOnClickListener(view -> exitSubpage());
mContainer = new PageInfoContainer(mContext);
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;
mConnectionController = new PageInfoConnectionController(
this, view2.getConnectionRowView(), mWebContents, mDelegate.getVrHandler());
mPermissionsController = new PageInfoPermissionsController(
this, view2.getPermissionsRowView(), mDelegate, mDisplayUrlBuilder.toString());
this, view2.getPermissionsRowView(), mDelegate, mFullUrl);
mCookiesController = new PageInfoCookiesController(this, view2.getCookiesRowView(),
mDelegate, viewParams.cookieControlsShown, mFullUrl);
mDelegate.getFavicon(mFullUrl, favicon -> {
if (favicon != null) {
mView.setFavicon(favicon);
mContainer.setFavicon(favicon);
} else {
mView.setFavicon(
mContainer.setFavicon(
SettingsUtils.getTintedIcon(mContext, R.drawable.ic_globe_24dp));
}
});
......@@ -336,7 +335,7 @@ public class PageInfoController
}
};
mDialog = new PageInfoDialog(mContext, mView, mSubpage,
mDialog = new PageInfoDialog(mContext, mView, mContainer,
webContents.getViewAndroidDelegate().getContainerView(), isSheet(mContext),
delegate.getModalDialogManager(), this);
mDialog.show();
......@@ -503,9 +502,8 @@ public class PageInfoController
}
@VisibleForTesting
public PageInfoView getPageInfoViewForTesting() {
// Check that this view is active.
assert mView.getParent() != null;
public View getPageInfoViewForTesting() {
if (mContainer != null) return mContainer;
return mView;
}
......@@ -584,33 +582,16 @@ public class PageInfoController
@Override
public void launchSubpage(PageInfoSubpageController controller) {
mSubpageController = controller;
PageInfoSubpage.Params subpageParams = new PageInfoSubpage.Params();
subpageParams.url = mDisplayUrlBuilder;
subpageParams.urlOriginLength = mUrlOriginLength;
subpageParams.subpageTitle = mSubpageController.getSubpageTitle();
mSubpage.updateSubpage(subpageParams);
View subview = mSubpageController.createViewForSubpage(mSubpage);
((FrameLayout) mSubpage.findViewById(R.id.placeholder)).addView(subview);
replaceView(mView, mSubpage);
CharSequence title = mSubpageController.getSubpageTitle();
View subview = mSubpageController.createViewForSubpage(mContainer);
mContainer.showPage(subview, title, false);
controller.onSubPageAttached();
}
@Override
public void exitSubpage() {
replaceView(mSubpage, mView);
((FrameLayout) mSubpage.findViewById(R.id.placeholder)).removeAllViews();
mContainer.showPage(mView, "", true);
mSubpageController.onSubpageRemoved();
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;
*/
public class PageInfoCookiesController
implements PageInfoSubpageController, CookieControlsObserver {
private PageInfoMainPageController mMainController;
private PageInfoMainController mMainController;
private PageInfoRowView mRowView;
private CookieControlsBridge mBridge;
private PageInfoControllerDelegate mDelegate;
......@@ -36,9 +36,8 @@ public class PageInfoCookiesController
private int mStatus;
private boolean mIsEnforced;
public PageInfoCookiesController(PageInfoMainPageController mainController,
PageInfoRowView rowView, PageInfoControllerDelegate delegate, boolean isVisible,
String fullUrl) {
public PageInfoCookiesController(PageInfoMainController mainController, PageInfoRowView rowView,
PageInfoControllerDelegate delegate, boolean isVisible, String fullUrl) {
mMainController = mainController;
mRowView = rowView;
mDelegate = delegate;
......
......@@ -39,7 +39,7 @@ public class PageInfoDialog {
@NonNull
private final PageInfoView mView;
private final PageInfoSubpage mSubpageView;
private final PageInfoContainer mContainerView;
private final boolean mIsSheet;
// The dialog implementation.
// mSheetDialog is set if the dialog appears as a sheet. Otherwise, mModalDialog is set.
......@@ -68,11 +68,11 @@ public class PageInfoDialog {
*
*/
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 ModalDialogProperties.Controller controller) {
mView = view;
mSubpageView = subpageView;
mContainerView = subpageView;
mIsSheet = isSheet;
mManager = manager;
mController = controller;
......@@ -99,7 +99,7 @@ public class PageInfoDialog {
container = new ScrollView(context);
}
container.addView(mView);
container.addView(mContainerView != null ? mContainerView : mView);
if (isSheet) {
mSheetDialog = createSheetDialog(context, container);
......@@ -163,8 +163,8 @@ public class PageInfoDialog {
// Delay the cleanup by a tiny amount to give this frame a chance to
// be displayed before we destroy the dialog.
mView.postDelayed(this::superDismiss, CLOSE_CLEANUP_DELAY_MS);
if (mSubpageView != null) {
mSubpageView.postDelayed(this::superDismiss, CLOSE_CLEANUP_DELAY_MS);
if (mContainerView != null) {
mContainerView.postDelayed(this::superDismiss, CLOSE_CLEANUP_DELAY_MS);
}
}).start();
}
......@@ -238,8 +238,8 @@ public class PageInfoDialog {
private Animator createAllAnimations(boolean isEnter, Runnable onAnimationEnd) {
Animator dialogAnimation =
mIsSheet ? createDialogSlideAnimaton(isEnter, mView) : new AnimatorSet();
Animator subpageDialogAnimation = mIsSheet && mSubpageView != null
? createDialogSlideAnimaton(isEnter, mSubpageView)
Animator subpageDialogAnimation = mIsSheet && mContainerView != null
? createDialogSlideAnimaton(isEnter, mContainerView)
: new AnimatorSet();
Animator viewAnimation = mView.createEnterExitAnimation(isEnter);
AnimatorSet allAnimations = new AnimatorSet();
......
......@@ -9,7 +9,7 @@ import org.chromium.components.embedder_support.browser_context.BrowserContextHa
/**
* Interface for a page info main page controller.
*/
public interface PageInfoMainPageController {
public interface PageInfoMainController {
/**
* Launches the PageInfoSubpage provided by |pageInfoCookiesController|.
* @param controller The controller providing a PageInfoSubpage.
......
......@@ -17,14 +17,14 @@ import org.chromium.components.browser_ui.site_settings.SingleWebsiteSettings;
* Class for controlling the page info permissions section.
*/
public class PageInfoPermissionsController implements PageInfoSubpageController {
private PageInfoMainPageController mMainController;
private PageInfoMainController mMainController;
private PageInfoRowView mRowView;
private PageInfoControllerDelegate mDelegate;
private String mTitle;
private String mPageUrl;
private SingleWebsiteSettings mSubpageFragment;
public PageInfoPermissionsController(PageInfoMainPageController mainController,
public PageInfoPermissionsController(PageInfoMainController mainController,
PageInfoRowView view, PageInfoControllerDelegate delegate, String pageUrl) {
mMainController = mainController;
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;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.text.Layout;
import android.util.AttributeSet;
import android.view.LayoutInflater;
......@@ -174,7 +173,6 @@ public class PageInfoView extends FrameLayout implements OnClickListener {
public CharSequence url;
public CharSequence previewLoadOriginalMessage;
public int urlOriginLength;
public CharSequence truncatedUrl;
}
/** Parameters to configure the permission info section */
......@@ -344,13 +342,6 @@ public class PageInfoView extends FrameLayout implements OnClickListener {
mOnUiClosingCallback.run();
}
/**
* Sets a favicon for the current page.
*/
public void setFavicon(Drawable favicon) {
// Not implemented.
}
public void setPermissions(PermissionParams params) {
mPermissionsList.removeAllViews();
// If we have at least one permission show the lower permissions area.
......
......@@ -5,11 +5,9 @@
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.LinearLayout;
import android.widget.TextView;
import java.util.Arrays;
import java.util.List;
......@@ -23,7 +21,6 @@ public class PageInfoViewV2 extends PageInfoView {
private PageInfoRowView mConnectionRow;
private PageInfoRowView mPermissionsRow;
private PageInfoRowView mCookiesRow;
private TextView mTruncatedUrlTitle;
public PageInfoViewV2(Context context, PageInfoView.PageInfoViewParams params) {
super(context);
......@@ -31,17 +28,6 @@ public class PageInfoViewV2 extends PageInfoView {
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
protected void init(PageInfoView.PageInfoViewParams params) {
super.init(params);
......@@ -51,23 +37,7 @@ public class PageInfoViewV2 extends PageInfoView {
@Override
protected void initUrlTitle(PageInfoView.PageInfoViewParams params) {
super.initUrlTitle(params);
// 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);
// URL is initialized in PageInfoContainer.
}
@Override
......@@ -108,8 +78,7 @@ public class PageInfoViewV2 extends PageInfoView {
@Override
public void toggleUrlTruncation() {
mUrlTitle.setVisibility(mTruncatedUrlTitle.getVisibility());
mTruncatedUrlTitle.setVisibility(mUrlTitle.getVisibility() == VISIBLE ? GONE : VISIBLE);
throw new RuntimeException();
}
/**
......@@ -118,7 +87,7 @@ public class PageInfoViewV2 extends PageInfoView {
@Override
protected List<View> collectAnimatableViews() {
// TODO(crbug.com/1077766): Sort and use rows instead of the rowWrapper.
return Arrays.asList(mTruncatedUrlTitle, mPreviewMessage, mPreviewLoadOriginal,
mPreviewSeparator, mInstantAppButton, mRowWrapper, mSiteSettingsButton);
return Arrays.asList(mPreviewMessage, mPreviewLoadOriginal, mPreviewSeparator,
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