From 677a73852f7564ed275b2483639979a801086d2c Mon Sep 17 00:00:00 2001 From: Ming Ming Date: Sat, 17 Apr 2021 23:43:42 +0800 Subject: [PATCH] Config personalized ads --- app/lib/entity/pref.dart | 3 +++ app/lib/entity/pref/extension.dart | 7 +++++++ app/lib/l10n/app_en.arb | 2 ++ app/lib/widget/ad.dart | 3 ++- app/lib/widget/settings.dart | 19 +++++++++++++++++++ app/lib/widget/setup.dart | 22 +++++++++++++++++++++- 6 files changed, 54 insertions(+), 2 deletions(-) diff --git a/app/lib/entity/pref.dart b/app/lib/entity/pref.dart index c50bfaa9..39649281 100644 --- a/app/lib/entity/pref.dart +++ b/app/lib/entity/pref.dart @@ -119,6 +119,7 @@ enum PrefKey implements PrefKeyInterface { viewerBottomAppBarButtons, homeCollectionsNavBarButtons, lastAdRewardTime, + isPersonalizedAds, ; @override @@ -221,6 +222,8 @@ enum PrefKey implements PrefKeyInterface { return "homeCollectionsNavBarButtons"; case PrefKey.lastAdRewardTime: return "lastAdRewardTime"; + case PrefKey.isPersonalizedAds: + return "isPersonalizedAds"; } } } diff --git a/app/lib/entity/pref/extension.dart b/app/lib/entity/pref/extension.dart index 680a4043..9f419ca6 100644 --- a/app/lib/entity/pref/extension.dart +++ b/app/lib/entity/pref/extension.dart @@ -172,6 +172,13 @@ extension PrefExtension on Pref { PrefKey.lastAdRewardTime, value, (key, value) => provider.setInt(key, value)); + + bool? isPersonalizedAds() => provider.getBool(PrefKey.isPersonalizedAds); + bool isPersonalizedAdsOr(bool def) => isPersonalizedAds() ?? def; + Future setPersonalizedAds(bool value) => _set( + PrefKey.isPersonalizedAds, + value, + (key, value) => provider.setBool(key, value)); } extension AccountPrefExtension on AccountPref { diff --git a/app/lib/l10n/app_en.arb b/app/lib/l10n/app_en.arb index 3330aa60..db0f683f 100644 --- a/app/lib/l10n/app_en.arb +++ b/app/lib/l10n/app_en.arb @@ -9,6 +9,8 @@ "settingsPrivacyPageTitle": "Privacy settings", "settingsAnalyticsTitle": "Analytics", "settingsAnalyticsSubtitle": "Collect analytics after an error to help developers better diagnose the issue", + "settingsPersonalizedAdsTitle": "Personalized ads", + "settingsPersonalizedAdsSubtitle": "Show more relevant ads", "settingsPrivacyPolicyTitle": "Privacy policy", "setupPrivacyAgreeStatement": "Please read carefully the above privacy policy. By continuing, you agree to our privacy policy", "photosTabLabel": "Photos", diff --git a/app/lib/widget/ad.dart b/app/lib/widget/ad.dart index 87b1d3f7..5ff76df7 100644 --- a/app/lib/widget/ad.dart +++ b/app/lib/widget/ad.dart @@ -214,4 +214,5 @@ class RewardedAdHandler { static final _log = Logger("widget.ad.RewardedAdHandler"); } -const _request = AdRequest(); +final _request = + AdRequest(nonPersonalizedAds: !Pref().isPersonalizedAdsOr(false)); diff --git a/app/lib/widget/settings.dart b/app/lib/widget/settings.dart index 64e677d6..d3fd2a7c 100644 --- a/app/lib/widget/settings.dart +++ b/app/lib/widget/settings.dart @@ -7,6 +7,7 @@ import 'package:logging/logging.dart'; import 'package:nc_photos/app_localizations.dart'; import 'package:nc_photos/controller/pref_controller.dart'; import 'package:nc_photos/debug_util.dart'; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/k.dart' as k; import 'package:nc_photos/language_util.dart' as language_util; import 'package:nc_photos/mobile/platform.dart' @@ -280,6 +281,9 @@ class _PrivacySettingsState extends State<_PrivacySettings> { _isEnableAnalytics = FirebaseCrashlytics.instance.isCrashlyticsCollectionEnabled; } + if (features.isSupportAds) { + _isEnablePersonalizedAds = Pref().isPersonalizedAdsOr(false); + } } @override @@ -308,6 +312,13 @@ class _PrivacySettingsState extends State<_PrivacySettings> { value: _isEnableAnalytics, onChanged: (value) => _onAnalyticsChanged(value), ), + if (features.isSupportAds) + SwitchListTile( + title: Text(L10n.global().settingsPersonalizedAdsTitle), + subtitle: Text(L10n.global().settingsPersonalizedAdsSubtitle), + value: _isEnablePersonalizedAds, + onChanged: (value) => _onPersonalizedAdsChanged(value), + ), ListTile( title: Text(L10n.global().settingsPrivacyPolicyTitle), onTap: () { @@ -328,5 +339,13 @@ class _PrivacySettingsState extends State<_PrivacySettings> { FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(value); } + void _onPersonalizedAdsChanged(bool value) { + Pref().setPersonalizedAds(value); + setState(() { + _isEnablePersonalizedAds = value; + }); + } + late bool _isEnableAnalytics; + late bool _isEnablePersonalizedAds; } diff --git a/app/lib/widget/setup.dart b/app/lib/widget/setup.dart index 6f7dba05..f16d4eea 100644 --- a/app/lib/widget/setup.dart +++ b/app/lib/widget/setup.dart @@ -264,6 +264,17 @@ class _PrivacyState extends State<_Privacy> { child: Text(L10n.global().settingsAnalyticsSubtitle), ), const SizedBox(height: 16), + SwitchListTile( + title: Text(L10n.global().settingsPersonalizedAdsTitle), + value: _isEnablePersonalizedAds, + onChanged: _onPersonalizedAdsValueChanged, + ), + const SizedBox(height: 8), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Text(L10n.global().settingsPersonalizedAdsSubtitle), + ), + const SizedBox(height: 16), Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: InkWell( @@ -305,11 +316,13 @@ class _PrivacyState extends State<_Privacy> { dispose() { super.dispose(); // persist user's choice - _log.info("[dispose] Analytics: $_isEnableAnalytics"); + _log.info( + "[dispose] Analytics: $_isEnableAnalytics, Personalized Ads: $_isEnablePersonalizedAds"); if (features.isSupportCrashlytics) { FirebaseCrashlytics.instance .setCrashlyticsCollectionEnabled(_isEnableAnalytics); } + Pref().setPersonalizedAds(_isEnablePersonalizedAds); } void _onAnalyticsValueChanged(bool value) { @@ -318,7 +331,14 @@ class _PrivacyState extends State<_Privacy> { }); } + void _onPersonalizedAdsValueChanged(bool value) { + setState(() { + _isEnablePersonalizedAds = value; + }); + } + bool _isEnableAnalytics = true; + bool _isEnablePersonalizedAds = true; static final _log = Logger("widget.setup._PrivacyState"); }