Skip to content

Commit

Permalink
Show ad after adding a homework
Browse files Browse the repository at this point in the history
  • Loading branch information
nilsreichardt committed Oct 12, 2024
1 parent 0911bd4 commit 05f64e0
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 0 deletions.
54 changes: 54 additions & 0 deletions app/lib/ads/ads_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@ import 'dart:async';

import 'package:flutter/foundation.dart';
import 'package:google_mobile_ads/google_mobile_ads.dart';
import 'package:key_value_store/key_value_store.dart';
import 'package:platform_check/platform_check.dart';
import 'package:remote_configuration/remote_configuration.dart';
import 'package:sharezone/sharezone_plus/subscription_service/subscription_service.dart';

class AdsController extends ChangeNotifier {
final SubscriptionService subscriptionService;
final RemoteConfiguration remoteConfiguration;
final KeyValueStore keyValueStore;

/// Defines if ads are visible for the current user.
bool areAdsVisible = false;
Expand All @@ -17,6 +19,7 @@ class AdsController extends ChangeNotifier {
AdsController({
required this.subscriptionService,
required this.remoteConfiguration,
required this.keyValueStore,
}) {
if (remoteConfiguration.getBool('ads_enabled')) {
_initializeMobileAdsSDK();
Expand Down Expand Up @@ -78,6 +81,57 @@ class AdsController extends ChangeNotifier {
);
}

Future<void> maybeShowFullscreenAd() async {
if (areAdsVisible && _shouldShowFullscreenAd()) {
await _showFullscreenAd(adUnitId: getAdUnitId());
}
}

bool _shouldShowFullscreenAd() {
final editingHwCounter =
keyValueStore.getInt('homework-editing-counter') ?? 0;
final creatingHwCounter =
keyValueStore.getInt('homework-creating-counter') ?? 0;
final sum = editingHwCounter + creatingHwCounter;

if (sum == 0) {
// For a better user experience, we don't want to show an ad when the user
// shows his first homework. Technically, the sum should then be 1, but
// since we're not waiting for the counter to increment, we need to check
// for 0.
return false;
}

return sum % 5 == 0;
}

Future<void> _showFullscreenAd({
required String adUnitId,
}) async {
InterstitialAd.load(
adUnitId: adUnitId,
request: createAdRequest(),
adLoadCallback: InterstitialAdLoadCallback(
onAdLoaded: (ad) {
ad.fullScreenContentCallback = FullScreenContentCallback(
onAdFailedToShowFullScreenContent: (ad, err) {
ad.dispose();
},
onAdDismissedFullScreenContent: (ad) {
ad.dispose();
},
);

debugPrint('$ad loaded.');
ad.show();
},
onAdFailedToLoad: (LoadAdError error) {
debugPrint('InterstitialAd failed to load: $error');
},
),
);
}

@override
void dispose() {
_subscription?.cancel();
Expand Down
4 changes: 4 additions & 0 deletions app/lib/homework/homework_dialog/homework_dialog.dart
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart' as bloc_lib show BlocProvider;
import 'package:flutter_bloc/flutter_bloc.dart' hide BlocProvider;
import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart' hide Date;
import 'package:key_value_store/key_value_store.dart';
import 'package:platform_check/platform_check.dart';
import 'package:provider/provider.dart';
import 'package:sharezone/filesharing/dialog/attach_file.dart';
Expand Down Expand Up @@ -75,6 +76,7 @@ class _HomeworkDialogState extends State<HomeworkDialog> {
final szContext = BlocProvider.of<SharezoneContext>(context);
final analytics = szContext.analytics;
final holidayManager = BlocProvider.of<HolidayBloc>(context).holidayManager;
final keyValueStore = context.read<KeyValueStore>();

late NextLessonCalculator nextLessonCalculator;
if (widget.nextLessonCalculator != null) {
Expand Down Expand Up @@ -108,6 +110,7 @@ class _HomeworkDialogState extends State<HomeworkDialog> {
nextSchooldayCalculator: nextSchooldayCalculator,
markdownAnalytics: markdownAnalytics,
analytics: analytics,
keyValueStore: keyValueStore,
);
return value;
});
Expand All @@ -119,6 +122,7 @@ class _HomeworkDialogState extends State<HomeworkDialog> {
nextSchooldayCalculator: nextSchooldayCalculator,
markdownAnalytics: markdownAnalytics,
analytics: analytics,
keyValueStore: keyValueStore,
);
}
}
Expand Down
4 changes: 4 additions & 0 deletions app/lib/homework/homework_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import 'package:flutter/material.dart';
import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart'
hide StudentHomeworkPageBloc;
import 'package:provider/provider.dart';
import 'package:sharezone/ads/ads_controller.dart';
import 'package:sharezone/homework/homework_dialog/homework_dialog.dart';
import 'package:sharezone_widgets/sharezone_widgets.dart';
import 'package:user/user.dart';
Expand Down Expand Up @@ -41,6 +42,9 @@ Future<void> openHomeworkDialogAndShowConfirmationIfSuccessful(
),
);
if (successful == true && context.mounted) {
final adsController = context.read<AdsController>();
adsController.maybeShowFullscreenAd();

await showUserConfirmationOfHomeworkArrival(context: context);
}
}
Expand Down
7 changes: 7 additions & 0 deletions app/lib/main/sharezone_bloc_providers.dart
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik_setup.dart';
import 'package:holidays/holidays.dart' hide State;
import 'package:http/http.dart' as http;
import 'package:key_value_store/in_memory_key_value_store.dart';
import 'package:key_value_store/key_value_store.dart';
import 'package:provider/provider.dart';
import 'package:provider/single_child_widget.dart';
import 'package:sharezone/account/account_page_bloc_factory.dart';
Expand Down Expand Up @@ -334,6 +335,10 @@ class _SharezoneBlocProvidersState extends State<SharezoneBlocProviders> {
firestore: widget.blocDependencies.firestore,
functions: widget.blocDependencies.functions,
);

final keyValueStore =
FlutterKeyValueStore(widget.blocDependencies.sharedPreferences);

// In the past we used BlocProvider for everything (even non-bloc classes).
// This forced us to use BlocProvider wrapper classes for non-bloc entities,
// Provider allows us to skip using these wrapper classes.
Expand Down Expand Up @@ -485,9 +490,11 @@ class _SharezoneBlocProvidersState extends State<SharezoneBlocProviders> {
create: (context) => AdsController(
subscriptionService: subscriptionService,
remoteConfiguration: widget.blocDependencies.remoteConfiguration,
keyValueStore: keyValueStore,
),
lazy: false,
),
Provider<KeyValueStore>.value(value: keyValueStore)
];

mainBlocProviders = <BlocProvider>[
Expand Down

0 comments on commit 05f64e0

Please sign in to comment.