1efd75decSTomasz Sapeta#import <ExpoModulesCore/EXDefines.h>
29ef743bcSBartłomiej Bukowski
3*bab1112dSTomasz Sapeta#if !defined(EX_DETACHED)
4c46d5aaeSBartłomiej Bukowski#import "Expo_Go-Swift.h"
5*bab1112dSTomasz Sapeta#endif // !defined(EX_DETACHED)
61236efb4STomasz Sapeta
79ef743bcSBartłomiej Bukowski#import "EXAppLoadingProgressWindowController.h"
89ef743bcSBartłomiej Bukowski#import "EXUtil.h"
99ef743bcSBartłomiej Bukowski
109ef743bcSBartłomiej Bukowski@interface EXAppLoadingProgressWindowController ()
119ef743bcSBartłomiej Bukowski
129ef743bcSBartłomiej Bukowski@property (nonatomic, assign) BOOL enabled;
139ef743bcSBartłomiej Bukowski@property (nonatomic, strong) UIWindow *window;
149ef743bcSBartłomiej Bukowski@property (nonatomic, strong) UILabel *textLabel;
159ef743bcSBartłomiej Bukowski
169ef743bcSBartłomiej Bukowski@end
179ef743bcSBartłomiej Bukowski
189ef743bcSBartłomiej Bukowski@implementation EXAppLoadingProgressWindowController
199ef743bcSBartłomiej Bukowski
209ef743bcSBartłomiej Bukowski- (instancetype)initWithEnabled:(BOOL)enabled
219ef743bcSBartłomiej Bukowski{
229ef743bcSBartłomiej Bukowski  if (self = [super init]) {
239ef743bcSBartłomiej Bukowski    _enabled = enabled;
249ef743bcSBartłomiej Bukowski  }
259ef743bcSBartłomiej Bukowski  return self;
269ef743bcSBartłomiej Bukowski}
279ef743bcSBartłomiej Bukowski
289ef743bcSBartłomiej Bukowski- (void)show
299ef743bcSBartłomiej Bukowski{
30*bab1112dSTomasz Sapeta#if !defined(EX_DETACHED)
319ef743bcSBartłomiej Bukowski  if (!_enabled) {
329ef743bcSBartłomiej Bukowski    return;
339ef743bcSBartłomiej Bukowski  }
349ef743bcSBartłomiej Bukowski
35efd75decSTomasz Sapeta  EX_WEAKIFY(self);
369ef743bcSBartłomiej Bukowski  dispatch_async(dispatch_get_main_queue(), ^{
37efd75decSTomasz Sapeta    EX_ENSURE_STRONGIFY(self);
389ef743bcSBartłomiej Bukowski    if (!self.window) {
399ef743bcSBartłomiej Bukowski      CGSize screenSize = [UIScreen mainScreen].bounds.size;
409ef743bcSBartłomiej Bukowski
4171ebd28eSCharlie Cruzan      int bottomInsets = EXSharedApplication().keyWindow.safeAreaInsets.bottom;
4276b4fe7aSBartłomiej Bukowski      self.window = [[UIWindow alloc] initWithFrame:CGRectMake(0,
4376b4fe7aSBartłomiej Bukowski                                                               screenSize.height - 36 - bottomInsets,
4476b4fe7aSBartłomiej Bukowski                                                               screenSize.width,
45892d420fSEric Samelson                                                               36 + bottomInsets)];
469ef743bcSBartłomiej Bukowski      self.window.windowLevel = UIWindowLevelStatusBar + 1;
47c46d5aaeSBartłomiej Bukowski      self.window.rootViewController = [EXAppLoadingProgressWindowViewController new];
48892d420fSEric Samelson      self.window.backgroundColor = [EXUtil colorWithRGB:0xfafafa];
499ef743bcSBartłomiej Bukowski
509ef743bcSBartłomiej Bukowski      UIView *containerView = [UIView new];
519ef743bcSBartłomiej Bukowski      [self.window addSubview:containerView];
529ef743bcSBartłomiej Bukowski
539ef743bcSBartłomiej Bukowski      CALayer *topBorderLayer = [CALayer layer];
549ef743bcSBartłomiej Bukowski      topBorderLayer.frame = CGRectMake(0, 0, screenSize.width, 1);
559ef743bcSBartłomiej Bukowski      topBorderLayer.backgroundColor = [EXUtil colorWithRGB:0xe3e3e3].CGColor;
569ef743bcSBartłomiej Bukowski      [containerView.layer addSublayer:topBorderLayer];
579ef743bcSBartłomiej Bukowski
589ef743bcSBartłomiej Bukowski      self.textLabel = [UILabel new];
599ef743bcSBartłomiej Bukowski      self.textLabel.frame = CGRectMake(10, 0, screenSize.width - 20, 36);
609ef743bcSBartłomiej Bukowski      self.textLabel.font = [UIFont systemFontOfSize:12];
619ef743bcSBartłomiej Bukowski      self.textLabel.textAlignment = NSTextAlignmentLeft;
629ef743bcSBartłomiej Bukowski      self.textLabel.textColor = [EXUtil colorWithRGB:0xa7a7a7];
639ef743bcSBartłomiej Bukowski      [containerView addSubview:self.textLabel];
649ef743bcSBartłomiej Bukowski    }
659ef743bcSBartłomiej Bukowski    self.textLabel.text =  @"Waiting for server ...";
669ef743bcSBartłomiej Bukowski    self.window.hidden = NO;
679ef743bcSBartłomiej Bukowski  });
68*bab1112dSTomasz Sapeta#endif // !defined(EX_DETACHED)
699ef743bcSBartłomiej Bukowski}
709ef743bcSBartłomiej Bukowski
719ef743bcSBartłomiej Bukowski- (void)hide
729ef743bcSBartłomiej Bukowski{
73*bab1112dSTomasz Sapeta#if !defined(EX_DETACHED)
749ef743bcSBartłomiej Bukowski  if (!_enabled) {
759ef743bcSBartłomiej Bukowski    return;
769ef743bcSBartłomiej Bukowski  }
779ef743bcSBartłomiej Bukowski
78efd75decSTomasz Sapeta  EX_WEAKIFY(self);
7937ed3460SEric Samelson  dispatch_async(dispatch_get_main_queue(), ^{
80efd75decSTomasz Sapeta    EX_ENSURE_STRONGIFY(self);
8164c37d52SBartłomiej Bukowski    if (self.window) {
829ef743bcSBartłomiej Bukowski      self.window.hidden = YES;
83c46d5aaeSBartłomiej Bukowski      // remove this window altogther to hand over the command over StatusBar rotation
84c46d5aaeSBartłomiej Bukowski      self.window = nil;
859ef743bcSBartłomiej Bukowski    }
8637ed3460SEric Samelson  });
87*bab1112dSTomasz Sapeta#endif // !defined(EX_DETACHED)
8864c37d52SBartłomiej Bukowski}
899ef743bcSBartłomiej Bukowski
909ef743bcSBartłomiej Bukowski- (void)updateStatusWithProgress:(EXLoadingProgress *)progress
919ef743bcSBartłomiej Bukowski{
92*bab1112dSTomasz Sapeta#if !defined(EX_DETACHED)
939ef743bcSBartłomiej Bukowski  if (!_enabled) {
949ef743bcSBartłomiej Bukowski    return;
959ef743bcSBartłomiej Bukowski  }
969ef743bcSBartłomiej Bukowski
9764c37d52SBartłomiej Bukowski  [self show];
9864c37d52SBartłomiej Bukowski
99efd75decSTomasz Sapeta  EX_WEAKIFY(self);
1009ef743bcSBartłomiej Bukowski  dispatch_async(dispatch_get_main_queue(), ^{
101efd75decSTomasz Sapeta    EX_ENSURE_STRONGIFY(self);
1029ef743bcSBartłomiej Bukowski    float progressPercent = ([progress.done floatValue] / [progress.total floatValue]);
1039ef743bcSBartłomiej Bukowski    self.textLabel.text = [NSString stringWithFormat:@"%@ %.2f%%", progress.status, progressPercent * 100];
1049ef743bcSBartłomiej Bukowski    [self.textLabel setNeedsDisplay];
1059ef743bcSBartłomiej Bukowski
1069ef743bcSBartłomiej Bukowski    // TODO: (@bbarthec) maybe it's better to show/hide this based on other thing than progress status reported by the fetcher?
1079ef743bcSBartłomiej Bukowski    self.window.hidden = !(progress.total.floatValue > 0);
1089ef743bcSBartłomiej Bukowski  });
109*bab1112dSTomasz Sapeta#endif // !defined(EX_DETACHED)
1109ef743bcSBartłomiej Bukowski}
1119ef743bcSBartłomiej Bukowski
11257bba33fSEric Samelson- (void)updateStatus:(EXAppLoaderRemoteUpdateStatus)status
11357bba33fSEric Samelson{
114*bab1112dSTomasz Sapeta#if !defined(EX_DETACHED)
11557bba33fSEric Samelson  if (!_enabled) {
11657bba33fSEric Samelson    return;
11757bba33fSEric Samelson  }
11857bba33fSEric Samelson
11957bba33fSEric Samelson  NSString *statusText = [[self class] _loadingViewTextForStatus:status];
12057bba33fSEric Samelson  if (!statusText) {
12157bba33fSEric Samelson    return;
12257bba33fSEric Samelson  }
12357bba33fSEric Samelson
12457bba33fSEric Samelson  [self show];
12557bba33fSEric Samelson
126efd75decSTomasz Sapeta  EX_WEAKIFY(self);
12757bba33fSEric Samelson  dispatch_async(dispatch_get_main_queue(), ^{
128efd75decSTomasz Sapeta    EX_ENSURE_STRONGIFY(self);
12957bba33fSEric Samelson    self.textLabel.text = statusText;
13057bba33fSEric Samelson    [self.textLabel setNeedsDisplay];
13157bba33fSEric Samelson  });
132*bab1112dSTomasz Sapeta#endif // !defined(EX_DETACHED)
13357bba33fSEric Samelson}
13457bba33fSEric Samelson
13557bba33fSEric Samelson+ (nullable NSString *)_loadingViewTextForStatus:(EXAppLoaderRemoteUpdateStatus)status
13657bba33fSEric Samelson{
13757bba33fSEric Samelson  if (status == kEXAppLoaderRemoteUpdateStatusChecking) {
13857bba33fSEric Samelson    return @"Checking for new update...";
13957bba33fSEric Samelson  } else if (status == kEXAppLoaderRemoteUpdateStatusDownloading) {
14057bba33fSEric Samelson    return @"New update available, downloading...";
14157bba33fSEric Samelson  } else {
14257bba33fSEric Samelson    return nil;
14357bba33fSEric Samelson  }
14457bba33fSEric Samelson}
1459ef743bcSBartłomiej Bukowski
1469ef743bcSBartłomiej Bukowski@end
147