Commit 909f1d64 authored by Carola Nitz's avatar Carola Nitz

KeychainCoordinator: convert to swift

This also gets rid of the sharedinstance that is not necessary
parent e67e9fba
......@@ -11,7 +11,7 @@
#import "VLCPlaybackController.h"
#if TARGET_OS_IOS
#import "VLCKeychainCoordinator.h"
#import "VLC_iOS-Swift.h"
#import "VLCThumbnailsCache.h"
#endif
......@@ -100,7 +100,7 @@
self.elapsedPlaybackTime = @(mediaPlayer.time.value.floatValue / 1000.);
[[NSNotificationCenter defaultCenter] postNotificationName:VLCPlaybackControllerPlaybackMetadataDidChange object:self];
#if TARGET_OS_IOS
if ([[VLCKeychainCoordinator defaultCoordinator] passcodeLockEnabled]) return;
if ([VLCKeychainCoordinator passcodeLockEnabled]) return;
#endif
[self populateInfoCenterFromMetadata];
}
......
/*****************************************************************************
* KeychainCoordinator.m
* VLC for iOS
*****************************************************************************
* Copyright (c) 2017 VideoLAN. All rights reserved.
* $Id$
*
* Authors:Carola Nitz <caro # videolan.org>
*
* Refer to the COPYING file of the official project for license.
*****************************************************************************/
import Foundation
import LocalAuthentication
@objc(VLCKeychainCoordinator)
class KeychainCoordinator:NSObject, PAPasscodeViewControllerDelegate {
@objc class var passcodeLockEnabled:Bool {
return UserDefaults.standard.bool(forKey:kVLCSettingPasscodeOnKey)
}
private var touchIDEnabled:Bool {
return UserDefaults.standard.bool(forKey:kVLCSettingPasscodeAllowTouchID)
}
private var faceIDEnabled:Bool {
return UserDefaults.standard.bool(forKey:kVLCSettingPasscodeAllowFaceID)
}
static let passcodeService = "org.videolan.vlc-ios.passcode"
var completion: (() -> ())? = nil
private var avoidPromptingTouchOrFaceID = false
private var passcodeLockController:PAPasscodeViewController {
let passcodeController = PAPasscodeViewController()
passcodeController.delegate = self
return passcodeController
}
override init() {
super.init()
NotificationCenter.default.addObserver(self, selector: #selector(appInForeground), name: .UIApplicationDidBecomeActive, object: nil)
}
@objc class func setPasscode(passcode:String?) {
guard let passcode = passcode else {
try? XKKeychainGenericPasswordItem.removeItems(forService: passcodeService)
return
}
let keychainItem = XKKeychainGenericPasswordItem()
keychainItem.service = passcodeService
keychainItem.account = passcodeService
keychainItem.secret.stringValue = passcode
try? keychainItem.save()
}
@objc func validatePasscode(completion:@escaping ()->()) {
passcodeLockController.passcode = passcodeFromKeychain()
self.completion = completion
guard let rootViewController = UIApplication.shared.delegate?.window??.rootViewController else {
return
}
if rootViewController.presentedViewController != nil {
rootViewController.dismiss(animated: false, completion: nil)
}
let navigationController = UINavigationController(rootViewController: passcodeLockController)
navigationController.modalPresentationStyle = .fullScreen
rootViewController.present(navigationController, animated: true) {
[weak self] in
if (self?.touchIDEnabled == true || self?.faceIDEnabled == true) {
self?.touchOrFaceIDQuery()
}
}
}
@objc private func appInForeground(notification:Notification) {
if let navigationController = UIApplication.shared.delegate?.window??.rootViewController?.presentedViewController as? UINavigationController, navigationController.topViewController is PAPasscodeViewController, touchIDEnabled {
touchOrFaceIDQuery()
}
}
private func touchOrFaceIDQuery() {
if (avoidPromptingTouchOrFaceID || UIApplication.shared.applicationState != .active) {
return
}
let laContext = LAContext()
if laContext.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: nil){
avoidPromptingTouchOrFaceID = true
laContext.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics,
localizedReason: NSLocalizedString("BIOMETRIC_UNLOCK", comment: ""),
reply: { [weak self ] success, _ in
DispatchQueue.main.async {
if success {
UIApplication.shared.delegate?.window??.rootViewController?.dismiss(animated: true, completion: {
self?.completion?()
self?.completion = nil
self?.avoidPromptingTouchOrFaceID = false
})
} else {
//user hit cancel and wants to enter the passcode
self?.avoidPromptingTouchOrFaceID = true
}
}
})
}
}
private func passcodeFromKeychain() -> String {
let item = try? XKKeychainGenericPasswordItem(forService: KeychainCoordinator.passcodeService, account: KeychainCoordinator.passcodeService)
return item?.secret?.stringValue ?? ""
}
//MARK: PAPassCodeDelegate
func paPasscodeViewControllerDidEnterPasscode(_ controller: PAPasscodeViewController!) {
avoidPromptingTouchOrFaceID = false
UIApplication.shared.delegate?.window??.rootViewController?.dismiss(animated: true, completion: {
self.completion?()
self.completion = nil
})
}
}
......@@ -31,12 +31,12 @@
#import <MediaPlayer/MediaPlayer.h>
#import <HockeySDK/HockeySDK.h>
#import "VLCSidebarController.h"
#import "VLCKeychainCoordinator.h"
#import "VLCActivityManager.h"
#import "VLCDropboxConstants.h"
#import <ObjectiveDropboxOfficial/ObjectiveDropboxOfficial.h>
#import "VLCPlaybackNavigationController.h"
#import "PAPasscodeViewController.h"
#import "VLC_iOS-Swift.h"
NSString *const VLCDropboxSessionWasAuthorized = @"VLCDropboxSessionWasAuthorized";
......@@ -47,6 +47,7 @@ NSString *const VLCDropboxSessionWasAuthorized = @"VLCDropboxSessionWasAuthorize
BOOL _isRunningMigration;
BOOL _isComingFromHandoff;
VLCWatchCommunication *_watchCommunication;
VLCKeychainCoordinator *_keychainCoordinator;
}
@end
......@@ -126,7 +127,7 @@ NSString *const VLCDropboxSessionWasAuthorized = @"VLCDropboxSessionWasAuthorize
[self.window makeKeyAndVisible];
[self validatePasscodeIfNeededWithCompletion:setupLibraryBlock];
BOOL spotlightEnabled = ![[VLCKeychainCoordinator defaultCoordinator] passcodeLockEnabled];
BOOL spotlightEnabled = ![VLCKeychainCoordinator passcodeLockEnabled];
[[MLMediaLibrary sharedMediaLibrary] setSpotlightIndexingEnabled:spotlightEnabled];
[[MLMediaLibrary sharedMediaLibrary] applicationWillStart];
......@@ -470,14 +471,19 @@ didFailToContinueUserActivityWithType:(NSString *)userActivityType
}
#pragma mark - pass code validation
- (VLCKeychainCoordinator *)keychainCoordinator
{
if (!_keychainCoordinator) {
_keychainCoordinator = [[VLCKeychainCoordinator alloc] init];
}
return _keychainCoordinator;
}
- (void)validatePasscodeIfNeededWithCompletion:(void(^)(void))completion
{
VLCKeychainCoordinator *keychainCoordinator = [VLCKeychainCoordinator defaultCoordinator];
if ([keychainCoordinator passcodeLockEnabled]) {
if ([VLCKeychainCoordinator passcodeLockEnabled]) {
[[VLCPlayerDisplayController sharedInstance] dismissPlaybackView];
[keychainCoordinator validatePasscodeWithCompletion:completion];
[self.keychainCoordinator validatePasscodeWithCompletion:completion];
} else {
completion();
}
......
/*****************************************************************************
* VLCKeychainCoordinator.h
* VLC for iOS
*****************************************************************************
* Copyright (c) 2015 VideoLAN. All rights reserved.
* $Id$
*
* Authors: Felix Paul Kühne <fkuehne # videolan.org>
*
* Refer to the COPYING file of the official project for license.
*****************************************************************************/
@interface VLCKeychainCoordinator : NSObject
+ (instancetype)defaultCoordinator;
@property (readonly) BOOL passcodeLockEnabled;
- (void)validatePasscodeWithCompletion:(void(^)(void))completion;
- (void)setPasscode:(NSString *)passcode;
@end
/*****************************************************************************
* VLCKeychainCoordinator.m
* VLC for iOS
*****************************************************************************
* Copyright (c) 2015 VideoLAN. All rights reserved.
* $Id$
*
* Authors: Felix Paul Kühne <fkuehne # videolan.org>
*
* Refer to the COPYING file of the official project for license.
*****************************************************************************/
#import "VLCKeychainCoordinator.h"
#import "PAPasscodeViewController.h"
#import <XKKeychain/XKKeychainGenericPasswordItem.h>
#import <LocalAuthentication/LocalAuthentication.h>
NSString *const VLCPasscode = @"org.videolan.vlc-ios.passcode";
@interface VLCKeychainCoordinator () <PAPasscodeViewControllerDelegate>
{
PAPasscodeViewController *_passcodeLockController;
void (^_completion)(void);
BOOL _avoidPromptingTouchOrFaceID;
}
@end
@implementation VLCKeychainCoordinator
+ (instancetype)defaultCoordinator
{
static VLCKeychainCoordinator *sharedInstance = nil;
static dispatch_once_t pred;
dispatch_once(&pred, ^{
sharedInstance = [VLCKeychainCoordinator new];
});
return sharedInstance;
}
- (instancetype)init
{
self = [super init];
if (!self)
return nil;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(appInForeground:)
name:UIApplicationDidBecomeActiveNotification
object:nil];
return self;
}
- (void)appInForeground:(NSNotification *)notification
{
/* our touch ID session is killed by the OS if the app moves to background, so re-init */
UIViewController *rootViewController = [UIApplication sharedApplication].delegate.window.rootViewController;
if ([rootViewController.presentedViewController isKindOfClass:[UINavigationController class]]){
UINavigationController *navCon = (UINavigationController *)rootViewController.presentedViewController;
if ([navCon.topViewController isKindOfClass:[PAPasscodeViewController class]] && [self touchIDEnabled]){
[self _touchOrFaceIDQuery];
}
}
}
- (NSString *)passcodeFromKeychain
{
XKKeychainGenericPasswordItem *item = [XKKeychainGenericPasswordItem itemForService:VLCPasscode account:VLCPasscode error:nil];
NSString *passcode = item.secret.stringValue;
return passcode;
}
- (BOOL)touchIDEnabled
{
return [[NSUserDefaults standardUserDefaults] boolForKey:kVLCSettingPasscodeAllowTouchID];
}
- (BOOL)faceIDEnabled
{
return [[NSUserDefaults standardUserDefaults] boolForKey:kVLCSettingPasscodeAllowFaceID];
}
- (BOOL)passcodeLockEnabled
{
return [[NSUserDefaults standardUserDefaults] boolForKey:kVLCSettingPasscodeOnKey];
}
- (void)validatePasscodeWithCompletion:(void(^)(void))completion
{
_passcodeLockController = [[PAPasscodeViewController alloc] initForAction:PasscodeActionEnter];
_passcodeLockController.delegate = self;
_passcodeLockController.passcode = [self passcodeFromKeychain];
_completion = completion;
UIViewController *rootViewController = [UIApplication sharedApplication].delegate.window.rootViewController;
if (rootViewController.presentedViewController)
[rootViewController dismissViewControllerAnimated:NO completion:nil];
UINavigationController *navCon = [[UINavigationController alloc] initWithRootViewController:_passcodeLockController];
navCon.modalPresentationStyle = UIModalPresentationFullScreen;
[rootViewController presentViewController:navCon animated:YES completion:^{
if ([self touchIDEnabled] || [self faceIDEnabled]) {
[self _touchOrFaceIDQuery];
}
}];
}
- (void)_touchOrFaceIDQuery
{
//if we just entered background don't show TouchID
if (_avoidPromptingTouchOrFaceID || [UIApplication sharedApplication].applicationState != UIApplicationStateActive)
return;
LAContext *laContext = [[LAContext alloc] init];
if ([laContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:nil]) {
_avoidPromptingTouchOrFaceID = YES;
[laContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
localizedReason:NSLocalizedString(@"BIOMETRIC_UNLOCK", nil)
reply:^(BOOL success, NSError *error) {
//if we cancel we don't want to show TouchID again
dispatch_async(dispatch_get_main_queue(), ^{
if (success) {
[[UIApplication sharedApplication].delegate.window.rootViewController dismissViewControllerAnimated:YES completion:^{
_completion();
_completion = nil;
_avoidPromptingTouchOrFaceID = NO;
}];
} else {
//user hit cancel and wants to enter the passcode
_avoidPromptingTouchOrFaceID = YES;
}
});
}];
}
}
- (void)PAPasscodeViewControllerDidEnterPasscode:(PAPasscodeViewController *)controller
{
_avoidPromptingTouchOrFaceID = NO;
[[UIApplication sharedApplication].delegate.window.rootViewController dismissViewControllerAnimated:YES completion:^{
_completion();
_completion = nil;
}];
}
- (void)PAPasscodeViewController:(PAPasscodeViewController *)controller didFailToEnterPasscode:(NSInteger)attempts
{
// FIXME: handle countless failed passcode attempts
}
- (void)setPasscode:(NSString *)passcode
{
if (!passcode) {
[XKKeychainGenericPasswordItem removeItemsForService:VLCPasscode error:nil];
return;
}
XKKeychainGenericPasswordItem *keychainItem = [[XKKeychainGenericPasswordItem alloc] init];
keychainItem.service = VLCPasscode;
keychainItem.account = VLCPasscode;
keychainItem.secret.stringValue = passcode;
[keychainItem saveWithError:nil];
}
@end
......@@ -22,7 +22,6 @@
#import "VLCBugreporter.h"
#import "VLCFirstStepsViewController.h"
#import "VLCFolderCollectionViewFlowLayout.h"
#import "VLCKeychainCoordinator.h"
#import "VLCMediaDataSource.h"
#import "VLCLibrarySearchDisplayDataSource.h"
#import "VLCMovieViewController.h"
......@@ -343,7 +342,7 @@ static NSString *kUsingTableViewToShowData = @"UsingTableViewToShowData";
- (void)createSpotlightItem:(nonnull NSManagedObject *)mediaObject
{
if ([CSSearchableItemAttributeSet class] != nil && ![[VLCKeychainCoordinator defaultCoordinator] passcodeLockEnabled]) {
if ([CSSearchableItemAttributeSet class] != nil && ![VLCKeychainCoordinator passcodeLockEnabled]) {
self.userActivity = [[NSUserActivity alloc] initWithActivityType:kVLCUserActivityPlaying];
MLFile *file = nil;
......
......@@ -16,10 +16,6 @@
#import "VLCMetadata.h"
#import "VLC_iOS-Swift.h"
#if TARGET_OS_IOS
#import "VLCKeychainCoordinator.h"
#endif
@interface VLCMiniPlaybackView () <UIGestureRecognizerDelegate>
{
UIImageView *_artworkView;
......
......@@ -16,8 +16,8 @@
#import "VLCLibraryViewController.h"
#import "IASKSettingsReader.h"
#import "PAPasscodeViewController.h"
#import "VLCKeychainCoordinator.h"
#import <LocalAuthentication/LocalAuthentication.h>
#import "VLC_iOS-Swift.h"
@interface VLCSettingsController ()<PAPasscodeViewControllerDelegate, IASKSettingsDelegate>
......@@ -72,8 +72,7 @@
- (void)filterCellsWithAnimation:(BOOL)shouldAnimate
{
NSMutableSet *hideKeys = [[NSMutableSet alloc] init];
VLCKeychainCoordinator *keychainCoordinator = [VLCKeychainCoordinator defaultCoordinator];
if (![keychainCoordinator passcodeLockEnabled]) {
if (![VLCKeychainCoordinator passcodeLockEnabled]) {
[hideKeys addObject:kVLCSettingPasscodeAllowTouchID];
[hideKeys addObject:kVLCSettingPasscodeAllowFaceID];
[self setHiddenKeys:hideKeys animated:shouldAnimate];
......@@ -133,7 +132,7 @@
//Set manually the value to NO to disable the UISwitch.
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:kVLCSettingPasscodeOnKey];
}
[[VLCKeychainCoordinator defaultCoordinator] setPasscode:passcode];
[VLCKeychainCoordinator setPasscodeWithPasscode:passcode];
[self updateUIAndCoreSpotlightForPasscodeSetting:passcode != nil];
if ([self.navigationController.presentedViewController isKindOfClass:[PAPasscodeViewController class]]) {
[self.navigationController.presentedViewController dismissViewControllerAnimated:YES completion:nil];
......
......@@ -6,3 +6,6 @@
#import "VLCPlaylistTableViewCell.h"
#import "VLCMediaDataSource.h"
#import "VLCLibraryViewController.h"
#import "PAPasscodeViewController.h"
#import <XKKeychain/XKKeychain.h>
#import "VLCConstants.h"
......@@ -21,6 +21,8 @@
41273A3D1A955C4100A2EF77 /* VLCMigrationViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 41273A3B1A955C4100A2EF77 /* VLCMigrationViewController.xib */; };
412BE7531FC4947400ACCC42 /* VLCMediaData+VLCDragAndDrop.swift in Sources */ = {isa = PBXBuildFile; fileRef = 412BE7521FC4947400ACCC42 /* VLCMediaData+VLCDragAndDrop.swift */; };
4144C4661A0ED6C700918C89 /* Reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D3784E6183A99E1009EE944 /* Reachability.m */; };
4152F1621FEF19BD00F1908B /* KeychainCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4152F1611FEF19BD00F1908B /* KeychainCoordinator.swift */; };
4152F1631FEF19BD00F1908B /* KeychainCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4152F1611FEF19BD00F1908B /* KeychainCoordinator.swift */; };
415908F71F34ED4000C6A831 /* VLCNetworkServerLoginInformation+Keychain.m in Sources */ = {isa = PBXBuildFile; fileRef = DDA1B9081CE902EE0076BC45 /* VLCNetworkServerLoginInformation+Keychain.m */; };
416DEFF61FEEA76A00F4FC59 /* LayoutAnchorContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 416DEFF51FEEA76A00F4FC59 /* LayoutAnchorContainer.swift */; };
416DEFF71FEEA76A00F4FC59 /* LayoutAnchorContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 416DEFF51FEEA76A00F4FC59 /* LayoutAnchorContainer.swift */; };
......@@ -204,7 +206,6 @@
7DB174B51CD20DC00085BCF0 /* VLCSearchController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DB174B31CD20DC00085BCF0 /* VLCSearchController.m */; };
7DB638AB185BC0890003887C /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7DB638AA185BC0890003887C /* Images.xcassets */; };
7DB847D71A5871570002DC30 /* VLCOneDriveObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DB847D61A5871570002DC30 /* VLCOneDriveObject.m */; };
7DBB788A1B30423B00894467 /* VLCKeychainCoordinator.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DBB78891B30423B00894467 /* VLCKeychainCoordinator.m */; };
7DBBF182183AB3B80009A339 /* VLCAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DBBF181183AB3B80009A339 /* VLCAppDelegate.m */; };
7DBBF19A183AB4300009A339 /* VLCCloudStorageTableViewCell~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7DBBF185183AB4300009A339 /* VLCCloudStorageTableViewCell~ipad.xib */; };
7DBBF19B183AB4300009A339 /* VLCCloudStorageTableViewCell~iphone.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7DBBF186183AB4300009A339 /* VLCCloudStorageTableViewCell~iphone.xib */; };
......@@ -316,7 +317,6 @@
7DC5500E1C046615007B4E42 /* VLCServerListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DD3EFEEC1BDEBA3800B68579 /* VLCServerListViewController.m */; };
7DC5500F1C046615007B4E42 /* VLCOneDriveObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DB847D61A5871570002DC30 /* VLCOneDriveObject.m */; };
7DC550101C046615007B4E42 /* VLCOneDriveTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D1052E81A4DCC1100295F08 /* VLCOneDriveTableViewController.m */; };
7DC550111C046615007B4E42 /* VLCKeychainCoordinator.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DBB78891B30423B00894467 /* VLCKeychainCoordinator.m */; };
7DC550121C046615007B4E42 /* VLCLocalNetworkServiceUPnP.m in Sources */ = {isa = PBXBuildFile; fileRef = DD3EFF251BDEBCE500B68579 /* VLCLocalNetworkServiceUPnP.m */; };
7DC550131C046615007B4E42 /* VLCNetworkListCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D30F3D2183AB2F100FFC021 /* VLCNetworkListCell.m */; };
7DC550141C046615007B4E42 /* VLCOneDriveController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D1052ED1A4DCD1E00295F08 /* VLCOneDriveController.m */; };
......@@ -741,6 +741,7 @@
41273A3A1A955C4100A2EF77 /* VLCMigrationViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCMigrationViewController.m; path = Sources/VLCMigrationViewController.m; sourceTree = SOURCE_ROOT; };
41273A3B1A955C4100A2EF77 /* VLCMigrationViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = VLCMigrationViewController.xib; path = Sources/VLCMigrationViewController.xib; sourceTree = SOURCE_ROOT; };
412BE7521FC4947400ACCC42 /* VLCMediaData+VLCDragAndDrop.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "VLCMediaData+VLCDragAndDrop.swift"; sourceTree = SOURCE_ROOT; };
4152F1611FEF19BD00F1908B /* KeychainCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = KeychainCoordinator.swift; path = Sources/KeychainCoordinator.swift; sourceTree = "<group>"; };
416DEFF51FEEA76A00F4FC59 /* LayoutAnchorContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LayoutAnchorContainer.swift; sourceTree = "<group>"; };
4171D34E18A2C19000A16EF9 /* VLCFolderCollectionViewFlowLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCFolderCollectionViewFlowLayout.h; path = Sources/VLCFolderCollectionViewFlowLayout.h; sourceTree = SOURCE_ROOT; };
4171D34F18A2C19000A16EF9 /* VLCFolderCollectionViewFlowLayout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCFolderCollectionViewFlowLayout.m; path = Sources/VLCFolderCollectionViewFlowLayout.m; sourceTree = SOURCE_ROOT; };
......@@ -1108,8 +1109,6 @@
7DB638AA185BC0890003887C /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = "../vlc-ios/Images.xcassets"; sourceTree = "<group>"; };
7DB847D51A5871570002DC30 /* VLCOneDriveObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCOneDriveObject.h; path = Sources/VLCOneDriveObject.h; sourceTree = SOURCE_ROOT; };
7DB847D61A5871570002DC30 /* VLCOneDriveObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCOneDriveObject.m; path = Sources/VLCOneDriveObject.m; sourceTree = SOURCE_ROOT; };
7DBB78881B30423B00894467 /* VLCKeychainCoordinator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCKeychainCoordinator.h; path = Sources/VLCKeychainCoordinator.h; sourceTree = SOURCE_ROOT; };
7DBB78891B30423B00894467 /* VLCKeychainCoordinator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCKeychainCoordinator.m; path = Sources/VLCKeychainCoordinator.m; sourceTree = SOURCE_ROOT; };
7DBBF180183AB3B80009A339 /* VLCAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCAppDelegate.h; path = Sources/VLCAppDelegate.h; sourceTree = SOURCE_ROOT; };
7DBBF181183AB3B80009A339 /* VLCAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCAppDelegate.m; path = Sources/VLCAppDelegate.m; sourceTree = SOURCE_ROOT; };
7DBBF185183AB4300009A339 /* VLCCloudStorageTableViewCell~ipad.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = "VLCCloudStorageTableViewCell~ipad.xib"; path = "Resources/VLCCloudStorageTableViewCell~ipad.xib"; sourceTree = SOURCE_ROOT; };
......@@ -2160,10 +2159,9 @@
7DBB788E1B305D8300894467 /* Keychain & random singletons */ = {
isa = PBXGroup;
children = (
7DBB78881B30423B00894467 /* VLCKeychainCoordinator.h */,
7DBB78891B30423B00894467 /* VLCKeychainCoordinator.m */,
7D18F0A01B34522000651A30 /* VLCActivityManager.h */,
7D18F0A11B34522000651A30 /* VLCActivityManager.m */,
4152F1611FEF19BD00F1908B /* KeychainCoordinator.swift */,
);
name = "Keychain & random singletons";
sourceTree = "<group>";
......@@ -3779,6 +3777,7 @@
7DC19ADF1868C7BB00810BF7 /* VLCFirstStepsViewController.m in Sources */,
DD3EFF331BDEBCE500B68579 /* VLCLocalNetworkServiceBrowserMediaDiscoverer.m in Sources */,
7DE56C1A1AD93F9100E8CA00 /* VLCPlaybackController.m in Sources */,
4152F1621FEF19BD00F1908B /* KeychainCoordinator.swift in Sources */,
DD7110F01AF38B2B00854776 /* MLMediaLibrary+playlist.m in Sources */,
7D5CAA891A4AD763003F2CBC /* VLCTrackSelectorTableViewCell.m in Sources */,
7D63C19018774B1700BD5256 /* VLCFirstStepsSecondPageViewController.m in Sources */,
......@@ -3854,7 +3853,6 @@
DD3EFEEE1BDEBA3800B68579 /* VLCServerListViewController.m in Sources */,
7DB847D71A5871570002DC30 /* VLCOneDriveObject.m in Sources */,
7D1052E91A4DCC1100295F08 /* VLCOneDriveTableViewController.m in Sources */,
7DBB788A1B30423B00894467 /* VLCKeychainCoordinator.m in Sources */,
DD3EFF591BDEBCE500B68579 /* VLCLocalNetworkServiceUPnP.m in Sources */,
7D30F3D7183AB2F100FFC021 /* VLCNetworkListCell.m in Sources */,
7D1052EE1A4DCD1E00295F08 /* VLCOneDriveController.m in Sources */,
......@@ -3949,6 +3947,7 @@
26D2F06F1D3D3CD4003F7417 /* VLCNetworkLoginDataSourceLogin.m in Sources */,
7DC54FED1C046615007B4E42 /* VLCPlexParser.m in Sources */,
7DC54FEE1C046615007B4E42 /* VLCMenuButton.m in Sources */,
4152F1631FEF19BD00F1908B /* KeychainCoordinator.swift in Sources */,
7DC54FEF1C046615007B4E42 /* VLCBoxController.m in Sources */,
41EB91D91F7BE6F900821AA5 /* VLCRemoteControlService.m in Sources */,
7DC54FF01C046615007B4E42 /* VLCSlider.m in Sources */,
......@@ -3986,7 +3985,6 @@
7DC5500E1C046615007B4E42 /* VLCServerListViewController.m in Sources */,
7DC5500F1C046615007B4E42 /* VLCOneDriveObject.m in Sources */,
7DC550101C046615007B4E42 /* VLCOneDriveTableViewController.m in Sources */,
7DC550111C046615007B4E42 /* VLCKeychainCoordinator.m in Sources */,
7DC550121C046615007B4E42 /* VLCLocalNetworkServiceUPnP.m in Sources */,
415908F71F34ED4000C6A831 /* VLCNetworkServerLoginInformation+Keychain.m in Sources */,
7DC550131C046615007B4E42 /* VLCNetworkListCell.m in Sources */,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment