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