Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/thumbnails #32

Merged
merged 4 commits into from
May 18, 2018
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
2 changes: 1 addition & 1 deletion ios-sdk
Submodule ios-sdk updated 69 files
+2 −0 Example/Ocean/ViewController.m
+26 −0 doc/COMPONENTS.md
+12 −0 doc/CONFIGURATION.md
+119 −11 ownCloudSDK.xcodeproj/project.pbxproj
+3 −3 ownCloudSDK/Authentication/OCAuthenticationMethod.h
+2 −1 ownCloudSDK/Authentication/OCAuthenticationMethod.m
+1 −1 ownCloudSDK/Authentication/OCAuthenticationMethodBasicAuth.m
+19 −2 ownCloudSDK/Authentication/OCAuthenticationMethodOAuth2.m
+15 −7 ownCloudSDK/Bookmark/OCBookmark.h
+63 −44 ownCloudSDK/Bookmark/OCBookmark.m
+0 −0 ownCloudSDK/Categories/Foundation/NSData+OCHash.h
+0 −0 ownCloudSDK/Categories/Foundation/NSData+OCHash.m
+0 −0 ownCloudSDK/Categories/Foundation/NSDate+OCDateParser.h
+0 −0 ownCloudSDK/Categories/Foundation/NSDate+OCDateParser.m
+15 −0 ownCloudSDK/Categories/Foundation/NSProgress+OCExtensions.h
+18 −0 ownCloudSDK/Categories/Foundation/NSProgress+OCExtensions.m
+25 −0 ownCloudSDK/Categories/Foundation/NSString+OCVersionCompare.h
+63 −0 ownCloudSDK/Categories/Foundation/NSString+OCVersionCompare.m
+0 −0 ownCloudSDK/Categories/Foundation/NSURL+OCURLNormalization.h
+0 −0 ownCloudSDK/Categories/Foundation/NSURL+OCURLNormalization.m
+0 −0 ownCloudSDK/Categories/Foundation/NSURL+OCURLQueryParameterExtensions.h
+0 −0 ownCloudSDK/Categories/Foundation/NSURL+OCURLQueryParameterExtensions.m
+30 −0 ownCloudSDK/Categories/UIKit/UIImage+OCTools.h
+97 −0 ownCloudSDK/Categories/UIKit/UIImage+OCTools.m
+61 −0 ownCloudSDK/Connection/OCConnection+Compatibility.m
+3 −1 ownCloudSDK/Connection/OCConnection+Tools.m
+23 −1 ownCloudSDK/Connection/OCConnection.h
+199 −15 ownCloudSDK/Connection/OCConnection.m
+1 −1 ownCloudSDK/Connection/OCConnectionIssue.m
+1 −1 ownCloudSDK/Connection/OCConnectionQueue.h
+43 −4 ownCloudSDK/Connection/OCConnectionQueue.m
+7 −3 ownCloudSDK/Connection/OCConnectionRequest.h
+11 −4 ownCloudSDK/Connection/OCConnectionRequest.m
+1 −0 ownCloudSDK/Core/OCCore+Internal.h
+17 −2 ownCloudSDK/Core/OCCore.h
+292 −7 ownCloudSDK/Core/OCCore.m
+5 −1 ownCloudSDK/Errors/NSError+OCError.h
+11 −0 ownCloudSDK/Events/OCEvent.h
+10 −0 ownCloudSDK/Events/OCEvent.m
+2 −0 ownCloudSDK/Events/OCEventTarget.h
+10 −0 ownCloudSDK/Events/OCEventTarget.m
+42 −0 ownCloudSDK/Item/Images/OCImage.h
+159 −0 ownCloudSDK/Item/Images/OCImage.m
+40 −0 ownCloudSDK/Item/Images/OCItemThumbnail.h
+139 −0 ownCloudSDK/Item/Images/OCItemThumbnail.m
+22 −4 ownCloudSDK/Item/OCItem.h
+77 −1 ownCloudSDK/Item/OCItem.m
+29 −0 ownCloudSDK/Item/OCItemVersionIdentifier.h
+82 −0 ownCloudSDK/Item/OCItemVersionIdentifier.m
+3 −0 ownCloudSDK/OCTypes.h
+2 −0 ownCloudSDK/Resources/en.lproj/Localizable.strings
+3 −2 ownCloudSDK/Settings/OCClassSettings.h
+18 −1 ownCloudSDK/Settings/OCClassSettings.m
+50 −0 ownCloudSDK/Toolkit/OCCache.h
+192 −0 ownCloudSDK/Toolkit/OCCache.m
+30 −0 ownCloudSDK/Vaults/Database/OCDatabase+Schemas.h
+183 −0 ownCloudSDK/Vaults/Database/OCDatabase+Schemas.m
+14 −2 ownCloudSDK/Vaults/Database/OCDatabase.h
+236 −32 ownCloudSDK/Vaults/Database/OCDatabase.m
+97 −0 ownCloudSDK/Vaults/Database/OCDatabaseConsistentOperation.h
+109 −0 ownCloudSDK/Vaults/Database/OCDatabaseConsistentOperation.m
+4 −1 ownCloudSDK/Vaults/Database/SQLite/OCSQLiteDB.m
+2 −0 ownCloudSDK/Vaults/Database/SQLite/Queries/OCSQLiteTransaction.h
+7 −0 ownCloudSDK/ownCloudSDK.h
+0 −10 ownCloudSDKTests/BookmarkTests.m
+143 −1 ownCloudSDKTests/ConnectionTests.m
+238 −3 ownCloudSDKTests/CoreTests.m
+1 −1 ownCloudSDKTests/Host Simulator/OCHostSimulator.m
+101 −0 ownCloudSDKTests/MiscTests.m
48 changes: 42 additions & 6 deletions ownCloud/Client/ClientItemCell.swift
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ class ClientItemCell: ThemeTableViewCell {
var detailLabel : UILabel = UILabel()
var iconView : UIImageView = UIImageView()

var activeThumbnailRequestProgress : Progress?

weak var core : OCCore?

override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
prepareViewAndConstraints()
Expand All @@ -49,13 +53,13 @@ class ClientItemCell: ThemeTableViewCell {
self.contentView.addSubview(iconView)

iconView.leftAnchor.constraint(equalTo: self.contentView.leftAnchor, constant: 20).isActive = true
iconView.rightAnchor.constraint(equalTo: titleLabel.leftAnchor, constant: -25).isActive = true
iconView.rightAnchor.constraint(equalTo: detailLabel.leftAnchor, constant: -25).isActive = true
iconView.rightAnchor.constraint(equalTo: titleLabel.leftAnchor, constant: -15).isActive = true
iconView.rightAnchor.constraint(equalTo: detailLabel.leftAnchor, constant: -15).isActive = true

titleLabel.rightAnchor.constraint(equalTo: self.contentView.rightAnchor, constant: -20).isActive = true
detailLabel.rightAnchor.constraint(equalTo: self.contentView.rightAnchor, constant: -20).isActive = true

iconView.widthAnchor.constraint(equalToConstant: 40).isActive = true
iconView.widthAnchor.constraint(equalToConstant: 60).isActive = true
iconView.centerYAnchor.constraint(equalTo: self.contentView.centerYAnchor).isActive = true

titleLabel.topAnchor.constraint(equalTo: self.contentView.topAnchor, constant: 20).isActive = true
Expand All @@ -69,17 +73,23 @@ class ClientItemCell: ThemeTableViewCell {

// MARK: - Present item
var item : OCItem? {
willSet {
if let item: OCItem = newValue {
updateWith(item)
didSet {
if let newItem: OCItem = item {
updateWith(newItem)
}
}
}

func updateWith(_ item: OCItem) {
let iconSize : CGSize = CGSize(width: 40, height: 40)
let thumbnailSize : CGSize = CGSize(width: 60, height: 60)
var iconImage : UIImage?

// Cancel any already active request
if activeThumbnailRequestProgress != nil {
activeThumbnailRequestProgress?.cancel()
}

iconImage = item.icon(fitInSize: iconSize)

if item.type == .collection {
Expand All @@ -90,6 +100,32 @@ class ClientItemCell: ThemeTableViewCell {
self.accessoryType = .none
}

if item.thumbnailAvailability != .none {
let displayThumbnail = { (thumbnail: OCItemThumbnail?) in
_ = thumbnail?.requestImage(for: thumbnailSize, scale: 0, withCompletionHandler: { (thumbnail, error, _, image) in
if error == nil,
image != nil,
self.item?.versionIdentifier == thumbnail?.versionIdentifier {
OnMainThread {
self.iconView.image = image
}
}
})
}

if let thumbnail = item.thumbnail {
displayThumbnail(thumbnail)
} else {
activeThumbnailRequestProgress = core?.retrieveThumbnail(for: item, maximumSize: thumbnailSize, scale: 0, retrieveHandler: { [weak self] (_, _, _, thumbnail, _, progress) in
displayThumbnail(thumbnail)

if self?.activeThumbnailRequestProgress === progress {
self?.activeThumbnailRequestProgress = nil
}
})
}
}

self.iconView.image = iconImage
self.titleLabel.text = item.name
}
Expand Down
9 changes: 8 additions & 1 deletion ownCloud/Client/ClientQueryViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -218,8 +218,15 @@ class ClientQueryViewController: UITableViewController, Themeable {

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "itemCell", for: indexPath) as? ClientItemCell
let newItem = self.items![indexPath.row]

cell?.item = self.items![indexPath.row]
cell?.core = self.core

// UITableView can call this method several times for the same cell, and .dequeueReusableCell will then return the same cell again.
// Make sure we don't request the thumbnail multiple times in that case.
if cell?.item?.versionIdentifier != newItem.versionIdentifier {
cell?.item = newItem
}

return cell!
}
Expand Down