Skip to content

Commit ad6010f

Browse files
committed
refactor(ads): improve AdService logging and error handling
- Prefix AdService log messages with 'AdService:' for consistent naming - Add more granular logging throughout the class - Enhance error logging with stack traces where applicable - Refactor some conditional logic for clarity
1 parent aa89234 commit ad6010f

File tree

1 file changed

+40
-41
lines changed

1 file changed

+40
-41
lines changed

lib/ads/ad_service.dart

Lines changed: 40 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,11 @@ class AdService {
3434
/// This should be called once at application startup to ensure all
3535
/// integrated ad SDKs are properly initialized.
3636
Future<void> initialize() async {
37-
_logger.info('Initializing AdService...');
37+
_logger.info('AdService: Initializing AdService...');
3838
for (final provider in _adProviders.values) {
3939
await provider.initialize();
4040
}
41-
_logger.info('AdService initialized.');
41+
_logger.info('AdService: AdService initialized.');
4242
}
4343

4444
/// Retrieves a loaded inline ad (native or banner) for display in a feed.
@@ -59,6 +59,7 @@ class AdService {
5959
required AdThemeStyle adThemeStyle,
6060
HeadlineImageStyle? headlineImageStyle,
6161
}) async {
62+
_logger.info('AdService: getFeedAd called for adType: $adType');
6263
return _loadInlineAd(
6364
adConfig: adConfig,
6465
adType: adType,
@@ -83,30 +84,31 @@ class AdService {
8384
required AdConfig adConfig,
8485
required AdThemeStyle adThemeStyle,
8586
}) async {
87+
_logger.info('AdService: getInterstitialAd called.');
8688
if (!adConfig.enabled) {
87-
_logger.info('Ads are globally disabled in RemoteConfig.');
89+
_logger.info('AdService: Ads are globally disabled in RemoteConfig.');
8890
return null;
8991
}
9092

9193
// Check if interstitial ads are enabled in the remote config.
9294
if (!adConfig.interstitialAdConfiguration.enabled) {
93-
_logger.info('Interstitial ads are disabled in RemoteConfig.');
95+
_logger.info('AdService: Interstitial ads are disabled in RemoteConfig.');
9496
return null;
9597
}
9698

9799
final primaryAdPlatform = adConfig.primaryAdPlatform;
98100
final adProvider = _adProviders[primaryAdPlatform];
99101

100102
if (adProvider == null) {
101-
_logger.warning('No AdProvider found for platform: $primaryAdPlatform');
103+
_logger.warning('AdService: No AdProvider found for platform: $primaryAdPlatform');
102104
return null;
103105
}
104106

105107
final platformAdIdentifiers =
106108
adConfig.platformAdIdentifiers[primaryAdPlatform];
107109
if (platformAdIdentifiers == null) {
108110
_logger.warning(
109-
'No AdPlatformIdentifiers found for platform: $primaryAdPlatform',
111+
'AdService: No AdPlatformIdentifiers found for platform: $primaryAdPlatform',
110112
);
111113
return null;
112114
}
@@ -116,13 +118,13 @@ class AdService {
116118

117119
if (adId == null || adId.isEmpty) {
118120
_logger.warning(
119-
'No interstitial ad ID configured for platform $primaryAdPlatform',
121+
'AdService: No interstitial ad ID configured for platform $primaryAdPlatform',
120122
);
121123
return null;
122124
}
123125

124126
_logger.info(
125-
'Requesting Interstitial ad from $primaryAdPlatform AdProvider with ID: $adId',
127+
'AdService: Requesting Interstitial ad from $primaryAdPlatform AdProvider with ID: $adId',
126128
);
127129
try {
128130
final loadedAd = await adProvider.loadInterstitialAd(
@@ -132,14 +134,14 @@ class AdService {
132134
);
133135

134136
if (loadedAd != null) {
135-
_logger.info('Interstitial ad successfully loaded.');
137+
_logger.info('AdService: Interstitial ad successfully loaded.');
136138
return loadedAd;
137139
} else {
138-
_logger.info('No Interstitial ad loaded by AdProvider.');
140+
_logger.info('AdService: No Interstitial ad loaded by AdProvider.');
139141
return null;
140142
}
141-
} catch (e) {
142-
_logger.severe('Error getting Interstitial ad from AdProvider: $e');
143+
} catch (e, s) {
144+
_logger.severe('AdService: Error getting Interstitial ad from AdProvider: $e', e, s);
143145
return null;
144146
}
145147
}
@@ -154,21 +156,16 @@ class AdService {
154156
///
155157
/// - [adConfig]: The remote configuration for ad display rules.
156158
/// - [adThemeStyle]: UI-agnostic theme properties for ad styling.
157-
/// - [headlineImageStyle]: The user's preference for feed layout,
158-
/// which can be used to request an appropriately sized ad.
159159
Future<InlineAd?> getInArticleAd({
160160
required AdConfig adConfig,
161161
required AdThemeStyle adThemeStyle,
162-
// headlineImageStyle is not directly used for in-article ad sizing,
163-
// but kept for consistency with AdService.getFeedAd.
164-
HeadlineImageStyle? headlineImageStyle,
165162
}) async {
163+
_logger.info('AdService: getInArticleAd called.');
166164
return _loadInlineAd(
167165
adConfig: adConfig,
168166
adType: AdType.banner, // In-article ads are now always banners
169167
adThemeStyle: adThemeStyle,
170168
feedAd: false,
171-
headlineImageStyle: headlineImageStyle,
172169
bannerAdShape: adConfig.articleAdConfiguration.bannerAdShape,
173170
);
174171
}
@@ -196,20 +193,27 @@ class AdService {
196193
HeadlineImageStyle? headlineImageStyle,
197194
BannerAdShape? bannerAdShape,
198195
}) async {
196+
_logger.info(
197+
'AdService: _loadInlineAd called for adType: $adType, feedAd: $feedAd',
198+
);
199199
// Check if ads are globally enabled and specifically for the context (feed or article).
200-
if (!adConfig.enabled ||
201-
(feedAd && !adConfig.feedAdConfiguration.enabled) ||
202-
(!feedAd && !adConfig.articleAdConfiguration.enabled)) {
203-
_logger.info(
204-
'Inline ads are disabled in RemoteConfig, either globally or for this context.',
205-
);
200+
if (!adConfig.enabled) {
201+
_logger.info('AdService: Ads are globally disabled in RemoteConfig.');
202+
return null;
203+
}
204+
if (feedAd && !adConfig.feedAdConfiguration.enabled) {
205+
_logger.info('AdService: Feed ads are disabled in RemoteConfig.');
206+
return null;
207+
}
208+
if (!feedAd && !adConfig.articleAdConfiguration.enabled) {
209+
_logger.info('AdService: In-article ads are disabled in RemoteConfig.');
206210
return null;
207211
}
208212

209213
// Ensure the requested adType is valid for inline ads.
210214
if (adType != AdType.native && adType != AdType.banner) {
211215
_logger.warning(
212-
'_loadInlineAd called with unsupported AdType: $adType. '
216+
'AdService: _loadInlineAd called with unsupported AdType: $adType. '
213217
'Expected AdType.native or AdType.banner.',
214218
);
215219
return null;
@@ -219,15 +223,15 @@ class AdService {
219223
final adProvider = _adProviders[primaryAdPlatform];
220224

221225
if (adProvider == null) {
222-
_logger.warning('No AdProvider found for platform: $primaryAdPlatform');
226+
_logger.warning('AdService: No AdProvider found for platform: $primaryAdPlatform');
223227
return null;
224228
}
225229

226230
final platformAdIdentifiers =
227231
adConfig.platformAdIdentifiers[primaryAdPlatform];
228232
if (platformAdIdentifiers == null) {
229233
_logger.warning(
230-
'No AdPlatformIdentifiers found for platform: $primaryAdPlatform',
234+
'AdService: No AdPlatformIdentifiers found for platform: $primaryAdPlatform',
231235
);
232236
return null;
233237
}
@@ -242,26 +246,21 @@ class AdService {
242246

243247
if (adId == null || adId.isEmpty) {
244248
_logger.warning(
245-
'No ad ID configured for platform $primaryAdPlatform and ad type $adType '
249+
'AdService: No ad ID configured for platform $primaryAdPlatform and ad type $adType '
246250
'for ${feedAd ? 'feed' : 'in-article'} placement.',
247251
);
248252
return null;
249253
}
250254

251255
_logger.info(
252-
'Requesting $adType ad from $primaryAdPlatform AdProvider with ID: $adId '
256+
'AdService: Requesting $adType ad from $primaryAdPlatform AdProvider with ID: $adId '
253257
'for ${feedAd ? 'feed' : 'in-article'} placement.',
254258
);
255259
try {
256260
InlineAd? loadedAd;
257-
// Determine the effective headlineImageStyle for the ad provider.
258261
// For in-article banner ads, bannerAdShape dictates the visual style.
259-
final effectiveHeadlineImageStyle =
260-
!feedAd && adType == AdType.banner && bannerAdShape != null
261-
? (bannerAdShape == BannerAdShape.square
262-
? HeadlineImageStyle.largeThumbnail
263-
: HeadlineImageStyle.smallThumbnail)
264-
: headlineImageStyle; // Otherwise, use the provided headlineImageStyle
262+
// For feed ads, headlineImageStyle is still relevant.
263+
final effectiveHeadlineImageStyle = feedAd ? headlineImageStyle : null;
265264

266265
switch (adType) {
267266
case AdType.native:
@@ -281,20 +280,20 @@ class AdService {
281280
case AdType.interstitial:
282281
case AdType.video:
283282
_logger.warning(
284-
'Attempted to load $adType ad using _loadInlineAd. This is not supported.',
283+
'AdService: Attempted to load $adType ad using _loadInlineAd. This is not supported.',
285284
);
286285
return null;
287286
}
288287

289288
if (loadedAd != null) {
290-
_logger.info('$adType ad successfully loaded.');
289+
_logger.info('AdService: $adType ad successfully loaded.');
291290
return loadedAd;
292291
} else {
293-
_logger.info('No $adType ad loaded by AdProvider.');
292+
_logger.info('AdService: No $adType ad loaded by AdProvider.');
294293
return null;
295294
}
296-
} catch (e) {
297-
_logger.severe('Error getting $adType ad from AdProvider: $e');
295+
} catch (e, s) {
296+
_logger.severe('AdService: Error getting $adType ad from AdProvider: $e', e, s);
298297
return null;
299298
}
300299
}

0 commit comments

Comments
 (0)