mirror of https://github.com/oxen-io/session-ios
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			115 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Objective-C
		
	
			
		
		
	
	
			115 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Objective-C
		
	
| //
 | |
| //  Copyright (c) 2019 Open Whisper Systems. All rights reserved.
 | |
| //
 | |
| 
 | |
| #import "AppSetup.h"
 | |
| #import "Environment.h"
 | |
| #import "VersionMigrations.h"
 | |
| #import <SignalUtilitiesKit/OWSDatabaseMigration.h>
 | |
| #import <SignalUtilitiesKit/OWSProfileManager.h>
 | |
| #import <SessionMessagingKit/OWSBackgroundTask.h>
 | |
| #import <SessionMessagingKit/OWSDisappearingMessagesJob.h>
 | |
| #import <SessionMessagingKit/OWSIdentityManager.h>
 | |
| #import <SessionMessagingKit/OWSOutgoingReceiptManager.h>
 | |
| #import <SessionMessagingKit/OWSReadReceiptManager.h>
 | |
| #import <SessionMessagingKit/OWSSounds.h>
 | |
| #import <SessionMessagingKit/OWSStorage.h>
 | |
| #import <SessionMessagingKit/SSKEnvironment.h>
 | |
| #import <SignalUtilitiesKit/SignalUtilitiesKit-Swift.h>
 | |
| 
 | |
| NS_ASSUME_NONNULL_BEGIN
 | |
| 
 | |
| @implementation AppSetup
 | |
| 
 | |
| + (void)setupEnvironmentWithAppSpecificSingletonBlock:(dispatch_block_t)appSpecificSingletonBlock
 | |
|                                   migrationCompletion:(OWSDatabaseMigrationCompletion)migrationCompletion
 | |
| {
 | |
|     OWSAssertDebug(appSpecificSingletonBlock);
 | |
|     OWSAssertDebug(migrationCompletion);
 | |
| 
 | |
|     __block OWSBackgroundTask *_Nullable backgroundTask =
 | |
|         [OWSBackgroundTask backgroundTaskWithLabelStr:__PRETTY_FUNCTION__];
 | |
| 
 | |
|     static dispatch_once_t onceToken;
 | |
|     dispatch_once(&onceToken, ^{
 | |
|         // Order matters here.
 | |
|         //
 | |
|         // All of these "singletons" should have any dependencies used in their
 | |
|         // initializers injected.
 | |
|         [[OWSBackgroundTaskManager sharedManager] observeNotifications];
 | |
| 
 | |
|         OWSPrimaryStorage *primaryStorage = [[OWSPrimaryStorage alloc] initStorage];
 | |
|         [OWSPrimaryStorage protectFiles];
 | |
| 
 | |
|         // AFNetworking (via CFNetworking) spools it's attachments to NSTemporaryDirectory().
 | |
|         // If you receive a media message while the device is locked, the download will fail if the temporary directory
 | |
|         // is NSFileProtectionComplete
 | |
|         BOOL success = [OWSFileSystem protectFileOrFolderAtPath:NSTemporaryDirectory()
 | |
|                                              fileProtectionType:NSFileProtectionCompleteUntilFirstUserAuthentication];
 | |
|         OWSAssert(success);
 | |
| 
 | |
|         OWSPreferences *preferences = [OWSPreferences new];
 | |
| 
 | |
|         OWSProfileManager *profileManager = [[OWSProfileManager alloc] initWithPrimaryStorage:primaryStorage];
 | |
|         OWSIdentityManager *identityManager = [[OWSIdentityManager alloc] initWithPrimaryStorage:primaryStorage];
 | |
|         TSAccountManager *tsAccountManager = [[TSAccountManager alloc] initWithPrimaryStorage:primaryStorage];
 | |
|         OWSDisappearingMessagesJob *disappearingMessagesJob =
 | |
|             [[OWSDisappearingMessagesJob alloc] initWithPrimaryStorage:primaryStorage];
 | |
|         OWSReadReceiptManager *readReceiptManager =
 | |
|             [[OWSReadReceiptManager alloc] initWithPrimaryStorage:primaryStorage];
 | |
|         OWSOutgoingReceiptManager *outgoingReceiptManager =
 | |
|             [[OWSOutgoingReceiptManager alloc] initWithPrimaryStorage:primaryStorage];
 | |
|         id<SSKReachabilityManager> reachabilityManager = [SSKReachabilityManagerImpl new];
 | |
|         id<OWSTypingIndicators> typingIndicators = [[OWSTypingIndicatorsImpl alloc] init];
 | |
| 
 | |
|         OWSAudioSession *audioSession = [OWSAudioSession new];
 | |
|         OWSSounds *sounds = [[OWSSounds alloc] initWithPrimaryStorage:primaryStorage];
 | |
|         id<OWSProximityMonitoringManager> proximityMonitoringManager = [OWSProximityMonitoringManagerImpl new];
 | |
|         OWSWindowManager *windowManager = [[OWSWindowManager alloc] initDefault];
 | |
|         
 | |
|         [Environment setShared:[[Environment alloc] initWithAudioSession:audioSession
 | |
|                                                              preferences:preferences
 | |
|                                               proximityMonitoringManager:proximityMonitoringManager
 | |
|                                                                   sounds:sounds
 | |
|                                                            windowManager:windowManager]];
 | |
| 
 | |
|         [SSKEnvironment setShared:[[SSKEnvironment alloc] initWithProfileManager:profileManager
 | |
|                                                                   primaryStorage:primaryStorage
 | |
|                                                                  identityManager:identityManager
 | |
|                                                                 tsAccountManager:tsAccountManager
 | |
|                                                          disappearingMessagesJob:disappearingMessagesJob
 | |
|                                                               readReceiptManager:readReceiptManager
 | |
|                                                           outgoingReceiptManager:outgoingReceiptManager
 | |
|                                                              reachabilityManager:reachabilityManager
 | |
|                                                                 typingIndicators:typingIndicators]];
 | |
| 
 | |
|         appSpecificSingletonBlock();
 | |
| 
 | |
|         OWSAssertDebug(SSKEnvironment.shared.isComplete);
 | |
|         
 | |
|         [SNConfiguration performMainSetup]; // Must happen before the performUpdateCheck call below
 | |
| 
 | |
|         // Register renamed classes.
 | |
|         [NSKeyedUnarchiver setClass:[OWSUserProfile class] forClassName:[OWSUserProfile collection]];
 | |
|         [NSKeyedUnarchiver setClass:[OWSDatabaseMigration class] forClassName:[OWSDatabaseMigration collection]];
 | |
| 
 | |
|         [OWSStorage registerExtensionsWithMigrationBlock:^() {
 | |
|             dispatch_async(dispatch_get_main_queue(), ^{
 | |
|                 // Don't start database migrations until storage is ready.
 | |
|                 [VersionMigrations performUpdateCheckWithCompletion:^(BOOL successful, BOOL needsConfigSync) {
 | |
|                     OWSAssertIsOnMainThread();
 | |
| 
 | |
|                     migrationCompletion(successful, needsConfigSync);
 | |
| 
 | |
|                     OWSAssertDebug(backgroundTask);
 | |
|                     backgroundTask = nil;
 | |
|                 }];
 | |
|             });
 | |
|         }];
 | |
|     });
 | |
| }
 | |
| 
 | |
| @end
 | |
| 
 | |
| NS_ASSUME_NONNULL_END
 |