Skip to content

Commit 4658009

Browse files
runnerrunner
runner
authored and
runner
committed
Release
1 parent ec0f7ce commit 4658009

File tree

19 files changed

+209
-40
lines changed

19 files changed

+209
-40
lines changed

SourceCode/Private/Core/Properties/USRVSdkProperties.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@
1010
NSString *const kUnityServicesLocalStorageFilePrefix = @"UnityAdsStorage-";
1111
NSString *const kUnityServicesWebviewBranchInfoDictionaryKey = @"UADSWebviewBranch";
1212
NSString *const kUnityServicesWebviewConfigInfoDictionaryKey = @"UADSWebviewConfig";
13-
NSString *const kUnityServicesVersionName = @"4.2.0";
13+
NSString *const kUnityServicesVersionName = @"4.2.1";
1414
NSString *const kUnityServicesFlavorDebug = @"debug";
1515
NSString *const kUnityServicesFlavorRelease = @"release";
1616
NSString *const kChinaIsoAlpha2Code = @"CN";
1717
NSString *const kChinaIsoAlpha3Code = @"CHN";
18-
int const kUnityServicesVersionCode = 4200;
18+
int const kUnityServicesVersionCode = 4210;
1919

2020
@implementation USRVSdkProperties
2121

SourceCode/Private/GMAScar/GMAAdLoaders/GMAAdLoaderStrategy/Interstitial/GMAGenericAdsDelegateObject/GMAAdDelegateBase.m

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ - (void)willDismissAd: (id)ad {
5959
- (void)didDismissAd: (id)ad {
6060
[_quartileEventsStream invalidate];
6161
_quartileEventsStream = nil;
62+
_timer = nil;
6263
[_eventSender sendEvent: [GMAWebViewEvent newAdClosedWithMeta: _meta]];
6364
}
6465

SourceCode/Private/GMAScar/GMABridges/GMADelegatesFactory/GMADelegatesFactory.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#import <Foundation/Foundation.h>
22
#import "GMAInterstitialAdDelegateProxy.h"
33
#import "GMARewardedAdDelegateProxy.h"
4+
#import "UADSTimerFactory.h"
5+
46
NS_ASSUME_NONNULL_BEGIN
57

68
@protocol GMADelegatesFactory <NSObject>
@@ -17,7 +19,7 @@ NS_ASSUME_NONNULL_BEGIN
1719

1820
+ (instancetype)newWithEventSender: (id<UADSWebViewEventSender>)eventSender
1921
errorHandler: (id<UADSErrorHandler>)errorHandler
20-
timer: (id<UADSRepeatableTimer>)timer;
22+
timerFactory: (id<UADSTimerFactory>)timerFactory;
2123

2224
@end
2325

SourceCode/Private/GMAScar/GMABridges/GMADelegatesFactory/GMADelegatesFactory.m

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
@interface GMADelegatesBaseFactory ()
66
@property (nonatomic, strong) id<UADSWebViewEventSender> eventSender;
77
@property (nonatomic, strong) id<UADSErrorHandler> errorHandler;
8-
@property (nonatomic, strong) id<UADSRepeatableTimer> timer;
8+
@property (nonatomic, strong) id<UADSTimerFactory> timerFactory;
99
@end
1010

1111
@implementation GMADelegatesBaseFactory
@@ -14,17 +14,17 @@ + (instancetype)newWithEventSender: (id<UADSWebViewEventSender>)eventSender
1414
errorHandler: (id<UADSErrorHandler>)errorHandler {
1515
return [GMADelegatesBaseFactory newWithEventSender: eventSender
1616
errorHandler: errorHandler
17-
timer: [UADSTimerWithAppLifeCycle defaultTimer]];
17+
timerFactory: [UADSTimerFactoryBase new]];
1818
}
1919

2020
+ (instancetype)newWithEventSender: (id<UADSWebViewEventSender>)eventSender
2121
errorHandler: (id<UADSErrorHandler>)errorHandler
22-
timer: (id<UADSRepeatableTimer>)timer {
22+
timerFactory: (id<UADSTimerFactory>)timerFactory {
2323
GMADelegatesBaseFactory *factory = [GMADelegatesBaseFactory new];
2424

2525
factory.eventSender = eventSender;
2626
factory.errorHandler = errorHandler;
27-
factory.timer = timer;
27+
factory.timerFactory = timerFactory;
2828
return factory;
2929
}
3030

@@ -34,15 +34,15 @@ - (nonnull GMAInterstitialAdDelegateProxy *)interstitialDelegate: (nonnull GMAAd
3434
andErrorHandler: _errorHandler
3535
andSender: _eventSender
3636
andCompletion: completion
37-
andTimer: _timer];
37+
andTimer: [_timerFactory timerWithAppLifeCycle]];
3838
}
3939

4040
- (nonnull GMARewardedAdDelegateProxy *)rewardedDelegate: (nonnull GMAAdMetaData *)meta {
4141
return [GMARewardedAdDelegateProxy newWithMetaData: meta
4242
andErrorHandler: _errorHandler
4343
andSender: _eventSender
4444
andCompletion: [UADSAnyCompletion new]
45-
andTimer: _timer];
45+
andTimer: [_timerFactory timerWithAppLifeCycle]];
4646
}
4747

4848
@end

SourceCode/Private/Tools/Timer/UADSTimer.m

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,14 +69,14 @@ - (void)invalidate {
6969
}
7070

7171
- (void)pause {
72-
if (self.isValid) {
72+
if (self.isValid && self.wasInitialized) {
7373
self.remainingTime = [self.timer.fireDate timeIntervalSinceNow];
7474
[self invalidate];
7575
}
7676
}
7777

7878
- (void)resume {
79-
if (!self.isValid) {
79+
if (!self.isValid && self.wasInitialized) {
8080
[self scheduleTimerWithTimeInterval: self.remainingTime];
8181
}
8282
}
@@ -85,4 +85,8 @@ - (BOOL)isValid {
8585
return self.timer && self.timer.isValid;
8686
}
8787

88+
- (BOOL)wasInitialized {
89+
return self.timeIntervals && self.timerBlock;
90+
}
91+
8892
@end
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#import <Foundation/Foundation.h>
2+
3+
#import "UADSTimer.h"
4+
5+
NS_ASSUME_NONNULL_BEGIN
6+
7+
@protocol UADSTimerFactory <NSObject>
8+
- (id<UADSRepeatableTimer>)timerWithAppLifeCycle;
9+
@end
10+
11+
@interface UADSTimerFactoryBase : NSObject <UADSTimerFactory>
12+
13+
@end
14+
15+
NS_ASSUME_NONNULL_END
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#import "UADSTimerFactory.h"
2+
#import "UADSTimerWithAppLifeCycle.h"
3+
4+
@implementation UADSTimerFactoryBase
5+
6+
- (nonnull id<UADSRepeatableTimer>)timerWithAppLifeCycle {
7+
return [UADSTimerWithAppLifeCycle defaultTimer];
8+
}
9+
10+
@end

SourceCode/Private/Tools/WeakProxy/NSObject+WeakProxy.m

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,3 @@
1-
//
2-
// NSObject+WeakProxy.m
3-
// UnityAds
4-
//
5-
// Created by Alex Crowe on 2020-10-13.
6-
//
7-
81
#import "NSObject+WeakProxy.h"
92
#import "UADSWeakProxy.h"
103

Tests/UnityAdsTests/GMAInfo/GMAInterstitialAdDelegateProxy/GMAInterstitialAdDelegateProxyTests.m

Lines changed: 59 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,18 @@
1111
#import "GMAError.h"
1212
#import "GMATestCommonConstants.h"
1313
#import "UADSRepeatableTimerMock.h"
14+
#import "UADSTimerFactoryMock.h"
15+
#import "XCTestCase+Convenience.h"
1416

1517
@interface GMAInterstitialAdDelegateProxyTests : XCTestCase
1618
@property (nonatomic, strong) USRVWebViewAppMock *webAppMock;
17-
@property (nonatomic, strong) UADSRepeatableTimerMock *timerMock;
19+
@property (nonatomic, strong) UADSTimerFactoryMock *timerFactoryMock;
1820
@end
1921

2022
@implementation GMAInterstitialAdDelegateProxyTests
2123

2224
- (void)setUp {
23-
_timerMock = [UADSRepeatableTimerMock new];
25+
_timerFactoryMock = [UADSTimerFactoryMock new];
2426
_webAppMock = [USRVWebViewAppMock new];
2527
[USRVWebViewApp setCurrentApp: _webAppMock];
2628
}
@@ -148,7 +150,7 @@ - (void)test_no_quarlites_events_after_did_dismiss {
148150
[delegateToTest interstitialWillPresentScreen: self.fakeAdObject];
149151
[self simulateQuartilesPlayed: 2];
150152
[delegateToTest interstitialDidDismissScreen: self.fakeAdObject];
151-
XCTAssertTrue(_timerMock.invalidateCalled);
153+
XCTAssertTrue(self.timerFactoryMock.lastTimerMock.invalidateCalled);
152154
GMAAdMetaData *meta = self.defaultMeta;
153155
NSArray<GMAWebViewEvent *> *expectedEvents = @[
154156
[GMAWebViewEvent newAdStartedWithMeta: meta],
@@ -260,7 +262,7 @@ - (void)test_did_fail_sends_id_error_and_code {
260262
}
261263

262264
- (void)simulateQuartilesPlayed: (NSInteger)count {
263-
[_timerMock fire: count];
265+
[self.timerFactoryMock.lastTimerMock fire: count];
264266
}
265267

266268
- (void)validateExpectedEvents: (NSArray<GMAWebViewEvent *> *)expectedEvents {
@@ -313,7 +315,59 @@ - (GMAAdMetaData *)defaultMeta {
313315

314316
return [GMADelegatesBaseFactory newWithEventSender: eventSender
315317
errorHandler: errorHandler
316-
timer: _timerMock];
318+
timerFactory: self.timerFactoryMock];
319+
}
320+
321+
- (void)test_factory_not_crash_if_ad_not_started_before_background {
322+
id<UADSWebViewEventSender>eventSender = [UADSWebViewEventSenderBase new];
323+
id<UADSErrorHandler>errorHandler = [UADSWebViewErrorHandler newWithEventSender: eventSender];
324+
325+
[GMADelegatesBaseFactory newWithEventSender: eventSender
326+
errorHandler: errorHandler];
327+
328+
[self postDidEnterBackground];
329+
[self postDidBecomeActive];
330+
}
331+
332+
- (void)test_interstitial_delegate_not_crash_if_ad_not_started_before_background {
333+
id<UADSWebViewEventSender>eventSender = [UADSWebViewEventSenderBase new];
334+
id<UADSErrorHandler>errorHandler = [UADSWebViewErrorHandler newWithEventSender: eventSender];
335+
336+
GMADelegatesBaseFactory *factory = [GMADelegatesBaseFactory newWithEventSender: eventSender
337+
errorHandler: errorHandler];
338+
339+
[factory interstitialDelegate: self.defaultMeta
340+
andCompletion: [UADSAnyCompletion new]];
341+
342+
[self postDidEnterBackground];
343+
[self postDidBecomeActive];
344+
}
345+
346+
- (void)test_no_quartile_events_sent_after_dismiss_ad {
347+
id<UADSWebViewEventSender>eventSender = [UADSWebViewEventSenderBase new];
348+
id<UADSErrorHandler>errorHandler = [UADSWebViewErrorHandler newWithEventSender: eventSender];
349+
350+
GMADelegatesBaseFactory *factory = [GMADelegatesBaseFactory newWithEventSender: eventSender
351+
errorHandler: errorHandler];
352+
353+
@autoreleasepool {
354+
GMAInterstitialAdDelegateProxy *delegateToTest = [factory interstitialDelegate: self.defaultMeta
355+
andCompletion: [UADSAnyCompletion new]];
356+
357+
[delegateToTest interstitialWillPresentScreen: self.fakeAdObject];
358+
[delegateToTest adDidDismissFullScreenContent: self.fakeAdObject];
359+
}
360+
[self postDidEnterBackground];
361+
[self postDidBecomeActive];
362+
GMAAdMetaData *meta = self.defaultMeta;
363+
NSArray<GMAWebViewEvent *> *expectedEvents = @[
364+
[GMAWebViewEvent newAdStartedWithMeta: meta],
365+
[GMAWebViewEvent newAdSkippedWithMeta: meta],
366+
[GMAWebViewEvent newAdClosedWithMeta: meta],
367+
];
368+
369+
[self waitForTimeInterval: 0.5];
370+
[self validateExpectedEvents: expectedEvents];
317371
}
318372

319373
@end

Tests/UnityAdsTests/GMAInfo/GMARewardedAdDelegateProxy/GMARewardedAdDelegateProxyTests.m

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,18 @@
1111
#import "GMAError.h"
1212
#import "GMATestCommonConstants.h"
1313
#import "UADSRepeatableTimerMock.h"
14+
#import "UADSTimerFactoryMock.h"
15+
#import "XCTestCase+Convenience.h"
1416

1517
@interface GMARewardedAdDelegateProxyTests : XCTestCase
1618
@property (nonatomic, strong) USRVWebViewAppMock *webAppMock;
17-
@property (nonatomic, strong) UADSRepeatableTimerMock *timerMock;
19+
@property (nonatomic, strong) UADSTimerFactoryMock *timerFactoryMock;
1820
@end
1921

2022
@implementation GMARewardedAdDelegateProxyTests
2123

2224
- (void)setUp {
23-
_timerMock = [UADSRepeatableTimerMock new];
25+
_timerFactoryMock = [UADSTimerFactoryMock new];
2426
_webAppMock = [USRVWebViewAppMock new];
2527
[USRVWebViewApp setCurrentApp: _webAppMock];
2628
}
@@ -219,7 +221,7 @@ - (void)test_did_fail_sends_id_error_and_code {
219221
}
220222

221223
- (void)simulateQuartilesPlayed: (NSInteger)count {
222-
[_timerMock fire: count];
224+
[self.timerFactoryMock.lastTimerMock fire: count];
223225
}
224226

225227
- (void)validateExpectedEvents: (NSArray<GMAWebViewEvent *> *)expectedEvents {
@@ -261,7 +263,47 @@ - (GMAAdMetaData *)defaultMeta {
261263

262264
return [GMADelegatesBaseFactory newWithEventSender: eventSender
263265
errorHandler: errorHandler
264-
timer: _timerMock];
266+
timerFactory: self.timerFactoryMock];
267+
}
268+
269+
- (void)test_rewarded_delegate_not_crash_if_ad_not_started_before_background {
270+
id<UADSWebViewEventSender>eventSender = [UADSWebViewEventSenderBase new];
271+
id<UADSErrorHandler>errorHandler = [UADSWebViewErrorHandler newWithEventSender: eventSender];
272+
273+
GMADelegatesBaseFactory *factory = [GMADelegatesBaseFactory newWithEventSender: eventSender
274+
errorHandler: errorHandler];
275+
276+
[factory rewardedDelegate: self.defaultMeta];
277+
278+
[self postDidEnterBackground];
279+
[self postDidBecomeActive];
280+
}
281+
282+
- (void)test_no_quartile_events_sent_after_dismiss_ad {
283+
id<UADSWebViewEventSender>eventSender = [UADSWebViewEventSenderBase new];
284+
id<UADSErrorHandler>errorHandler = [UADSWebViewErrorHandler newWithEventSender: eventSender];
285+
286+
GMADelegatesBaseFactory *factory = [GMADelegatesBaseFactory newWithEventSender: eventSender
287+
errorHandler: errorHandler];
288+
289+
@autoreleasepool {
290+
GMARewardedAdDelegateProxy *delegateToTest = [factory rewardedDelegate: self.defaultMeta];
291+
292+
[delegateToTest rewardedAdDidPresent: self.fakeAdObject];
293+
[delegateToTest adDidDismissFullScreenContent: self.fakeAdObject];
294+
}
295+
296+
[self postDidEnterBackground];
297+
[self postDidBecomeActive];
298+
GMAAdMetaData *meta = self.defaultMeta;
299+
NSArray<GMAWebViewEvent *> *expectedEvents = @[
300+
[GMAWebViewEvent newAdStartedWithMeta: meta],
301+
[GMAWebViewEvent newAdSkippedWithMeta: meta],
302+
[GMAWebViewEvent newAdClosedWithMeta: meta],
303+
];
304+
305+
[self waitForTimeInterval: 0.5];
306+
[self validateExpectedEvents: expectedEvents];
265307
}
266308

267309
@end
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#import <Foundation/Foundation.h>
2+
#import "UADSTimerFactory.h"
3+
#import "UADSRepeatableTimerMock.h"
4+
5+
NS_ASSUME_NONNULL_BEGIN
6+
7+
@interface UADSTimerFactoryMock : NSObject <UADSTimerFactory>
8+
@property (nonatomic, strong) NSMutableArray *timerMocks;
9+
- (UADSRepeatableTimerMock *)lastTimerMock;
10+
@end
11+
12+
NS_ASSUME_NONNULL_END
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#import "UADSTimerFactoryMock.h"
2+
#import "UADSTools.h"
3+
@implementation UADSTimerFactoryMock
4+
5+
- (instancetype)init {
6+
SUPER_INIT;
7+
_timerMocks = [NSMutableArray array];
8+
return self;
9+
}
10+
11+
- (nonnull id<UADSRepeatableTimer>)timerWithAppLifeCycle {
12+
UADSRepeatableTimerMock *mock = [UADSRepeatableTimerMock new];
13+
14+
[self.timerMocks addObject: mock];
15+
return mock;
16+
}
17+
18+
- (UADSRepeatableTimerMock *)lastTimerMock {
19+
return self.timerMocks.lastObject;
20+
}
21+
22+
@end

Tests/UnityAdsTests/Tools/Timer/UADSAppLifeCycleListenerBaseTests.m

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,4 @@ - (void)test_calls_blocks_on_lifecycle_events {
2929
[self postDidEnterBackground];
3030
}
3131

32-
- (void)postDidBecomeActive {
33-
[[NSNotificationCenter defaultCenter] postNotificationName: UIApplicationDidBecomeActiveNotification
34-
object: nil];
35-
}
36-
37-
- (void)postDidEnterBackground {
38-
[[NSNotificationCenter defaultCenter] postNotificationName: UIApplicationDidEnterBackgroundNotification
39-
object: nil];
40-
}
41-
4232
@end

0 commit comments

Comments
 (0)