diff --git a/MVMCore/MVMCore/Session/MVMCoreSessionTimeHandler.m b/MVMCore/MVMCore/Session/MVMCoreSessionTimeHandler.m index 0a81b45..f0bf1b5 100644 --- a/MVMCore/MVMCore/Session/MVMCoreSessionTimeHandler.m +++ b/MVMCore/MVMCore/Session/MVMCoreSessionTimeHandler.m @@ -21,6 +21,7 @@ @interface MVMCoreSessionTimeHandler () +@property (strong, nonatomic) NSTimer *sessionWarningTimer; @property (strong, nonatomic) NSTimer *sessionTimer; // The time that we started the last session timer. @@ -74,13 +75,6 @@ } - (void)sessionTimeoutWarning { - - // Starts the timeout timer - if (!fequal(0, self.secondsUntilTimeout)) { - self.sessionTimer = [NSTimer scheduledTimerWithTimeInterval:self.secondsUntilTimeout target:self selector:@selector(sessionTimeout:) userInfo:nil repeats:NO]; - } else { - [self stopSessionTimer]; - } } - (void)sessionTimeout:(BOOL)whileInBackground { @@ -98,22 +92,22 @@ if (!self.sessionTimedOut) { + [self.sessionWarningTimer invalidate]; [self.sessionTimer invalidate]; self.secondsUntilWarning = [self timeUntilWarning]; self.secondsUntilTimeout = [self timeUntilTimeout]; - if (!fequal(0, self.secondsUntilWarning) || !fequal(0, self.secondsUntilTimeout)) { + if (!fequal(0, self.secondsUntilTimeout)) { self.sessionBeingTimed = YES; self.timeTimerStarted = [NSDate timeIntervalSinceReferenceDate]; } // Only start physical timer if active, otherwise will begin once entering foreground. - if ([UIApplication sharedApplication].applicationState == UIApplicationStateActive) { + if ([UIApplication sharedApplication].applicationState == UIApplicationStateActive && !fequal(0, self.secondsUntilTimeout)) { if (!fequal(0, self.secondsUntilWarning)) { - self.sessionTimer = [NSTimer scheduledTimerWithTimeInterval:self.secondsUntilWarning target:self selector:@selector(sessionTimeoutWarning) userInfo:nil repeats:NO]; - } else if (!fequal(0, self.secondsUntilTimeout)) { - self.sessionTimer = [NSTimer scheduledTimerWithTimeInterval:self.secondsUntilTimeout target:self selector:@selector(sessionTimeout:) userInfo:nil repeats:NO]; + self.sessionWarningTimer = [NSTimer scheduledTimerWithTimeInterval:self.secondsUntilWarning target:self selector:@selector(sessionTimeoutWarning) userInfo:nil repeats:NO]; } + self.sessionTimer = [NSTimer scheduledTimerWithTimeInterval:self.secondsUntilTimeout target:self selector:@selector(sessionTimeout:) userInfo:nil repeats:NO]; } } }); @@ -124,6 +118,8 @@ // nil timer, session no longer timed. dispatch_async(dispatch_get_main_queue(), ^(void) { self.sessionBeingTimed = NO; + [self.sessionWarningTimer invalidate]; + self.sessionWarningTimer = nil; [self.sessionTimer invalidate]; self.sessionTimer = nil; }); @@ -133,6 +129,8 @@ // Session is still being timed. Invalidates here, will start up again on enter foreground if need be. dispatch_async(dispatch_get_main_queue(), ^(void) { + [self.sessionWarningTimer invalidate]; + self.sessionWarningTimer = nil; [self.sessionTimer invalidate]; self.sessionTimer = nil; }); @@ -143,22 +141,25 @@ if (self.sessionBeingTimed || self.sessionTimedOut) { NSTimeInterval now = [NSDate timeIntervalSinceReferenceDate]; - if ((!fequal(0, self.secondsUntilWarning) && now > self.timeTimerStarted + self.secondsUntilWarning) || (fequal(0, self.secondsUntilWarning) && !fequal(0, self.secondsUntilTimeout) && now > self.timeTimerStarted + self.secondsUntilTimeout)) { + if ((!fequal(0, self.secondsUntilWarning) && now > self.timeTimerStarted + self.secondsUntilWarning) || (!fequal(0, self.secondsUntilTimeout) && now > self.timeTimerStarted + self.secondsUntilTimeout)) { // Timeout if we are passed the warning. [self sessionTimeout:YES]; - } else if (!fequal(0, self.secondsUntilWarning)) { + } else { + if (!fequal(0, self.secondsUntilWarning)) { - // Restart the warning timer! - NSTimeInterval timeLeftTillWarning = self.timeTimerStarted + self.secondsUntilWarning - now; - [self.sessionTimer invalidate]; - self.sessionTimer = [NSTimer scheduledTimerWithTimeInterval:timeLeftTillWarning target:self selector:@selector(sessionTimeoutWarning) userInfo:nil repeats:NO]; - } else if (!fequal(0, self.secondsUntilTimeout)) { + // Restart the warning timer! + NSTimeInterval timeLeftTillWarning = self.timeTimerStarted + self.secondsUntilWarning - now; + [self.sessionWarningTimer invalidate]; + self.sessionWarningTimer = [NSTimer scheduledTimerWithTimeInterval:timeLeftTillWarning target:self selector:@selector(sessionTimeoutWarning) userInfo:nil repeats:NO]; + } + if (!fequal(0, self.secondsUntilTimeout)) { - // Restart the timeout timer! - NSTimeInterval timeLeftTillTimeout = self.timeTimerStarted + self.secondsUntilTimeout - now; - [self.sessionTimer invalidate]; - self.sessionTimer = [NSTimer scheduledTimerWithTimeInterval:timeLeftTillTimeout target:self selector:@selector(sessionTimeout:) userInfo:nil repeats:NO]; + // Restart the timeout timer! + NSTimeInterval timeLeftTillTimeout = self.timeTimerStarted + self.secondsUntilTimeout - now; + [self.sessionTimer invalidate]; + self.sessionTimer = [NSTimer scheduledTimerWithTimeInterval:timeLeftTillTimeout target:self selector:@selector(sessionTimeout:) userInfo:nil repeats:NO]; + } } } } @@ -174,6 +175,8 @@ NSTimeInterval now = [NSDate timeIntervalSinceReferenceDate]; if ((!fequal(0, self.secondsUntilWarning) && now > self.timeTimerStarted + self.secondsUntilWarning) || (!fequal(0, self.secondsUntilTimeout) && now > self.timeTimerStarted + self.secondsUntilTimeout)) { self.sessionTimedOut = YES; + [self.sessionWarningTimer invalidate]; + self.sessionWarningTimer = nil; [self.sessionTimer invalidate]; self.sessionTimer = nil; } else if (![self.sessionTimer isValid]) {