diff --git a/android/brave_java_sources.gni b/android/brave_java_sources.gni index b4faced46ee..8c09fa05b8e 100644 --- a/android/brave_java_sources.gni +++ b/android/brave_java_sources.gni @@ -206,6 +206,7 @@ brave_java_sources = [ "../../brave/android/java/org/chromium/chrome/browser/custom_layout/popup_window_tooltip/PopupWindowTooltip.java", "../../brave/android/java/org/chromium/chrome/browser/custom_layout/popup_window_tooltip/PopupWindowTooltipUtils.java", "../../brave/android/java/org/chromium/chrome/browser/customtabs/features/partialcustomtab/BravePartialCustomTabBottomSheetStrategy.java", + "../../brave/android/java/org/chromium/chrome/browser/day_zero/DayZeroMojomHelper.java", "../../brave/android/java/org/chromium/chrome/browser/decentralized_dns/settings/ENSSettingsFragment.java", "../../brave/android/java/org/chromium/chrome/browser/decentralized_dns/settings/RadioButtonGroupDDnsResolveMethodPreference.java", "../../brave/android/java/org/chromium/chrome/browser/decentralized_dns/settings/RadioButtonGroupEnsOffchainResolveMethodPreference.java", diff --git a/android/java/org/chromium/chrome/browser/day_zero/DayZeroMojomHelper.java b/android/java/org/chromium/chrome/browser/day_zero/DayZeroMojomHelper.java new file mode 100644 index 00000000000..c1c09d629f6 --- /dev/null +++ b/android/java/org/chromium/chrome/browser/day_zero/DayZeroMojomHelper.java @@ -0,0 +1,80 @@ +/* Copyright (c) 2024 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.day_zero; + +import org.jni_zero.JNINamespace; +import org.jni_zero.NativeMethods; + +import org.chromium.content_public.browser.BrowserContextHandle; +import org.chromium.day_zero.mojom.DayZeroBrowserUiExpt; +import org.chromium.mojo.bindings.ConnectionErrorHandler; +import org.chromium.mojo.bindings.Interface; +import org.chromium.mojo.bindings.Interface.Proxy.Handler; +import org.chromium.mojo.system.MessagePipeHandle; +import org.chromium.mojo.system.MojoException; +import org.chromium.mojo.system.impl.CoreImpl; + +/** Helper to interact with native DayZeroBrowserUiExpt. */ +@JNINamespace("day_zero") +public class DayZeroMojomHelper implements ConnectionErrorHandler { + private long mNativeDayZeroBrowserUiExpt; + DayZeroBrowserUiExpt mDayZeroBroserUiExptHelper; + + private static final Object sLock = new Object(); + private static DayZeroMojomHelper sInstance; + + public static DayZeroMojomHelper getInstance(BrowserContextHandle browserContextHandle) { + synchronized (sLock) { + if (sInstance == null) { + sInstance = new DayZeroMojomHelper(browserContextHandle); + } + } + return sInstance; + } + + private DayZeroMojomHelper(BrowserContextHandle browserContextHandle) { + mNativeDayZeroBrowserUiExpt = DayZeroMojomHelperJni.get().init(browserContextHandle); + long nativeHandle = + DayZeroMojomHelperJni.get() + .getInterfaceToAndroidHelper(mNativeDayZeroBrowserUiExpt); + MessagePipeHandle handle = + CoreImpl.getInstance().acquireNativeHandle(nativeHandle).toMessagePipeHandle(); + mDayZeroBroserUiExptHelper = DayZeroBrowserUiExpt.MANAGER.attachProxy(handle, 0); + Handler handler = ((Interface.Proxy) mDayZeroBroserUiExptHelper).getProxyHandler(); + handler.setErrorHandler(this); + } + + private void destroy() { + synchronized (sLock) { + sInstance = null; + if (mNativeDayZeroBrowserUiExpt == 0 && mDayZeroBroserUiExptHelper == null) { + return; + } + mDayZeroBroserUiExptHelper.close(); + mDayZeroBroserUiExptHelper = null; + DayZeroMojomHelperJni.get().destroy(mNativeDayZeroBrowserUiExpt); + mNativeDayZeroBrowserUiExpt = 0; + } + } + + public void isDayZeroExpt(DayZeroBrowserUiExpt.IsDayZeroExpt_Response callback) { + mDayZeroBroserUiExptHelper.isDayZeroExpt(callback); + } + + @Override + public void onConnectionError(MojoException e) { + destroy(); + } + + @NativeMethods + public interface Natives { + long init(BrowserContextHandle browserContextHandle); + + void destroy(long nativeDayZeroBrowserUiExpt); + + long getInterfaceToAndroidHelper(long nativeDayZeroBrowserUiExpt); + } +} diff --git a/browser/day_zero_browser_ui_expt/android/day_zero_browser_ui_expt.cc b/browser/day_zero_browser_ui_expt/android/day_zero_browser_ui_expt.cc new file mode 100644 index 00000000000..70e60d3e4ab --- /dev/null +++ b/browser/day_zero_browser_ui_expt/android/day_zero_browser_ui_expt.cc @@ -0,0 +1,64 @@ +/* Copyright (c) 2024 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/. */ + +#include "brave/browser/day_zero_browser_ui_expt/android/day_zero_browser_ui_expt.h" + +#include +#include + +#include "base/strings/strcat.h" +#include "brave/build/android/jni_headers/DayZeroMojomHelper_jni.h" +#include "chrome/browser/browser_process.h" +#include "chrome/browser/profiles/profile.h" +#include "content/public/browser/android/browser_context_handle.h" +#include "content/public/browser/browser_context.h" +#include "mojo/public/cpp/bindings/pending_remote.h" + +namespace day_zero { + +DayZeroBrowserUiExpt::DayZeroBrowserUiExpt(content::BrowserContext* context) { + // auto skus_service_getter = base::BindRepeating( + // [](content::BrowserContext* context) { + // return skus::SkusServiceFactory::GetForContext(context); + // }, + // context); + // pref_service_ = Profile::FromBrowserContext(context)->GetPrefs(); + // credential_manager_ = std::make_unique( + // skus_service_getter, g_browser_process->local_state()); +} + +DayZeroBrowserUiExpt::~DayZeroBrowserUiExpt() = default; + +void DayZeroBrowserUiExpt::BindInterface( + mojo::PendingReceiver pending_receiver) { + receivers_.Add(this, std::move(pending_receiver)); +} + +static jlong JNI_DayZeroMojomHelper_Init( + JNIEnv* env, + const base::android::JavaParamRef& jbrowser_context_handle) { + content::BrowserContext* browser_context = + content::BrowserContextFromJavaHandle(jbrowser_context_handle); + DayZeroBrowserUiExpt* settings_helper = + new DayZeroBrowserUiExpt(browser_context); + return reinterpret_cast(settings_helper); +} + +void DayZeroBrowserUiExpt::Destroy(JNIEnv* env) { + delete this; +} + +jlong DayZeroBrowserUiExpt::GetInterfaceToAndroidHelper(JNIEnv* env) { + mojo::PendingRemote remote; + receivers_.Add(this, remote.InitWithNewPipeAndPassReceiver()); + + return static_cast(remote.PassPipe().release().value()); +} + +void DayZeroBrowserUiExpt::IsDayZeroExpt(IsDayZeroExptCallback callback) { + std::move(callback).Run(true); +} + +} // namespace day_zero diff --git a/browser/day_zero_browser_ui_expt/android/day_zero_browser_ui_expt.h b/browser/day_zero_browser_ui_expt/android/day_zero_browser_ui_expt.h new file mode 100644 index 00000000000..430d1b6ebfc --- /dev/null +++ b/browser/day_zero_browser_ui_expt/android/day_zero_browser_ui_expt.h @@ -0,0 +1,45 @@ +/* Copyright (c) 2024 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/. */ + +#ifndef BRAVE_BROWSER_DAY_ZERO_BROWSER_UI_EXPT_DAY_ZERO_BROWSER_UI_EXPT_H_ +#define BRAVE_BROWSER_DAY_ZERO_BROWSER_UI_EXPT_DAY_ZERO_BROWSER_UI_EXPT_H_ + +#include +#include + +#include "base/android/jni_android.h" +#include "base/android/scoped_java_ref.h" +#include "base/memory/raw_ptr.h" +#include "brave/components/day_zero_browser_ui_expt/common/mojom/day_zero.mojom.h" +#include "mojo/public/cpp/bindings/receiver_set.h" + +namespace content { +class BrowserContext; +} // namespace content + +namespace day_zero { + +class DayZeroBrowserUiExpt : public mojom::DayZeroBrowserUiExpt { + public: + explicit DayZeroBrowserUiExpt(content::BrowserContext* context); + ~DayZeroBrowserUiExpt() override; + + // mojom::DayZeroBrowserUiExpt: + void IsDayZeroExpt(IsDayZeroExptCallback callback) override; + + void BindInterface( + mojo::PendingReceiver pending_receiver); + + void Destroy(JNIEnv* env); + jlong GetInterfaceToAndroidHelper(JNIEnv* env); + + private: + mojo::ReceiverSet receivers_; + base::WeakPtrFactory weak_ptr_factory_{this}; +}; + +} // namespace day_zero + +#endif // BRAVE_BROWSER_DAY_ZERO_BROWSER_UI_EXPT_DAY_ZERO_BROWSER_UI_EXPT_H_ diff --git a/browser/day_zero_browser_ui_expt/android/sources.gni b/browser/day_zero_browser_ui_expt/android/sources.gni new file mode 100644 index 00000000000..3878a1cca15 --- /dev/null +++ b/browser/day_zero_browser_ui_expt/android/sources.gni @@ -0,0 +1,12 @@ +# Copyright (c) 2024 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/. + +brave_browser_day_zero_browser_ui_expt_sources = [ + "//brave/browser/day_zero_browser_ui_expt/android/day_zero_browser_ui_expt.cc", + "//brave/browser/day_zero_browser_ui_expt/android/day_zero_browser_ui_expt.h", +] + +brave_browser_day_zero_browser_ui_expt_deps = + [ "//brave/components/day_zero_browser_ui_expt/common/mojom" ] diff --git a/browser/sources.gni b/browser/sources.gni index ac47be697c2..52e9d4abbca 100644 --- a/browser/sources.gni +++ b/browser/sources.gni @@ -17,6 +17,7 @@ import("//brave/browser/brave_vpn/sources.gni") import("//brave/browser/brave_wallet/android/sources.gni") import("//brave/browser/brave_wallet/notifications/sources.gni") import("//brave/browser/browsing_data/sources.gni") +import("//brave/browser/day_zero_browser_ui_expt/android/sources.gni") import("//brave/browser/debounce/sources.gni") import("//brave/browser/download/sources.gni") import("//brave/browser/ephemeral_storage/sources.gni") @@ -349,7 +350,9 @@ if (is_android) { brave_chrome_browser_sources += brave_browser_brave_wallet_android_sources brave_chrome_browser_sources += brave_browser_misc_metrics_android_sources + brave_chrome_browser_sources += brave_browser_day_zero_browser_ui_expt_sources brave_chrome_browser_deps += brave_browser_brave_wallet_android_deps + brave_chrome_browser_deps += brave_browser_day_zero_browser_ui_expt_deps brave_chrome_browser_deps += [ "//brave/browser/android:android_browser_process", diff --git a/build/android/BUILD.gn b/build/android/BUILD.gn index 178c1c12df9..7a9d95e7f5a 100644 --- a/build/android/BUILD.gn +++ b/build/android/BUILD.gn @@ -225,6 +225,7 @@ generate_jni("jni_headers") { "//brave/android/java/org/chromium/chrome/browser/crypto_wallet/permission/BraveDappPermissionPromptDialog.java", "//brave/android/java/org/chromium/chrome/browser/crypto_wallet/util/WalletDataFilesInstallerUtil.java", "//brave/android/java/org/chromium/chrome/browser/crypto_wallet/util/WalletNativeUtils.java", + "//brave/android/java/org/chromium/chrome/browser/day_zero/DayZeroMojomHelper.java", "//brave/android/java/org/chromium/chrome/browser/informers/BraveSyncAccountDeletedInformer.java", "//brave/android/java/org/chromium/chrome/browser/misc_metrics/MiscAndroidMetricsFactory.java", "//brave/android/java/org/chromium/chrome/browser/notifications/BraveNotificationPlatformBridge.java", diff --git a/build/android/config.gni b/build/android/config.gni index 4c1de2d025d..14ce4379ea2 100644 --- a/build/android/config.gni +++ b/build/android/config.gni @@ -36,6 +36,7 @@ brave_chrome_java_deps = [ "//brave/components/brave_shields/core/common:mojom_java", "//brave/components/brave_wallet/common:mojom_java", "//brave/components/browser_ui/site_settings/android:java", + "//brave/components/day_zero_browser_ui_expt/common/mojom:mojom_java", "//brave/components/misc_metrics/common:mojom_java", "//brave/components/playlist/common/mojom:mojom_java", "//brave/components/safe_browsing/android:brave_safe_browsing_java", @@ -111,6 +112,7 @@ brave_jni_headers_sources = [ "//brave/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/dapps/ConnectAccountFragment.java", "//brave/android/java/org/chromium/chrome/browser/crypto_wallet/permission/BraveDappPermissionPromptDialog.java", "//brave/android/java/org/chromium/chrome/browser/crypto_wallet/util/WalletNativeUtils.java", + "//brave/android/java/org/chromium/chrome/browser/day_zero/DayZeroMojomHelper.java", "//brave/android/java/org/chromium/chrome/browser/informers/BraveSyncAccountDeletedInformer.java", "//brave/android/java/org/chromium/chrome/browser/misc_metrics/MiscAndroidMetricsFactory.java", "//brave/android/java/org/chromium/chrome/browser/notifications/BraveNotificationPlatformBridge.java",