|
| 1 | +import 'package:flutter_news_app_mobile_client_full_source_code/ads/ad_provider.dart'; |
| 2 | +import 'package:flutter_news_app_mobile_client_full_source_code/ads/models/ad_feed_item.dart'; |
| 3 | +import 'package:logging/logging.dart'; |
| 4 | +import 'package:uuid/uuid.dart'; |
| 5 | + |
| 6 | +/// {@template ad_service} |
| 7 | +/// A service responsible for managing and providing ads to the application. |
| 8 | +/// |
| 9 | +/// This service acts as an intermediary between the application's UI/logic |
| 10 | +/// and the underlying ad network providers (e.g., AdMob). It handles |
| 11 | +/// requesting ads and wrapping them in a generic [AdFeedItem] for use |
| 12 | +/// in the feed. |
| 13 | +/// {@endtemplate} |
| 14 | +class AdService { |
| 15 | + /// {@macro ad_service} |
| 16 | + /// |
| 17 | + /// Requires an [AdProvider] to be injected, which will be used to |
| 18 | + /// load ads from a specific ad network. |
| 19 | + AdService({required AdProvider adProvider, Logger? logger}) |
| 20 | + : _adProvider = adProvider, |
| 21 | + _logger = logger ?? Logger('AdService'); |
| 22 | + |
| 23 | + final AdProvider _adProvider; |
| 24 | + final Logger _logger; |
| 25 | + final Uuid _uuid = const Uuid(); |
| 26 | + |
| 27 | + /// Initializes the underlying ad provider. |
| 28 | + /// |
| 29 | + /// This should be called once at application startup. |
| 30 | + Future<void> initialize() async { |
| 31 | + _logger.info('Initializing AdService...'); |
| 32 | + await _adProvider.initialize(); |
| 33 | + _logger.info('AdService initialized.'); |
| 34 | + } |
| 35 | + |
| 36 | + /// Retrieves a loaded native ad wrapped as an [AdFeedItem]. |
| 37 | + /// |
| 38 | + /// This method delegates the ad loading to the injected [AdProvider]. |
| 39 | + /// If an ad is successfully loaded, it's wrapped in an [AdFeedItem] |
| 40 | + /// with a unique ID. |
| 41 | + /// |
| 42 | + /// Returns an [AdFeedItem] if an ad is available, otherwise `null`. |
| 43 | + Future<AdFeedItem?> getAd() async { |
| 44 | + _logger.info('Requesting native ad from AdProvider...'); |
| 45 | + try { |
| 46 | + final nativeAd = await _adProvider.loadNativeAd(); |
| 47 | + if (nativeAd != null) { |
| 48 | + _logger.info('Native ad successfully loaded and wrapped.'); |
| 49 | + return AdFeedItem(id: _uuid.v4(), nativeAd: nativeAd); |
| 50 | + } else { |
| 51 | + _logger.info('No native ad loaded by AdProvider.'); |
| 52 | + return null; |
| 53 | + } |
| 54 | + } catch (e) { |
| 55 | + _logger.severe('Error getting ad from AdProvider: $e'); |
| 56 | + return null; |
| 57 | + } |
| 58 | + } |
| 59 | +} |
0 commit comments