From df83444d45d692c85cc4cf87f5e3c7971bb4589c Mon Sep 17 00:00:00 2001 From: samartnik Date: Wed, 17 Jun 2020 18:22:31 -0400 Subject: [PATCH] [Android] NewTabPage modifications Fixes crash on opening new tab after closing all Fixes NTP image on changing phone layout Related to chromium change: https://chromium.googlesource.com/chromium/src/+/c0a930a52910bb56bf68925d9f233c29281c516b commit c0a930a52910bb56bf68925d9f233c29281c516b Author: Theresa Wellington Date: Fri May 1 20:33:45 2020 +0000 Combine FeedNewTabPage with NewTabPage, delete dead code Fold FeedNewTabPage into NewTabPage and start cleaning-up Java code that is no longer needed. Obviously dead code has been removed; subsequent CLs will be needed to clean-up more Java code and C++ classes. Bug: 1069183 --- android/brave_java_sources.gni | 1 + .../chrome/browser/ntp/BraveNewTabPage.java | 61 +++++++++++++++++++ .../browser/ntp/BraveNewTabPageLayout.java | 20 +++--- .../chromium/chrome/browser/BytecodeTest.java | 3 + .../org/brave/bytecode/BraveClassAdapter.java | 1 + .../bytecode/BraveNewTabPageClassAdapter.java | 23 +++++++ build/android/bytecode/java_sources.gni | 3 +- ...r-native_page-NativePageFactory.java.patch | 13 ++++ ...m-chrome-browser-ntp-NewTabPage.java.patch | 13 ---- 9 files changed, 115 insertions(+), 23 deletions(-) create mode 100644 android/java/org/chromium/chrome/browser/ntp/BraveNewTabPage.java create mode 100644 build/android/bytecode/java/org/brave/bytecode/BraveNewTabPageClassAdapter.java create mode 100644 patches/chrome-android-java-src-org-chromium-chrome-browser-native_page-NativePageFactory.java.patch delete mode 100644 patches/chrome-android-java-src-org-chromium-chrome-browser-ntp-NewTabPage.java.patch diff --git a/android/brave_java_sources.gni b/android/brave_java_sources.gni index 39736cc038e..a6416be8b61 100644 --- a/android/brave_java_sources.gni +++ b/android/brave_java_sources.gni @@ -48,6 +48,7 @@ brave_java_sources = [ "../../brave/android/java/org/chromium/chrome/browser/BraveUphold.java", "../../brave/android/java/org/chromium/chrome/browser/notifications/channels/BraveChannelDefinitions.java", "../../brave/android/java/org/chromium/chrome/browser/ntp/BraveDuckDuckGoOfferView.java", + "../../brave/android/java/org/chromium/chrome/browser/ntp/BraveNewTabPage.java", "../../brave/android/java/org/chromium/chrome/browser/ntp/BraveNewTabPageLayout.java", "../../brave/android/java/org/chromium/chrome/browser/ntp/IncognitoNewTabPageView.java", "../../brave/android/java/org/chromium/chrome/browser/ntp_background_images/model/NTPImage.java", diff --git a/android/java/org/chromium/chrome/browser/ntp/BraveNewTabPage.java b/android/java/org/chromium/chrome/browser/ntp/BraveNewTabPage.java new file mode 100644 index 00000000000..df4bd4e6a48 --- /dev/null +++ b/android/java/org/chromium/chrome/browser/ntp/BraveNewTabPage.java @@ -0,0 +1,61 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.chromium.chrome.browser.ntp; + +import android.app.Activity; + +import androidx.annotation.Nullable; + +import org.chromium.base.supplier.Supplier; +import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior; +import org.chromium.chrome.browser.feed.BraveFeedSurfaceCoordinator; +import org.chromium.chrome.browser.feed.FeedProcessScopeFactory; +import org.chromium.chrome.browser.feed.shared.FeedSurfaceProvider; +import org.chromium.chrome.browser.fullscreen.BrowserControlsStateProvider; +import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; +import org.chromium.chrome.browser.profiles.Profile; +import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.tabmodel.TabModelSelector; +import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager; +import org.chromium.chrome.browser.ui.native_page.NativePageHost; + +public class BraveNewTabPage extends NewTabPage { + private NewTabPageLayout mNewTabPageLayout; + private FeedSurfaceProvider mFeedSurfaceProvider; + + public BraveNewTabPage(Activity activity, + BrowserControlsStateProvider browserControlsStateProvider, + Supplier activityTabProvider, @Nullable OverviewModeBehavior overviewModeBehavior, + SnackbarManager snackbarManager, ActivityLifecycleDispatcher lifecycleDispatcher, + TabModelSelector tabModelSelector, boolean isTablet, NewTabPageUma uma, + boolean isInNightMode, NativePageHost nativePageHost, Tab tab) { + super(activity, browserControlsStateProvider, activityTabProvider, overviewModeBehavior, + snackbarManager, lifecycleDispatcher, tabModelSelector, isTablet, uma, + isInNightMode, nativePageHost, tab); + + assert mNewTabPageLayout instanceof BraveNewTabPageLayout; + if (mNewTabPageLayout instanceof BraveNewTabPageLayout) { + ((BraveNewTabPageLayout) mNewTabPageLayout).setTab(tab); + } + } + + @Override + protected void initializeMainView(Activity activity, Supplier tabProvider, + SnackbarManager snackbarManager, TabModelSelector tabModelSelector, NewTabPageUma uma, + boolean isInNightMode) { + super.initializeMainView( + activity, tabProvider, snackbarManager, tabModelSelector, uma, isInNightMode); + // Override surface provider + Profile profile = Profile.fromWebContents(mTab.getWebContents()); + + assert !FeedProcessScopeFactory.isFeedProcessEnabled(); + mFeedSurfaceProvider = + new BraveFeedSurfaceCoordinator(activity, snackbarManager, tabModelSelector, + tabProvider, new SnapScrollHelper(mNewTabPageManager, mNewTabPageLayout), + mNewTabPageLayout, null, null, isInNightMode, this, + mNewTabPageManager.getNavigationDelegate(), profile); + } +} diff --git a/android/java/org/chromium/chrome/browser/ntp/BraveNewTabPageLayout.java b/android/java/org/chromium/chrome/browser/ntp/BraveNewTabPageLayout.java index 13675bb6523..49349aa8536 100644 --- a/android/java/org/chromium/chrome/browser/ntp/BraveNewTabPageLayout.java +++ b/android/java/org/chromium/chrome/browser/ntp/BraveNewTabPageLayout.java @@ -105,7 +105,7 @@ public class BraveNewTabPageLayout extends NewTabPageLayout { private ViewGroup mSiteSectionView; - private Supplier mTabProvider; + private Tab mTab; private Activity mActivity; public BraveNewTabPageLayout(Context context, AttributeSet attrs) { @@ -204,6 +204,10 @@ public class BraveNewTabPageLayout extends NewTabPageLayout { @Override public void onConfigurationChanged(Configuration newConfig) { if (sponsoredTab != null && NTPUtil.shouldEnableNTPFeature(sponsoredTab.isMoreTabs())) { + if (bgImageView != null) { + // We need to redraw image to fit parent properly + bgImageView.setImageResource(android.R.color.transparent); + } NTPImage ntpImage = sponsoredTab.getTabNTPImage(false); if (ntpImage == null) { sponsoredTab.setNTPImage(SponsoredImageUtil.getBackgroundImage()); @@ -234,7 +238,6 @@ public class BraveNewTabPageLayout extends NewTabPageLayout { assert (activity instanceof BraveActivity); mActivity = activity; - mTabProvider = tabProvider; } @Override @@ -636,14 +639,13 @@ public class BraveNewTabPageLayout extends NewTabPageLayout { return view != null && view.getParent() != null; } + public void setTab(Tab tab) { + mTab = tab; + } + private Tab getTab() { - Tab tab = mTabProvider.get(); - if (tab == null && mActivity instanceof ChromeTabbedActivity) { - ChromeTabbedActivity chromeActivity = ((ChromeTabbedActivity) mActivity); - tab = chromeActivity.getActivityTab(); - } - assert tab != null; - return tab; + assert mTab != null; + return mTab; } private TabImpl getTabImpl() { diff --git a/android/javatests/org/chromium/chrome/browser/BytecodeTest.java b/android/javatests/org/chromium/chrome/browser/BytecodeTest.java index f648e2e377c..360afd53a2d 100644 --- a/android/javatests/org/chromium/chrome/browser/BytecodeTest.java +++ b/android/javatests/org/chromium/chrome/browser/BytecodeTest.java @@ -33,6 +33,7 @@ public class BytecodeTest { Assert.assertTrue(classExists("org/chromium/chrome/browser/LaunchIntentDispatcher")); Assert.assertTrue(classExists("org/chromium/chrome/browser/ntp/NewTabPageLayout")); Assert.assertTrue(classExists("org/chromium/chrome/browser/feed/FeedSurfaceCoordinator")); + Assert.assertTrue(classExists("org/chromium/chrome/browser/ntp/NewTabPage")); } @Test @@ -65,6 +66,8 @@ public class BytecodeTest { Assert.assertTrue(fieldExists("org/chromium/chrome/browser/feed/FeedSurfaceCoordinator", "mScrollViewForPolicy")); Assert.assertTrue(fieldExists("org/chromium/chrome/browser/feed/FeedSurfaceCoordinator", "mNtpHeader")); Assert.assertTrue(fieldExists("org/chromium/chrome/browser/feed/FeedSurfaceCoordinator", "mRootView")); + Assert.assertTrue(fieldExists("org/chromium/chrome/browser/ntp/NewTabPage", "mNewTabPageLayout")); + Assert.assertTrue(fieldExists("org/chromium/chrome/browser/ntp/NewTabPage", "mFeedSurfaceProvider")); } private boolean classExists(String className) { diff --git a/build/android/bytecode/java/org/brave/bytecode/BraveClassAdapter.java b/build/android/bytecode/java/org/brave/bytecode/BraveClassAdapter.java index 113de329e5a..950462a811f 100644 --- a/build/android/bytecode/java/org/brave/bytecode/BraveClassAdapter.java +++ b/build/android/bytecode/java/org/brave/bytecode/BraveClassAdapter.java @@ -17,6 +17,7 @@ public class BraveClassAdapter { chain = new BraveManageSyncSettingsClassAdapter(chain); chain = new BraveNewTabPageLayoutClassAdapter(chain); chain = new BraveFeedSurfaceCoordinatorClassAdapter(chain); + chain = new BraveNewTabPageClassAdapter(chain); return chain; } } diff --git a/build/android/bytecode/java/org/brave/bytecode/BraveNewTabPageClassAdapter.java b/build/android/bytecode/java/org/brave/bytecode/BraveNewTabPageClassAdapter.java new file mode 100644 index 00000000000..5b55fbc4f9d --- /dev/null +++ b/build/android/bytecode/java/org/brave/bytecode/BraveNewTabPageClassAdapter.java @@ -0,0 +1,23 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.brave.bytecode; + +import org.objectweb.asm.ClassVisitor; + +public class BraveNewTabPageClassAdapter extends BraveClassVisitor { + static String sNewTabPageClassName = "org/chromium/chrome/browser/ntp/NewTabPage"; + static String sBraveNewTabPageClassName = "org/chromium/chrome/browser/ntp/BraveNewTabPage"; + + public BraveNewTabPageClassAdapter(ClassVisitor visitor) { + super(visitor); + + deleteField(sBraveNewTabPageClassName, "mNewTabPageLayout"); + makeProtectedField(sNewTabPageClassName, "mNewTabPageLayout"); + + deleteField(sBraveNewTabPageClassName, "mFeedSurfaceProvider"); + makeProtectedField(sNewTabPageClassName, "mFeedSurfaceProvider"); + } +} diff --git a/build/android/bytecode/java_sources.gni b/build/android/bytecode/java_sources.gni index 4c8cd19cfae..df1861a56f6 100644 --- a/build/android/bytecode/java_sources.gni +++ b/build/android/bytecode/java_sources.gni @@ -8,5 +8,6 @@ brave_java_bytecode_files = [ "../../../brave/build/android/bytecode/java/org/brave/bytecode/BraveFeedSurfaceCoordinatorClassAdapter.java", "../../../brave/build/android/bytecode/java/org/brave/bytecode/BraveMainPreferenceBaseClassAdapter.java", "../../../brave/build/android/bytecode/java/org/brave/bytecode/BraveManageSyncSettingsClassAdapter.java", - "../../../brave/build/android/bytecode/java/org/brave/bytecode/BraveNewTabPageLayoutClassAdapter.java" + "../../../brave/build/android/bytecode/java/org/brave/bytecode/BraveNewTabPageClassAdapter.java", + "../../../brave/build/android/bytecode/java/org/brave/bytecode/BraveNewTabPageLayoutClassAdapter.java", ] diff --git a/patches/chrome-android-java-src-org-chromium-chrome-browser-native_page-NativePageFactory.java.patch b/patches/chrome-android-java-src-org-chromium-chrome-browser-native_page-NativePageFactory.java.patch new file mode 100644 index 00000000000..b12802c241d --- /dev/null +++ b/patches/chrome-android-java-src-org-chromium-chrome-browser-native_page-NativePageFactory.java.patch @@ -0,0 +1,13 @@ +diff --git a/chrome/android/java/src/org/chromium/chrome/browser/native_page/NativePageFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/native_page/NativePageFactory.java +index 7fc28ad0d47a3a9cabf5631aad19d469d5d05e11..e7d64854f03e54e602119982685b0a9503c3e1eb 100644 +--- a/chrome/android/java/src/org/chromium/chrome/browser/native_page/NativePageFactory.java ++++ b/chrome/android/java/src/org/chromium/chrome/browser/native_page/NativePageFactory.java +@@ -82,7 +82,7 @@ public class NativePageFactory { + NativePageHost nativePageHost = new TabShim(tab, mActivity); + if (tab.isIncognito()) return new IncognitoNewTabPage(mActivity, nativePageHost); + +- return new NewTabPage(mActivity, mActivity.getFullscreenManager(), ++ return new org.chromium.chrome.browser.ntp.BraveNewTabPage(mActivity, mActivity.getFullscreenManager(), + mActivity.getActivityTabProvider(), mActivity.getOverviewModeBehavior(), + mActivity.getSnackbarManager(), mActivity.getLifecycleDispatcher(), + mActivity.getTabModelSelector(), mActivity.isTablet(), mUma.get(), diff --git a/patches/chrome-android-java-src-org-chromium-chrome-browser-ntp-NewTabPage.java.patch b/patches/chrome-android-java-src-org-chromium-chrome-browser-ntp-NewTabPage.java.patch deleted file mode 100644 index 312c8e45bbd..00000000000 --- a/patches/chrome-android-java-src-org-chromium-chrome-browser-ntp-NewTabPage.java.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java -index 83657d3a9d528cc51e69be8dad61eb67f6e652a4..703764e66938d7427fb4341ab42a5ba52d2b19db 100644 ---- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java -+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java -@@ -440,7 +440,7 @@ public class NewTabPage implements NativePage, InvalidationAwareThumbnailProvide - } - - mFeedSurfaceProvider = -- new FeedSurfaceCoordinator(activity, snackbarManager, tabModelSelector, tabProvider, -+ new org.chromium.chrome.browser.feed.BraveFeedSurfaceCoordinator(activity, snackbarManager, tabModelSelector, tabProvider, - new SnapScrollHelper(mNewTabPageManager, mNewTabPageLayout), - mNewTabPageLayout, sectionHeaderView, actionApi, isInNightMode, this, - mNewTabPageManager.getNavigationDelegate(), profile);