2024-07-27 13:13:42 +00:00
|
|
|
import 'dart:async';
|
2024-05-22 20:48:44 +00:00
|
|
|
import 'dart:developer';
|
|
|
|
|
|
2024-08-03 22:37:10 +00:00
|
|
|
import 'package:auto_route/auto_route.dart';
|
2024-05-22 20:48:44 +00:00
|
|
|
import 'package:flutter/widgets.dart';
|
2024-08-03 22:37:10 +00:00
|
|
|
import 'package:mnemo_cards/domain/router/dialogs.dart';
|
2024-05-22 20:48:44 +00:00
|
|
|
import 'package:yandex_mobileads/mobile_ads.dart';
|
|
|
|
|
|
2024-08-03 22:37:10 +00:00
|
|
|
import '../../main.dart';
|
|
|
|
|
|
2024-05-22 20:48:44 +00:00
|
|
|
class YandexAds {
|
|
|
|
|
static BannerAd createBanner(
|
|
|
|
|
BoxConstraints constraints, {
|
2024-07-24 23:35:38 +00:00
|
|
|
required String id,
|
2024-05-22 20:48:44 +00:00
|
|
|
String? key,
|
2024-07-27 13:13:42 +00:00
|
|
|
VoidCallback? onLoaded,
|
2024-05-22 20:48:44 +00:00
|
|
|
}) {
|
|
|
|
|
return BannerAd(
|
|
|
|
|
adUnitId: id,
|
|
|
|
|
// or 'demo-banner-yandex'
|
|
|
|
|
adSize: BannerAdSize.inline(
|
|
|
|
|
width: constraints.maxWidth.round(),
|
|
|
|
|
maxHeight: constraints.maxHeight.round(),
|
|
|
|
|
),
|
|
|
|
|
adRequest: const AdRequest(),
|
|
|
|
|
onAdLoaded: () {
|
|
|
|
|
log('Loaded $key');
|
|
|
|
|
onLoaded?.call();
|
|
|
|
|
},
|
|
|
|
|
onAdFailedToLoad: (error) {
|
|
|
|
|
// Ad failed to load with AdRequestError.
|
|
|
|
|
// Attempting to load a new ad from the onAdFailedToLoad() method is strongly discouraged.
|
|
|
|
|
},
|
|
|
|
|
onAdClicked: () {
|
|
|
|
|
// Called when a click is recorded for an ad.
|
|
|
|
|
},
|
|
|
|
|
onLeftApplication: () {
|
|
|
|
|
// Called when user is about to leave application (e.g., to go to the browser), as a result of clicking on the ad.
|
|
|
|
|
},
|
|
|
|
|
onReturnedToApplication: () {
|
|
|
|
|
// Called when user returned to application after click.
|
|
|
|
|
},
|
|
|
|
|
onImpression: (impressionData) {
|
|
|
|
|
// Called when an impression is recorded for an ad.
|
|
|
|
|
});
|
|
|
|
|
}
|
2024-07-27 13:13:42 +00:00
|
|
|
|
|
|
|
|
static RewardedAd? _preloadedAd;
|
2024-08-03 22:37:10 +00:00
|
|
|
static Completer? _showingAdCompleter;
|
2024-07-27 13:13:42 +00:00
|
|
|
|
|
|
|
|
static Future<RewardedAd?> loadRewardedAd() async {
|
|
|
|
|
final completer = Completer<RewardedAd?>();
|
|
|
|
|
final _rewardedAdLoader = await RewardedAdLoader.create(
|
|
|
|
|
onAdLoaded: (RewardedAd rewardedAd) {
|
|
|
|
|
_preloadedAd = rewardedAd;
|
|
|
|
|
completer.complete(rewardedAd);
|
|
|
|
|
},
|
|
|
|
|
onAdFailedToLoad: (error) {
|
|
|
|
|
completer.complete(null);
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
await _rewardedAdLoader.loadAd(
|
|
|
|
|
adRequestConfiguration: AdRequestConfiguration(
|
|
|
|
|
adUnitId: 'R-M-3761037-1',
|
|
|
|
|
),
|
|
|
|
|
);
|
|
|
|
|
return completer.future;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static Future<bool> showRewardedAd(
|
|
|
|
|
Function(Reward reward) onRewarded, {
|
|
|
|
|
maxAttempts = 2,
|
|
|
|
|
}) async {
|
2024-08-03 22:37:10 +00:00
|
|
|
if (_showingAdCompleter?.isCompleted == false) {
|
|
|
|
|
return false;
|
2024-07-27 13:13:42 +00:00
|
|
|
}
|
2024-08-03 22:37:10 +00:00
|
|
|
try {
|
|
|
|
|
_showingAdCompleter = Completer();
|
|
|
|
|
if (_preloadedAd == null) {
|
|
|
|
|
// final dialogCompleter = Completer();
|
|
|
|
|
// final dialogFuture =
|
|
|
|
|
// showErrorDialog('Загрузка...', completer: dialogCompleter);
|
|
|
|
|
try {
|
|
|
|
|
final _loadedAd = await loadRewardedAd().timeout(
|
|
|
|
|
Duration(seconds: 5),
|
|
|
|
|
);
|
|
|
|
|
if (_loadedAd == null) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
} finally {}
|
|
|
|
|
// dialogCompleter.complete();
|
|
|
|
|
// await dialogFuture;
|
|
|
|
|
// final frameCompleter = Completer();
|
|
|
|
|
// WidgetsBinding.instance.addPostFrameCallback((_) {
|
|
|
|
|
// frameCompleter.complete();
|
|
|
|
|
// });
|
|
|
|
|
// await frameCompleter;
|
2024-07-27 13:13:42 +00:00
|
|
|
}
|
2024-08-03 22:37:10 +00:00
|
|
|
final _ad = _preloadedAd;
|
|
|
|
|
_preloadedAd = null;
|
|
|
|
|
await _ad?.setAdEventListener(
|
|
|
|
|
eventListener: RewardedAdEventListener(
|
|
|
|
|
onAdDismissed: () {
|
|
|
|
|
_ad.destroy();
|
|
|
|
|
},
|
|
|
|
|
onAdFailedToShow: (e) {
|
|
|
|
|
_ad.destroy();
|
|
|
|
|
if (maxAttempts-- > 0) {
|
|
|
|
|
showRewardedAd(onRewarded, maxAttempts: maxAttempts);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
onAdShown: () {
|
|
|
|
|
// _ad.destroy();
|
|
|
|
|
},
|
|
|
|
|
onRewarded: (r) {
|
|
|
|
|
onRewarded(r);
|
|
|
|
|
_ad.destroy();
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
);
|
|
|
|
|
await _ad?.show();
|
|
|
|
|
final reward = await _ad?.waitForDismiss();
|
|
|
|
|
return reward != null;
|
|
|
|
|
} finally {
|
|
|
|
|
_showingAdCompleter?.complete();
|
|
|
|
|
}
|
2024-07-27 13:13:42 +00:00
|
|
|
}
|
2024-05-22 20:48:44 +00:00
|
|
|
}
|