diff --git a/android/brave_java_resources.gni b/android/brave_java_resources.gni index c07cae3566c..8dac0796f89 100644 --- a/android/brave_java_resources.gni +++ b/android/brave_java_resources.gni @@ -1019,7 +1019,9 @@ brave_java_resources = [ "java/res/xml/background_images_preferences.xml", "java/res/xml/brave_download_preferences.xml", "java/res/xml/brave_ethereum_preferences.xml", + "java/res/xml/brave_leo_default_model_preferences.xml", "java/res/xml/brave_leo_preferences.xml", + "java/res/xml/brave_leo_radio_button_group_default_model_preference.xml", "java/res/xml/brave_license_preferences.xml", "java/res/xml/brave_main_preferences.xml", "java/res/xml/brave_playlist_preferences.xml", diff --git a/android/brave_java_sources.gni b/android/brave_java_sources.gni index d9027488848..c004eeef95a 100644 --- a/android/brave_java_sources.gni +++ b/android/brave_java_sources.gni @@ -78,7 +78,7 @@ brave_java_sources = [ "../../brave/android/java/org/chromium/chrome/browser/bookmarks/BraveBookmarkUiPrefs.java", "../../brave/android/java/org/chromium/chrome/browser/bookmarks/BraveBookmarkUtils.java", "../../brave/android/java/org/chromium/chrome/browser/brave_leo/BraveLeoActivity.java", - "../../brave/android/java/org/chromium/chrome/browser/brave_leo/BraveLeoCMHelper.java", + "../../brave/android/java/org/chromium/chrome/browser/brave_leo/BraveLeoMojomHelper.java", "../../brave/android/java/org/chromium/chrome/browser/brave_leo/BraveLeoPlansActivity.java", "../../brave/android/java/org/chromium/chrome/browser/brave_leo/BraveLeoPrefUtils.java", "../../brave/android/java/org/chromium/chrome/browser/brave_leo/BraveLeoSettingsLauncherHelper.java", @@ -350,8 +350,9 @@ brave_java_sources = [ "../../brave/android/java/org/chromium/chrome/browser/settings/AppearancePreferences.java", "../../brave/android/java/org/chromium/chrome/browser/settings/BackgroundImagesPreferences.java", "../../brave/android/java/org/chromium/chrome/browser/settings/BraveDialogPreference.java", - "../../brave/android/java/org/chromium/chrome/browser/settings/BraveLeoDescriptionPreference.java", + "../../brave/android/java/org/chromium/chrome/browser/settings/BraveLeoDefaultModelPreferences.java", "../../brave/android/java/org/chromium/chrome/browser/settings/BraveLeoPreferences.java", + "../../brave/android/java/org/chromium/chrome/browser/settings/BraveLeoRadioButtonGroupDefaultModelPreference.java", "../../brave/android/java/org/chromium/chrome/browser/settings/BraveLeoResetPreference.java", "../../brave/android/java/org/chromium/chrome/browser/settings/BraveLicensePreference.java", "../../brave/android/java/org/chromium/chrome/browser/settings/BraveLicensePreferences.java", diff --git a/android/java/org/chromium/chrome/browser/billing/InAppPurchaseWrapper.java b/android/java/org/chromium/chrome/browser/billing/InAppPurchaseWrapper.java index db5f508dd83..a2fe54831c9 100644 --- a/android/java/org/chromium/chrome/browser/billing/InAppPurchaseWrapper.java +++ b/android/java/org/chromium/chrome/browser/billing/InAppPurchaseWrapper.java @@ -41,6 +41,8 @@ import java.util.Locale; import java.util.Map; public class InAppPurchaseWrapper { + public static final String MANAGE_SUBSCRIPTION_PAGE = + "https://play.google.com/store/account/subscriptions"; private static final String TAG = "InAppPurchaseWrapper"; private static final String LEO_MONTHLY_SUBSCRIPTION = "brave.leo.monthly"; diff --git a/android/java/org/chromium/chrome/browser/brave_leo/BraveLeoCMHelper.java b/android/java/org/chromium/chrome/browser/brave_leo/BraveLeoCMHelper.java deleted file mode 100644 index 470dd60e841..00000000000 --- a/android/java/org/chromium/chrome/browser/brave_leo/BraveLeoCMHelper.java +++ /dev/null @@ -1,85 +0,0 @@ -/* Copyright (c) 2023 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.brave_leo; - -import org.jni_zero.JNINamespace; -import org.jni_zero.NativeMethods; - -import org.chromium.ai_chat.mojom.CredentialManagerHelper; -import org.chromium.ai_chat.mojom.PremiumStatus; -import org.chromium.content_public.browser.BrowserContextHandle; -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 ai_chat_credential_manager. */ -@JNINamespace("ai_chat") -public class BraveLeoCMHelper implements ConnectionErrorHandler { - private long mNativeAIChatCMHelperAndroid; - CredentialManagerHelper mCredentialManagerHelper; - - private static final Object sLock = new Object(); - private static BraveLeoCMHelper sInstance; - - public static BraveLeoCMHelper getInstance(BrowserContextHandle browserContextHandle) { - synchronized (sLock) { - if (sInstance == null) { - sInstance = new BraveLeoCMHelper(browserContextHandle); - } - } - return sInstance; - } - - private BraveLeoCMHelper(BrowserContextHandle browserContextHandle) { - mNativeAIChatCMHelperAndroid = BraveLeoCMHelperJni.get().init(browserContextHandle); - long nativeHandle = - BraveLeoCMHelperJni.get() - .getInterfaceToCredentialManagerHelper(mNativeAIChatCMHelperAndroid); - MessagePipeHandle handle = - CoreImpl.getInstance().acquireNativeHandle(nativeHandle).toMessagePipeHandle(); - mCredentialManagerHelper = CredentialManagerHelper.MANAGER.attachProxy(handle, 0); - Handler handler = ((Interface.Proxy) mCredentialManagerHelper).getProxyHandler(); - handler.setErrorHandler(this); - } - - public void destroy() { - synchronized (sLock) { - sInstance = null; - if (mNativeAIChatCMHelperAndroid == 0 && mCredentialManagerHelper == null) { - return; - } - mCredentialManagerHelper.close(); - mCredentialManagerHelper = null; - BraveLeoCMHelperJni.get().destroy(mNativeAIChatCMHelperAndroid); - mNativeAIChatCMHelperAndroid = 0; - } - } - - public void getPremiumStatus(CredentialManagerHelper.GetPremiumStatus_Response callback) { - if (mCredentialManagerHelper == null) { - callback.call(PremiumStatus.INACTIVE, null); - return; - } - mCredentialManagerHelper.getPremiumStatus(callback); - } - - @Override - public void onConnectionError(MojoException e) { - destroy(); - } - - @NativeMethods - public interface Natives { - long init(BrowserContextHandle browserContextHandle); - - void destroy(long nativeAIChatCMHelperAndroid); - - long getInterfaceToCredentialManagerHelper(long nativeAIChatCMHelperAndroid); - } -} diff --git a/android/java/org/chromium/chrome/browser/brave_leo/BraveLeoMojomHelper.java b/android/java/org/chromium/chrome/browser/brave_leo/BraveLeoMojomHelper.java new file mode 100644 index 00000000000..faaea0f42a9 --- /dev/null +++ b/android/java/org/chromium/chrome/browser/brave_leo/BraveLeoMojomHelper.java @@ -0,0 +1,97 @@ +/* Copyright (c) 2023 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.brave_leo; + +import org.jni_zero.JNINamespace; +import org.jni_zero.NativeMethods; + +import org.chromium.ai_chat.mojom.AiChatAndroidHelper; +import org.chromium.ai_chat.mojom.ModelWithSubtitle; +import org.chromium.ai_chat.mojom.PremiumStatus; +import org.chromium.content_public.browser.BrowserContextHandle; +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 AIChatMojomHelperAndroid. Check ai_chat_mojom_helper_android.h, + * ai_chat_mojom_helper_android.cc for native parts + */ +@JNINamespace("ai_chat") +public class BraveLeoMojomHelper implements ConnectionErrorHandler { + private long mNativeAIChatCMHelperAndroid; + AiChatAndroidHelper mAIChatAndroidHelper; + + private static final Object sLock = new Object(); + private static BraveLeoMojomHelper sInstance; + + public static BraveLeoMojomHelper getInstance(BrowserContextHandle browserContextHandle) { + synchronized (sLock) { + if (sInstance == null) { + sInstance = new BraveLeoMojomHelper(browserContextHandle); + } + } + return sInstance; + } + + private BraveLeoMojomHelper(BrowserContextHandle browserContextHandle) { + mNativeAIChatCMHelperAndroid = BraveLeoMojomHelperJni.get().init(browserContextHandle); + long nativeHandle = + BraveLeoMojomHelperJni.get() + .getInterfaceToAndroidHelper(mNativeAIChatCMHelperAndroid); + MessagePipeHandle handle = + CoreImpl.getInstance().acquireNativeHandle(nativeHandle).toMessagePipeHandle(); + mAIChatAndroidHelper = AiChatAndroidHelper.MANAGER.attachProxy(handle, 0); + Handler handler = ((Interface.Proxy) mAIChatAndroidHelper).getProxyHandler(); + handler.setErrorHandler(this); + } + + public void destroy() { + synchronized (sLock) { + sInstance = null; + if (mNativeAIChatCMHelperAndroid == 0 && mAIChatAndroidHelper == null) { + return; + } + mAIChatAndroidHelper.close(); + mAIChatAndroidHelper = null; + BraveLeoMojomHelperJni.get().destroy(mNativeAIChatCMHelperAndroid); + mNativeAIChatCMHelperAndroid = 0; + } + } + + public void getPremiumStatus(AiChatAndroidHelper.GetPremiumStatus_Response callback) { + if (mAIChatAndroidHelper == null) { + callback.call(PremiumStatus.INACTIVE, null); + return; + } + mAIChatAndroidHelper.getPremiumStatus(callback); + } + + public void getModels(AiChatAndroidHelper.GetModelsWithSubtitles_Response callback) { + if (mAIChatAndroidHelper == null) { + callback.call(new ModelWithSubtitle[0]); + return; + } + mAIChatAndroidHelper.getModelsWithSubtitles(callback); + } + + @Override + public void onConnectionError(MojoException e) { + destroy(); + } + + @NativeMethods + public interface Natives { + long init(BrowserContextHandle browserContextHandle); + + void destroy(long nativeAIChatMojomHelperAndroid); + + long getInterfaceToAndroidHelper(long nativeAIChatMojomHelperAndroid); + } +} diff --git a/android/java/org/chromium/chrome/browser/brave_leo/BraveLeoPrefUtils.java b/android/java/org/chromium/chrome/browser/brave_leo/BraveLeoPrefUtils.java index 60a405ec53e..77b0c43d72f 100644 --- a/android/java/org/chromium/chrome/browser/brave_leo/BraveLeoPrefUtils.java +++ b/android/java/org/chromium/chrome/browser/brave_leo/BraveLeoPrefUtils.java @@ -79,4 +79,22 @@ public class BraveLeoPrefUtils { } UserPrefs.get(profileToUse).setString(BravePref.BRAVE_CHAT_PRODUCT_ID_ANDROID, productId); } + + public static String getDefaultModel() { + Profile profileToUse = BraveLeoPrefUtils.getProfile(); + if (profileToUse == null) { + Log.e(TAG, "BraveLeoPrefUtils.getDefaultModel profile is null"); + return ""; + } + return UserPrefs.get(profileToUse).getString(BravePref.DEFAULT_MODEL_KEY); + } + + public static void setDefaultModel(String modelKey) { + Profile profileToUse = BraveLeoPrefUtils.getProfile(); + if (profileToUse == null) { + Log.e(TAG, "BraveLeoPrefUtils.setDefaultModel profile is null"); + return; + } + UserPrefs.get(profileToUse).setString(BravePref.DEFAULT_MODEL_KEY, modelKey); + } } diff --git a/android/java/org/chromium/chrome/browser/brave_leo/BraveLeoUtils.java b/android/java/org/chromium/chrome/browser/brave_leo/BraveLeoUtils.java index dda94b9af00..6102f6c3e05 100644 --- a/android/java/org/chromium/chrome/browser/brave_leo/BraveLeoUtils.java +++ b/android/java/org/chromium/chrome/browser/brave_leo/BraveLeoUtils.java @@ -11,6 +11,7 @@ import androidx.lifecycle.MutableLiveData; import org.jni_zero.JNINamespace; import org.jni_zero.NativeMethods; +import org.chromium.ai_chat.mojom.ModelWithSubtitle; import org.chromium.base.Callback; import org.chromium.base.Log; import org.chromium.chrome.browser.app.BraveActivity; @@ -56,6 +57,18 @@ public class BraveLeoUtils { } } + public static String getDefaultModelName(ModelWithSubtitle[] models) { + String defaultModelKey = BraveLeoPrefUtils.getDefaultModel(); + + for (ModelWithSubtitle model : models) { + if (model.model.key.equals(defaultModelKey)) { + return model.model.displayName; + } + } + + return ""; + } + @NativeMethods public interface Natives { void openLeoQuery(WebContents webContents, String query); diff --git a/android/java/org/chromium/chrome/browser/settings/BraveLeoDefaultModelPreferences.java b/android/java/org/chromium/chrome/browser/settings/BraveLeoDefaultModelPreferences.java new file mode 100644 index 00000000000..8a5e6fd5557 --- /dev/null +++ b/android/java/org/chromium/chrome/browser/settings/BraveLeoDefaultModelPreferences.java @@ -0,0 +1,46 @@ +/* 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.settings; + +import android.os.Bundle; + +import androidx.annotation.Nullable; + +import org.chromium.chrome.R; +import org.chromium.chrome.browser.brave_leo.BraveLeoMojomHelper; +import org.chromium.chrome.browser.brave_leo.BraveLeoPrefUtils; +import org.chromium.components.browser_ui.settings.SettingsUtils; + +public class BraveLeoDefaultModelPreferences extends BravePreferenceFragment + implements BraveLeoRadioButtonGroupDefaultModelPreference.RadioButtonsDelegate { + private static final String PREF_DEFAULT_MODEL_GROUP = "default_model"; + private BraveLeoRadioButtonGroupDefaultModelPreference mRadioButtons; + + @Override + public void onCreatePreferences(@Nullable Bundle savedInstanceState, String rootKey) { + SettingsUtils.addPreferencesFromResource(this, R.xml.brave_leo_default_model_preferences); + getActivity().setTitle(R.string.leo_default_model_pref_screen); + mRadioButtons = + (BraveLeoRadioButtonGroupDefaultModelPreference) + findPreference(PREF_DEFAULT_MODEL_GROUP); + mRadioButtons.initialize(this); + } + + @Override + public void fetchModels() { + BraveLeoMojomHelper.getInstance(getProfile()) + .getModels( + (models -> { + mRadioButtons.initializeModels( + models, BraveLeoPrefUtils.getDefaultModel()); + })); + } + + @Override + public void setDefaultModel(String key) { + BraveLeoPrefUtils.setDefaultModel(key); + } +} diff --git a/android/java/org/chromium/chrome/browser/settings/BraveLeoDescriptionPreference.java b/android/java/org/chromium/chrome/browser/settings/BraveLeoDescriptionPreference.java deleted file mode 100644 index 0a3921237b7..00000000000 --- a/android/java/org/chromium/chrome/browser/settings/BraveLeoDescriptionPreference.java +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2023 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.settings; - -import android.content.Context; -import android.util.AttributeSet; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.preference.Preference; -import androidx.preference.PreferenceViewHolder; - -import org.chromium.chrome.R; -import org.chromium.components.browser_ui.settings.ChromeBasePreference; - -/** - * The preference used to reset Brave Leo. - */ -public class BraveLeoDescriptionPreference - extends ChromeBasePreference implements Preference.OnPreferenceClickListener { - /** - * Constructor for BraveLeoDescriptionPreference. - */ - public BraveLeoDescriptionPreference(Context context, AttributeSet attrs) { - super(context, attrs); - } - - @Override - public boolean onPreferenceClick(@NonNull Preference preference) { - return true; - } - - @Override - public void onBindViewHolder(@NonNull PreferenceViewHolder holder) { - super.onBindViewHolder(holder); - TextView titleView = (TextView) holder.findViewById(android.R.id.summary); - assert titleView != null; - titleView.setTextAppearance(R.style.BraveLeoDescriptionText); - } -} diff --git a/android/java/org/chromium/chrome/browser/settings/BraveLeoPreferences.java b/android/java/org/chromium/chrome/browser/settings/BraveLeoPreferences.java index 8b4da8d4b5a..959aa08690f 100644 --- a/android/java/org/chromium/chrome/browser/settings/BraveLeoPreferences.java +++ b/android/java/org/chromium/chrome/browser/settings/BraveLeoPreferences.java @@ -5,17 +5,21 @@ package org.chromium.chrome.browser.settings; +import android.content.Intent; +import android.net.Uri; import android.os.Bundle; import androidx.annotation.NonNull; import androidx.preference.Preference; +import androidx.preference.PreferenceCategory; import org.chromium.ai_chat.mojom.PremiumStatus; import org.chromium.base.BravePreferenceKeys; import org.chromium.base.Log; import org.chromium.chrome.R; import org.chromium.chrome.browser.app.BraveActivity; -import org.chromium.chrome.browser.brave_leo.BraveLeoCMHelper; +import org.chromium.chrome.browser.billing.InAppPurchaseWrapper; +import org.chromium.chrome.browser.brave_leo.BraveLeoMojomHelper; import org.chromium.chrome.browser.brave_leo.BraveLeoPrefUtils; import org.chromium.chrome.browser.brave_leo.BraveLeoUtils; import org.chromium.chrome.browser.preferences.ChromeSharedPreferences; @@ -28,14 +32,21 @@ public class BraveLeoPreferences extends BravePreferenceFragment implements Preference.OnPreferenceChangeListener { private static final String TAG = "BraveLeoPreferences"; private static final String PREF_LINK_SUBSCRIPTION = "link_subscription"; + private static final String PREF_MANAGE_SUBSCRIPTION = "subscription_manage"; private static final String PREF_AUTOCOMPLETE = "autocomplete_switch"; + private static final String PREF_SUBSCRIPTION_CATEGORY = "subscription_category"; + private static final String PREF_DEFAULT_MODEL = "default_model"; private static final String LINK_SUBSCRIPTION_URL = "https://account.brave.com?intent=connect-receipt&product=leo"; + private PreferenceCategory mSubscriptionCategory; + @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { requireActivity().setTitle(R.string.menu_brave_leo); SettingsUtils.addPreferencesFromResource(this, R.xml.brave_leo_preferences); + mSubscriptionCategory = findPreference(PREF_SUBSCRIPTION_CATEGORY); + assert mSubscriptionCategory != null; BraveLeoUtils.verifySubscription( (subscriptionActive) -> { @@ -46,7 +57,7 @@ public class BraveLeoPreferences extends BravePreferenceFragment @Override public void onDestroyView() { super.onDestroyView(); - BraveLeoCMHelper.getInstance(getProfile()).destroy(); + BraveLeoMojomHelper.getInstance(getProfile()).destroy(); } @Override @@ -65,22 +76,39 @@ public class BraveLeoPreferences extends BravePreferenceFragment } } + private void setModel() { + BraveLeoMojomHelper.getInstance(getProfile()) + .getModels( + (models -> { + Preference pref = findPreference(PREF_DEFAULT_MODEL); + if (pref == null) { + Log.e(TAG, "Default model pref is null"); + return; + } + pref.setSummary(BraveLeoUtils.getDefaultModelName(models)); + })); + } + private void checkLinkPurchase() { - BraveLeoCMHelper.getInstance(getProfile()) + BraveLeoMojomHelper.getInstance(getProfile()) .getPremiumStatus( (status, info) -> { if (status == PremiumStatus.ACTIVE || !BraveLeoPrefUtils.getIsSubscriptionActive(getProfile())) { return; } - ChromeBasePreference link_subscription = + ChromeBasePreference linkSubscription = findPreference(PREF_LINK_SUBSCRIPTION); - if (link_subscription == null) { + ChromeBasePreference manageSubscription = + findPreference(PREF_MANAGE_SUBSCRIPTION); + if (linkSubscription == null + || manageSubscription == null + || mSubscriptionCategory == null) { Log.e(TAG, "Subscription pref is null"); return; } - link_subscription.setVisible(true); - link_subscription.setOnPreferenceClickListener( + mSubscriptionCategory.setVisible(true); + linkSubscription.setOnPreferenceClickListener( preference -> { try { BraveActivity.getBraveActivity() @@ -93,6 +121,17 @@ public class BraveLeoPreferences extends BravePreferenceFragment } return true; }); + manageSubscription.setOnPreferenceClickListener( + preference -> { + Intent browserIntent = + new Intent( + Intent.ACTION_VIEW, + Uri.parse( + InAppPurchaseWrapper + .MANAGE_SUBSCRIPTION_PAGE)); + getActivity().startActivity(browserIntent); + return true; + }); }); } @@ -106,4 +145,10 @@ public class BraveLeoPreferences extends BravePreferenceFragment return true; } + + @Override + public void onResume() { + super.onResume(); + setModel(); + } } diff --git a/android/java/org/chromium/chrome/browser/settings/BraveLeoRadioButtonGroupDefaultModelPreference.java b/android/java/org/chromium/chrome/browser/settings/BraveLeoRadioButtonGroupDefaultModelPreference.java new file mode 100644 index 00000000000..6740df49015 --- /dev/null +++ b/android/java/org/chromium/chrome/browser/settings/BraveLeoRadioButtonGroupDefaultModelPreference.java @@ -0,0 +1,92 @@ +/* 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.settings; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.RadioGroup; + +import androidx.preference.Preference; +import androidx.preference.PreferenceViewHolder; + +import org.chromium.ai_chat.mojom.ModelWithSubtitle; +import org.chromium.chrome.R; +import org.chromium.components.browser_ui.widget.RadioButtonWithDescription; +import org.chromium.components.browser_ui.widget.RadioButtonWithDescriptionLayout; + +import java.util.ArrayList; +import java.util.List; + +public class BraveLeoRadioButtonGroupDefaultModelPreference extends Preference + implements RadioGroup.OnCheckedChangeListener { + /** This is a delegate that is implemented in BraveLeoDefaultModelPreferences */ + public interface RadioButtonsDelegate { + default void fetchModels() {} + + default void setDefaultModel(String key) {} + } + + private RadioButtonWithDescriptionLayout mGroup; + private ModelWithSubtitle[] mModels; + private String mDefaultModelKey; + private Context mContext; + RadioButtonsDelegate mDelegate; + + public BraveLeoRadioButtonGroupDefaultModelPreference(Context context, AttributeSet attrs) { + super(context, attrs); + mContext = context; + setLayoutResource(R.xml.brave_leo_radio_button_group_default_model_preference); + } + + @Override + public void onBindViewHolder(PreferenceViewHolder holder) { + super.onBindViewHolder(holder); + mGroup = (RadioButtonWithDescriptionLayout) holder.findViewById(R.id.radio_button_layout); + assert mGroup != null; + mGroup.setOnCheckedChangeListener(this); + assert mDelegate != null; + mDelegate.fetchModels(); + } + + public void initialize(RadioButtonsDelegate delegate) { + mDelegate = delegate; + } + + public void initializeModels(ModelWithSubtitle[] models, String defaultModel) { + mModels = models; + mDefaultModelKey = defaultModel; + if (mModels != null) { + List buttons = new ArrayList(); + for (int i = 0; i < mModels.length; i++) { + buttons.add( + createRadioButtonWithDescription( + mModels[i].model.displayName, + mModels[i].subtitle, + mModels[i].model.key, + mModels[i].model.key.equals(mDefaultModelKey), + i)); + } + mGroup.addButtons(buttons); + } + } + + private RadioButtonWithDescription createRadioButtonWithDescription( + String primary, String description, Object tag, boolean checked, int id) { + RadioButtonWithDescription b = new RadioButtonWithDescription(mContext, null); + b.setPrimaryText(primary); + b.setDescriptionText(description); + b.setTag(tag); + b.setId(id); + b.setChecked(checked); + return b; + } + + @Override + public void onCheckedChanged(RadioGroup radioGroup, int i) { + mDefaultModelKey = mModels[i].model.key; + mDelegate.setDefaultModel(mModels[i].model.key); + } +} diff --git a/android/java/org/chromium/chrome/browser/vpn/settings/BraveVpnPreferences.java b/android/java/org/chromium/chrome/browser/vpn/settings/BraveVpnPreferences.java index 4240c6f516a..135179e10a2 100644 --- a/android/java/org/chromium/chrome/browser/vpn/settings/BraveVpnPreferences.java +++ b/android/java/org/chromium/chrome/browser/vpn/settings/BraveVpnPreferences.java @@ -77,8 +77,6 @@ public class BraveVpnPreferences extends BravePreferenceFragment implements Brav private static final String VPN_SUPPORT_PAGE = "https://support.brave.com/hc/en-us/articles/4410838268429"; - private static final String MANAGE_SUBSCRIPTION_PAGE = - "https://play.google.com/store/account/subscriptions"; private static final String DATE_FORMAT = "dd/MM/yyyy"; @@ -155,15 +153,20 @@ public class BraveVpnPreferences extends BravePreferenceFragment implements Brav }); findPreference(PREF_SUBSCRIPTION_MANAGE) - .setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - Intent browserIntent = - new Intent(Intent.ACTION_VIEW, Uri.parse(MANAGE_SUBSCRIPTION_PAGE)); - getActivity().startActivity(browserIntent); - return true; - } - }); + .setOnPreferenceClickListener( + new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + Intent browserIntent = + new Intent( + Intent.ACTION_VIEW, + Uri.parse( + InAppPurchaseWrapper + .MANAGE_SUBSCRIPTION_PAGE)); + getActivity().startActivity(browserIntent); + return true; + } + }); findPreference(PREF_SERVER_RESET_CONFIGURATION) .setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { diff --git a/android/java/res/values/brave_styles.xml b/android/java/res/values/brave_styles.xml index 1562114ae60..066f3367c4a 100644 --- a/android/java/res/values/brave_styles.xml +++ b/android/java/res/values/brave_styles.xml @@ -309,10 +309,6 @@ - -