-
Notifications
You must be signed in to change notification settings - Fork 266
Expand file tree
/
Copy pathOSAttributedFocusTimeProcessor.m
More file actions
134 lines (112 loc) · 5.63 KB
/
OSAttributedFocusTimeProcessor.m
File metadata and controls
134 lines (112 loc) · 5.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/**
* Modified MIT License
*
* Copyright 2019 OneSignal
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* 1. The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* 2. All copies of substantial portions of the Software may only be used in connection
* with services provided by OneSignal.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#import <UIKit/UIKit.h>
#import <OneSignalCore/OneSignalCore.h>
#import "OSMacros.h"
#import "OneSignalFramework.h"
#import "OSAttributedFocusTimeProcessor.h"
#import <OneSignalUser/OneSignalUser.h>
@interface OneSignal ()
+ (void)sendSessionEndOutcomes:(NSNumber*)totalTimeActive params:(OSFocusCallParams *)params onSuccess:(OSResultSuccessBlock _Nonnull)successBlock onFailure:(OSFailureBlock _Nonnull)failureBlock;
@end
@implementation OSAttributedFocusTimeProcessor {
NSTimer* restCallTimer;
}
static let ATTRIBUTED_MIN_SESSION_TIME_SEC = 1;
static let DELAY_TIME = 30;
- (instancetype)init {
self = [super init];
[OSBackgroundTaskManager setTaskInvalid:SESSION_OUTCOMES_TASK];
return self;
}
- (int)getMinSessionTime {
return ATTRIBUTED_MIN_SESSION_TIME_SEC;
}
- (NSString*)unsentActiveTimeUserDefaultsKey {
return OSUD_UNSENT_ACTIVE_TIME_ATTRIBUTED;
}
- (void)sendOnFocusCall:(OSFocusCallParams *)params {
let unsentActive = [super getUnsentActiveTime];
let totalTimeActive = unsentActive + params.timeElapsed;
[OneSignalLog onesignalLog:ONE_S_LL_DEBUG
message:[NSString stringWithFormat:@"sendOnFocusCall attributed with totalTimeActive %f", totalTimeActive]];
[super saveUnsentActiveTime:totalTimeActive];
[OneSignalLog onesignalLog:ONE_S_LL_DEBUG message:[NSString stringWithFormat:@"OSAttributedFocusTimeProcessor:sendSessionTime of %@", @(params.timeElapsed)]];
[OneSignalUserManagerImpl.sharedInstance sendSessionTime:@(params.timeElapsed)];
[self sendOnFocusCallWithParams:params totalTimeActive:totalTimeActive];
}
- (void)sendUnsentActiveTime:(OSFocusCallParams *)params {
let unsentActive = [super getUnsentActiveTime];
[OneSignalLog onesignalLog:ONE_S_LL_DEBUG
message:[NSString stringWithFormat:@"sendUnsentActiveTime attributed with unsentActive %f", unsentActive]];
[self sendOnFocusCallWithParams:params totalTimeActive:unsentActive];
}
- (void)sendOnFocusCallWithParams:(OSFocusCallParams *)params totalTimeActive:(NSTimeInterval)totalTimeActive {
// Don't send influenced session with time < 1 seconds
if (totalTimeActive < 1) {
[OneSignalLog onesignalLog:ONE_S_LL_DEBUG message:[NSString stringWithFormat:@"sendSessionEndOutcomes not sending active time %f", totalTimeActive]];
return;
}
[OSBackgroundTaskManager beginBackgroundTask:SESSION_OUTCOMES_TASK];
if (params.onSessionEnded) {
[self sendBackgroundAttributedSessionTimeWithParams:params withTotalTimeActive:@(totalTimeActive)];
return;
}
restCallTimer = [NSTimer
scheduledTimerWithTimeInterval:DELAY_TIME
target:self
selector:@selector(sendBackgroundAttributedSessionTimeWithNSTimer:)
userInfo:@{@"params": params, @"time": @(totalTimeActive)}
repeats:false];
}
- (void)sendBackgroundAttributedSessionTimeWithNSTimer:(NSTimer*)timer {
let userInfo = (NSDictionary<NSString*, id>*)timer.userInfo;
let params = (OSFocusCallParams*)userInfo[@"params"];
let totalTimeActive = (NSNumber*)userInfo[@"time"];
[self sendBackgroundAttributedSessionTimeWithParams:params withTotalTimeActive:totalTimeActive];
}
- (void)sendBackgroundAttributedSessionTimeWithParams:(OSFocusCallParams *)params withTotalTimeActive:(NSNumber*)totalTimeActive {
[OneSignalLog onesignalLog:ONE_S_LL_DEBUG message:@"OSAttributedFocusTimeProcessor:sendBackgroundAttributedSessionTimeWithParams start"];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[OneSignal sendSessionEndOutcomes:totalTimeActive params:params onSuccess:^(NSDictionary *result) {
[OneSignalLog onesignalLog:ONE_S_LL_DEBUG message:@"sendBackgroundAttributed succeed"];
[super saveUnsentActiveTime:0];
[OSBackgroundTaskManager endBackgroundTask:SESSION_OUTCOMES_TASK];
} onFailure:^(NSError *error) {
[OneSignalLog onesignalLog:ONE_S_LL_ERROR message:@"sendBackgroundAttributed failed, will retry on next open"];
[OSBackgroundTaskManager endBackgroundTask:SESSION_OUTCOMES_TASK];
}];
});
}
- (void)cancelDelayedJob {
if (!restCallTimer)
return;
[restCallTimer invalidate];
restCallTimer = nil;
[OSBackgroundTaskManager endBackgroundTask:SESSION_OUTCOMES_TASK];
}
@end