151 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Mathematica
		
	
	
	
		
		
			
		
	
	
			151 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Mathematica
		
	
	
	
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								//  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
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 |