Commit b852caf2 authored by Sinan Sahin's avatar Sinan Sahin Committed by Commit Bot

Width constraining NTP to 600dp

MarginResizer is now called ViewResizer. Its functionality has also changed.
It calculates the padding for the NTP content instead of switching between
the two predetermined margin sizes.

Bug: 881078
Change-Id: I8f62787d0ee53102cc1e1e5678da36f110be18df
Reviewed-on: https://chromium-review.googlesource.com/c/1480812Reviewed-by: default avatarTheresa <twellington@chromium.org>
Reviewed-by: default avatarBecky Zhou <huayinz@chromium.org>
Commit-Queue: Sinan Sahin <sinansahin@google.com>
Cr-Commit-Position: refs/heads/master@{#634924}
parent 0af14967
...@@ -48,9 +48,8 @@ import org.chromium.chrome.browser.snackbar.Snackbar; ...@@ -48,9 +48,8 @@ import org.chromium.chrome.browser.snackbar.Snackbar;
import org.chromium.chrome.browser.snackbar.SnackbarManager; import org.chromium.chrome.browser.snackbar.SnackbarManager;
import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.util.ViewUtils; import org.chromium.chrome.browser.util.ViewUtils;
import org.chromium.chrome.browser.widget.displaystyle.HorizontalDisplayStyle;
import org.chromium.chrome.browser.widget.displaystyle.MarginResizer;
import org.chromium.chrome.browser.widget.displaystyle.UiConfig; import org.chromium.chrome.browser.widget.displaystyle.UiConfig;
import org.chromium.chrome.browser.widget.displaystyle.ViewResizer;
import org.chromium.ui.UiUtils; import org.chromium.ui.UiUtils;
import org.chromium.ui.base.DeviceFormFactor; import org.chromium.ui.base.DeviceFormFactor;
...@@ -73,12 +72,12 @@ public class FeedNewTabPage extends NewTabPage { ...@@ -73,12 +72,12 @@ public class FeedNewTabPage extends NewTabPage {
private @Nullable FeedImageLoader mImageLoader; private @Nullable FeedImageLoader mImageLoader;
private @Nullable StreamLifecycleManager mStreamLifecycleManager; private @Nullable StreamLifecycleManager mStreamLifecycleManager;
private @Nullable SectionHeaderView mSectionHeaderView; private @Nullable SectionHeaderView mSectionHeaderView;
private @Nullable MarginResizer mSectionHeaderViewMarginResizer;
private @Nullable PersonalizedSigninPromoView mSigninPromoView; private @Nullable PersonalizedSigninPromoView mSigninPromoView;
private @Nullable MarginResizer mSignInPromoViewMarginResizer; private @Nullable ViewResizer mStreamViewResizer;
// Used when Feed is disabled by policy. // Used when Feed is disabled by policy.
private @Nullable ScrollView mScrollViewForPolicy; private @Nullable ScrollView mScrollViewForPolicy;
private @Nullable ViewResizer mScrollViewResizer;
private static class BasicSnackbarApi implements SnackbarApi { private static class BasicSnackbarApi implements SnackbarApi {
private final SnackbarManager mManager; private final SnackbarManager mManager;
...@@ -157,16 +156,12 @@ public class FeedNewTabPage extends NewTabPage { ...@@ -157,16 +156,12 @@ public class FeedNewTabPage extends NewTabPage {
@Override @Override
public int getCardStartMargin() { public int getCardStartMargin() {
return mUiConfig.getCurrentDisplayStyle().horizontal == HorizontalDisplayStyle.WIDE return 0;
? mCardWideMargin
: mCardMargin;
} }
@Override @Override
public int getCardEndMargin() { public int getCardEndMargin() {
return mUiConfig.getCurrentDisplayStyle().horizontal == HorizontalDisplayStyle.WIDE return 0;
? mCardWideMargin
: mCardMargin;
} }
} }
...@@ -222,6 +217,21 @@ public class FeedNewTabPage extends NewTabPage { ...@@ -222,6 +217,21 @@ public class FeedNewTabPage extends NewTabPage {
} }
} }
/**
* Provides the additional capabilities needed for the {@link ScrollView}.
*/
private class PolicyScrollView extends ScrollView {
public PolicyScrollView(Context context) {
super(context);
}
@Override
protected void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mUiConfig.updateDisplayStyle();
}
}
/** /**
* Constructs a new FeedNewTabPage. * Constructs a new FeedNewTabPage.
* *
...@@ -319,6 +329,8 @@ public class FeedNewTabPage extends NewTabPage { ...@@ -319,6 +329,8 @@ public class FeedNewTabPage extends NewTabPage {
if (mScrollViewForPolicy != null) { if (mScrollViewForPolicy != null) {
mRootView.removeView(mScrollViewForPolicy); mRootView.removeView(mScrollViewForPolicy);
mScrollViewForPolicy = null; mScrollViewForPolicy = null;
mScrollViewResizer.detach();
mScrollViewResizer = null;
} }
FeedProcessScope feedProcessScope = FeedProcessScopeFactory.getFeedProcessScope(); FeedProcessScope feedProcessScope = FeedProcessScopeFactory.getFeedProcessScope();
...@@ -360,12 +372,12 @@ public class FeedNewTabPage extends NewTabPage { ...@@ -360,12 +372,12 @@ public class FeedNewTabPage extends NewTabPage {
LayoutInflater inflater = LayoutInflater.from(chromeActivity); LayoutInflater inflater = LayoutInflater.from(chromeActivity);
mSectionHeaderView = (SectionHeaderView) inflater.inflate( mSectionHeaderView = (SectionHeaderView) inflater.inflate(
R.layout.new_tab_page_snippets_expandable_header, mRootView, false); R.layout.new_tab_page_snippets_expandable_header, mRootView, false);
mSectionHeaderViewMarginResizer = MarginResizer.createAndAttach(
mSectionHeaderView, mUiConfig, mDefaultMargin, mWideMargin);
View view = mStream.getView(); View view = mStream.getView();
view.setBackgroundResource(R.color.modern_primary_color); view.setBackgroundResource(R.color.modern_primary_color);
mRootView.addView(view); mRootView.addView(view);
mStreamViewResizer =
ViewResizer.createAndAttach(view, mUiConfig, mDefaultMargin, mWideMargin);
UiUtils.removeViewFromParent(mNewTabPageLayout); UiUtils.removeViewFromParent(mNewTabPageLayout);
UiUtils.removeViewFromParent(mSectionHeaderView); UiUtils.removeViewFromParent(mSectionHeaderView);
...@@ -391,6 +403,8 @@ public class FeedNewTabPage extends NewTabPage { ...@@ -391,6 +403,8 @@ public class FeedNewTabPage extends NewTabPage {
*/ */
void createScrollViewForPolicy() { void createScrollViewForPolicy() {
if (mStream != null) { if (mStream != null) {
mStreamViewResizer.detach();
mStreamViewResizer = null;
mRootView.removeView(mStream.getView()); mRootView.removeView(mStream.getView());
assert mStreamLifecycleManager assert mStreamLifecycleManager
!= null != null
...@@ -400,20 +414,14 @@ public class FeedNewTabPage extends NewTabPage { ...@@ -400,20 +414,14 @@ public class FeedNewTabPage extends NewTabPage {
// Do not call mStream.onDestroy(), the mStreamLifecycleManager has done that for us. // Do not call mStream.onDestroy(), the mStreamLifecycleManager has done that for us.
mStream = null; mStream = null;
mSectionHeaderView = null; mSectionHeaderView = null;
mSectionHeaderViewMarginResizer.detach();
mSectionHeaderViewMarginResizer = null;
mSigninPromoView = null; mSigninPromoView = null;
if (mSignInPromoViewMarginResizer != null) {
mSignInPromoViewMarginResizer.detach();
mSignInPromoViewMarginResizer = null;
}
if (mImageLoader != null) { if (mImageLoader != null) {
mImageLoader.destroy(); mImageLoader.destroy();
mImageLoader = null; mImageLoader = null;
} }
} }
mScrollViewForPolicy = new ScrollView(mTab.getActivity()); mScrollViewForPolicy = new PolicyScrollView(mTab.getActivity());
mScrollViewForPolicy.setBackgroundColor(Color.WHITE); mScrollViewForPolicy.setBackgroundColor(Color.WHITE);
// Make scroll view focusable so that it is the next focusable view when the url bar clears // Make scroll view focusable so that it is the next focusable view when the url bar clears
...@@ -426,6 +434,8 @@ public class FeedNewTabPage extends NewTabPage { ...@@ -426,6 +434,8 @@ public class FeedNewTabPage extends NewTabPage {
UiUtils.removeViewFromParent(mNewTabPageLayout); UiUtils.removeViewFromParent(mNewTabPageLayout);
mScrollViewForPolicy.addView(mNewTabPageLayout); mScrollViewForPolicy.addView(mNewTabPageLayout);
mRootView.addView(mScrollViewForPolicy); mRootView.addView(mScrollViewForPolicy);
mScrollViewResizer = ViewResizer.createAndAttach(
mScrollViewForPolicy, mUiConfig, mDefaultMargin, mWideMargin);
mScrollViewForPolicy.requestFocus(); mScrollViewForPolicy.requestFocus();
} }
...@@ -441,8 +451,6 @@ public class FeedNewTabPage extends NewTabPage { ...@@ -441,8 +451,6 @@ public class FeedNewTabPage extends NewTabPage {
mSigninPromoView = (PersonalizedSigninPromoView) inflater.inflate( mSigninPromoView = (PersonalizedSigninPromoView) inflater.inflate(
R.layout.personalized_signin_promo_view_modern_content_suggestions, mRootView, R.layout.personalized_signin_promo_view_modern_content_suggestions, mRootView,
false); false);
mSignInPromoViewMarginResizer = MarginResizer.createAndAttach(
mSigninPromoView, mUiConfig, mDefaultMargin, mWideMargin);
} }
return mSigninPromoView; return mSigninPromoView;
} }
......
...@@ -30,6 +30,7 @@ import org.chromium.chrome.browser.suggestions.TileGroup; ...@@ -30,6 +30,7 @@ import org.chromium.chrome.browser.suggestions.TileGroup;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.util.ViewUtils; import org.chromium.chrome.browser.util.ViewUtils;
import org.chromium.chrome.browser.widget.displaystyle.UiConfig; import org.chromium.chrome.browser.widget.displaystyle.UiConfig;
import org.chromium.chrome.browser.widget.displaystyle.ViewResizer;
/** /**
* The native new tab page, represented by some basic data such as title and url, and an Android * The native new tab page, represented by some basic data such as title and url, and an Android
...@@ -46,6 +47,7 @@ public class NewTabPageView extends HistoryNavigationLayout { ...@@ -46,6 +47,7 @@ public class NewTabPageView extends HistoryNavigationLayout {
private Tab mTab; private Tab mTab;
private SnapScrollHelper mSnapScrollHelper; private SnapScrollHelper mSnapScrollHelper;
private UiConfig mUiConfig; private UiConfig mUiConfig;
private ViewResizer mRecyclerViewResizer;
private boolean mNewTabPageRecyclerViewChanged; private boolean mNewTabPageRecyclerViewChanged;
private int mSnapshotWidth; private int mSnapshotWidth;
...@@ -186,6 +188,12 @@ public class NewTabPageView extends HistoryNavigationLayout { ...@@ -186,6 +188,12 @@ public class NewTabPageView extends HistoryNavigationLayout {
mRecyclerView.setAdapter(newTabPageAdapter); mRecyclerView.setAdapter(newTabPageAdapter);
mRecyclerView.getLinearLayoutManager().scrollToPosition(scrollPosition); mRecyclerView.getLinearLayoutManager().scrollToPosition(scrollPosition);
mRecyclerViewResizer = ViewResizer.createAndAttach(mRecyclerView, mUiConfig,
mRecyclerView.getResources().getDimensionPixelSize(
R.dimen.content_suggestions_card_modern_margin),
mRecyclerView.getResources().getDimensionPixelSize(
R.dimen.ntp_wide_card_lateral_margins));
setupScrollHandling(); setupScrollHandling();
// When the NewTabPageAdapter's data changes we need to invalidate any previous // When the NewTabPageAdapter's data changes we need to invalidate any previous
......
...@@ -12,12 +12,10 @@ import android.view.View; ...@@ -12,12 +12,10 @@ import android.view.View;
import android.view.View.OnAttachStateChangeListener; import android.view.View.OnAttachStateChangeListener;
import android.view.ViewGroup; import android.view.ViewGroup;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.native_page.ContextMenuManager; import org.chromium.chrome.browser.native_page.ContextMenuManager;
import org.chromium.chrome.browser.native_page.ContextMenuManager.ContextMenuItemId; import org.chromium.chrome.browser.native_page.ContextMenuManager.ContextMenuItemId;
import org.chromium.chrome.browser.suggestions.SuggestionsRecyclerView; import org.chromium.chrome.browser.suggestions.SuggestionsRecyclerView;
import org.chromium.chrome.browser.widget.displaystyle.HorizontalDisplayStyle; import org.chromium.chrome.browser.widget.displaystyle.HorizontalDisplayStyle;
import org.chromium.chrome.browser.widget.displaystyle.MarginResizer;
import org.chromium.chrome.browser.widget.displaystyle.UiConfig; import org.chromium.chrome.browser.widget.displaystyle.UiConfig;
/** /**
...@@ -38,7 +36,6 @@ public abstract class CardViewHolder ...@@ -38,7 +36,6 @@ public abstract class CardViewHolder
protected final SuggestionsRecyclerView mRecyclerView; protected final SuggestionsRecyclerView mRecyclerView;
protected final UiConfig mUiConfig; protected final UiConfig mUiConfig;
private final MarginResizer mMarginResizer;
/** /**
* @param layoutId resource id of the layout to inflate and to use as card. * @param layoutId resource id of the layout to inflate and to use as card.
...@@ -62,14 +59,6 @@ public abstract class CardViewHolder ...@@ -62,14 +59,6 @@ public abstract class CardViewHolder
menu, itemView, CardViewHolder.this)); menu, itemView, CardViewHolder.this));
mUiConfig = uiConfig; mUiConfig = uiConfig;
final int defaultLateralMargin =
resources.getDimensionPixelSize(R.dimen.content_suggestions_card_modern_margin);
int wideLateralMargin =
resources.getDimensionPixelSize(R.dimen.ntp_wide_card_lateral_margins);
mMarginResizer =
new MarginResizer(itemView, uiConfig, defaultLateralMargin, wideLateralMargin);
} }
@Override @Override
...@@ -130,14 +119,6 @@ public abstract class CardViewHolder ...@@ -130,14 +119,6 @@ public abstract class CardViewHolder
// Make sure we use the right background. // Make sure we use the right background.
updateLayoutParams(); updateLayoutParams();
mMarginResizer.attach();
}
@Override
public void recycle() {
mMarginResizer.detach();
super.recycle();
} }
/** /**
......
...@@ -10,7 +10,6 @@ import android.view.LayoutInflater; ...@@ -10,7 +10,6 @@ import android.view.LayoutInflater;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.ntp.cards.NewTabPageViewHolder; import org.chromium.chrome.browser.ntp.cards.NewTabPageViewHolder;
import org.chromium.chrome.browser.suggestions.SuggestionsRecyclerView; import org.chromium.chrome.browser.suggestions.SuggestionsRecyclerView;
import org.chromium.chrome.browser.widget.displaystyle.MarginResizer;
import org.chromium.chrome.browser.widget.displaystyle.UiConfig; import org.chromium.chrome.browser.widget.displaystyle.UiConfig;
/** /**
...@@ -18,7 +17,6 @@ import org.chromium.chrome.browser.widget.displaystyle.UiConfig; ...@@ -18,7 +17,6 @@ import org.chromium.chrome.browser.widget.displaystyle.UiConfig;
*/ */
public class SectionHeaderViewHolder extends NewTabPageViewHolder { public class SectionHeaderViewHolder extends NewTabPageViewHolder {
private final SectionHeaderView mSectionHeaderView; private final SectionHeaderView mSectionHeaderView;
private final MarginResizer mMarginResizer;
public SectionHeaderViewHolder(final SuggestionsRecyclerView recyclerView, UiConfig config) { public SectionHeaderViewHolder(final SuggestionsRecyclerView recyclerView, UiConfig config) {
super(LayoutInflater.from(recyclerView.getContext()) super(LayoutInflater.from(recyclerView.getContext())
...@@ -31,18 +29,14 @@ public class SectionHeaderViewHolder extends NewTabPageViewHolder { ...@@ -31,18 +29,14 @@ public class SectionHeaderViewHolder extends NewTabPageViewHolder {
resources.getDimensionPixelSize(R.dimen.content_suggestions_card_modern_margin); resources.getDimensionPixelSize(R.dimen.content_suggestions_card_modern_margin);
int wideLateralMargin = int wideLateralMargin =
resources.getDimensionPixelSize(R.dimen.ntp_wide_card_lateral_margins); resources.getDimensionPixelSize(R.dimen.ntp_wide_card_lateral_margins);
mMarginResizer =
new MarginResizer(itemView, config, defaultLateralMargin, wideLateralMargin);
} }
public void onBindViewHolder(SectionHeader header) { public void onBindViewHolder(SectionHeader header) {
mSectionHeaderView.setHeader(header); mSectionHeaderView.setHeader(header);
mMarginResizer.attach();
} }
@Override @Override
public void recycle() { public void recycle() {
mMarginResizer.detach();
mSectionHeaderView.setHeader(null); mSectionHeaderView.setHeader(null);
super.recycle(); super.recycle();
} }
......
...@@ -8,7 +8,6 @@ import android.content.res.Resources; ...@@ -8,7 +8,6 @@ import android.content.res.Resources;
import android.view.ViewGroup; import android.view.ViewGroup;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.widget.displaystyle.MarginResizer;
import org.chromium.chrome.browser.widget.displaystyle.UiConfig; import org.chromium.chrome.browser.widget.displaystyle.UiConfig;
import java.util.List; import java.util.List;
...@@ -19,7 +18,6 @@ import java.util.List; ...@@ -19,7 +18,6 @@ import java.util.List;
*/ */
public class TileGridViewHolder extends SiteSectionViewHolder { public class TileGridViewHolder extends SiteSectionViewHolder {
private final TileGridLayout mSectionView; private final TileGridLayout mSectionView;
private final MarginResizer mMarginResizer;
public TileGridViewHolder(ViewGroup view, int maxRows, int maxColumns, UiConfig uiConfig) { public TileGridViewHolder(ViewGroup view, int maxRows, int maxColumns, UiConfig uiConfig) {
super(view); super(view);
...@@ -32,8 +30,6 @@ public class TileGridViewHolder extends SiteSectionViewHolder { ...@@ -32,8 +30,6 @@ public class TileGridViewHolder extends SiteSectionViewHolder {
int defaultLateralMargin = int defaultLateralMargin =
res.getDimensionPixelSize(R.dimen.tile_grid_layout_padding_start); res.getDimensionPixelSize(R.dimen.tile_grid_layout_padding_start);
int wideLateralMargin = res.getDimensionPixelSize(R.dimen.ntp_wide_card_lateral_margins); int wideLateralMargin = res.getDimensionPixelSize(R.dimen.ntp_wide_card_lateral_margins);
mMarginResizer =
new MarginResizer(itemView, uiConfig, defaultLateralMargin, wideLateralMargin);
} }
@Override @Override
...@@ -54,12 +50,10 @@ public class TileGridViewHolder extends SiteSectionViewHolder { ...@@ -54,12 +50,10 @@ public class TileGridViewHolder extends SiteSectionViewHolder {
@Override @Override
public void bindDataSource(TileGroup tileGroup, TileRenderer tileRenderer) { public void bindDataSource(TileGroup tileGroup, TileRenderer tileRenderer) {
super.bindDataSource(tileGroup, tileRenderer); super.bindDataSource(tileGroup, tileRenderer);
if (mMarginResizer != null) mMarginResizer.attach();
} }
@Override @Override
public void recycle() { public void recycle() {
super.recycle(); super.recycle();
if (mMarginResizer != null) mMarginResizer.detach();
} }
} }
...@@ -69,7 +69,6 @@ public class DisplayStyleObserverAdapter ...@@ -69,7 +69,6 @@ public class DisplayStyleObserverAdapter
mCurrentDisplayStyle = newDisplayStyle; mCurrentDisplayStyle = newDisplayStyle;
if (!mIsViewAttached) return; if (!mIsViewAttached) return;
if (mCurrentDisplayStyle.equals(mNotifiedDisplayStyle)) return;
mNotifiedDisplayStyle = mCurrentDisplayStyle; mNotifiedDisplayStyle = mCurrentDisplayStyle;
......
// Copyright 2016 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.chrome.browser.widget.displaystyle;
import android.view.View;
import android.view.ViewGroup.MarginLayoutParams;
/**
* Changes a view's margins when switching between {@link UiConfig} display styles.
*/
public class MarginResizer implements DisplayStyleObserver {
/** The default value for the lateral margins. */
private int mDefaultMarginSizePixels;
/** The wide display value for the lateral margins. */
private int mWideMarginSizePixels;
private final View mView;
private final DisplayStyleObserverAdapter mDisplayStyleObserver;
@HorizontalDisplayStyle
private int mCurrentDisplayStyle;
/**
* @param view The view that will have its margins resized.
* @param config The UiConfig object to subscribe to.
* @param defaultMarginPixels Margin size to use in {@link HorizontalDisplayStyle#REGULAR}.
* @param wideMarginPixels Margin size to use in {@link HorizontalDisplayStyle#WIDE}.
*/
public MarginResizer(
View view, UiConfig config, int defaultMarginPixels, int wideMarginPixels) {
mView = view;
mDefaultMarginSizePixels = defaultMarginPixels;
mWideMarginSizePixels = wideMarginPixels;
mDisplayStyleObserver = new DisplayStyleObserverAdapter(view, config, this);
}
/**
* Convenience method to create a new MarginResizer and immediately attach it to a {@link
* UiConfig}. If the {@link UiConfig} can outlive the view, the regular constructor should be
* used, so it can be detached to avoid memory leaks.
* @param view The view that will have its margins resized.
* @param config The UiConfig object to subscribe to.
* @param defaultMarginPixels Margin size to use in {@link HorizontalDisplayStyle#REGULAR}.
* @param wideMarginPixels Margin size to use in {@link HorizontalDisplayStyle#WIDE}.
* @return The {@link MarginResizer} that is created and attached.
*/
public static MarginResizer createAndAttach(
View view, UiConfig config, int defaultMarginPixels, int wideMarginPixels) {
MarginResizer marginResizer =
new MarginResizer(view, config, defaultMarginPixels, wideMarginPixels);
marginResizer.attach();
return marginResizer;
}
/**
* Attaches to the {@link UiConfig}.
*/
public void attach() {
mDisplayStyleObserver.attach();
}
/**
* Detaches from the {@link UiConfig}.
*/
public void detach() {
mDisplayStyleObserver.detach();
}
@Override
public void onDisplayStyleChanged(UiConfig.DisplayStyle newDisplayStyle) {
mCurrentDisplayStyle = newDisplayStyle.horizontal;
updateMargins();
}
/**
* Sets the lateral margins on the associated view, using the appropriate value depending on
* the current display style.
* @param defaultMarginPixels Margin size to use in {@link HorizontalDisplayStyle#REGULAR}.
* @param wideMarginPixels Margin size to use in {@link HorizontalDisplayStyle#WIDE}.
*/
public void setMargins(int defaultMarginPixels, int wideMarginPixels) {
mDefaultMarginSizePixels = defaultMarginPixels;
mWideMarginSizePixels = wideMarginPixels;
updateMargins();
}
private void updateMargins() {
MarginLayoutParams layoutParams = (MarginLayoutParams) mView.getLayoutParams();
if (mCurrentDisplayStyle == HorizontalDisplayStyle.WIDE) {
layoutParams.setMargins(mWideMarginSizePixels, layoutParams.topMargin,
mWideMarginSizePixels, layoutParams.bottomMargin);
} else {
layoutParams.setMargins(mDefaultMarginSizePixels, layoutParams.topMargin,
mDefaultMarginSizePixels, layoutParams.bottomMargin);
}
mView.setLayoutParams(layoutParams);
}
}
...@@ -68,6 +68,13 @@ public class UiConfig { ...@@ -68,6 +68,13 @@ public class UiConfig {
assert success; assert success;
} }
/**
* @return The context for the view associated with this UiConfig.
*/
public Context getContext() {
return mContext;
}
/** /**
* Refresh the display style, notify observers of changes. * Refresh the display style, notify observers of changes.
*/ */
......
// Copyright 2016 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.chrome.browser.widget.displaystyle;
import android.content.res.Resources;
import android.support.v4.view.ViewCompat;
import android.view.View;
/**
* Changes a view's padding when switching between {@link UiConfig} display styles. If the display
* style is {@link HorizontalDisplayStyle#REGULAR}, a predetermined value will be used to set the
* lateral padding. If the display style is {@link HorizontalDisplayStyle#WIDE}, the lateral padding
* will be calculated using the available screen width to keep the view constrained to
* {@link UiConfig#WIDE_DISPLAY_STYLE_MIN_WIDTH_DP}
*/
public class ViewResizer implements DisplayStyleObserver {
/** The default value for the lateral padding. */
private int mDefaultPaddingPixels;
/** The minimum wide display value used for the lateral padding. */
private int mMinWidePaddingPixels;
private final View mView;
private final DisplayStyleObserverAdapter mDisplayStyleObserver;
private final UiConfig mUiConfig;
@HorizontalDisplayStyle
private int mCurrentDisplayStyle;
/**
* @param view The view that will have its padding resized.
* @param config The UiConfig object to subscribe to.
* @param defaultPaddingPixels Padding to use in {@link HorizontalDisplayStyle#REGULAR}.
* @param minWidePaddingPixels Minimum lateral padding to use in {@link
* HorizontalDisplayStyle#WIDE}.
*/
public ViewResizer(
View view, UiConfig config, int defaultPaddingPixels, int minWidePaddingPixels) {
mView = view;
mDefaultPaddingPixels = defaultPaddingPixels;
mMinWidePaddingPixels = minWidePaddingPixels;
mUiConfig = config;
mDisplayStyleObserver = new DisplayStyleObserverAdapter(view, config, this);
}
/**
* Convenience method to create a new ViewResizer and immediately attach it to a {@link
* UiConfig}. If the {@link UiConfig} can outlive the view, the regular constructor should be
* used, so it can be detached to avoid memory leaks.
* @param view The view that will have its padding resized.
* @param config The UiConfig object to subscribe to.
* @param defaultPaddingPixels Padding to use in {@link HorizontalDisplayStyle#REGULAR}.
* @param minWidePaddingPixels Minimum lateral padding to use in {@link
* HorizontalDisplayStyle#WIDE}.
* @return The {@link ViewResizer} that is created and attached.
*/
public static ViewResizer createAndAttach(
View view, UiConfig config, int defaultPaddingPixels, int minWidePaddingPixels) {
ViewResizer viewResizer =
new ViewResizer(view, config, defaultPaddingPixels, minWidePaddingPixels);
viewResizer.attach();
return viewResizer;
}
/**
* Attaches to the {@link UiConfig}.
*/
public void attach() {
mDisplayStyleObserver.attach();
}
/**
* Detaches from the {@link UiConfig}.
*/
public void detach() {
mDisplayStyleObserver.detach();
}
@Override
public void onDisplayStyleChanged(UiConfig.DisplayStyle newDisplayStyle) {
mCurrentDisplayStyle = newDisplayStyle.horizontal;
updatePadding();
}
/**
* Sets the lateral padding on the associated view, using the appropriate value depending on
* the current display style.
* @param defaultPaddingPixels Padding to use in {@link HorizontalDisplayStyle#REGULAR}.
* @param minWidePaddingPixels Minimum lateral padding to use in {@link
* HorizontalDisplayStyle#WIDE}.
*/
public void setPadding(int defaultPaddingPixels, int minWidePaddingPixels) {
mDefaultPaddingPixels = defaultPaddingPixels;
mMinWidePaddingPixels = minWidePaddingPixels;
updatePadding();
}
private void updatePadding() {
int padding;
if (mCurrentDisplayStyle == HorizontalDisplayStyle.WIDE) {
padding = computePadding();
} else {
padding = mDefaultPaddingPixels;
}
ViewCompat.setPaddingRelative(
mView, padding, mView.getPaddingTop(), padding, mView.getPaddingBottom());
}
private int computePadding() {
// mUiConfig.getContext().getResources() is used here instead of mView.getResources()
// because lemon compression, somehow, causes the resources to return a different
// configuration.
Resources resources = mUiConfig.getContext().getResources();
int screenWidthDp = resources.getConfiguration().screenWidthDp;
float dpToPx = resources.getDisplayMetrics().density;
int padding =
(int) (((screenWidthDp - UiConfig.WIDE_DISPLAY_STYLE_MIN_WIDTH_DP) / 2.f) * dpToPx);
padding = Math.max(mMinWidePaddingPixels, padding);
return padding;
}
}
...@@ -1854,9 +1854,9 @@ chrome_java_sources = [ ...@@ -1854,9 +1854,9 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/widget/displaystyle/DisplayStyleObserver.java", "java/src/org/chromium/chrome/browser/widget/displaystyle/DisplayStyleObserver.java",
"java/src/org/chromium/chrome/browser/widget/displaystyle/DisplayStyleObserverAdapter.java", "java/src/org/chromium/chrome/browser/widget/displaystyle/DisplayStyleObserverAdapter.java",
"java/src/org/chromium/chrome/browser/widget/displaystyle/HorizontalDisplayStyle.java", "java/src/org/chromium/chrome/browser/widget/displaystyle/HorizontalDisplayStyle.java",
"java/src/org/chromium/chrome/browser/widget/displaystyle/MarginResizer.java",
"java/src/org/chromium/chrome/browser/widget/displaystyle/UiConfig.java", "java/src/org/chromium/chrome/browser/widget/displaystyle/UiConfig.java",
"java/src/org/chromium/chrome/browser/widget/displaystyle/VerticalDisplayStyle.java", "java/src/org/chromium/chrome/browser/widget/displaystyle/VerticalDisplayStyle.java",
"java/src/org/chromium/chrome/browser/widget/displaystyle/ViewResizer.java",
"java/src/org/chromium/chrome/browser/widget/emptybackground/EmptyBackgroundViewTablet.java", "java/src/org/chromium/chrome/browser/widget/emptybackground/EmptyBackgroundViewTablet.java",
"java/src/org/chromium/chrome/browser/widget/emptybackground/EmptyBackgroundViewWrapper.java", "java/src/org/chromium/chrome/browser/widget/emptybackground/EmptyBackgroundViewWrapper.java",
"java/src/org/chromium/chrome/browser/widget/findinpage/FindResultBar.java", "java/src/org/chromium/chrome/browser/widget/findinpage/FindResultBar.java",
......
e6ecbd5a6265b6c6b1adbf19a25da49fffad0704 cf360211ab9e16fb1d235a77a232f2e50ee582f2
\ No newline at end of file \ No newline at end of file
7178c3c0d7603fca0a121938623b4d4d7fca285d 672732a5a3221f428c99fe5179fe9462519b68b4
\ No newline at end of file \ No newline at end of file
f4504a205d897998ea28ff9d403b9bea32e68388 1fbf6ff6a3f51a1e2beb7a927ee4df857f114b46
\ No newline at end of file \ No newline at end of file
4dc776d39ee828dec3f617b6b6765480a70ccd93 80cd3a8d1146495173098ecd0bb0e3aa44781d49
\ No newline at end of file \ No newline at end of file
a3c0b9186ca0280d18aab50b4d51fb22ec789071 7066f7088f9ac993ecce95eca8f6f242ab53c6c4
\ No newline at end of file \ No newline at end of file
9b04f3563d7fe7c2c34a55c54cfa138b76aaac71 fedf1b5e79b847fa3343bf87fc86ee86fb854735
\ No newline at end of file \ No newline at end of file
8f8c148024fe1490c59d9f2f2f97367e564c28fd 8240f0ec2b804fc98fc50bb653a652365a7c560a
\ No newline at end of file \ No newline at end of file
124594a5a55aa345b497ff6261f4bf851c379f36 dee8fdfbf94330e026770dd354428bbac6e51a30
\ No newline at end of file \ No newline at end of file
5758cb5bc1d6864c3b921548fefafe956a44b444 7ff73eb5311c830d103bfcf43d4235a8f002b298
\ No newline at end of file \ No newline at end of file
07fe444d6ade047e48daf9aaa534327e98ec8d9a f0db2dc8feb066e3ece5c5c566f1cdac25867e59
\ No newline at end of file \ No newline at end of file
944cf0540c2ae5c5e36d4066c8c232a34c81044d 755d3e95c0ab71adcef1404d56f6735b3040aa11
\ No newline at end of file \ No newline at end of file
16fa1029433827b6eb43f0f3a994061b4305f75e 8bc7dfdcdbfc619d454dfa1769de42b202e752fd
\ No newline at end of file \ No newline at end of file
f0d7fe28f4dc7629b700b262185ab6409c5002d0 6a9031b377dc7e0007ba3455304405a7996cd398
\ No newline at end of file \ No newline at end of file
0248fe9bb458f011400dc699ee784fb76f79e674 64244997cb1a91db14bee9021bc9deae3233dc16
\ No newline at end of file \ No newline at end of file
63dd9eb2665a75c482823bf31cb5e1f0b232ab48 d66e153937d0f4a4399c1b26837ac1942a7fe5a6
\ No newline at end of file \ No newline at end of file
5a29948d2502295ecbaa7440e57eefb2dd564a54 e3e7f51bf6308dd22f6446f8e159adf2ce3c3523
\ No newline at end of file \ No newline at end of file
c1bd6a90fad5996afc35d8846e3fdbaea3942aa1 e6374a3c3a2b52d4793d188214723bf2937d68a1
\ No newline at end of file \ No newline at end of file
2507acefe5b561eaccc2b4b4fdc1b48caee650a4 0d3ea45c5a952ad5bb77439d97d54d8abfb2b595
\ No newline at end of file \ No newline at end of file
c8da1bd3a44c191a84db94568953e20699928a2b 12c360c912f3b59093860e686cb729171ced6252
\ No newline at end of file \ No newline at end of file
79510974572cb1abb6fd6c763854fecb4da0e38f a3ebe6112e63f02207c770863ba26d9dc8e6de7d
\ No newline at end of file \ No newline at end of file
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