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