From 4532a325c3bb06fe4dc62cbb4605397ec1e6ac8b Mon Sep 17 00:00:00 2001 From: Emerick Rogul Date: Tue, 28 Sep 2021 14:30:30 -0400 Subject: [PATCH] Add Rewards settings to brave://settings --- app/brave_generated_resources.grd | 67 +++++++ browser/extensions/api/brave_rewards_api.cc | 8 + browser/extensions/api/brave_rewards_api.h | 10 + .../api/settings_private/brave_prefs_util.cc | 29 +++ browser/resources/settings/BUILD.gn | 5 + browser/resources/settings/brave_icons.html | 6 + .../settings/brave_overrides/basic_page.js | 18 +- .../settings/brave_overrides/settings_menu.js | 10 +- .../settings/brave_rewards_page/BUILD.gn | 26 +++ .../brave_rewards_browser_proxy.html | 1 + .../brave_rewards_browser_proxy.js | 36 ++++ .../brave_rewards_page.html | 134 ++++++++++++++ .../brave_rewards_page/brave_rewards_page.js | 172 ++++++++++++++++++ browser/resources/settings/brave_routes.js | 3 +- browser/resources/settings/settings.gni | 1 + browser/ui/webui/brave_rewards_page_ui.cc | 75 ++++++++ .../settings_localized_strings_provider.cc | 73 ++++++++ common/extensions/api/_api_features.json | 11 +- common/extensions/api/brave_rewards.json | 17 ++ .../android_page/actions/rewards_actions.ts | 4 + .../android_page/brave_rewards_page.tsx | 7 +- .../android_page/constants/rewards_types.ts | 3 +- .../android_page/reducers/rewards_reducer.ts | 7 + .../resources/page/actions/rewards_actions.ts | 4 + .../resources/page/brave_rewards_page.tsx | 7 +- .../resources/page/constants/rewards_types.ts | 3 +- .../page/reducers/rewards_reducer.ts | 7 + 27 files changed, 728 insertions(+), 16 deletions(-) create mode 100644 browser/resources/settings/brave_rewards_page/BUILD.gn create mode 100644 browser/resources/settings/brave_rewards_page/brave_rewards_browser_proxy.html create mode 100644 browser/resources/settings/brave_rewards_page/brave_rewards_browser_proxy.js create mode 100644 browser/resources/settings/brave_rewards_page/brave_rewards_page.html create mode 100644 browser/resources/settings/brave_rewards_page/brave_rewards_page.js diff --git a/app/brave_generated_resources.grd b/app/brave_generated_resources.grd index 72e45af9e8c9..f4ba6e898527 100644 --- a/app/brave_generated_resources.grd +++ b/app/brave_generated_resources.grd @@ -337,6 +337,73 @@ By installing this extension, you are agreeing to the Google Widevine Terms of U Automatically indexes websites that follow the OpenSearch spec. + + + Brave Rewards + + + Brave Rewards are disabled + + + Click here to learn more + + + Auto-detected + + + Default + + + Disabled + + + Brave Private Ads + + + Earn tokens by viewing Brave Ads. Ads presented are based on your interests, as inferred from your browsing behavior. No personal data or browsing history ever leaves your browser. + + + Maximum number of ads to display + + + State-level ad targeting + + + This allows Brave to show you ads meant specifically for your state. <a target="_blank" href="$1">Learn more</a> + + + Auto-Contribute + + + Monthly auto-contribution limit + + + Minimum page time before logging a visit + + + Minimum visits for publisher relevancy + + + Show non-verified sites in list + + + Allow contributions to videos + + + By turning on Auto-Contribute, you agree to the <a target="_blank" href="$1">Terms of Service</a> and <a target="_blank" href="$2">Privacy Policy</a>. + + + Tip buttons + + + Reddit + + + Twitter + + + Github + New Tab Page diff --git a/browser/extensions/api/brave_rewards_api.cc b/browser/extensions/api/brave_rewards_api.cc index 18f6c0d2b242..a5c5a95b2c1d 100644 --- a/browser/extensions/api/brave_rewards_api.cc +++ b/browser/extensions/api/brave_rewards_api.cc @@ -23,6 +23,7 @@ #include "brave/components/brave_ads/browser/ads_service.h" #include "brave/components/brave_rewards/browser/rewards_service.h" #include "brave/components/brave_rewards/common/pref_names.h" +#include "brave/components/l10n/browser/locale_helper.h" #include "chrome/browser/extensions/api/tabs/tabs_constants.h" #include "chrome/browser/extensions/chrome_extension_function_details.h" #include "chrome/browser/extensions/extension_service.h" @@ -45,6 +46,13 @@ using brave_rewards::RewardsServiceFactory; namespace extensions { namespace api { +BraveRewardsGetLocaleFunction::~BraveRewardsGetLocaleFunction() {} + +ExtensionFunction::ResponseAction BraveRewardsGetLocaleFunction::Run() { + std::string locale = brave_l10n::LocaleHelper::GetInstance()->GetLocale(); + return RespondNow(OneArgument(base::Value(std::move(locale)))); +} + BraveRewardsOpenBrowserActionUIFunction:: ~BraveRewardsOpenBrowserActionUIFunction() { } diff --git a/browser/extensions/api/brave_rewards_api.h b/browser/extensions/api/brave_rewards_api.h index 2f0e63fb9b09..b91e6d64e881 100644 --- a/browser/extensions/api/brave_rewards_api.h +++ b/browser/extensions/api/brave_rewards_api.h @@ -16,6 +16,16 @@ namespace extensions { namespace api { +class BraveRewardsGetLocaleFunction : public ExtensionFunction { + public: + DECLARE_EXTENSION_FUNCTION("braveRewards.getLocale", UNKNOWN) + + protected: + ~BraveRewardsGetLocaleFunction() override; + + ResponseAction Run() override; +}; + class BraveRewardsOpenBrowserActionUIFunction : public ExtensionFunction { public: diff --git a/browser/extensions/api/settings_private/brave_prefs_util.cc b/browser/extensions/api/settings_private/brave_prefs_util.cc index 2ef95e874ba9..7583aecd2ff3 100644 --- a/browser/extensions/api/settings_private/brave_prefs_util.cc +++ b/browser/extensions/api/settings_private/brave_prefs_util.cc @@ -5,6 +5,7 @@ #include "brave/browser/extensions/api/settings_private/brave_prefs_util.h" +#include "bat/ads/pref_names.h" #include "brave/browser/ethereum_remote_client/buildflags/buildflags.h" #include "brave/common/pref_names.h" #include "brave/components/brave_rewards/common/pref_names.h" @@ -117,6 +118,34 @@ const PrefsUtil::TypedPrefMap& BravePrefsUtil::GetAllowlistedKeys() { (*s_brave_allowlist)[brave_shields::prefs::kLinkedInEmbedControlType] = settings_api::PrefType::PREF_TYPE_BOOLEAN; + // Rewards/Ads prefs + (*s_brave_allowlist)[ads::prefs::kEnabled] = + settings_api::PrefType::PREF_TYPE_BOOLEAN; + (*s_brave_allowlist)[ads::prefs::kAdsPerHour] = + settings_api::PrefType::PREF_TYPE_NUMBER; + (*s_brave_allowlist)[ads::prefs::kAdsSubdivisionTargetingCode] = + settings_api::PrefType::PREF_TYPE_STRING; + (*s_brave_allowlist)[brave_rewards::prefs::kEnabled] = + settings_api::PrefType::PREF_TYPE_BOOLEAN; + (*s_brave_allowlist)[brave_rewards::prefs::kAutoContributeEnabled] = + settings_api::PrefType::PREF_TYPE_BOOLEAN; + (*s_brave_allowlist)[brave_rewards::prefs::kAutoContributeAmount] = + settings_api::PrefType::PREF_TYPE_NUMBER; + (*s_brave_allowlist)[brave_rewards::prefs::kMinVisitTime] = + settings_api::PrefType::PREF_TYPE_NUMBER; + (*s_brave_allowlist)[brave_rewards::prefs::kMinVisits] = + settings_api::PrefType::PREF_TYPE_NUMBER; + (*s_brave_allowlist)[brave_rewards::prefs::kAllowNonVerified] = + settings_api::PrefType::PREF_TYPE_BOOLEAN; + (*s_brave_allowlist)[brave_rewards::prefs::kAllowVideoContribution] = + settings_api::PrefType::PREF_TYPE_BOOLEAN; + (*s_brave_allowlist)[brave_rewards::prefs::kInlineTipRedditEnabled] = + settings_api::PrefType::PREF_TYPE_BOOLEAN; + (*s_brave_allowlist)[brave_rewards::prefs::kInlineTipTwitterEnabled] = + settings_api::PrefType::PREF_TYPE_BOOLEAN; + (*s_brave_allowlist)[brave_rewards::prefs::kInlineTipGithubEnabled] = + settings_api::PrefType::PREF_TYPE_BOOLEAN; + // Search engine prefs (*s_brave_allowlist)[prefs::kAddOpenSearchEngines] = settings_api::PrefType::PREF_TYPE_BOOLEAN; diff --git a/browser/resources/settings/BUILD.gn b/browser/resources/settings/BUILD.gn index 186c8019bcd6..383176ce7f6c 100644 --- a/browser/resources/settings/BUILD.gn +++ b/browser/resources/settings/BUILD.gn @@ -161,6 +161,8 @@ preprocess_if_expr("preprocess_generated") { "brave_new_tab_page/brave_new_tab_page.m.js", "brave_privacy_page/brave_personalization_options.m.js", "brave_privacy_page/brave_privacy_page_browser_proxy.m.js", + "brave_rewards_page/brave_rewards_browser_proxy.m.js", + "brave_rewards_page/brave_rewards_page.js", "brave_search_engines_page/brave_search_engines_page.m.js", "brave_sync_page/brave_sync_code_dialog.js", "brave_sync_page/brave_sync_configure.js", @@ -236,6 +238,8 @@ ts_library("build_ts") { "brave_privacy_page/brave_personalization_options.m.js", "brave_privacy_page/brave_privacy_page_browser_proxy.m.js", "brave_reset_page/brave_reset_profile_dialog_behavior.js", + "brave_rewards_page/brave_rewards_browser_proxy.m.js", + "brave_rewards_page/brave_rewards_page.js", "brave_routes.js", "brave_search_engines_page/brave_search_engines_page.m.js", "brave_sync_page/brave_sync_browser_proxy.js", @@ -284,6 +288,7 @@ group("web_modules") { "brave_ipfs_page:web_modules", "brave_new_tab_page:web_modules", "brave_privacy_page:web_modules", + "brave_rewards_page:web_modules", "brave_search_engines_page:web_modules", "brave_sync_page:web_modules", "brave_wallet_page:web_modules", diff --git a/browser/resources/settings/brave_icons.html b/browser/resources/settings/brave_icons.html index a2133047bb72..a3174ffea20c 100644 --- a/browser/resources/settings/brave_icons.html +++ b/browser/resources/settings/brave_icons.html @@ -31,6 +31,12 @@ + + + + + + diff --git a/browser/resources/settings/brave_overrides/basic_page.js b/browser/resources/settings/brave_overrides/basic_page.js index feefd0214a0d..149f30aaaadb 100644 --- a/browser/resources/settings/brave_overrides/basic_page.js +++ b/browser/resources/settings/brave_overrides/basic_page.js @@ -10,6 +10,7 @@ import '../brave_default_extensions_page/brave_default_extensions_page.m.js' import '../brave_help_tips_page/brave_help_tips_page.m.js' import '../brave_ipfs_page/brave_ipfs_page.m.js' import '../brave_new_tab_page/brave_new_tab_page.m.js' +import '../brave_rewards_page/brave_rewards_page.js' import '../brave_search_engines_page/brave_search_engines_page.m.js' import '../brave_sync_page/brave_sync_page.js' import '../brave_wallet_page/brave_wallet_page.m.js' @@ -136,7 +137,6 @@ RegisterPolymerTemplateModifications({ 'settings-brave-sync-page', {} )) - const sectionShields = document.createElement('template') sectionShields.setAttribute('is', 'dom-if') sectionShields.setAttribute('restamp', true) @@ -149,6 +149,18 @@ RegisterPolymerTemplateModifications({ prefs: '{{prefs}}' } )) + const sectionRewards = document.createElement('template') + sectionRewards.setAttribute('is', 'dom-if') + sectionRewards.setAttribute('restamp', true) + sectionRewards.setAttribute('if', '[[showPage_(pageVisibility.rewards)]]') + sectionRewards.content.appendChild(createSectionElement( + 'rewards', + 'braveRewards', + 'settings-brave-rewards-page', + { + prefs: '{{prefs}}' + } + )) const sectionSocialBlocking = document.createElement('template') sectionSocialBlocking.setAttribute('is', 'dom-if') sectionSocialBlocking.setAttribute('restamp', true) @@ -194,8 +206,10 @@ RegisterPolymerTemplateModifications({ sectionAppearance.insertAdjacentElement('afterend', sectionNewTab) // Insert shields sectionNewTab.insertAdjacentElement('afterend', sectionShields) + // Insert Rewards + sectionShields.insertAdjacentElement('afterend', sectionRewards) // Insert Social Blocking - sectionShields.insertAdjacentElement('afterend', sectionSocialBlocking) + sectionRewards.insertAdjacentElement('afterend', sectionSocialBlocking) // Move privacy section to after social blocking const sectionPrivacy = getSectionElement(actualTemplate.content, 'privacy') sectionSocialBlocking.insertAdjacentElement('afterend', sectionPrivacy) diff --git a/browser/resources/settings/brave_overrides/settings_menu.js b/browser/resources/settings/brave_overrides/settings_menu.js index 1a502add9e39..06e6fa80e962 100644 --- a/browser/resources/settings/brave_overrides/settings_menu.js +++ b/browser/resources/settings/brave_overrides/settings_menu.js @@ -221,6 +221,14 @@ RegisterPolymerTemplateModifications({ 'shields', ) newTabEl.insertAdjacentElement('afterend', shieldsEl) + // Add Rewards item + const rewardsEl = createMenuElement( + loadTimeData.getString('braveRewards'), + '/rewards', + 'brave_settings:rewards', + 'rewards', + ) + shieldsEl.insertAdjacentElement('afterend', rewardsEl) // Add Embed Blocking item const embedEl = createMenuElement( loadTimeData.getString('socialBlocking'), @@ -228,7 +236,7 @@ RegisterPolymerTemplateModifications({ 'brave_settings:social-permissions', 'socialBlocking', ) - shieldsEl.insertAdjacentElement('afterend', embedEl) + rewardsEl.insertAdjacentElement('afterend', embedEl) // Add privacy const privacyEl = getMenuElement(templateContent, '/privacy') embedEl.insertAdjacentElement('afterend', privacyEl) diff --git a/browser/resources/settings/brave_rewards_page/BUILD.gn b/browser/resources/settings/brave_rewards_page/BUILD.gn new file mode 100644 index 000000000000..76486948da99 --- /dev/null +++ b/browser/resources/settings/brave_rewards_page/BUILD.gn @@ -0,0 +1,26 @@ +# Copyright (c) 2021 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/. + +import("//tools/polymer/html_to_js.gni") +import("//ui/webui/resources/tools/js_modulizer.gni") +import("../settings.gni") + +# ES Module conversion from HTML Imports code + +group("web_modules") { + public_deps = [ + ":modules", + ":templatize", + ] +} + +html_to_js("templatize") { + js_files = [ "brave_rewards_page.js" ] +} + +js_modulizer("modules") { + input_files = [ "brave_rewards_browser_proxy.js" ] + namespace_rewrites = settings_namespace_rewrites +} diff --git a/browser/resources/settings/brave_rewards_page/brave_rewards_browser_proxy.html b/browser/resources/settings/brave_rewards_page/brave_rewards_browser_proxy.html new file mode 100644 index 000000000000..deaf332aae80 --- /dev/null +++ b/browser/resources/settings/brave_rewards_page/brave_rewards_browser_proxy.html @@ -0,0 +1 @@ + diff --git a/browser/resources/settings/brave_rewards_page/brave_rewards_browser_proxy.js b/browser/resources/settings/brave_rewards_page/brave_rewards_browser_proxy.js new file mode 100644 index 000000000000..7aa95f0964ca --- /dev/null +++ b/browser/resources/settings/brave_rewards_page/brave_rewards_browser_proxy.js @@ -0,0 +1,36 @@ +/* Copyright (c) 2021 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/. */ + +import {addSingletonGetter} from 'chrome://resources/js/cr.m.js'; + +/** @interface */ +export class BraveRewardsBrowserProxy { + getLocale() { /* Intentionally empty */ } + getRewardsEnabled() { /* Intentionally empty */ } + getRewardsParameters() { /* Intentionally empty */ } +} + +/** + * @implements {settings.BraveRewardsBrowserProxy} + */ +export class BraveRewardsBrowserProxyImpl { + /** @override */ + getLocale () { + return new Promise((resolve) => chrome.braveRewards.getLocale( + (locale) => { resolve(locale) })) + } + /** @override */ + getRewardsEnabled () { + return new Promise((resolve) => chrome.braveRewards.getRewardsEnabled( + (enabled) => { resolve(enabled) })) + } + /** @override */ + getRewardsParameters () { + return new Promise((resolve) => chrome.braveRewards.getRewardsParameters( + (parameters) => { resolve(parameters) })) + } +} + +addSingletonGetter(BraveRewardsBrowserProxyImpl) diff --git a/browser/resources/settings/brave_rewards_page/brave_rewards_page.html b/browser/resources/settings/brave_rewards_page/brave_rewards_page.html new file mode 100644 index 000000000000..99ae0349dab0 --- /dev/null +++ b/browser/resources/settings/brave_rewards_page/brave_rewards_page.html @@ -0,0 +1,134 @@ + + + diff --git a/browser/resources/settings/brave_rewards_page/brave_rewards_page.js b/browser/resources/settings/brave_rewards_page/brave_rewards_page.js new file mode 100644 index 000000000000..3b9eed6dbca0 --- /dev/null +++ b/browser/resources/settings/brave_rewards_page/brave_rewards_page.js @@ -0,0 +1,172 @@ +/* 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/. */ + +'use strict'; + +import {loadTimeData} from '../i18n_setup.js'; + +import '//resources/js/cr.m.js'; +import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +import {I18nBehavior} from '//resources/js/i18n_behavior.m.js'; +import {BraveRewardsBrowserProxyImpl} from './brave_rewards_browser_proxy.m.js'; + +const SettingsBraveRewardsPageBase = + mixinBehaviors([I18nBehavior], PolymerElement); + +/** + * 'settings-brave-rewards-page' is the settings page containing settings for + * Brave Rewards. + */ +class SettingsBraveRewardsPage extends SettingsBraveRewardsPageBase { + static get is() { + return 'settings-brave-rewards-page' + } + + static get template() { + return html`{__html_template__}` + } + + static get properties() { + return { + maxAdsToDisplay_: { + readOnly: true, + type: Array, + value() { + return [ + { name: loadTimeData.getString('braveRewardsDefaultItem'), value: -1 }, + { name: loadTimeData.getString('braveRewardsMaxAdsPerHour0'), value: 0 }, + { name: loadTimeData.getString('braveRewardsMaxAdsPerHour1'), value: 1 }, + { name: loadTimeData.getString('braveRewardsMaxAdsPerHour2'), value: 2 }, + { name: loadTimeData.getString('braveRewardsMaxAdsPerHour3'), value: 3 }, + { name: loadTimeData.getString('braveRewardsMaxAdsPerHour4'), value: 4 }, + { name: loadTimeData.getString('braveRewardsMaxAdsPerHour5'), value: 5 }, + { name: loadTimeData.getString('braveRewardsMaxAdsPerHour10'), value: 10 } + ] + } + }, + adsSubdivisionTargetingCodes_: { + readOnly: true, + type: Array, + value() { + return [ + { name: loadTimeData.getString('braveRewardsAutoDetectedItem'), value: 'AUTO' }, + { name: loadTimeData.getString('braveRewardsDisabledItem'), value: 'DISABLED' }, + { name: 'Alabama', value: 'US-AL' }, + { name: 'Alaska', value: 'US-AK' }, + { name: 'Arizona', value: 'US-AZ' }, + { name: 'Arkansas', value: 'US-AR' }, + { name: 'California', value: 'US-CA' }, + { name: 'Colorado', value: 'US-CO' }, + { name: 'Connecticut', value: 'US-CT' }, + { name: 'Delaware', value: 'US-DE' }, + { name: 'Florida', value: 'US-FL' }, + { name: 'Georgia', value: 'US-GA' }, + { name: 'Hawaii', value: 'US-HI' }, + { name: 'Idaho', value: 'US-ID' }, + { name: 'Illinois', value: 'US-IL' }, + { name: 'Indiana', value: 'US-IN' }, + { name: 'Iowa', value: 'US-IA' }, + { name: 'Kansas', value: 'US-KS' }, + { name: 'Kentucky', value: 'US-KY' }, + { name: 'Louisiana', value: 'US-LA' }, + { name: 'Maine', value: 'US-ME' }, + { name: 'Maryland', value: 'US-MD' }, + { name: 'Massachusetts', value: 'US-MA' }, + { name: 'Michigan', value: 'US-MI' }, + { name: 'Minnesota', value: 'US-MN' }, + { name: 'Mississippi', value: 'US-MS' }, + { name: 'Missouri', value: 'US-MO' }, + { name: 'Montana', value: 'US-MT' }, + { name: 'Nebraska', value: 'US-NE' }, + { name: 'Nevada', value: 'US-NV' }, + { name: 'New Hampshire', value: 'US-NH' }, + { name: 'New Jersey', value: 'US-NJ' }, + { name: 'New Mexico', value: 'US-NM' }, + { name: 'New York', value: 'US-NY' }, + { name: 'North Carolina', value: 'US-NC' }, + { name: 'North Dakota', value: 'US-ND' }, + { name: 'Ohio', value: 'US-OH' }, + { name: 'Oklahoma', value: 'US-OK' }, + { name: 'Oregon', value: 'US-OR' }, + { name: 'Pennsylvania', value: 'US-PA' }, + { name: 'Rhode Island', value: 'US-RI' }, + { name: 'South Carolina', value: 'US-SC' }, + { name: 'South Dakota', value: 'US-SD' }, + { name: 'Tennessee', value: 'US-TN' }, + { name: 'Texas', value: 'US-TX' }, + { name: 'Utah', value: 'US-UT' }, + { name: 'Vermont', value: 'US-VT' }, + { name: 'Virginia', value: 'US-VA' }, + { name: 'Washington', value: 'US-WA' }, + { name: 'West Virginia', value: 'US-WV' }, + { name: 'Wisconsin', value: 'US-WI' }, + { name: 'Wyoming', value: 'US-WY' } + ] + } + }, + autoContributeMinVisitTimeOptions_: { + readOnly: true, + type: Array, + value() { + return [ + { name: loadTimeData.getString('braveRewardsAutoContributeMinVisitTime5'), value: 5 }, + { name: loadTimeData.getString('braveRewardsAutoContributeMinVisitTime8'), value: 8 }, + { name: loadTimeData.getString('braveRewardsAutoContributeMinVisitTime60'), value: 60 } + ] + } + }, + autoContributeMinVisitsOptions_: { + readOnly: true, + type: Array, + value() { + return [ + { name: loadTimeData.getString('braveRewardsAutoContributeMinVisits1'), value: 1 }, + { name: loadTimeData.getString('braveRewardsAutoContributeMinVisits5'), value: 5 }, + { name: loadTimeData.getString('braveRewardsAutoContributeMinVisits10'), value: 10 } + ] + } + }, + autoContributeMonthlyLimit_: Array + } + } + + browserProxy_ = BraveRewardsBrowserProxyImpl.getInstance() + + ready() { + super.ready() + this.openRewardsPanel_ = () => { + chrome.braveRewards.openBrowserActionUI('brave_rewards_panel.html') + this.populateAutoContributeAmountDropdown_() + } + this.browserProxy_.getRewardsEnabled().then((enabled) => { + if (enabled) { + this.populateAutoContributeAmountDropdown_() + } + }) + } + + populateAutoContributeAmountDropdown_() { + this.browserProxy_.getRewardsParameters().then((params) => { + let autoContributeChoices = [ + { name: loadTimeData.getString('braveRewardsDefaultItem'), value: 0 } + ] + params.autoContributeChoices.forEach((element) => { + autoContributeChoices.push({ + name: `${loadTimeData.getString('braveRewardsContributionUpTo')} ${element.toFixed(3)} BAT`, + value: element + }) + }) + this.autoContributeMonthlyLimit_ = autoContributeChoices + }) + } + + async shouldAllowAdsSubdivisionTargeting_() { + const locale = await this.browserProxy_.getLocale() + return locale === 'en-US' + } +} + +customElements.define( + SettingsBraveRewardsPage.is, SettingsBraveRewardsPage) diff --git a/browser/resources/settings/brave_routes.js b/browser/resources/settings/brave_routes.js index 41cab5335672..2d67ff254a24 100644 --- a/browser/resources/settings/brave_routes.js +++ b/browser/resources/settings/brave_routes.js @@ -17,6 +17,7 @@ export default function addBraveRoutes(r) { r.MANAGE_PROFILE = r.GET_STARTED.createChild('/manageProfile'); } r.SHIELDS = r.BASIC.createSection('/shields', 'shields') + r.REWARDS = r.BASIC.createSection('/rewards', 'rewards') r.SOCIAL_BLOCKING = r.BASIC.createSection('/socialBlocking', 'socialBlocking') r.EXTENSIONS = r.BASIC.createSection('/extensions', 'extensions') if (pageVisibility.braveSync) { @@ -62,4 +63,4 @@ export default function addBraveRoutes(r) { } else if (!isGuest) { console.error('[Brave Settings Overrides] Could not move safety check route to advanced route', r) } -} \ No newline at end of file +} diff --git a/browser/resources/settings/settings.gni b/browser/resources/settings/settings.gni index e71242737c2d..1a33c9bd3397 100644 --- a/browser/resources/settings/settings.gni +++ b/browser/resources/settings/settings.gni @@ -7,6 +7,7 @@ settings_namespace_rewrites = [ "settings.BraveDefaultExtensionsBrowserProxyImpl|BraveDefaultExtensionsBrowserProxyImpl", "settings.BraveNewTabBrowserProxyImpl|BraveNewTabBrowserProxyImpl", "settings.BravePrivacyBrowserProxyImpl|BravePrivacyBrowserProxyImpl", + "settings.BraveRewardsBrowserProxyImpl|BraveRewardsBrowserProxyImpl", "settings.BraveSyncBrowserProxy|BraveSyncBrowserProxy", "settings.DefaultBraveShieldsBrowserProxyImpl|DefaultBraveShieldsBrowserProxyImpl", "settings.SocialBlockingPageProxyImpl|SocialBlockingPageProxyImpl", diff --git a/browser/ui/webui/brave_rewards_page_ui.cc b/browser/ui/webui/brave_rewards_page_ui.cc index dc325319b1ff..4297658e1b15 100644 --- a/browser/ui/webui/brave_rewards_page_ui.cc +++ b/browser/ui/webui/brave_rewards_page_ui.cc @@ -16,6 +16,7 @@ #include "base/scoped_observation.h" #include "base/strings/string_number_conversions.h" #include "base/time/time.h" +#include "bat/ads/pref_names.h" #include "bat/ledger/mojom_structs.h" #include "brave/browser/brave_ads/ads_service_factory.h" #include "brave/browser/brave_rewards/rewards_service_factory.h" @@ -33,6 +34,7 @@ #include "brave/components/l10n/common/locale_util.h" #include "chrome/browser/lifetime/application_lifetime.h" #include "chrome/browser/profiles/profile.h" +#include "components/prefs/pref_change_registrar.h" #include "components/prefs/pref_service.h" #include "content/public/browser/render_view_host.h" #include "content/public/browser/web_contents.h" @@ -285,6 +287,9 @@ class RewardsDOMHandler // AdsServiceObserver implementation void OnAdRewardsChanged() override; + void InitPrefChangeRegistrar(); + void OnPrefChanged(const std::string& key); + brave_rewards::RewardsService* rewards_service_; // NOT OWNED brave_ads::AdsService* ads_service_; // NOT OWNED @@ -294,6 +299,8 @@ class RewardsDOMHandler base::ScopedObservation ads_service_observation_{this}; + PrefChangeRegistrar pref_change_registrar_; + base::WeakPtrFactory weak_factory_; DISALLOW_COPY_AND_ASSIGN(RewardsDOMHandler); @@ -538,6 +545,74 @@ void RewardsDOMHandler::Init() { rewards_service_->StartProcess(base::DoNothing()); ads_service_ = brave_ads::AdsServiceFactory::GetForProfile(profile); + + // Configure a pref change registrar to update brave://rewards when settings + // are changed via brave://settings + InitPrefChangeRegistrar(); +} + +void RewardsDOMHandler::InitPrefChangeRegistrar() { + Profile* profile = Profile::FromWebUI(web_ui()); + pref_change_registrar_.Init(profile->GetPrefs()); + + pref_change_registrar_.Add( + ads::prefs::kEnabled, + base::BindRepeating(&RewardsDOMHandler::OnPrefChanged, + base::Unretained(this))); + pref_change_registrar_.Add( + ads::prefs::kAdsPerHour, + base::BindRepeating(&RewardsDOMHandler::OnPrefChanged, + base::Unretained(this))); + pref_change_registrar_.Add( + ads::prefs::kAdsSubdivisionTargetingCode, + base::BindRepeating(&RewardsDOMHandler::OnPrefChanged, + base::Unretained(this))); + + pref_change_registrar_.Add( + brave_rewards::prefs::kAutoContributeEnabled, + base::BindRepeating(&RewardsDOMHandler::OnPrefChanged, + base::Unretained(this))); + pref_change_registrar_.Add( + brave_rewards::prefs::kAutoContributeAmount, + base::BindRepeating(&RewardsDOMHandler::OnPrefChanged, + base::Unretained(this))); + pref_change_registrar_.Add( + brave_rewards::prefs::kMinVisitTime, + base::BindRepeating(&RewardsDOMHandler::OnPrefChanged, + base::Unretained(this))); + pref_change_registrar_.Add( + brave_rewards::prefs::kMinVisits, + base::BindRepeating(&RewardsDOMHandler::OnPrefChanged, + base::Unretained(this))); + pref_change_registrar_.Add( + brave_rewards::prefs::kAllowNonVerified, + base::BindRepeating(&RewardsDOMHandler::OnPrefChanged, + base::Unretained(this))); + pref_change_registrar_.Add( + brave_rewards::prefs::kAllowVideoContribution, + base::BindRepeating(&RewardsDOMHandler::OnPrefChanged, + base::Unretained(this))); + + pref_change_registrar_.Add( + brave_rewards::prefs::kInlineTipTwitterEnabled, + base::BindRepeating(&RewardsDOMHandler::OnPrefChanged, + base::Unretained(this))); + pref_change_registrar_.Add( + brave_rewards::prefs::kInlineTipRedditEnabled, + base::BindRepeating(&RewardsDOMHandler::OnPrefChanged, + base::Unretained(this))); + pref_change_registrar_.Add( + brave_rewards::prefs::kInlineTipGithubEnabled, + base::BindRepeating(&RewardsDOMHandler::OnPrefChanged, + base::Unretained(this))); +} + +void RewardsDOMHandler::OnPrefChanged(const std::string& path) { + if (!IsJavascriptAllowed()) { + return; + } + + CallJavascriptFunction("brave_rewards.onPrefChanged", base::Value(path)); } void RewardsDOMHandler::RestartBrowser(base::Value::ConstListView args) { diff --git a/chromium_src/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc b/chromium_src/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc index 7c95a7001af1..05f86b0fc9f3 100644 --- a/chromium_src/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc +++ b/chromium_src/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc @@ -73,6 +73,10 @@ const char16_t kDNSLinkLearnMoreURL[] = const char16_t kUnstoppableDomainsLearnMoreURL[] = u"https://github.com/brave/brave-browser/wiki/" u"Resolve-Methods-for-Unstoppable-Domains"; +const char16_t kBraveAdsLearnMoreURL[] = + u"https://support.brave.com/hc/en-us/articles/360026361072-Brave-Ads-FAQ"; +const char16_t kBraveTermsOfUseURL[] = u"https://brave.com/terms-of-use/"; +const char16_t kBravePrivacyPolicyURL[] = u"https://brave.com/privacy/browser/"; void BraveAddCommonStrings(content::WebUIDataSource* html_source, Profile* profile) { @@ -246,6 +250,63 @@ void BraveAddCommonStrings(content::WebUIDataSource* html_source, {"braveNewTabNewTabPageShows", IDS_SETTINGS_NEW_TAB_NEW_TAB_PAGE_SHOWS}, {"braveNewTabNewTabCustomizeWidgets", IDS_SETTINGS_NEW_TAB_NEW_TAB_CUSTOMIZE_WIDGETS}, + // Rewards page + {"braveRewards", IDS_SETTINGS_BRAVE_REWARDS_TITLE}, + {"braveRewardsDisabledLabel", IDS_SETTINGS_BRAVE_REWARDS_DISABLED_LABEL}, + {"braveRewardsDisabledSubLabel", + IDS_SETTINGS_BRAVE_REWARDS_DISABLED_SUB_LABEL}, + {"braveRewardsAutoDetectedItem", + IDS_SETTINGS_BRAVE_REWARDS_AUTO_DETECTED_ITEM}, + {"braveRewardsDefaultItem", IDS_SETTINGS_BRAVE_REWARDS_DEFAULT_ITEM}, + {"braveRewardsDisabledItem", IDS_SETTINGS_BRAVE_REWARDS_DISABLED_ITEM}, + {"braveRewardsPrivateAdsTitle", + IDS_SETTINGS_BRAVE_REWARDS_PRIVATE_ADS_TITLE}, + {"braveRewardsPrivateAdsEarnTokensLabel", + IDS_SETTINGS_BRAVE_REWARDS_PRIVATE_ADS_EARN_TOKENS_LABEL}, + {"braveRewardsMaxAdsToDisplayLabel", + IDS_SETTINGS_BRAVE_REWARDS_MAX_ADS_TO_DISPLAY_LABEL}, + {"braveRewardsMaxAdsPerHour0", IDS_BRAVE_REWARDS_LOCAL_ADS_PER_HOUR_0}, + {"braveRewardsMaxAdsPerHour1", IDS_BRAVE_REWARDS_LOCAL_ADS_PER_HOUR_1}, + {"braveRewardsMaxAdsPerHour2", IDS_BRAVE_REWARDS_LOCAL_ADS_PER_HOUR_2}, + {"braveRewardsMaxAdsPerHour3", IDS_BRAVE_REWARDS_LOCAL_ADS_PER_HOUR_3}, + {"braveRewardsMaxAdsPerHour4", IDS_BRAVE_REWARDS_LOCAL_ADS_PER_HOUR_4}, + {"braveRewardsMaxAdsPerHour5", IDS_BRAVE_REWARDS_LOCAL_ADS_PER_HOUR_5}, + {"braveRewardsMaxAdsPerHour10", IDS_BRAVE_REWARDS_LOCAL_ADS_PER_HOUR_10}, + {"braveRewardsStateLevelAdTargetingLabel", + IDS_SETTINGS_BRAVE_REWARDS_STATE_LEVEL_AD_TARGETING_LABEL}, + {"braveRewardsAutoContributeTitle", + IDS_SETTINGS_BRAVE_REWARDS_AUTO_CONTRIBUTE_TITLE}, + {"braveRewardsAutoContributeMonthlyLimitLabel", + IDS_SETTINGS_BRAVE_REWARDS_AUTO_CONTRIBUTE_MONTHLY_LIMIT_LABEL}, + {"braveRewardsContributionUpTo", IDS_BRAVE_REWARDS_LOCAL_CONTR_UP_TO}, + {"braveRewardsAutoContributeMinVisitTimeLabel", + IDS_SETTINGS_BRAVE_REWARDS_AUTO_CONTRIBUTE_MIN_VISIT_TIME_LABEL}, + {"braveRewardsAutoContributeMinVisitTime5", + IDS_BRAVE_REWARDS_LOCAL_CONTR_TIME_5}, + {"braveRewardsAutoContributeMinVisitTime8", + IDS_BRAVE_REWARDS_LOCAL_CONTR_TIME_8}, + {"braveRewardsAutoContributeMinVisitTime60", + IDS_BRAVE_REWARDS_LOCAL_CONTR_TIME_60}, + {"braveRewardsAutoContributeMinVisitsLabel", + IDS_SETTINGS_BRAVE_REWARDS_AUTO_CONTRIBUTE_MIN_VISITS_LABEL}, + {"braveRewardsAutoContributeMinVisits1", + IDS_BRAVE_REWARDS_LOCAL_CONTR_VISIT_1}, + {"braveRewardsAutoContributeMinVisits5", + IDS_BRAVE_REWARDS_LOCAL_CONTR_VISIT_5}, + {"braveRewardsAutoContributeMinVisits10", + IDS_BRAVE_REWARDS_LOCAL_CONTR_VISIT_10}, + {"braveRewardsAutoContributeShowNonVerifiedSitesLabel", + IDS_SETTINGS_BRAVE_REWARDS_AUTO_CONTRIBUTE_SHOW_NON_VERIFIED_SITES_LABEL}, + {"braveRewardsAutoContributeAllowVideoContributionsLabel", + IDS_SETTINGS_BRAVE_REWARDS_AUTO_CONTRIBUTE_ALLOW_VIDEO_CONTRIBUTIONS_LABEL}, // NOLINT + {"braveRewardsTipButtonsTitle", + IDS_SETTINGS_BRAVE_REWARDS_TIP_BUTTONS_TITLE}, + {"braveRewardsInlineTipRedditLabel", + IDS_SETTINGS_BRAVE_REWARDS_INLINE_TIP_REDDIT_LABEL}, + {"braveRewardsInlineTipTwitterLabel", + IDS_SETTINGS_BRAVE_REWARDS_INLINE_TIP_TWITTER_LABEL}, + {"braveRewardsInlineTipGithubLabel", + IDS_SETTINGS_BRAVE_REWARDS_INLINE_TIP_GITHUB_LABEL}, // Misc (TODO: Organize this) {"showSearchTabsBtn", IDS_SETTINGS_TABS_SEARCH_SHOW}, {"onExitPageTitle", IDS_SETTINGS_BRAVE_ON_EXIT}, @@ -424,6 +485,18 @@ void BraveAddCommonStrings(content::WebUIDataSource* html_source, l10n_util::GetStringFUTF16( IDS_SETTINGS_RESOLVE_UNSTOPPABLE_DOMAINS_SUB_DESC, kUnstoppableDomainsLearnMoreURL)); + + html_source->AddString( + "braveRewardsStateLevelAdTargetingDescLabel", + l10n_util::GetStringFUTF16( + IDS_SETTINGS_BRAVE_REWARDS_STATE_LEVEL_AD_TARGETING_DESC_LABEL, + kBraveAdsLearnMoreURL)); + + html_source->AddString( + "braveRewardsAutoContributeDescLabel", + l10n_util::GetStringFUTF16( + IDS_SETTINGS_BRAVE_REWARDS_AUTO_CONTRIBUTE_DESC_LABEL, + kBraveTermsOfUseURL, kBravePrivacyPolicyURL)); } void BraveAddResources(content::WebUIDataSource* html_source, diff --git a/common/extensions/api/_api_features.json b/common/extensions/api/_api_features.json index 41a421f655cf..f3adadd725ba 100644 --- a/common/extensions/api/_api_features.json +++ b/common/extensions/api/_api_features.json @@ -105,14 +105,9 @@ "channel": "stable", "contexts": ["webui"], "matches": [ - "chrome://newtab/*" - ] - }, - { - "channel": "stable", - "contexts": ["webui"], - "matches": [ - "chrome://rewards/*" + "chrome://newtab/*", + "chrome://rewards/*", + "chrome://settings/*" ] } ], diff --git a/common/extensions/api/brave_rewards.json b/common/extensions/api/brave_rewards.json index 5b02fe0dbe27..3e2e1c885749 100644 --- a/common/extensions/api/brave_rewards.json +++ b/common/extensions/api/brave_rewards.json @@ -322,6 +322,23 @@ } ], "functions": [ + { + "name": "getLocale", + "type": "function", + "description": "Retrieves the current locale", + "parameters": [ + { + "type": "function", + "name": "callback", + "parameters": [ + { + "name": "locale", + "type": "string" + } + ] + } + ] + }, { "name": "openBrowserActionUI", "type": "function", diff --git a/components/brave_rewards/resources/android_page/actions/rewards_actions.ts b/components/brave_rewards/resources/android_page/actions/rewards_actions.ts index 6628ce062e10..78cca8645154 100644 --- a/components/brave_rewards/resources/android_page/actions/rewards_actions.ts +++ b/components/brave_rewards/resources/android_page/actions/rewards_actions.ts @@ -177,3 +177,7 @@ export const onBalance = (status: number, balance: Rewards.Balance) => action(ty export const onInitialized = (result: boolean) => action(types.ON_INITIALIZED, { result }) + +export const onPrefChanged = (key: string) => action(types.ON_PREF_CHANGED, { + key +}) diff --git a/components/brave_rewards/resources/android_page/brave_rewards_page.tsx b/components/brave_rewards/resources/android_page/brave_rewards_page.tsx index fdf4df6fc28c..d326bcb79a35 100644 --- a/components/brave_rewards/resources/android_page/brave_rewards_page.tsx +++ b/components/brave_rewards/resources/android_page/brave_rewards_page.tsx @@ -161,6 +161,10 @@ function initialized (result: number) { getActions().onInitialized(result) } +function onPrefChanged (key: string) { + getActions().onPrefChanged(key) +} + // Expose functions to Page Handlers. // TODO(petemill): Use event listeners instead. // @ts-ignore @@ -191,7 +195,8 @@ window.brave_rewards = { reconcileComplete, onlyAnonWallet, unblindedTokensReady, - initialized + initialized, + onPrefChanged } document.addEventListener('DOMContentLoaded', initialize) diff --git a/components/brave_rewards/resources/android_page/constants/rewards_types.ts b/components/brave_rewards/resources/android_page/constants/rewards_types.ts index 153af3efd84c..e5e9b6b2afbc 100644 --- a/components/brave_rewards/resources/android_page/constants/rewards_types.ts +++ b/components/brave_rewards/resources/android_page/constants/rewards_types.ts @@ -57,5 +57,6 @@ export const enum types { ON_ONLY_ANON_WALLET = '@@rewards/ON_ONLY_ANON_WALLET', ON_INITIALIZED = '@@rewards/ON_INITIALIZED', DISCONNECT_WALLET = '@@rewards/DISCONNECT_WALLET', - DISCONNECT_WALLET_ERROR = '@@rewards/DISCONNECT_WALLET_ERROR' + DISCONNECT_WALLET_ERROR = '@@rewards/DISCONNECT_WALLET_ERROR', + ON_PREF_CHANGED = '@@rewards/ON_PREF_CHANGED' } diff --git a/components/brave_rewards/resources/android_page/reducers/rewards_reducer.ts b/components/brave_rewards/resources/android_page/reducers/rewards_reducer.ts index cb80ae341ca8..1834ff985da9 100644 --- a/components/brave_rewards/resources/android_page/reducers/rewards_reducer.ts +++ b/components/brave_rewards/resources/android_page/reducers/rewards_reducer.ts @@ -225,6 +225,13 @@ const rewardsReducer: Reducer = (state: Rewards.State chrome.send('brave_rewards.getReconcileStamp') break } + case types.ON_PREF_CHANGED: { + chrome.send('brave_rewards.getEnabledInlineTippingPlatforms') + chrome.send('brave_rewards.getContributionAmount') + chrome.send('brave_rewards.getAutoContributeProperties') + chrome.send('brave_rewards.getAdsData') + break + } } return state diff --git a/components/brave_rewards/resources/page/actions/rewards_actions.ts b/components/brave_rewards/resources/page/actions/rewards_actions.ts index 028794fdca16..2e609a4b58a6 100644 --- a/components/brave_rewards/resources/page/actions/rewards_actions.ts +++ b/components/brave_rewards/resources/page/actions/rewards_actions.ts @@ -343,3 +343,7 @@ export const onEnabledInlineTippingPlatforms = (platforms: string[]) => action(t }) export const restartBrowser = () => action(types.RESTART_BROWSER) + +export const onPrefChanged = (key: string) => action(types.ON_PREF_CHANGED, { + key +}) diff --git a/components/brave_rewards/resources/page/brave_rewards_page.tsx b/components/brave_rewards/resources/page/brave_rewards_page.tsx index f4e107f8277e..5be3c564ae4f 100644 --- a/components/brave_rewards/resources/page/brave_rewards_page.tsx +++ b/components/brave_rewards/resources/page/brave_rewards_page.tsx @@ -273,6 +273,10 @@ function externalWalletLogin (url: string) { window.open(url, '_self') } +function onPrefChanged (key: string) { + getActions().onPrefChanged(key) +} + // Expose functions to Page Handlers. // TODO(petemill): Use event listeners instead. // @ts-ignore @@ -324,7 +328,8 @@ window.brave_rewards = { walletPassphrase, onboardingStatus, enabledInlineTippingPlatforms, - externalWalletLogin + externalWalletLogin, + onPrefChanged } document.addEventListener('DOMContentLoaded', initialize) diff --git a/components/brave_rewards/resources/page/constants/rewards_types.ts b/components/brave_rewards/resources/page/constants/rewards_types.ts index 1a68ce2a597a..0b20a183c7b0 100644 --- a/components/brave_rewards/resources/page/constants/rewards_types.ts +++ b/components/brave_rewards/resources/page/constants/rewards_types.ts @@ -100,5 +100,6 @@ export const enum types { GET_ENABLED_INLINE_TIPPING_PLATFORMS = '@@rewards/GET_ENABLED_INLINE_TIPPING_PLATFORMS', ON_ENABLED_INLINE_TIPPING_PLATFORMS = '@@rewards/ON_ENABLED_INLINE_TIPPING_PLATFORMS', ON_EXTERNAL_WALLET_PROVIDER_LIST = '@@rewards/ON_EXTERNAL_WALLET_PROVIDER_LIST', - RESTART_BROWSER = '@@rewards/RESTART_BROWSER' + RESTART_BROWSER = '@@rewards/RESTART_BROWSER', + ON_PREF_CHANGED = '@@rewards/ON_PREF_CHANGED' } diff --git a/components/brave_rewards/resources/page/reducers/rewards_reducer.ts b/components/brave_rewards/resources/page/reducers/rewards_reducer.ts index 19d62159de18..2acb5e1bf1e9 100644 --- a/components/brave_rewards/resources/page/reducers/rewards_reducer.ts +++ b/components/brave_rewards/resources/page/reducers/rewards_reducer.ts @@ -489,6 +489,13 @@ const rewardsReducer: Reducer = (state: Rewards.State chrome.send('brave_rewards.restartBrowser') break } + case types.ON_PREF_CHANGED: { + chrome.send('brave_rewards.getEnabledInlineTippingPlatforms') + chrome.send('brave_rewards.getContributionAmount') + chrome.send('brave_rewards.getAutoContributeProperties') + chrome.send('brave_rewards.getAdsData') + break + } } return state