1#import <UMCore/UMDefines.h>
2
3#import "EXAppLoadingProgressWindowController.h"
4#import "EXUtil.h"
5
6@interface EXAppLoadingProgressWindowController ()
7
8@property (nonatomic, assign) BOOL enabled;
9@property (nonatomic, strong) UIWindow *window;
10@property (nonatomic, strong) UILabel *textLabel;
11
12@end
13
14@implementation EXAppLoadingProgressWindowController
15
16- (instancetype)initWithEnabled:(BOOL)enabled
17{
18  if (self = [super init]) {
19    _enabled = enabled;
20  }
21  return self;
22}
23
24- (void)show
25{
26  if (!_enabled) {
27    return;
28  }
29
30  UM_WEAKIFY(self);
31  dispatch_async(dispatch_get_main_queue(), ^{
32    UM_ENSURE_STRONGIFY(self);
33    if (!self.window) {
34      CGSize screenSize = [UIScreen mainScreen].bounds.size;
35
36      if (@available(iOS 11.0, *)) {
37        UIWindow *window = UMSharedApplication().keyWindow;
38        self.window = [[UIWindow alloc] initWithFrame:CGRectMake(0,
39                                                                 screenSize.height - 30 - window.safeAreaInsets.bottom,
40                                                                 screenSize.width,
41                                                                 36)];
42      } else {
43        self.window = [[UIWindow alloc] initWithFrame:CGRectMake(0,
44                                                                 screenSize.height - 36,
45                                                                 screenSize.width,
46                                                                 36)];
47      }
48      self.window.windowLevel = UIWindowLevelStatusBar + 1;
49      // set a root VC so rotation is supported
50      self.window.rootViewController = [UIViewController new];
51
52      UIView *containerView = [UIView new];
53      containerView.backgroundColor = [EXUtil colorWithRGB:0xfafafa];
54
55      [self.window addSubview:containerView];
56
57      CALayer *topBorderLayer = [CALayer layer];
58      topBorderLayer.frame = CGRectMake(0, 0, screenSize.width, 1);
59      topBorderLayer.backgroundColor = [EXUtil colorWithRGB:0xe3e3e3].CGColor;
60      [containerView.layer addSublayer:topBorderLayer];
61
62      self.textLabel = [UILabel new];
63      self.textLabel.frame = CGRectMake(10, 0, screenSize.width - 20, 36);
64      self.textLabel.font = [UIFont systemFontOfSize:12];
65      self.textLabel.textAlignment = NSTextAlignmentLeft;
66      self.textLabel.textColor = [EXUtil colorWithRGB:0xa7a7a7];
67      [containerView addSubview:self.textLabel];
68    }
69    self.textLabel.text =  @"Waiting for server ...";
70    self.window.hidden = NO;
71  });
72}
73
74- (void)hide
75{
76  if (!_enabled) {
77    return;
78  }
79
80  self.window.hidden = YES;
81}
82
83- (void)updateStatusWithProgress:(EXLoadingProgress *)progress
84{
85  if (!_enabled) {
86    return;
87  }
88
89  UM_WEAKIFY(self);
90  dispatch_async(dispatch_get_main_queue(), ^{
91    UM_ENSURE_STRONGIFY(self);
92    float progressPercent = ([progress.done floatValue] / [progress.total floatValue]);
93    self.textLabel.text = [NSString stringWithFormat:@"%@ %.2f%%", progress.status, progressPercent * 100];
94    [self.textLabel setNeedsDisplay];
95
96    // TODO: (@bbarthec) maybe it's better to show/hide this based on other thing than progress status reported by the fetcher?
97    self.window.hidden = !(progress.total.floatValue > 0);
98  });
99}
100
101
102@end
103