diff --git a/android/java/org/chromium/chrome/browser/ntp/BraveNewTabPageLayout.java b/android/java/org/chromium/chrome/browser/ntp/BraveNewTabPageLayout.java index 738e112cb223..d52b189e2de9 100644 --- a/android/java/org/chromium/chrome/browser/ntp/BraveNewTabPageLayout.java +++ b/android/java/org/chromium/chrome/browser/ntp/BraveNewTabPageLayout.java @@ -160,6 +160,10 @@ public class BraveNewTabPageLayout extends NewTabPageLayout implements Connectio private static final int MINIMUM_VISIBLE_HEIGHT_THRESHOLD = 50; private static final int NEWS_SCROLL_TO_TOP_NEW = -1; private static final int NEWS_SCROLL_TO_TOP_RELOAD = -2; + private static final String BRAVE_NESTED_SCROLLVIEW_POSITION = "nestedscrollview_position_"; + private static final String BRAVE_RECYCLERVIEW_POSITION = "recyclerview_visible_position_"; + private static final String BRAVE_RECYCLERVIEW_OFFSET_POSITION = + "recyclerview_offset_position_"; private View mBraveStatsViewFallBackLayout; @@ -284,7 +288,8 @@ protected void onFinishInflate() { BraveActivity.getBraveActivity().removeSettingsBar(); if (tab != null) { SharedPreferencesManager.getInstance().writeInt( - "position_" + tab.getId(), mPrevScrollPosition); + BRAVE_RECYCLERVIEW_OFFSET_POSITION + tab.getId(), + mPrevScrollPosition); } } } @@ -304,8 +309,9 @@ private void showFallBackNTPLayout() { new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); - layoutParams.setMargins(dpToPx(mActivity, 16), dpToPx(mActivity, 16), dpToPx(mActivity, 16), - dpToPx(mActivity, 16)); + int margin = dpToPx(mActivity, 16); + layoutParams.setMargins(margin, margin, margin, margin); + mBraveStatsViewFallBackLayout.setLayoutParams(layoutParams); mBraveStatsViewFallBackLayout.requestLayout(); @@ -388,8 +394,6 @@ protected void onAttachedToWindow() { && !OnboardingPrefManager.getInstance().shouldShowBadgeAnimation()) { mBadgeAnimationView.setVisibility(View.INVISIBLE); } - int appOpenCount = SharedPreferencesManager.getInstance().readInt( - BravePreferenceKeys.BRAVE_APP_OPEN_COUNT); if (ChromeFeatureList.isEnabled(BraveFeatureList.BRAVE_NEWS)) { if (mSettingsBar != null) { @@ -543,19 +547,21 @@ public void onConfigurationChanged(Configuration newConfig) { if (BraveActivity.getBraveActivity() != null && BraveActivity.getBraveActivity().getActivityTab() != null) { Tab tab = BraveActivity.getBraveActivity().getActivityTab(); + + int prevRecyclerViewPosition = (tab != null) + ? SharedPreferencesManager.getInstance().readInt( + BRAVE_RECYCLERVIEW_OFFSET_POSITION + tab.getId(), 0) + : 0; int prevScrollPosition = (tab != null) ? SharedPreferencesManager.getInstance().readInt( - "position_" + tab.getId(), 0) + BRAVE_NESTED_SCROLLVIEW_POSITION + tab.getId(), 0) : 0; - if (ConfigurationUtils.isLandscape(mActivity) - && ConfigurationUtils.isTablet(mActivity) - && prevScrollPosition == NEWS_SCROLL_TO_TOP_RELOAD) { - keepPosition(NEWS_SCROLL_TO_TOP_RELOAD); - } else if (!ConfigurationUtils.isLandscape(mActivity) && prevScrollPosition >= 1) { - keepPosition(prevScrollPosition + 1); - } else { - keepPosition(prevScrollPosition); - } + int prevRecyclerViewItemPosition = (tab != null) + ? SharedPreferencesManager.getInstance().readInt( + BRAVE_RECYCLERVIEW_POSITION + tab.getId(), 0) + : 0; + keepPosition( + prevScrollPosition, prevRecyclerViewPosition, prevRecyclerViewItemPosition); } } else { super.onConfigurationChanged(newConfig); @@ -584,8 +590,8 @@ private void correctPosition(boolean toTop) { LinearLayout.LayoutParams linearLayoutParams = (LinearLayout.LayoutParams) mImageCreditLayout.getLayoutParams(); - int imageCreditCorrection = - NTPUtil.correctImageCreditLayoutTopPosition(mNtpImageGlobal); + int imageCreditCorrection = NTPUtil.correctImageCreditLayoutTopPosition( + mNtpImageGlobal, mSiteSectionView.getHeight()); if (toTop) { imageCreditCorrection = 0; @@ -734,46 +740,25 @@ private void refreshFeed() { } } - private void keepPosition(int prevScrollPosition) { + private void keepPosition(int prevScrollPosition, int prevRecyclerViewPosition, + int prevRecyclerViewItemPosition) { processFeed(); int scrollPosition = prevScrollPosition; - if (scrollPosition == NEWS_SCROLL_TO_TOP_RELOAD) { - if (ConfigurationUtils.isLandscape(mActivity)) { - new Handler().postDelayed(() -> { - if (mRecyclerView != null) { - mRecyclerView.scrollToPosition(0); - } - }, 100); - } else { - mParentScrollView.post(() -> { - mContainer.setVisibility(View.VISIBLE); - mRecyclerView.setVisibility(View.VISIBLE); - mParentScrollView.fullScroll(NestedScrollView.FOCUS_UP); - }); - } - } else { - new Handler().postDelayed(() -> { - if (mRecyclerView != null) { - mContainer.setVisibility(View.VISIBLE); - mRecyclerView.setVisibility(View.VISIBLE); - - final int scrollPositionFinal = scrollPosition; - if (mParentScrollView != null) { - if (scrollPosition > 0) { - mRecyclerView.scrollToPosition(scrollPosition); - } else if (scrollPosition != NEWS_SCROLL_TO_TOP_RELOAD) { - mParentScrollView.scrollTo(0, 0); - mImageCreditLayout.setAlpha(1.0f); - mImageCreditLayout.requestLayout(); - } - } - if (mRecyclerView.getLayoutManager().findViewByPosition(0) != null) { - correctPosition(false); - } + new Handler().postDelayed(() -> { + mContainer.setVisibility(View.VISIBLE); + mRecyclerView.setVisibility(View.VISIBLE); + mParentScrollView.post(() -> { mParentScrollView.scrollTo(0, prevScrollPosition); }); + if (prevRecyclerViewItemPosition > 0) { + RecyclerView.LayoutManager manager = mRecyclerView.getLayoutManager(); + if (manager instanceof LinearLayoutManager) { + LinearLayoutManager linearLayoutManager = (LinearLayoutManager) manager; + linearLayoutManager.scrollToPositionWithOffset( + prevRecyclerViewItemPosition, prevRecyclerViewPosition); } - }, 100); - } + } + correctPosition(false); + }, 100); } @SuppressLint("ClickableViewAccessibility") @@ -865,15 +850,24 @@ private void initNews() { CopyOnWriteArrayList existingNewsFeedObject = BraveActivity.getBraveActivity().getNewsItemsFeedCards(); Tab tab = BraveActivity.getBraveActivity().getActivityTab(); - int prevScrollPosition = (tab != null) - ? SharedPreferencesManager.getInstance().readInt("position_" + tab.getId(), 0) + int prevRecyclerViewPosition = (tab != null) + ? SharedPreferencesManager.getInstance().readInt( + BRAVE_RECYCLERVIEW_OFFSET_POSITION + tab.getId(), 0) + : 0; + int prevScrollPosition = (tab != null) ? SharedPreferencesManager.getInstance().readInt( + BRAVE_NESTED_SCROLLVIEW_POSITION + tab.getId(), 0) + : 0; + int prevRecyclerViewItemPosition = (tab != null) + ? SharedPreferencesManager.getInstance().readInt( + BRAVE_RECYCLERVIEW_POSITION + tab.getId(), 0) : 0; mmViewedNewsCardsCount = (tab != null) ? SharedPreferencesManager.getInstance().readInt( "mViewedNewsCardsCount_" + tab.getId()) : 0; - if (prevScrollPosition == 0) { + if (prevScrollPosition == 0 && prevRecyclerViewPosition == 0 + && prevRecyclerViewItemPosition == 0) { isFeedLoaded = false; existingNewsFeedObject = null; mmViewedNewsCardsCount = 0; @@ -883,7 +877,8 @@ private void initNews() { getFeed(); if (tab != null) { SharedPreferencesManager.getInstance().writeInt( - "position_" + tab.getId(), NEWS_SCROLL_TO_TOP_NEW); + BRAVE_RECYCLERVIEW_OFFSET_POSITION + tab.getId(), + NEWS_SCROLL_TO_TOP_NEW); } // Brave News interaction started if (mBraveNewsController != null) { @@ -893,11 +888,9 @@ private void initNews() { if (mActivity == null) { mActivity = BraveActivity.getBraveActivity(); } - if (!ConfigurationUtils.isLandscape(mActivity) && prevScrollPosition > 1) { - keepPosition(prevScrollPosition - 1); - } else { - keepPosition(prevScrollPosition); - } + + keepPosition( + prevScrollPosition, prevRecyclerViewPosition, prevRecyclerViewItemPosition); } } else { if (mOptinLayout != null) { @@ -906,74 +899,81 @@ private void initNews() { } ViewTreeObserver parentScrollViewObserver = mParentScrollView.getViewTreeObserver(); - mParentScrollView.getViewTreeObserver().addOnScrollChangedListener( - new ViewTreeObserver.OnScrollChangedListener() { - @Override - public void onScrollChanged() { - try { - int scrollY = mParentScrollView.getScrollY(); - RecyclerView.LayoutManager manager = mRecyclerView.getLayoutManager(); - if (manager instanceof LinearLayoutManager) { - LinearLayoutManager linearLayoutManager = - (LinearLayoutManager) manager; - } - isScrolled = false; - float value = (float) scrollY / mParentScrollView.getMaxScrollAmount(); - if (value >= 1) { - value = 1; - } - float alpha = (float) (1 - value * 4); - if (alpha < 1f) { - mImageCreditLayout.setAlpha(alpha); - mImageCreditLayout.requestLayout(); - } - if (BraveActivity.getBraveActivity() != null - && BraveActivity.getBraveActivity().getActivityTab() != null) { - if (UrlUtilities.isNTPUrl(BraveActivity.getBraveActivity() - .getActivityTab() - .getUrl() - .getSpec())) { - if (mSettingsBar != null) { - if (BraveActivity.getBraveActivity() != null) { - BraveActivity.getBraveActivity() - .inflateNewsSettingsBar(); + mParentScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() { + @Override + public void onScrollChange( + NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { + if (scrollY != oldScrollY) { + try { + if (BraveActivity.getBraveActivity() != null + && BraveActivity.getBraveActivity().getActivityTab() != null) { + SharedPreferencesManager.getInstance().writeInt( + BRAVE_NESTED_SCROLLVIEW_POSITION + + BraveActivity.getBraveActivity() + .getActivityTab() + .getId(), + scrollY); + } + + RecyclerView.LayoutManager manager = mRecyclerView.getLayoutManager(); + if (manager instanceof LinearLayoutManager) { + LinearLayoutManager linearLayoutManager = (LinearLayoutManager) manager; + } + isScrolled = false; + float value = (float) scrollY / mParentScrollView.getMaxScrollAmount(); + if (value >= 1) { + value = 1; + } + float alpha = (float) (1 - value * 4); + if (alpha < 1f) { + mImageCreditLayout.setAlpha(alpha); + mImageCreditLayout.requestLayout(); + } + if (BraveActivity.getBraveActivity() != null + && BraveActivity.getBraveActivity().getActivityTab() != null) { + if (UrlUtilities.isNTPUrl(BraveActivity.getBraveActivity() + .getActivityTab() + .getUrl() + .getSpec())) { + if (mSettingsBar != null) { + if (BraveActivity.getBraveActivity() != null) { + BraveActivity.getBraveActivity().inflateNewsSettingsBar(); + } + if (mSettingsBar.getVisibility() == View.VISIBLE) { + if (value > 0.4) { + mSettingsBar.setAlpha((float) (value + 0.5)); + } else if (value < 0.4 && mSettingsBar.getAlpha() > 0f) { + mSettingsBar.setAlpha((float) (value - 0.2)); + } else if (value == 1 && mSettingsBar.getAlpha() >= 1f) { + mSettingsBar.setAlpha(1); + mSettingsBar.requestLayout(); } - if (mSettingsBar.getVisibility() == View.VISIBLE) { - if (value > 0.4) { - mSettingsBar.setAlpha((float) (value + 0.5)); - } else if (value < 0.4 - && mSettingsBar.getAlpha() > 0f) { - mSettingsBar.setAlpha((float) (value - 0.2)); - } else if (value == 1 - && mSettingsBar.getAlpha() >= 1f) { - mSettingsBar.setAlpha(1); - mSettingsBar.requestLayout(); - } - if (mSettingsBar.getAlpha() >= 1) { - isScrolled = true; - mSettingsBarIsClickable = true; - } else { - mSettingsBarIsClickable = false; - } - if (mSettingsBar.getAlpha() <= 0) { - mSettingsBar.setVisibility(View.INVISIBLE); - } + if (mSettingsBar.getAlpha() >= 1) { + isScrolled = true; + mSettingsBarIsClickable = true; } else { - boolean isFromNewTab = BraveActivity.getBraveActivity() - .isComesFromNewTab(); - if (scrollY > 200 && (mTouchScroll || isFromNewTab)) { - mSettingsBar.setVisibility(View.VISIBLE); - mSettingsBar.setAlpha(1); - } + mSettingsBarIsClickable = false; + } + if (mSettingsBar.getAlpha() <= 0) { + mSettingsBar.setVisibility(View.INVISIBLE); + } + } else { + boolean isFromNewTab = BraveActivity.getBraveActivity() + .isComesFromNewTab(); + if (scrollY > 200 && (mTouchScroll || isFromNewTab)) { + mSettingsBar.setVisibility(View.VISIBLE); + mSettingsBar.setAlpha(1); } } } } - } catch (Exception e) { - e.printStackTrace(); } + } catch (Exception e) { + e.printStackTrace(); } - }); + } + } + }); parentScrollViewObserver.addOnGlobalLayoutListener( new ViewTreeObserver.OnGlobalLayoutListener() { @@ -1005,13 +1005,21 @@ public void onClick(View v) { new GestureDetector.SimpleOnGestureListener() { @Override public boolean onDoubleTap(MotionEvent e) { - SharedPreferencesManager.getInstance().writeInt( - "position_" - + BraveActivity - .getBraveActivity() - .getActivityTab() - .getId(), - NEWS_SCROLL_TO_TOP_RELOAD); + if (BraveActivity.getBraveActivity() + != null + && BraveActivity.getBraveActivity() + .getActivityTab() + != null) { + SharedPreferencesManager + .getInstance() + .writeInt( + BRAVE_RECYCLERVIEW_OFFSET_POSITION + + BraveActivity + .getBraveActivity() + .getActivityTab() + .getId(), + 0); + } correctPosition(false); mParentScrollView.fullScroll( NestedScrollView.FOCUS_UP); @@ -1060,15 +1068,44 @@ public void onClick(View v) { isScrolled = false; refreshFeed(); new Handler().postDelayed(() -> { + int pxHeight = + ConfigurationUtils.getDisplayMetrics(mActivity) + .get("height"); + int scrollToY; if (!ConfigurationUtils.isTablet(mActivity) && ConfigurationUtils.isLandscape(mActivity)) { - mParentScrollView.smoothScrollTo(0, 0); + scrollToY = 0; + + } else if (ConfigurationUtils.isTablet(mActivity) + && !ConfigurationUtils.isLandscape(mActivity)) { + scrollToY = pxHeight - dpToPx(getContext(), 320); + + } else if (ConfigurationUtils.isTablet(mActivity) + && ConfigurationUtils.isLandscape(mActivity)) { + scrollToY = pxHeight - dpToPx(getContext(), 270); + } else { - mParentScrollView.smoothScrollTo(0, - mRecyclerView.getHeight() - - mParentScrollView - .getMaxScrollAmount() - + dpToPx(getContext(), 90)); + scrollToY = pxHeight - dpToPx(getContext(), 215); + } + + mParentScrollView.smoothScrollTo(0, scrollToY); + if (BraveActivity.getBraveActivity() != null + && BraveActivity.getBraveActivity() + .getActivityTab() + != null) { + SharedPreferencesManager.getInstance().writeInt( + BRAVE_RECYCLERVIEW_OFFSET_POSITION + + BraveActivity.getBraveActivity() + .getActivityTab() + .getId(), + -1); + + SharedPreferencesManager.getInstance().writeInt( + BRAVE_RECYCLERVIEW_POSITION + + BraveActivity.getBraveActivity() + .getActivityTab() + .getId(), + -1); } }, 100); @@ -1095,8 +1132,6 @@ public void onClick(View v) { LinearLayoutManager linearLayoutManager = (LinearLayoutManager) manager; mFirstVisibleCard = linearLayoutManager.findFirstVisibleItemPosition(); mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { - private int lastFirstVisibleItem; - @Override public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); @@ -1153,25 +1188,24 @@ public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newStat if (BraveActivity.getBraveActivity() != null && BraveActivity.getBraveActivity().getActivityTab() != null) { - if (firstCompletelyVisibleItemPosition >= 0) { - int position = 0; - if (firstCompletelyVisibleItemPosition == 0 - && ((ConfigurationUtils.isLandscape(mActivity) - && scrollY > 600) - || (!ConfigurationUtils.isLandscape(mActivity) - && scrollY > 900))) { - position = NEWS_SCROLL_TO_TOP_RELOAD; - } else { - position = firstCompletelyVisibleItemPosition == 0 - ? NEWS_SCROLL_TO_TOP_NEW - : firstCompletelyVisibleItemPosition; - } - SharedPreferencesManager.getInstance().writeInt("position_" - + BraveActivity.getBraveActivity() - .getActivityTab() - .getId(), - position); - } + View firstChild = mRecyclerView.getChildAt(0); + int firstVisiblePosition = + mRecyclerView.getChildAdapterPosition(firstChild); + int verticalOffset = firstChild.getTop(); + + SharedPreferencesManager.getInstance().writeInt( + BRAVE_RECYCLERVIEW_OFFSET_POSITION + + BraveActivity.getBraveActivity() + .getActivityTab() + .getId(), + verticalOffset); + + SharedPreferencesManager.getInstance().writeInt( + BRAVE_RECYCLERVIEW_POSITION + + BraveActivity.getBraveActivity() + .getActivityTab() + .getId(), + firstVisiblePosition); } mFeedHash = SharedPreferencesManager.getInstance().readString( BravePreferenceKeys.BRAVE_NEWS_FEED_HASH, ""); @@ -1340,7 +1374,14 @@ private void showNTPImage(NTPImage ntpImage) { Display display = mActivity.getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); - NTPUtil.updateOrientedUI(mActivity, this, size, ntpImage); + mSiteSectionView.post(new Runnable() { + @Override + public void run() { + correctPosition(false); + } + }); + NTPUtil.updateOrientedUI(mActivity, this, size, ntpImage, mSiteSectionView.getHeight()); + ImageView mSponsoredLogo = (ImageView) findViewById(R.id.sponsored_logo); FloatingActionButton mSuperReferralLogo = (FloatingActionButton) findViewById(R.id.super_referral_logo); TextView mCreditText = (TextView) findViewById(R.id.credit_text); @@ -1548,11 +1589,11 @@ public void bgWallpaperRetrieved(Bitmap bgWallpaper) { .getSpec())) { mPrevScrollPosition = SharedPreferencesManager.getInstance().readInt( - "position_" + BRAVE_NESTED_SCROLLVIEW_POSITION + BraveActivity.getBraveActivity() .getActivityTab() .getId(), - NEWS_SCROLL_TO_TOP_NEW); + 0); if (compositorView.getChildAt(2).getId() == R.id.news_settings_bar) { mSettingsBar = (LinearLayout) compositorView.getChildAt(2); @@ -1700,6 +1741,12 @@ private TabImpl getTabImpl() { @Override public void onTileCountChanged() { + new Handler().postDelayed(() -> { + if (mTileGroup != null && mTileGroup.isEmpty()) { + correctPosition(false); + } + }, 100); + if (mTopsiteErrorMessage == null) { return; } diff --git a/android/java/org/chromium/chrome/browser/ntp_background_images/util/NTPUtil.java b/android/java/org/chromium/chrome/browser/ntp_background_images/util/NTPUtil.java index adc2fb540c3d..43dec8aa9828 100644 --- a/android/java/org/chromium/chrome/browser/ntp_background_images/util/NTPUtil.java +++ b/android/java/org/chromium/chrome/browser/ntp_background_images/util/NTPUtil.java @@ -89,7 +89,7 @@ public static void turnOnAds() { BraveRewardsNativeWorker.getInstance().SetAutoContributeEnabled(true); } - public static int correctImageCreditLayoutTopPosition(NTPImage ntpImage) { + public static int correctImageCreditLayoutTopPosition(NTPImage ntpImage, int height) { int imageCreditCorrection = 0; int widgetCompensation = 0; boolean isCompensate = false; @@ -111,13 +111,17 @@ public static int correctImageCreditLayoutTopPosition(NTPImage ntpImage) { imageCreditCorrection = isLandscape ? (int) (pxHeight * (isCompensate ? 0.48 : 0.54)) : (int) (pxHeight * (isCompensate ? 0.60 : 0.30)); - widgetCompensation = dpToPx(activity, 80); + if (height > 0) { + widgetCompensation = dpToPx(activity, 80); + } else { + widgetCompensation = dpToPx(activity, -28); + } if (ntpImage instanceof BackgroundImage) { if (!isTablet) { imageCreditCorrection = isLandscape ? (int) (pxHeight * (isCompensate ? 0.12 : 0.88)) - : (int) (pxHeight - dpToPx(activity, 355)); + : (int) (pxHeight - dpToPx(activity, 380)); } if (!ChromeFeatureList.isEnabled(BraveFeatureList.BRAVE_NEWS)) { imageCreditCorrection = (int) imageCreditCorrection - (int) (pxHeight * 0.04); @@ -126,7 +130,7 @@ public static int correctImageCreditLayoutTopPosition(NTPImage ntpImage) { if (!isTablet) { imageCreditCorrection = isLandscape ? (int) (pxHeight * (isCompensate ? 0.02 : 0.98)) - : (int) (pxHeight - dpToPx(activity, 480)); + : (int) (pxHeight - dpToPx(activity, 505)); } else { imageCreditCorrection = isLandscape ? (int) (pxHeight * (isCompensate ? 0.28 : 0.72)) @@ -143,7 +147,7 @@ public static int correctImageCreditLayoutTopPosition(NTPImage ntpImage) { } public static void updateOrientedUI( - Context context, ViewGroup view, Point size, NTPImage ntpImage) { + Context context, ViewGroup view, Point size, NTPImage ntpImage, int height) { LinearLayout parentLayout = (LinearLayout)view.findViewById(R.id.parent_layout); CompositorViewHolder compositorView = view.findViewById(R.id.compositor_view_holder); ViewGroup imageCreditLayout = view.findViewById(R.id.image_credit_layout); @@ -181,7 +185,7 @@ public static void updateOrientedUI( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); if (ChromeFeatureList.isEnabled(BraveFeatureList.BRAVE_NEWS)) { - int topMargin = correctImageCreditLayoutTopPosition(ntpImage); + int topMargin = correctImageCreditLayoutTopPosition(ntpImage, height); imageCreditLayoutParams.setMargins(0, topMargin, 0, 10); View feedSpinner = (View) view.findViewById(R.id.feed_spinner);