MediaViewController.swift 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. /*****************************************************************************
  2. * MediaViewController.swift
  3. * VLC for iOS
  4. *****************************************************************************
  5. * Copyright (c) 2018 VideoLAN. All rights reserved.
  6. * $Id$
  7. *
  8. * Authors: Carola Nitz <nitz.carola # gmail.com>
  9. *
  10. * Refer to the COPYING file of the official project for license.
  11. *****************************************************************************/
  12. import Foundation
  13. @objc public protocol VLCMediaViewControllerDelegate: class {
  14. func mediaViewControllerDidSelectMediaObject(_ mediaViewController: VLCMediaViewController, mediaObject: NSManagedObject)
  15. func mediaViewControllerDidSelectSort(_ mediaViewController: VLCMediaViewController)
  16. }
  17. public class VLCMediaViewController: UICollectionViewController, UISearchResultsUpdating, UISearchControllerDelegate {
  18. private var services: Services
  19. private var mediaDatasourceAndDelegate: MediaDataSourceAndDelegate?
  20. private var searchController: UISearchController?
  21. private let searchDataSource = VLCLibrarySearchDisplayDataSource()
  22. public weak var delegate: VLCMediaViewControllerDelegate?
  23. @available(iOS 11.0, *)
  24. lazy var dragAndDropManager: VLCDragAndDropManager = {
  25. let dragAndDropManager = VLCDragAndDropManager()
  26. dragAndDropManager.delegate = services.mediaDataSource
  27. return dragAndDropManager
  28. }()
  29. public convenience init(services: Services) {
  30. self.init(collectionViewLayout: UICollectionViewFlowLayout())
  31. self.services = services
  32. NotificationCenter.default.addObserver(self, selector: #selector(themeDidChange), name: .VLCThemeDidChangeNotification, object: nil)
  33. }
  34. public override init(collectionViewLayout layout: UICollectionViewLayout) {
  35. self.services = Services()
  36. super.init(collectionViewLayout: layout)
  37. }
  38. @available(*, unavailable)
  39. required public init?(coder aDecoder: NSCoder) {
  40. fatalError("init(coder:) has not been implemented")
  41. }
  42. override public func viewDidLoad() {
  43. super.viewDidLoad()
  44. setupCollectionView()
  45. setupSearchController()
  46. setupNavigationBar()
  47. _ = (MLMediaLibrary.sharedMediaLibrary() as! MLMediaLibrary).libraryDidAppear()
  48. }
  49. @objc func themeDidChange() {
  50. collectionView?.backgroundColor = PresentationTheme.current.colors.background
  51. }
  52. func setupCollectionView() {
  53. mediaDatasourceAndDelegate = MediaDataSourceAndDelegate(services: services)
  54. mediaDatasourceAndDelegate?.delegate = self
  55. let playlistnib = UINib(nibName: "VLCPlaylistCollectionViewCell", bundle:nil)
  56. collectionView?.register(playlistnib, forCellWithReuseIdentifier: VLCPlaylistCollectionViewCell.cellIdentifier())
  57. collectionView?.backgroundColor = PresentationTheme.current.colors.background
  58. collectionView?.alwaysBounceVertical = true
  59. collectionView?.dataSource = mediaDatasourceAndDelegate
  60. collectionView?.delegate = mediaDatasourceAndDelegate
  61. if #available(iOS 11.0, *) {
  62. collectionView?.dragDelegate = dragAndDropManager
  63. collectionView?.dropDelegate = dragAndDropManager
  64. }
  65. }
  66. override public func viewDidAppear(_ animated: Bool) {
  67. super.viewDidAppear(animated)
  68. services.mediaDataSource.updateContents(forSelection: nil)
  69. services.mediaDataSource.addAllFolders()
  70. services.mediaDataSource.addRemainingFiles()
  71. collectionView?.reloadData()
  72. }
  73. func setupSearchController() {
  74. searchController = UISearchController(searchResultsController: nil)
  75. searchController?.searchResultsUpdater = self
  76. searchController?.dimsBackgroundDuringPresentation = false
  77. searchController?.delegate = self
  78. if let textfield = searchController?.searchBar.value(forKey: "searchField") as? UITextField {
  79. if let backgroundview = textfield.subviews.first {
  80. backgroundview.backgroundColor = UIColor.white
  81. backgroundview.layer.cornerRadius = 10
  82. backgroundview.clipsToBounds = true
  83. }
  84. }
  85. if #available(iOS 11.0, *) {
  86. navigationItem.searchController = searchController
  87. } else {
  88. navigationItem.titleView = searchController?.searchBar
  89. searchController?.hidesNavigationBarDuringPresentation = false
  90. }
  91. }
  92. func setupNavigationBar() {
  93. navigationItem.leftBarButtonItem = UIBarButtonItem(title: NSLocalizedString("SORT", comment: ""), style: .plain, target: self, action: #selector(sort))
  94. }
  95. @objc func sort() {
  96. delegate?.mediaViewControllerDidSelectSort(self)
  97. }
  98. override public func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
  99. collectionView?.collectionViewLayout.invalidateLayout()
  100. }
  101. // MARK: - MediaDatasourceAndDelegate
  102. override public func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
  103. delegate?.mediaViewControllerDidSelectMediaObject(self, mediaObject:services.mediaDataSource.object(at: UInt(indexPath.row)))
  104. }
  105. // MARK: - Search
  106. public func updateSearchResults(for searchController: UISearchController) {
  107. searchDataSource.shouldReloadTable(forSearch: searchController.searchBar.text, searchableFiles: services.mediaDataSource.allObjects())
  108. collectionView?.reloadData()
  109. }
  110. public func didPresentSearchController(_ searchController: UISearchController) {
  111. collectionView?.dataSource = searchDataSource
  112. }
  113. public func didDismissSearchController(_ searchController: UISearchController) {
  114. collectionView?.dataSource = mediaDatasourceAndDelegate
  115. }
  116. }