Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 24 additions & 15 deletions ownCloud/Client/Viewer/DisplayHostViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,13 @@ class DisplayHostViewController: UIPageViewController {
private var initialItem: OCItem
private var displayedIndex: Int?

public var items: [OCItem]?
public var items: [OCItem]? {
didSet {
playableItems = items?.filter({ $0.isPlayable })
}
}

private var playableItems: [OCItem]?

private var query: OCQuery
private var queryStarted : Bool = false
Expand Down Expand Up @@ -215,12 +221,13 @@ class DisplayHostViewController: UIPageViewController {
return nil
}

private func viewControllerAtIndex(index: Int) -> UIViewController? {
guard let items = items else { return nil }
private func viewControllerAtIndex(index: Int, includeOnlyMediaItems: Bool = false) -> UIViewController? {

guard index >= 0, index < items.count else { return nil }
guard let processedItems = includeOnlyMediaItems ? playableItems : items else { return nil }

let item = items[index]
guard index >= 0, index < processedItems.count else { return nil }

let item = processedItems[index]

let viewController = self.viewController(for: item)
(viewController as? DisplayViewController)?.itemIndex = index
Expand Down Expand Up @@ -262,24 +269,26 @@ class DisplayHostViewController: UIPageViewController {

extension DisplayHostViewController: UIPageViewControllerDataSource {

private func vendNewViewController(from viewController:UIViewController, _ position:PagePosition) -> UIViewController? {
private func vendNewViewController(from viewController:UIViewController, _ position:PagePosition, includeOnlyMediaItems: Bool = false) -> UIViewController? {
guard let displayViewController = viewControllers?.first as? DisplayViewController else { return nil }
guard let item = displayViewController.item, let items = self.items else { return nil }
guard let item = displayViewController.item else { return nil }

guard let processedItems = includeOnlyMediaItems ? playableItems : items else { return nil }

// Is the item assigned to the currently visible view controller still available?
let index = items.firstIndex(where: {$0.localID == item.localID})
let index = processedItems.firstIndex(where: {$0.localID == item.localID})

if index != nil {
// If so, then vend view controller with the item next to the current item
if let nextIndex = computeNewIndex(for: index!, itemCount:items.count, position: position) {
return viewControllerAtIndex(index: nextIndex)
if let nextIndex = computeNewIndex(for: index!, itemCount:processedItems.count, position: position) {
return viewControllerAtIndex(index: nextIndex, includeOnlyMediaItems: includeOnlyMediaItems)
}

} else {
// Currently visible item was deleted or moved, use it's old index to find a new one
if let index = displayViewController.itemIndex {
if let nextIndex = computeNewIndex(for: index, itemCount:items.count, position: position, indexFound: false) {
return viewControllerAtIndex(index: nextIndex)
if let nextIndex = computeNewIndex(for: index, itemCount:processedItems.count, position: position, indexFound: false) {
return viewControllerAtIndex(index: nextIndex, includeOnlyMediaItems: includeOnlyMediaItems)
}
}
}
Expand Down Expand Up @@ -330,23 +339,23 @@ extension DisplayHostViewController {

@objc private func handleMediaPlaybackFinished(notification:Notification) {
if let mediaController = self.viewControllers?.first as? MediaDisplayViewController {
if let vc = vendNewViewController(from: mediaController, .after) {
if let vc = vendNewViewController(from: mediaController, .after, includeOnlyMediaItems: true) {
self.setViewControllers([vc], direction: .forward, animated: false, completion: nil)
}
}
}

@objc private func handlePlayNextMedia(notification:Notification) {
if let mediaController = self.viewControllers?.first as? MediaDisplayViewController {
if let vc = vendNewViewController(from: mediaController, .after) {
if let vc = vendNewViewController(from: mediaController, .after, includeOnlyMediaItems: true) {
self.setViewControllers([vc], direction: .forward, animated: false, completion: nil)
}
}
}

@objc private func handlePlayPreviousMedia(notification:Notification) {
if let mediaController = self.viewControllers?.first as? MediaDisplayViewController {
if let vc = vendNewViewController(from: mediaController, .before) {
if let vc = vendNewViewController(from: mediaController, .before, includeOnlyMediaItems: true) {
self.setViewControllers([vc], direction: .forward, animated: false, completion: nil)
}
}
Expand Down
12 changes: 12 additions & 0 deletions ownCloudAppShared/SDK Extensions/OCItem+Extension.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,20 @@

import UIKit
import ownCloudSDK
import CoreServices

extension OCItem {

public var isPlayable: Bool {
guard let mime = self.mimeType else { return false }

guard let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, mime as CFString, nil) else {
return false
}

return UTTypeConformsTo(uti.takeUnretainedValue(), kUTTypeAudiovisualContent)
}

static private let iconNamesByMIMEType : [String:String] = {
var mimeTypeToIconMap : [String:String] = [
// List taken from https://github.com/owncloud/core/blob/master/core/js/mimetypelist.js
Expand Down