diff --git a/android/java/org/chromium/chrome/browser/BraveActivity.java b/android/java/org/chromium/chrome/browser/BraveActivity.java index b5f6b18e6bf..c7ab85f4343 100644 --- a/android/java/org/chromium/chrome/browser/BraveActivity.java +++ b/android/java/org/chromium/chrome/browser/BraveActivity.java @@ -317,24 +317,60 @@ public abstract class BraveActivity extends ChromeActivity { } } - public void openNewOrSelectExistingTab(String url) { + public Tab selectExistingTab(String url) { + Tab tab = getActivityTab(); + if (tab != null && tab.getUrl().equals(url)) { + return tab; + } + + TabModel tabModel = getCurrentTabModel(); + int tabIndex = TabModelUtils.getTabIndexByUrl(tabModel, url); + + // Find if tab exists + if (tabIndex != TabModel.INVALID_TAB_INDEX){ + tab = tabModel.getTabAt(tabIndex); + // Moving tab forward + tabModel.moveTab(tab.getId(), tabModel.getCount()); + tabModel.setIndex( + TabModelUtils.getTabIndexById(tabModel, tab.getId()), + TabSelectionType.FROM_USER); + return tab; + } else { + return null; + } + } + + public Tab openNewOrSelectExistingTab(String url) { TabModel tabModel = getCurrentTabModel(); int tabRewardsIndex = TabModelUtils.getTabIndexByUrl(tabModel, url); - // Find if tab exists - if (tabRewardsIndex != TabModel.INVALID_TAB_INDEX){ - Tab tab = tabModel.getTabAt(tabRewardsIndex); - // Moving tab forward - if (!getActivityTab().equals(tab)){ - tabModel.moveTab(tab.getId(), tabModel.getCount()); - tabModel.setIndex( - TabModelUtils.getTabIndexById(tabModel, tab.getId()), - TabSelectionType.FROM_USER); - } + Tab tab = selectExistingTab(url); + if (tab != null) { + return tab; } else { // Open a new tab - getTabCreator(false).launchUrl(url, TabLaunchType.FROM_CHROME_UI); + return getTabCreator(false).launchUrl(url, TabLaunchType.FROM_CHROME_UI); } } private native void nativeRestartStatsUpdater(); + + static public ChromeTabbedActivity getChromeTabbedActivity() { + for (Activity ref : ApplicationStatus.getRunningActivities()) { + if (!(ref instanceof ChromeTabbedActivity)) continue; + + return (ChromeTabbedActivity)ref; + } + + return null; + } + + static public BraveActivity getBraveActivity() { + for (Activity ref : ApplicationStatus.getRunningActivities()) { + if (!(ref instanceof BraveActivity)) continue; + + return (BraveActivity)ref; + } + + return null; + } } diff --git a/android/java/org/chromium/chrome/browser/BraveRewardsHelper.java b/android/java/org/chromium/chrome/browser/BraveRewardsHelper.java index 9a7e05b0490..a05f705758b 100644 --- a/android/java/org/chromium/chrome/browser/BraveRewardsHelper.java +++ b/android/java/org/chromium/chrome/browser/BraveRewardsHelper.java @@ -194,23 +194,11 @@ public class BraveRewardsHelper implements LargeIconBridge.LargeIconCallback{ } static public ChromeTabbedActivity getChromeTabbedActivity() { - for (Activity ref : ApplicationStatus.getRunningActivities()) { - if (!(ref instanceof ChromeTabbedActivity)) continue; - - return (ChromeTabbedActivity)ref; - } - - return null; + return BraveActivity.getChromeTabbedActivity(); } static public BraveActivity getBraveActivity() { - for (Activity ref : ApplicationStatus.getRunningActivities()) { - if (!(ref instanceof BraveActivity)) continue; - - return (BraveActivity)ref; - } - - return null; + return BraveActivity.getBraveActivity(); } static public String getCurrentMonth(Calendar currentTime, diff --git a/android/java/org/chromium/chrome/browser/ntp/BraveNewTabPageLayout.java b/android/java/org/chromium/chrome/browser/ntp/BraveNewTabPageLayout.java index feaf2755692..0a12cb433a1 100644 --- a/android/java/org/chromium/chrome/browser/ntp/BraveNewTabPageLayout.java +++ b/android/java/org/chromium/chrome/browser/ntp/BraveNewTabPageLayout.java @@ -45,8 +45,9 @@ public class BraveNewTabPageLayout extends NewTabPageLayout { } @Override - public void insertSiteSectionView() { + protected void insertSiteSectionView() { ViewGroup mainLayout = findViewById(R.id.ntp_main_layout); + mSiteSectionView = SiteSection.inflateSiteSection(mainLayout); ViewGroup.LayoutParams layoutParams = mSiteSectionView.getLayoutParams(); layoutParams.width = ViewGroup.LayoutParams.WRAP_CONTENT; @@ -66,7 +67,7 @@ public class BraveNewTabPageLayout extends NewTabPageLayout { } @Override - public int getMaxTileRows() { + protected int getMaxTileRows() { boolean isMoreTabs = false; ChromeTabbedActivity chromeTabbedActivity = BraveRewardsHelper.getChromeTabbedActivity(); if(chromeTabbedActivity != null) { diff --git a/android/java/org/chromium/chrome/browser/tabmodel/BraveTabCreator.java b/android/java/org/chromium/chrome/browser/tabmodel/BraveTabCreator.java index 2b86d49d552..a6f570cd242 100644 --- a/android/java/org/chromium/chrome/browser/tabmodel/BraveTabCreator.java +++ b/android/java/org/chromium/chrome/browser/tabmodel/BraveTabCreator.java @@ -10,52 +10,49 @@ import android.os.Build; import org.chromium.base.Supplier; import org.chromium.chrome.browser.ChromeActivity; import org.chromium.ui.base.WindowAndroid; -import org.chromium.chrome.browser.tab.Tab; -import org.chromium.chrome.browser.tab.TabDelegateFactory; +import org.chromium.chrome.browser.BraveActivity; import org.chromium.chrome.browser.ChromeTabbedActivity; import org.chromium.chrome.browser.init.StartupTabPreloader; -import org.chromium.chrome.browser.profiles.Profile; -import org.chromium.chrome.browser.ntp.NewTabPage; -import org.chromium.chrome.browser.util.UrlConstants; -import org.chromium.chrome.browser.BraveRewardsHelper; +import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.tab.TabDelegateFactory; import org.chromium.chrome.browser.ntp_sponsored_images.SponsoredImageUtil; import org.chromium.chrome.browser.ntp_sponsored_images.NTPSponsoredImagesBridge; +import org.chromium.chrome.browser.ntp.NewTabPage; import org.chromium.chrome.browser.preferences.BravePref; import org.chromium.chrome.browser.preferences.BravePrefServiceBridge; +import org.chromium.chrome.browser.profiles.Profile; +import org.chromium.chrome.browser.util.UrlConstants; public class BraveTabCreator extends ChromeTabCreator { - public BraveTabCreator(ChromeActivity activity, + public BraveTabCreator(ChromeActivity activity, WindowAndroid nativeWindow, - StartupTabPreloader startupTabPreloader, - Supplier tabDelegateFactory, + StartupTabPreloader startupTabPreloader, + Supplier tabDelegateFactory, boolean incognito) { - super(activity, nativeWindow, startupTabPreloader, tabDelegateFactory, incognito); - } - - @Override - public void launchNTP() { - ChromeTabbedActivity chromeTabbedActivity = BraveRewardsHelper.getChromeTabbedActivity(); - if(chromeTabbedActivity != null && Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) { - TabModel tabModel = chromeTabbedActivity.getCurrentTabModel(); - if (tabModel.getCount() >= SponsoredImageUtil.MAX_TABS && BravePrefServiceBridge.getInstance().getBoolean(BravePref.NTP_SHOW_BACKGROUND_IMAGE)) { - if(chromeTabbedActivity.getActivityTab() != null && NewTabPage.isNTPUrl(chromeTabbedActivity.getActivityTab().getUrl())) { - chromeTabbedActivity.hideOverview(); - } else { - chromeTabbedActivity.openNewOrSelectExistingTab(UrlConstants.NTP_URL); - chromeTabbedActivity.hideOverview(); - } - } else { - initializeNTPBridge(); - launchUrl(UrlConstants.NTP_URL, TabLaunchType.FROM_CHROME_UI); - } - } else { - initializeNTPBridge(); - launchUrl(UrlConstants.NTP_URL, TabLaunchType.FROM_CHROME_UI); - } + super(activity, nativeWindow, startupTabPreloader, tabDelegateFactory, incognito); } - private void initializeNTPBridge() { + @Override + public Tab launchUrl(String url, @TabLaunchType int type) { + if (url.equals(UrlConstants.NTP_URL) && type == TabLaunchType.FROM_CHROME_UI) { + registerPageView(); + ChromeTabbedActivity chromeTabbedActivity = BraveActivity.getChromeTabbedActivity(); + if(chromeTabbedActivity != null && Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) { + TabModel tabModel = chromeTabbedActivity.getCurrentTabModel(); + if (tabModel.getCount() >= SponsoredImageUtil.MAX_TABS && BravePrefServiceBridge.getInstance().getBoolean(BravePref.NTP_SHOW_BACKGROUND_IMAGE)) { + Tab tab = chromeTabbedActivity.selectExistingTab(UrlConstants.NTP_URL); + if (tab != null) { + chromeTabbedActivity.hideOverview(); + return tab; + } + } + } + } + return super.launchUrl(url, type); + } + + private void registerPageView() { NTPSponsoredImagesBridge.getInstance(Profile.getLastUsedProfile()).registerPageView(); } } diff --git a/android/java/org/chromium/chrome/browser/upgrade/BraveUpgradeJobIntentService.java b/android/java/org/chromium/chrome/browser/upgrade/BraveUpgradeJobIntentService.java index e566d659be7..a4005ceb501 100644 --- a/android/java/org/chromium/chrome/browser/upgrade/BraveUpgradeJobIntentService.java +++ b/android/java/org/chromium/chrome/browser/upgrade/BraveUpgradeJobIntentService.java @@ -15,9 +15,11 @@ import org.chromium.base.Log; import org.chromium.base.library_loader.LibraryProcessType; import org.chromium.base.task.PostTask; import org.chromium.chrome.browser.BraveHelper; +import org.chromium.chrome.browser.preferences.BravePref; import org.chromium.chrome.browser.preferences.BravePrefServiceBridge; import org.chromium.chrome.browser.preferences.website.BraveShieldsContentSettings; import org.chromium.chrome.browser.profiles.Profile; +import org.chromium.chrome.browser.settings.BackgroundImagesPreferences; import org.chromium.chrome.browser.settings.website.WebsitePreferenceBridge; import org.chromium.content_public.browser.BrowserStartupController; import org.chromium.content_public.browser.UiThreadTaskTraits; @@ -219,6 +221,14 @@ public class BraveUpgradeJobIntentService extends JobIntentService { BravePrefServiceBridge.getInstance().setDesktopModeEnabled( BravePrefServiceBridge.getInstance().GetBooleanForContentSetting(CONTENT_SETTINGS_TYPE_DESKTOP_VIEW)); + // Background image settings settings + if (sharedPreferences.contains(BackgroundImagesPreferences.PREF_SHOW_BACKGROUND_IMAGES)) { + BravePrefServiceBridge.getInstance().setBoolean(BravePref.NTP_SHOW_BACKGROUND_IMAGE, + sharedPreferences.getBoolean(BackgroundImagesPreferences.PREF_SHOW_BACKGROUND_IMAGES, true)); + BravePrefServiceBridge.getInstance().setBoolean(BravePref.NTP_SHOW_BRANDED_BACKGROUND_IMAGE, + sharedPreferences.getBoolean(BackgroundImagesPreferences.PREF_SHOW_SPONSORED_IMAGES, true)); + } + // Migrate search engines settings sharedPreferencesEditor.putString(BraveHelper.PRIVATE_DSE_KEYWORD, sharedPreferences.getString(PREF_PRIVATE_SEARCH_ENGINE_KEYWORD, DSE_KEYWORD)); diff --git a/build/android/bytecode/java/org/brave/bytecode/BraveClassVisitor.java b/build/android/bytecode/java/org/brave/bytecode/BraveClassVisitor.java index c9d626e587d..d0bed01555d 100644 --- a/build/android/bytecode/java/org/brave/bytecode/BraveClassVisitor.java +++ b/build/android/bytecode/java/org/brave/bytecode/BraveClassVisitor.java @@ -9,15 +9,21 @@ import static org.objectweb.asm.Opcodes.ACC_PRIVATE; import static org.objectweb.asm.Opcodes.ACC_PUBLIC; import static org.objectweb.asm.Opcodes.ASM5; +import java.util.ArrayList; +import java.util.List; import java.util.HashMap; import java.util.Map; -import java.util.ArrayList; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.MethodVisitor; +import org.objectweb.asm.tree.AnnotationNode; +import org.objectweb.asm.tree.ClassNode; +import org.objectweb.asm.tree.MethodNode; class BraveClassVisitor extends ClassVisitor { + private ClassVisitor mTarget; + class Method { public int access; public String name; @@ -48,9 +54,12 @@ class BraveClassVisitor extends ClassVisitor { new HashMap>(); private Map> mMakePublicMethods = new HashMap>(); + private Map>> mAddAnnotations = + new HashMap>>(); public BraveClassVisitor(ClassVisitor visitor) { - super(ASM5, visitor); + super(ASM5, null); + mTarget = visitor; } protected void changeSuperName(String className, String superName) { @@ -99,6 +108,22 @@ class BraveClassVisitor extends ClassVisitor { methods.add(methodName); } + protected void addMethodAnnotation(String className, String methodName, String annotationType) { + Map> annotations = mAddAnnotations.get(className); + if (annotations == null) { + annotations = new HashMap>(); + mAddAnnotations.put(className, annotations); + } + + ArrayList annotationList = annotations.get(methodName); + if (annotationList == null) { + annotationList = new ArrayList(); + annotations.put(methodName, annotationList); + } + + annotationList.add(annotationType); + } + @Override public void visit(int version, int access, @@ -106,6 +131,7 @@ class BraveClassVisitor extends ClassVisitor { String signature, String superName, String[] interfaces) { + super.cv = new ClassNode(); mName = name; if (mSuperNames.containsKey(name)) { superName = mSuperNames.get(name); @@ -151,4 +177,36 @@ class BraveClassVisitor extends ClassVisitor { method.signature, method.exceptions); } + + protected ClassNode process(ClassNode source) { + Map> annotationsForClass = mAddAnnotations.get(source.name); + + if (annotationsForClass == null) + return source; + + List methods = source.methods; + for (MethodNode method : methods) { + ArrayList annotations = annotationsForClass.get(method.name); + if (annotations != null) { + if (method.visibleAnnotations == null) { + method.visibleAnnotations = new ArrayList(); + } + for (String annotation : annotations) { + method.visibleAnnotations.add(new AnnotationNode(annotation)); + System.out.println("add " + annotation + " annotation to " + method.name + " in " + source.name); + } + } + } + return source; + } + + @Override + public void visitEnd() { + super.visitEnd(); + ClassNode source = (ClassNode)super.cv; + ClassNode result = process(source); + if (mTarget != null) { + result.accept(mTarget); + } + } } diff --git a/patches/chrome-android-java-src-org-chromium-chrome-browser-ntp-NewTabPageLayout.java.patch b/patches/chrome-android-java-src-org-chromium-chrome-browser-ntp-NewTabPageLayout.java.patch index 9a574d90a52..7431731d103 100644 --- a/patches/chrome-android-java-src-org-chromium-chrome-browser-ntp-NewTabPageLayout.java.patch +++ b/patches/chrome-android-java-src-org-chromium-chrome-browser-ntp-NewTabPageLayout.java.patch @@ -1,25 +1,17 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java -index db1db4f0b941c6cea83f2ca28ddc70b8e7916a90..29b95ee943646c9556533850585b904300ad918d 100644 +index db1db4f0b941c6cea83f2ca28ddc70b8e7916a90..337bbb41a18195c16603c62acb92de4c5c921a13 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java -@@ -20,6 +20,7 @@ import android.view.ViewGroup; - import android.view.ViewStub; - import android.widget.ImageView; - import android.widget.LinearLayout; -+import android.widget.FrameLayout; - import android.widget.TextView; - - import androidx.annotation.Nullable; -@@ -62,7 +63,7 @@ import org.chromium.ui.base.DeviceFormFactor; +@@ -62,7 +62,7 @@ import org.chromium.ui.base.DeviceFormFactor; * Layout for the new tab page. This positions the page elements in the correct vertical positions. * There are no separate phone and tablet UIs; this layout adapts based on the available space. */ -public class NewTabPageLayout extends LinearLayout implements TileGroup.Observer, VrModeObserver { -+public class NewTabPageLayout extends FrameLayout implements TileGroup.Observer, VrModeObserver { ++public class NewTabPageLayout extends android.widget.FrameLayout implements TileGroup.Observer, VrModeObserver { private static final String TAG = "NewTabPageLayout"; // Used to signify the cached resource value is unset. private static final int UNSET_RESOURCE_FLAG = -1; -@@ -74,7 +75,7 @@ public class NewTabPageLayout extends LinearLayout implements TileGroup.Observer +@@ -74,7 +74,7 @@ public class NewTabPageLayout extends LinearLayout implements TileGroup.Observer private LogoView mSearchProviderLogoView; private View mSearchBoxView; @@ -28,21 +20,21 @@ index db1db4f0b941c6cea83f2ca28ddc70b8e7916a90..29b95ee943646c9556533850585b9043 private SiteSectionViewHolder mSiteSectionViewHolder; private ImageView mVoiceSearchButton; private View mTileGridPlaceholder; -@@ -415,7 +416,7 @@ public class NewTabPageLayout extends LinearLayout implements TileGroup.Observer +@@ -415,7 +415,7 @@ public class NewTabPageLayout extends LinearLayout implements TileGroup.Observer 1f); } - private void insertSiteSectionView() { -+ public void insertSiteSectionView() { ++ protected void insertSiteSectionView() { mSiteSectionView = SiteSection.inflateSiteSection(this); ViewGroup.LayoutParams layoutParams = mSiteSectionView.getLayoutParams(); layoutParams.width = ViewGroup.LayoutParams.WRAP_CONTENT; -@@ -786,7 +787,7 @@ public class NewTabPageLayout extends LinearLayout implements TileGroup.Observer +@@ -786,7 +786,7 @@ public class NewTabPageLayout extends LinearLayout implements TileGroup.Observer } } - private static int getMaxTileRows() { -+ public int getMaxTileRows() { ++ protected int getMaxTileRows() { return 2; } diff --git a/patches/chrome-android-java-src-org-chromium-chrome-browser-tabmodel-TabCreatorManager.java.patch b/patches/chrome-android-java-src-org-chromium-chrome-browser-tabmodel-TabCreatorManager.java.patch deleted file mode 100644 index 2e9893fa8c9..00000000000 --- a/patches/chrome-android-java-src-org-chromium-chrome-browser-tabmodel-TabCreatorManager.java.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabCreatorManager.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabCreatorManager.java -index de7adb86f85b72ad82b8d994c59d164394cbdfdb..c8f26dd54052d28257d9ddbb670264d0c6b54dcb 100644 ---- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabCreatorManager.java -+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabCreatorManager.java -@@ -87,7 +87,7 @@ public interface TabCreatorManager { - /** - * Creates a new tab and loads the NTP. - */ -- public final void launchNTP() { -+ public void launchNTP() { - try { - TraceEvent.begin("TabCreator.launchNTP"); - launchUrl(UrlConstants.NTP_URL, TabLaunchType.FROM_CHROME_UI);