127700081SBartłomiej Bukowski#import <React/RCTImageSource.h> 227700081SBartłomiej Bukowski#import <React/RCTImageView.h> 3efd75decSTomasz Sapeta#import <ExpoModulesCore/EXDefines.h> 427700081SBartłomiej Bukowski 527700081SBartłomiej Bukowski#import "EXKernel.h" 64d7a9b36SBartłomiej Bukowski#import "EXManagedAppSplashScreenConfiguration.h" 74d7a9b36SBartłomiej Bukowski#import "EXManagedAppSplashScreenConfigurationBuilder.h" 84d7a9b36SBartłomiej Bukowski#import "EXManagedAppSplashScreenViewProvider.h" 927700081SBartłomiej Bukowski#import "EXReactAppManager.h" 1027700081SBartłomiej Bukowski 1127700081SBartłomiej Bukowski@interface EXManagedAppSplashScreenViewProvider () 1227700081SBartłomiej Bukowski 1327700081SBartłomiej Bukowski@property (nonatomic, weak) UIView *splashScreenView; 144d7a9b36SBartłomiej Bukowski@property (nonatomic, strong) EXManagedAppSplashScreenConfiguration *configuration; 1527700081SBartłomiej Bukowski@property (nonatomic, strong, nullable) RCTImageView *splashImageView; 1627700081SBartłomiej Bukowski 1727700081SBartłomiej Bukowski@end 1827700081SBartłomiej Bukowski 1927700081SBartłomiej Bukowski@implementation EXManagedAppSplashScreenViewProvider 2027700081SBartłomiej Bukowski 21*50661f5cSWill Schurman- (instancetype)initWithManifest:(EXManifestsManifest *)manifest 2227700081SBartłomiej Bukowski{ 2327700081SBartłomiej Bukowski if (self = [super init]) { 2427700081SBartłomiej Bukowski _configuration = [EXManagedAppSplashScreenConfigurationBuilder parseManifest:manifest]; 2527700081SBartłomiej Bukowski } 2627700081SBartłomiej Bukowski return self; 2727700081SBartłomiej Bukowski} 2827700081SBartłomiej Bukowski 29*50661f5cSWill Schurman- (void)updateSplashScreenViewWithManifest:(EXManifestsManifest *)manifest 3027700081SBartłomiej Bukowski{ 3157ec57a4SBrent Vatne EXManagedAppSplashScreenConfiguration *previousConfiguration = _configuration; 3227700081SBartłomiej Bukowski _configuration = [EXManagedAppSplashScreenConfigurationBuilder parseManifest:manifest]; 3327700081SBartłomiej Bukowski if (_splashScreenView) { 3457ec57a4SBrent Vatne [self configureSplashScreenView:_splashScreenView previousConfiguration:previousConfiguration]; 3527700081SBartłomiej Bukowski } 3627700081SBartłomiej Bukowski} 3727700081SBartłomiej Bukowski 3827700081SBartłomiej Bukowski- (UIView *)createSplashScreenView 3927700081SBartłomiej Bukowski{ 4027700081SBartłomiej Bukowski UIView *splashScreenView = [UIView new]; 4157ec57a4SBrent Vatne [self configureSplashScreenView:splashScreenView previousConfiguration:nil]; 4227700081SBartłomiej Bukowski _splashScreenView = splashScreenView; 4327700081SBartłomiej Bukowski return splashScreenView; 4427700081SBartłomiej Bukowski} 4527700081SBartłomiej Bukowski 4657ec57a4SBrent Vatne- (void)configureSplashScreenView:(UIView *)splashScreenView previousConfiguration:(EXManagedAppSplashScreenConfiguration *)previousConfiguration 4727700081SBartłomiej Bukowski{ 48efd75decSTomasz Sapeta EX_WEAKIFY(self); 4927700081SBartłomiej Bukowski dispatch_async(dispatch_get_main_queue(), ^{ 50efd75decSTomasz Sapeta EX_ENSURE_STRONGIFY(self); 5127700081SBartłomiej Bukowski splashScreenView.backgroundColor = self.configuration.backgroundColor; 5227700081SBartłomiej Bukowski 5327700081SBartłomiej Bukowski if (self.configuration.imageUrl) { 5427700081SBartłomiej Bukowski EXKernelAppRecord *homeAppRecord = [EXKernel sharedInstance].appRegistry.homeAppRecord; 5527700081SBartłomiej Bukowski 5627700081SBartłomiej Bukowski if (homeAppRecord.appManager.reactBridge) { 5757ec57a4SBrent Vatne // Only re-create the splashImageView when the imageUrl or imageResizeMode changes 5857ec57a4SBrent Vatne if (![previousConfiguration.imageUrl isEqualToString:self.configuration.imageUrl] || 5957ec57a4SBrent Vatne previousConfiguration.imageResizeMode != self.configuration.imageResizeMode) { 6027700081SBartłomiej Bukowski if (self.splashImageView) { 6127700081SBartłomiej Bukowski [self.splashImageView removeFromSuperview]; 6227700081SBartłomiej Bukowski } 6327700081SBartłomiej Bukowski RCTImageSource *imageSource = [RCTConvert RCTImageSource:@{ @"uri": self.configuration.imageUrl }]; 6427700081SBartłomiej Bukowski 654d7a9b36SBartłomiej Bukowski // splash image loading is taking some time that, what can result in no image visually presented during loading phase 664d7a9b36SBartłomiej Bukowski // despite the fact the RCTImageView is mounted in the view hierarchy 6727700081SBartłomiej Bukowski self.splashImageView = [[RCTImageView alloc] initWithBridge:homeAppRecord.appManager.reactBridge]; 6827700081SBartłomiej Bukowski self.splashImageView.frame = splashScreenView.bounds; 6927700081SBartłomiej Bukowski self.splashImageView.imageSources = @[imageSource]; 704d7a9b36SBartłomiej Bukowski self.splashImageView.resizeMode = self.configuration.imageResizeMode == EXSplashScreenImageResizeModeCover ? RCTResizeModeCover : RCTResizeModeContain; 7127700081SBartłomiej Bukowski [splashScreenView addSubview:self.splashImageView]; 7227700081SBartłomiej Bukowski } 7327700081SBartłomiej Bukowski } 7457ec57a4SBrent Vatne } 7527700081SBartłomiej Bukowski }); 7627700081SBartłomiej Bukowski} 7727700081SBartłomiej Bukowski 7827700081SBartłomiej Bukowski@end 7927700081SBartłomiej Bukowski 80