Skip to content

Commit 7e6ac03

Browse files
committed
feat(ads): implement AdService for ad management
- Create AdService class to handle ad operations - Add initialize() method for ad provider setup - Implement getAd() method to retrieve and wrap ads in AdFeedItem - Include error handling and logging for ad requests
1 parent 3bcd08f commit 7e6ac03

File tree

1 file changed

+59
-0
lines changed

1 file changed

+59
-0
lines changed

lib/ads/ad_service.dart

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
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

Comments
 (0)