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