blob: 491659534de0095d6da699eb099ee2ec2e12a1d9 [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/chrome/browser/sessions/model/session_saving_scene_agent.h"
#import "ios/chrome/app/profile/profile_init_stage.h"
#import "ios/chrome/app/profile/profile_state.h"
#import "ios/chrome/browser/sessions/model/session_restoration_service.h"
#import "ios/chrome/browser/sessions/model/session_restoration_service_factory.h"
#import "ios/chrome/browser/shared/model/profile/profile_ios.h"
@implementation SessionSavingSceneAgent {
// YES when the scene reached SceneActivationLevelForegroundActive.
BOOL _sceneWasActivated;
}
#pragma mark - SceneStateObserver
- (void)sceneState:(SceneState*)sceneState
transitionedToActivationLevel:(SceneActivationLevel)level {
switch (level) {
case SceneActivationLevelUnattached:
case SceneActivationLevelForegroundInactive:
// no-op.
break;
case SceneActivationLevelBackground:
case SceneActivationLevelDisconnected:
[self saveSessionsIfNeeded];
break;
case SceneActivationLevelForegroundActive:
_sceneWasActivated = YES;
break;
}
}
#pragma mark - Private
// Saves the scene's sessions if they haven't been saved since the last time
// the scene was foregrounded.
- (void)saveSessionsIfNeeded {
// No need to save the session if the scene didn't reach the
// SceneActivationLevelForegroundActive stage.
if (!_sceneWasActivated) {
return;
}
// Forget the scene was activated. Even if the session is not saved, this
// is okay because we do not really care about change that could happen
// while the scene is backgrounded. If/when it becomes active again, the
// flag will be set to YES and on the next background the session will be
// saved (assuming that by this point the profile initialization is over).
_sceneWasActivated = NO;
// If the ProfileState is not ProfileInitStage::kFinal, then do not try
// to save the session as the profile may not be ready yet.
ProfileState* profileState = self.sceneState.profileState;
if (profileState.initStage < ProfileInitStage::kFinal) {
return;
}
// Since the app is about to be backgrounded or terminated, save the sessions
// immediately for the regular and incognito Profiles (if it exists).
DCHECK(profileState.profile);
ProfileIOS* profile = profileState.profile;
SessionRestorationServiceFactory::GetForProfile(profile)->SaveSessions();
if (profile->HasOffTheRecordProfile()) {
SessionRestorationServiceFactory::GetForProfile(
profile->GetOffTheRecordProfile())
->SaveSessions();
}
}
@end