Browse Source

VLCKeychainCoordinator: Fix that a playing video is not visible after dismissing the passcodecontroller

After coming back into the app from background and entering a password we had two titlebars.
Now we check for nil and superviews to avoid doubling (closes #157)
Carola Nitz 7 years ago
parent
commit
ded60c40c2
2 changed files with 64 additions and 36 deletions
  1. 17 7
      Sources/KeychainCoordinator.swift
  2. 47 29
      Sources/VLCMovieViewController.m

+ 17 - 7
Sources/KeychainCoordinator.swift

@@ -88,15 +88,19 @@ class KeychainCoordinator: NSObject, PAPasscodeViewControllerDelegate {
             self.completion = nil
             return
         }
-        if rootViewController.presentedViewController != nil {
-            rootViewController.dismiss(animated: false, completion: nil)
+
+        //if we have no video displayed we should use the current rootViewController
+        var presentingViewController = rootViewController
+        if let presentedViewController = rootViewController.presentedViewController {
+            //but if a video is playing we have the MovieViewController presented and want to show it above
+            presentingViewController = presentedViewController
         }
 
         let navigationController = UINavigationController(rootViewController: passcodeLockController)
         navigationController.modalPresentationStyle = .fullScreen
         navigationController.modalTransitionStyle = .crossDissolve
 
-        rootViewController.present(navigationController, animated: true) {
+        presentingViewController.present(navigationController, animated: true) {
             [weak self] in
             if self?.touchIDEnabled == true || self?.faceIDEnabled == true {
                 self?.touchOrFaceIDQuery()
@@ -151,9 +155,15 @@ class KeychainCoordinator: NSObject, PAPasscodeViewControllerDelegate {
 
     func paPasscodeViewControllerDidEnterPasscode(_ controller: PAPasscodeViewController!) {
         avoidPromptingTouchOrFaceID = false
-        UIApplication.shared.delegate?.window??.rootViewController?.dismiss(animated: true, completion: {
-            self.completion?()
-            self.completion = nil
-        })
+        if let navigationController = UIApplication.shared.delegate?.window??.rootViewController?.presentedViewController as? UINavigationController,
+            let passcodeController = navigationController.topViewController?.presentedViewController as? PAPasscodeViewController ??
+            navigationController.topViewController {
+            //either dismiss the papasscode presented from movieVC or as topViewController 
+            passcodeController.dismiss(animated: true, completion: {
+                [weak self] in
+                self?.completion?()
+                self?.completion = nil
+            })
+        }
     }
 }

+ 47 - 29
Sources/VLCMovieViewController.m

@@ -358,46 +358,64 @@ typedef NS_ENUM(NSInteger, VLCPanType) {
 
 }
 
+- (UIButton *)doneButton
+{
+    if (!_doneButton) {
+        _doneButton = [[UIButton alloc] initWithFrame:CGRectZero];
+        [_doneButton setAccessibilityIdentifier:@"Done"];
+        [_doneButton addTarget:self action:@selector(closePlayback:) forControlEvents:UIControlEventTouchUpInside];
+        [_doneButton setTitle:NSLocalizedString(@"BUTTON_DONE", nil) forState:UIControlStateNormal];
+        [_doneButton setTitleColor:[UIColor grayColor] forState:UIControlStateDisabled];
+        _doneButton.translatesAutoresizingMaskIntoConstraints = NO;
+    }
+    return _doneButton;
+}
+
+- (UIStackView *)navigationBarStackView
+{
+    if (!_navigationBarStackView) {
+        _navigationBarStackView = [[UIStackView alloc] init];
+        _navigationBarStackView.translatesAutoresizingMaskIntoConstraints = NO;
+        _navigationBarStackView.spacing = 8;
+        _navigationBarStackView.axis = UILayoutConstraintAxisHorizontal;
+        _navigationBarStackView.alignment = UIStackViewAlignmentCenter;
+        [_navigationBarStackView addArrangedSubview:self.doneButton];
+        [_navigationBarStackView addArrangedSubview:_timeNavigationTitleView];
+        [_navigationBarStackView addArrangedSubview:_rendererButton];
+    }
+    return _navigationBarStackView;
+}
+
 - (void)setupNavigationbar
 {
-    _doneButton = [[UIButton alloc] initWithFrame:CGRectZero];
-    [_doneButton setAccessibilityIdentifier:@"Done"];
-    [_doneButton addTarget:self action:@selector(closePlayback:) forControlEvents:UIControlEventTouchUpInside];
-    [_doneButton setTitle:NSLocalizedString(@"BUTTON_DONE", nil) forState:UIControlStateNormal];
-    [_doneButton setTitleColor:[UIColor grayColor] forState:UIControlStateDisabled];
-    _doneButton.translatesAutoresizingMaskIntoConstraints = NO;
 
-    self.timeNavigationTitleView = [[[NSBundle mainBundle] loadNibNamed:@"VLCTimeNavigationTitleView" owner:self options:nil] objectAtIndex:0];
-    self.timeNavigationTitleView.translatesAutoresizingMaskIntoConstraints = NO;
+    if (!self.timeNavigationTitleView) {
+        self.timeNavigationTitleView = [[[NSBundle mainBundle] loadNibNamed:@"VLCTimeNavigationTitleView" owner:self options:nil] objectAtIndex:0];
+        self.timeNavigationTitleView.translatesAutoresizingMaskIntoConstraints = NO;
+    }
 
     if (_vpc.renderer != nil) {
         [_rendererButton setSelected:YES];
     }
 
-    _navigationBarStackView = [[UIStackView alloc] init];
-    _navigationBarStackView.translatesAutoresizingMaskIntoConstraints = NO;
-    _navigationBarStackView.spacing = 8;
-    _navigationBarStackView.axis = UILayoutConstraintAxisHorizontal;
-    _navigationBarStackView.alignment = UIStackViewAlignmentCenter;
-    [_navigationBarStackView addArrangedSubview:_doneButton];
-    [_navigationBarStackView addArrangedSubview:_timeNavigationTitleView];
-    [_navigationBarStackView addArrangedSubview:_rendererButton];
+    if (self.navigationBarStackView.superview == nil) {
+        [self.navigationController.navigationBar addSubview:self.navigationBarStackView];
 
-    [self.navigationController.navigationBar addSubview:_navigationBarStackView];
 
-    NSObject *guide = self.navigationController.navigationBar;
-    if (@available(iOS 11.0, *)) {
-        guide = self.navigationController.navigationBar.safeAreaLayoutGuide;
-    }
+        NSObject *guide = self.navigationController.navigationBar;
+        if (@available(iOS 11.0, *)) {
+            guide = self.navigationController.navigationBar.safeAreaLayoutGuide;
+        }
 
-    [NSLayoutConstraint activateConstraints:@[
-                                              [NSLayoutConstraint constraintWithItem:_navigationBarStackView attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self.navigationController.navigationBar attribute:NSLayoutAttributeCenterY multiplier:1 constant:0],
-                                              [NSLayoutConstraint constraintWithItem:_navigationBarStackView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:guide attribute:NSLayoutAttributeLeft multiplier:1 constant:8],
-                                              [NSLayoutConstraint constraintWithItem:_navigationBarStackView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:guide attribute:NSLayoutAttributeRight multiplier:1 constant:-8],
-                                              [NSLayoutConstraint constraintWithItem:_navigationBarStackView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.navigationController.navigationBar attribute:NSLayoutAttributeTop multiplier:1 constant:0],
-                                              [NSLayoutConstraint constraintWithItem:_navigationBarStackView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.navigationController.navigationBar attribute:NSLayoutAttributeBottom multiplier:1 constant:0],
-                                              [NSLayoutConstraint constraintWithItem:_timeNavigationTitleView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:_navigationBarStackView attribute:NSLayoutAttributeHeight multiplier:1 constant:0]
-                                              ]];
+        [NSLayoutConstraint activateConstraints:@[
+                                                  [NSLayoutConstraint constraintWithItem:self.navigationBarStackView attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self.navigationController.navigationBar attribute:NSLayoutAttributeCenterY multiplier:1 constant:0],
+                                                  [NSLayoutConstraint constraintWithItem:self.navigationBarStackView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:guide attribute:NSLayoutAttributeLeft multiplier:1 constant:8],
+                                                  [NSLayoutConstraint constraintWithItem:self.navigationBarStackView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:guide attribute:NSLayoutAttributeRight multiplier:1 constant:-8],
+                                                  [NSLayoutConstraint constraintWithItem:self.navigationBarStackView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.navigationController.navigationBar attribute:NSLayoutAttributeTop multiplier:1 constant:0],
+                                                  [NSLayoutConstraint constraintWithItem:self.navigationBarStackView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.navigationController.navigationBar attribute:NSLayoutAttributeBottom multiplier:1 constant:0],
+                                                  [NSLayoutConstraint constraintWithItem:self.timeNavigationTitleView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.navigationBarStackView attribute:NSLayoutAttributeHeight multiplier:1 constant:0]
+                                                  ]];
+    }
 }
 
 - (void)resetVideoFiltersSliders