Skip to content

Commit

Permalink
[ads] RichNTT: Android
Browse files Browse the repository at this point in the history
  • Loading branch information
aseren committed Feb 21, 2025
1 parent 5f96b0c commit 4c02a83
Show file tree
Hide file tree
Showing 31 changed files with 679 additions and 8 deletions.
2 changes: 2 additions & 0 deletions android/brave_java_sources.gni
Original file line number Diff line number Diff line change
Expand Up @@ -259,11 +259,13 @@ brave_java_sources = [
"../../brave/android/java/org/chromium/chrome/browser/ntp/IncognitoNewTabPageView.java",
"../../brave/android/java/org/chromium/chrome/browser/ntp/NtpUtil.java",
"../../brave/android/java/org/chromium/chrome/browser/ntp/OnBraveNtpListener.java",
"../../brave/android/java/org/chromium/chrome/browser/ntp/SponsoredBackgroundWebView.java",
"../../brave/android/java/org/chromium/chrome/browser/ntp_background_images/NTPBackgroundImagesBridge.java",
"../../brave/android/java/org/chromium/chrome/browser/ntp_background_images/model/BackgroundImage.java",
"../../brave/android/java/org/chromium/chrome/browser/ntp_background_images/model/ImageCredit.java",
"../../brave/android/java/org/chromium/chrome/browser/ntp_background_images/model/NTPImage.java",
"../../brave/android/java/org/chromium/chrome/browser/ntp_background_images/model/SponsoredLogo.java",
"../../brave/android/java/org/chromium/chrome/browser/ntp_background_images/model/SponsoredRichMedia.java",
"../../brave/android/java/org/chromium/chrome/browser/ntp_background_images/model/SponsoredTab.java",
"../../brave/android/java/org/chromium/chrome/browser/ntp_background_images/model/TopSite.java",
"../../brave/android/java/org/chromium/chrome/browser/ntp_background_images/model/Wallpaper.java",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
Expand All @@ -39,6 +40,7 @@
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.RecyclerView.OnItemTouchListener;
import androidx.recyclerview.widget.SimpleItemAnimator;

import com.airbnb.lottie.LottieAnimationView;
Expand Down Expand Up @@ -76,6 +78,7 @@
import org.chromium.chrome.browser.logo.LogoCoordinator;
import org.chromium.chrome.browser.ntp_background_images.NTPBackgroundImagesBridge;
import org.chromium.chrome.browser.ntp_background_images.model.NTPImage;
import org.chromium.chrome.browser.ntp_background_images.model.SponsoredRichMedia;
import org.chromium.chrome.browser.ntp_background_images.model.SponsoredTab;
import org.chromium.chrome.browser.ntp_background_images.model.TopSite;
import org.chromium.chrome.browser.ntp_background_images.model.Wallpaper;
Expand Down Expand Up @@ -132,7 +135,14 @@ public class BraveNewTabPageLayout
private Integer mInitialTileNum;

// Own members.
private WindowAndroid mWindowAndroid;

private ImageView mBgImageView;
private SponsoredBackgroundWebView mSponsoredBackgroundWebView;
// private ThinWebView mSponsoredBackgroundWebView;
private FrameLayout mBackgroundSponsoredContentView;
private SponsoredRichMedia mSponsoredRichMedia;

private Profile mProfile;
private SponsoredTab mSponsoredTab;
private boolean mIsTablet;
Expand Down Expand Up @@ -441,6 +451,31 @@ private void setNtpRecyclerView(LinearLayoutManager linearLayoutManager) {
}

mPrevVisibleNewsCardPosition = firstNewsFeedPosition() - 1;

mRecyclerView.addOnItemTouchListener(
new OnItemTouchListener() {
@Override
public boolean onInterceptTouchEvent(
RecyclerView recyclerView, MotionEvent event) {
final View childView =
recyclerView.findChildViewUnder(event.getX(), event.getY());
if (childView == null && mSponsoredBackgroundWebView != null) {
mSponsoredBackgroundWebView.getView().dispatchTouchEvent(event);
}
return false;
}

@Override
public void onTouchEvent(RecyclerView recyclerView, MotionEvent event) {
}

@Override
public void onRequestDisallowInterceptTouchEvent(
boolean disallowIntercept) {
}
}
);

mRecyclerView.addOnScrollListener(
new RecyclerView.OnScrollListener() {
@Override
Expand Down Expand Up @@ -931,6 +966,11 @@ public void onConfigurationChanged(Configuration newConfig) {
if (mWallpaper == null) {
mSponsoredTab.setNTPImage(SponsoredImageUtil.getBackgroundImage());
}
} else if (ntpImage instanceof SponsoredRichMedia) {
mSponsoredRichMedia = (SponsoredRichMedia) ntpImage;
if (mSponsoredRichMedia == null) {
mSponsoredTab.setNTPImage(SponsoredImageUtil.getBackgroundImage());
}
}
super.onConfigurationChanged(newConfig);
showNTPImage(ntpImage);
Expand Down Expand Up @@ -1181,6 +1221,8 @@ public void initialize(
tabStripHeightSupplier);

mIsTablet = isTablet;
mWindowAndroid = windowAndroid;


assert mMvTilesContainerLayout != null : "Something has changed in the upstream!";

Expand Down Expand Up @@ -1222,6 +1264,9 @@ private void showNTPImage(NTPImage ntpImage) {
&& Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
setBackgroundImage(ntpImage);

} else if (ntpImage instanceof SponsoredRichMedia) {
final SponsoredRichMedia sponsoredRichMedia = (SponsoredRichMedia) ntpImage;
setupSponsoredBackgroundContent(sponsoredRichMedia);
} else if (UserPrefs.get(ProfileManager.getLastUsedRegularProfile())
.getBoolean(BravePref.NEW_TAB_PAGE_SHOW_BACKGROUND_IMAGE)
&& mSponsoredTab != null
Expand All @@ -1230,6 +1275,34 @@ private void showNTPImage(NTPImage ntpImage) {
}
}

private void createSponsoredBackgroundWebContentsIfNeeded() {
if (mSponsoredBackgroundWebView != null) {
return;
}

mSponsoredBackgroundWebView = new SponsoredBackgroundWebView(mActivity, mWindowAndroid, mProfile);

mBackgroundSponsoredContentView = findViewById(R.id.bg_background_view);
mBackgroundSponsoredContentView.setVisibility(View.VISIBLE);
mBackgroundSponsoredContentView.addView(mSponsoredBackgroundWebView.getView());
}

private void setupSponsoredBackgroundContent(SponsoredRichMedia sponsoredRichMedia) {
createSponsoredBackgroundWebContentsIfNeeded();

mSponsoredBackgroundWebView.loadSponsoredRichMedia(sponsoredRichMedia);

// Uri.Builder builder = Uri.parse("chrome://new-tab-takeover").buildUpon();
// builder.appendQueryParameter("wallpaperUrl", sponsoredRichMedia.getWallpaperUrl());
// builder.appendQueryParameter("creativeInstanceId", sponsoredRichMedia.getCreativeInstanceId());
// builder.appendQueryParameter("placementId", sponsoredRichMedia.getPlacementId());
// builder.appendQueryParameter("targetUrl", sponsoredRichMedia.getTargetUrl());

// mSponsoredBackgroundWebContents
// .getNavigationController()
// .loadUrl(new LoadUrlParams(builder.build().toString()));
}

private void setBackgroundImage(NTPImage ntpImage) {
mBgImageView = (ImageView) findViewById(R.id.bg_image_view);
mBgImageView.setScaleType(ImageView.ScaleType.MATRIX);
Expand Down Expand Up @@ -1261,6 +1334,11 @@ private void checkAndShowNTPImage(boolean isReset) {
if (mWallpaper == null) {
mSponsoredTab.setNTPImage(SponsoredImageUtil.getBackgroundImage());
}
} else if (ntpImage instanceof SponsoredRichMedia) {
mSponsoredRichMedia = (SponsoredRichMedia) ntpImage;
if (mSponsoredRichMedia == null) {
mSponsoredTab.setNTPImage(SponsoredImageUtil.getBackgroundImage());
}
}
showNTPImage(ntpImage);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
/* Copyright (c) 2025 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 https://mozilla.org/MPL/2.0/. */

package org.chromium.chrome.browser.ntp;

import android.app.Activity;
import android.net.Uri;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import org.chromium.base.version_info.VersionInfo;
import org.chromium.chrome.browser.content.WebContentsFactory;
import org.chromium.chrome.browser.ntp_background_images.model.SponsoredRichMedia;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.components.embedder_support.view.ContentView;
import org.chromium.components.thinwebview.ThinWebView;
import org.chromium.components.thinwebview.ThinWebViewConstraints;
import org.chromium.components.thinwebview.ThinWebViewFactory;
import org.chromium.content_public.browser.LoadUrlParams;
import org.chromium.content_public.browser.WebContents;
import org.chromium.net.NetId;
import org.chromium.ui.base.IntentRequestTracker;
import org.chromium.ui.base.ViewAndroidDelegate;
import org.chromium.ui.base.WindowAndroid;

public class SponsoredBackgroundWebView {
private WebContents mSponsoredBackgroundWebContents;
private ThinWebView mSponsoredBackgroundWebView;

public SponsoredBackgroundWebView(Activity activity, WindowAndroid windowAndroid, Profile profile) {
mSponsoredBackgroundWebContents =
WebContentsFactory.createWebContentsWithWarmRenderer(
profile,
/* initiallyHidden= */ false,
/* targetNetwork= */ NetId.INVALID);

final ContentView webContentView =
ContentView.createContentView(activity, mSponsoredBackgroundWebContents);
final ViewAndroidDelegate delegate =
ViewAndroidDelegate.createBasicDelegate(webContentView);
mSponsoredBackgroundWebContents.setDelegates(
VersionInfo.getProductVersion(),
delegate,
webContentView,
windowAndroid,
WebContents.createDefaultInternalsHolder());

final IntentRequestTracker intentRequestTracker = windowAndroid.getIntentRequestTracker();
mSponsoredBackgroundWebView =
ThinWebViewFactory.create(
activity, new ThinWebViewConstraints(), intentRequestTracker);
mSponsoredBackgroundWebView
.getView()
.setLayoutParams(
new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
mSponsoredBackgroundWebView.attachWebContents(mSponsoredBackgroundWebContents,
webContentView,
null);
}

public void loadSponsoredRichMedia(SponsoredRichMedia sponsoredRichMedia) {
Uri.Builder builder = Uri.parse("chrome://new-tab-takeover").buildUpon();
builder.appendQueryParameter("wallpaperUrl", sponsoredRichMedia.getWallpaperUrl());
builder.appendQueryParameter("creativeInstanceId", sponsoredRichMedia.getCreativeInstanceId());
builder.appendQueryParameter("placementId", sponsoredRichMedia.getPlacementId());
builder.appendQueryParameter("targetUrl", sponsoredRichMedia.getTargetUrl());

mSponsoredBackgroundWebContents.getNavigationController().loadUrl(
new LoadUrlParams(builder.build().toString()));
}

public View getView() {
return mSponsoredBackgroundWebView.getView();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import org.chromium.chrome.browser.ntp_background_images.model.ImageCredit;
import org.chromium.chrome.browser.ntp_background_images.model.NTPImage;
import org.chromium.chrome.browser.ntp_background_images.model.TopSite;
import org.chromium.chrome.browser.ntp_background_images.model.SponsoredRichMedia;
import org.chromium.chrome.browser.ntp_background_images.model.Wallpaper;
import org.chromium.chrome.browser.ntp_background_images.util.NewTabPageListener;
import org.chromium.chrome.browser.profiles.Profile;
Expand Down Expand Up @@ -155,6 +156,11 @@ public static Wallpaper createBrandedWallpaper(String imagePath, int focalPointX
wallpaperId);
}

@CalledByNative
public static SponsoredRichMedia createSponsoredRichMedia(String wallpaperUrl, String creativeInstanceId, String placementId, String targetUrl) {
return new SponsoredRichMedia(wallpaperUrl, creativeInstanceId, placementId, targetUrl);
}

@CalledByNative
public void onUpdated() {
for (NTPBackgroundImageServiceObserver observer : mObservers) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
/* Copyright (c) 2025 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 https://mozilla.org/MPL/2.0/. */

package org.chromium.chrome.browser.ntp_background_images.model;

public class SponsoredRichMedia extends NTPImage {
private String mWallpaperUrl;
private String mCreativeInstanceId;
private String mPlacementId;
private String mTargetUrl;

public SponsoredRichMedia(String wallpaperUrl, String creativeInstanceId, String placementId, String targetUrl) {
mWallpaperUrl = wallpaperUrl;
mCreativeInstanceId = creativeInstanceId;
mPlacementId = placementId;
mTargetUrl = targetUrl;
}

public String getWallpaperUrl() {
return mWallpaperUrl;
}

public void setWallpaperUrl(String wallpaperUrl) {
mWallpaperUrl = wallpaperUrl;
}

public String getCreativeInstanceId() {
return mCreativeInstanceId;
}

public void setCreativeInstanceId(String creativeInstanceId) {
mCreativeInstanceId = creativeInstanceId;
}

public String getPlacementId() {
return mPlacementId;
}

public void setPlacementId(String placementId) {
mPlacementId = placementId;
}

public String getTargetUrl() {
return mTargetUrl;
}

public void setTargetUrl(String targetUrl) {
mTargetUrl = targetUrl;
}
}
3 changes: 3 additions & 0 deletions android/java/org/chromium/chrome/browser/util/TabUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@
import org.chromium.content_public.browser.LoadUrlParams;
import org.chromium.ui.util.ColorUtils;

import org.jni_zero.CalledByNative;

import java.lang.reflect.Field;

public class TabUtils {
Expand Down Expand Up @@ -236,6 +238,7 @@ public static void openUrlInNewTabInBackground(boolean isIncognito, String url)
}
}

@CalledByNative
public static void openUrlInSameTab(String url) {
try {
BraveActivity braveActivity = BraveActivity.getBraveActivity();
Expand Down
6 changes: 6 additions & 0 deletions android/java/res/layout/new_tab_page_layout.xml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,12 @@
android:layout_height="match_parent"
android:contentDescription="@null"/>

<FrameLayout
android:id="@+id/bg_background_view"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>

<FrameLayout
android:id="@+id/logo_holder"
android:layout_width="match_parent"
Expand Down
6 changes: 5 additions & 1 deletion browser/brave_content_browser_client.cc
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,7 @@ using extensions::ChromeContentBrowserClientExtensionsPart;

#if BUILDFLAG(IS_ANDROID)
#include "brave/browser/ui/webui/brave_wallet/android/android_wallet_page_ui.h"
#include "brave/browser/ui/webui/new_tab_takeover/android/new_tab_takeover_ui.h"
#endif // BUILDFLAG(IS_ANDROID)

#if !BUILDFLAG(IS_ANDROID)
Expand Down Expand Up @@ -681,7 +682,10 @@ void BraveContentBrowserClient::RegisterWebUIInterfaceBrokers(
.Add<brave_news::mojom::BraveNewsController>()
.Add<brave_news::mojom::BraveNewsInternals>();
}
#endif
#else
registry.ForWebUI<NewTabTakeoverUI>()
.Add<new_tab_takeover::mojom::NewTabTakeover>();
#endif // !BUILDFLAG(IS_ANDROID)
}

std::optional<base::UnguessableToken>
Expand Down
Loading

0 comments on commit 4c02a83

Please sign in to comment.