151 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
			
		
		
	
	
			151 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
| //
 | |
| //  TATrackTimer.m
 | |
| //  ThinkingSDK
 | |
| //
 | |
| //  Created by Yangxiongon 2022/6/1.
 | |
| //  Copyright © 2022 thinking. All rights reserved.
 | |
| //
 | |
| 
 | |
| #import "TDTrackTimer.h"
 | |
| #import "TDTrackTimerItem.h"
 | |
| #import "TDLogging.h"
 | |
| 
 | |
| #if __has_include(<ThinkingDataCore/TDCoreDeviceInfo.h>)
 | |
| #import <ThinkingDataCore/TDCoreDeviceInfo.h>
 | |
| #else
 | |
| #import "TDCoreDeviceInfo.h"
 | |
| #endif
 | |
| 
 | |
| @interface TDTrackTimer ()
 | |
| @property (nonatomic, strong) NSMutableDictionary *events;
 | |
| 
 | |
| @end
 | |
| 
 | |
| @implementation TDTrackTimer
 | |
| 
 | |
| - (instancetype)init
 | |
| {
 | |
|     self = [super init];
 | |
|     if (self) {
 | |
|         self.events = [NSMutableDictionary dictionary];
 | |
|     }
 | |
|     return self;
 | |
| }
 | |
| 
 | |
| - (void)trackEvent:(NSString *)eventName withSystemUptime:(NSTimeInterval)systemUptime {
 | |
|     if (!eventName.length) {
 | |
|         return;
 | |
|     }
 | |
|     TDTrackTimerItem *item = [[TDTrackTimerItem alloc] init];
 | |
|     item.beginTime = systemUptime ?: [TDCoreDeviceInfo bootTime];
 | |
|     @synchronized (self) {
 | |
|         self.events[eventName] = item;
 | |
|     }
 | |
|     TDLogInfo(@"time event success");
 | |
| }
 | |
| 
 | |
| - (void)enterForegroundWithSystemUptime:(NSTimeInterval)systemUptime {
 | |
|     @synchronized (self) {
 | |
|         NSArray *keys = [self.events allKeys];
 | |
|         for (NSString *key in keys) {
 | |
|             TDTrackTimerItem *item = self.events[key];
 | |
|             item.beginTime = systemUptime;
 | |
|             if (item.enterBackgroundTime == 0) {
 | |
|                 item.backgroundDuration = 0;
 | |
|             } else {
 | |
|                 item.backgroundDuration = systemUptime - item.enterBackgroundTime + item.backgroundDuration;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| - (void)enterBackgroundWithSystemUptime:(NSTimeInterval)systemUptime {
 | |
|     @synchronized (self) {
 | |
|         NSArray *keys = [self.events allKeys];
 | |
|         for (NSString *key in keys) {
 | |
|             TDTrackTimerItem *item = self.events[key];
 | |
|             item.enterBackgroundTime = systemUptime;
 | |
|             item.foregroundDuration = systemUptime - item.beginTime + item.foregroundDuration;
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| - (NSTimeInterval)foregroundDurationOfEvent:(NSString *)eventName isActive:(BOOL)isActive systemUptime:(NSTimeInterval)systemUptime {
 | |
|     if (!eventName.length) {
 | |
|         return 0;
 | |
|     }
 | |
|     TDTrackTimerItem *item = nil;
 | |
|     @synchronized (self) {
 | |
|         item = self.events[eventName];
 | |
|     }
 | |
|     if (!item) {
 | |
|         return 0;
 | |
|     }
 | |
|     
 | |
|     if (isActive) {
 | |
|         NSTimeInterval duration = systemUptime - item.beginTime + item.foregroundDuration;
 | |
|         return [self validateDuration:duration eventName:eventName];
 | |
|     } else {
 | |
|         return [self validateDuration:item.foregroundDuration eventName:eventName];
 | |
|     }
 | |
|     
 | |
| }
 | |
| 
 | |
| - (NSTimeInterval)backgroundDurationOfEvent:(NSString *)eventName isActive:(BOOL)isActive systemUptime:(NSTimeInterval)systemUptime {
 | |
|     if (!eventName.length) {
 | |
|         return 0;
 | |
|     }
 | |
|     TDTrackTimerItem *item = nil;
 | |
|     @synchronized (self) {
 | |
|         item = self.events[eventName];
 | |
|     }
 | |
|     if (!item) {
 | |
|         return 0;
 | |
|     }
 | |
|     if (isActive) {
 | |
|         return [self validateDuration:item.backgroundDuration eventName:eventName];
 | |
|     } else {
 | |
|         NSTimeInterval duration = 0;
 | |
|         if (item.enterBackgroundTime == 0) {
 | |
|             duration = 0;
 | |
|         } else {
 | |
|             duration = systemUptime - item.enterBackgroundTime + item.backgroundDuration;
 | |
|         }
 | |
|         return [self validateDuration:duration eventName:eventName];
 | |
|     }
 | |
| }
 | |
| 
 | |
| - (void)removeEvent:(NSString *)eventName {
 | |
|     @synchronized (self) {
 | |
|         [self.events removeObjectForKey:eventName];
 | |
|     }
 | |
| }
 | |
| 
 | |
| - (BOOL)isExistEvent:(NSString *)eventName {
 | |
|     BOOL result = NO;
 | |
|     @synchronized (self) {
 | |
|         result = self.events[eventName] != nil;
 | |
|     }
 | |
|     return result;
 | |
| }
 | |
| 
 | |
| - (void)clear {
 | |
|     @synchronized (self) {
 | |
|         [self.events removeAllObjects];
 | |
|     }
 | |
| }
 | |
| 
 | |
| //MARK: - Private Methods
 | |
| 
 | |
| - (NSTimeInterval)validateDuration:(NSTimeInterval)duration eventName:(NSString *)eventName {
 | |
|     NSInteger max = 3600 * 24;
 | |
|     if (duration >= max) {
 | |
|         return max;
 | |
|     }
 | |
|     return duration;
 | |
| }
 | |
| 
 | |
| @end
 | |
| 
 | |
| 
 |