127700081SBartłomiej Bukowski#import <React/RCTImageSource.h> 227700081SBartłomiej Bukowski#import <React/RCTImageView.h> 327700081SBartłomiej Bukowski#import <UMCore/UMDefines.h> 427700081SBartłomiej Bukowski 527700081SBartłomiej Bukowski#import "EXKernel.h" 6*4d7a9b36SBartłomiej Bukowski#import "EXManagedAppSplashScreenConfiguration.h" 7*4d7a9b36SBartłomiej Bukowski#import "EXManagedAppSplashScreenConfigurationBuilder.h" 8*4d7a9b36SBartł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; 14*4d7a9b36SBartł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 2127700081SBartłomiej Bukowski- (instancetype)initWithManifest:(NSDictionary *)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 2927700081SBartłomiej Bukowski- (void)updateSplashScreenViewWithManifest:(NSDictionary *)manifest 3027700081SBartłomiej Bukowski{ 3127700081SBartłomiej Bukowski _configuration = [EXManagedAppSplashScreenConfigurationBuilder parseManifest:manifest]; 3227700081SBartłomiej Bukowski if (_splashScreenView) { 3327700081SBartłomiej Bukowski [self configureSplashScreenView:_splashScreenView]; 3427700081SBartłomiej Bukowski } 3527700081SBartłomiej Bukowski} 3627700081SBartłomiej Bukowski 3727700081SBartłomiej Bukowski- (UIView *)createSplashScreenView 3827700081SBartłomiej Bukowski{ 3927700081SBartłomiej Bukowski UIView *splashScreenView = [UIView new]; 4027700081SBartłomiej Bukowski [self configureSplashScreenView:splashScreenView]; 4127700081SBartłomiej Bukowski _splashScreenView = splashScreenView; 4227700081SBartłomiej Bukowski return splashScreenView; 4327700081SBartłomiej Bukowski} 4427700081SBartłomiej Bukowski 4527700081SBartłomiej Bukowski- (void)configureSplashScreenView:(UIView *)splashScreenView 4627700081SBartłomiej Bukowski{ 4727700081SBartłomiej Bukowski UM_WEAKIFY(self); 4827700081SBartłomiej Bukowski dispatch_async(dispatch_get_main_queue(), ^{ 4927700081SBartłomiej Bukowski UM_ENSURE_STRONGIFY(self); 5027700081SBartłomiej Bukowski splashScreenView.backgroundColor = self.configuration.backgroundColor; 5127700081SBartłomiej Bukowski 5227700081SBartłomiej Bukowski if (self.configuration.imageUrl) { 5327700081SBartłomiej Bukowski EXKernelAppRecord *homeAppRecord = [EXKernel sharedInstance].appRegistry.homeAppRecord; 5427700081SBartłomiej Bukowski 5527700081SBartłomiej Bukowski if (homeAppRecord.appManager.reactBridge) { 5627700081SBartłomiej Bukowski // remove old splashImageView 5727700081SBartłomiej Bukowski if (self.splashImageView) { 5827700081SBartłomiej Bukowski [self.splashImageView removeFromSuperview]; 5927700081SBartłomiej Bukowski } 6027700081SBartłomiej Bukowski 6127700081SBartłomiej Bukowski RCTImageSource *imageSource = [RCTConvert RCTImageSource:@{ @"uri": self.configuration.imageUrl }]; 6227700081SBartłomiej Bukowski 63*4d7a9b36SBartłomiej Bukowski // splash image loading is taking some time that, what can result in no image visually presented during loading phase 64*4d7a9b36SBartłomiej Bukowski // despite the fact the RCTImageView is mounted in the view hierarchy 6527700081SBartłomiej Bukowski self.splashImageView = [[RCTImageView alloc] initWithBridge:homeAppRecord.appManager.reactBridge]; 6627700081SBartłomiej Bukowski self.splashImageView.frame = splashScreenView.bounds; 6727700081SBartłomiej Bukowski self.splashImageView.imageSources = @[imageSource]; 68*4d7a9b36SBartłomiej Bukowski self.splashImageView.resizeMode = self.configuration.imageResizeMode == EXSplashScreenImageResizeModeCover ? RCTResizeModeCover : RCTResizeModeContain; 6927700081SBartłomiej Bukowski [splashScreenView addSubview:self.splashImageView]; 7027700081SBartłomiej Bukowski } 7127700081SBartłomiej Bukowski } 7227700081SBartłomiej Bukowski }); 7327700081SBartłomiej Bukowski} 7427700081SBartłomiej Bukowski 7527700081SBartłomiej Bukowski@end 7627700081SBartłomiej Bukowski 77