Use shared image downloader session for file previews.

Signed-off-by: Ivan Sein <ivan@nextcloud.com>
This commit is contained in:
Ivan Sein 2019-10-14 15:19:26 +02:00
Родитель 4dda280462
Коммит 724b8724bc
8 изменённых файлов: 27 добавлений и 153 удалений

Просмотреть файл

@ -56,7 +56,6 @@
2C7A12432017872600864818 /* AddParticipantsTableViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2C7A12412017872600864818 /* AddParticipantsTableViewController.xib */; };
2C7C106221AF199300461817 /* SettingsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2C7C106021AF199300461817 /* SettingsViewController.m */; };
2C7F47AA20289B9600081CC7 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 2C7F47AC20289B9600081CC7 /* Localizable.strings */; };
2C86DB8B2135B910008770C3 /* NCFilePreviewSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 2C86DB8A2135B910008770C3 /* NCFilePreviewSessionManager.m */; };
2C8A2BC9221F094F00DE6D2C /* DirectoryTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2C8A2BC8221F094F00DE6D2C /* DirectoryTableViewController.m */; };
2C8A2BCE221FEEFE00DE6D2C /* DirectoryTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 2C8A2BCC221FEEFE00DE6D2C /* DirectoryTableViewCell.m */; };
2C8A2BCF221FEEFE00DE6D2C /* DirectoryTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2C8A2BCD221FEEFE00DE6D2C /* DirectoryTableViewCell.xib */; };
@ -254,8 +253,6 @@
2C7C105F21AF199300461817 /* SettingsViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SettingsViewController.h; sourceTree = "<group>"; };
2C7C106021AF199300461817 /* SettingsViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SettingsViewController.m; sourceTree = "<group>"; };
2C7F47AB20289B9600081CC7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
2C86DB892135B910008770C3 /* NCFilePreviewSessionManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NCFilePreviewSessionManager.h; sourceTree = "<group>"; };
2C86DB8A2135B910008770C3 /* NCFilePreviewSessionManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NCFilePreviewSessionManager.m; sourceTree = "<group>"; };
2C8A2BC7221F094F00DE6D2C /* DirectoryTableViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DirectoryTableViewController.h; sourceTree = "<group>"; };
2C8A2BC8221F094F00DE6D2C /* DirectoryTableViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DirectoryTableViewController.m; sourceTree = "<group>"; };
2C8A2BCB221FEEFE00DE6D2C /* DirectoryTableViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DirectoryTableViewCell.h; sourceTree = "<group>"; };
@ -776,8 +773,6 @@
2CBF82BC1FD5AE0A00636459 /* NCImageSessionManager.m */,
2CBF82BF1FD5AE3F00636459 /* NCPushProxySessionManager.h */,
2CBF82C01FD5AE3F00636459 /* NCPushProxySessionManager.m */,
2C86DB892135B910008770C3 /* NCFilePreviewSessionManager.h */,
2C86DB8A2135B910008770C3 /* NCFilePreviewSessionManager.m */,
);
name = Network;
sourceTree = "<group>";
@ -1307,7 +1302,6 @@
2C4D7D761F30F7B600FF4A0D /* ARDUtilities.m in Sources */,
2C961E112216BF4B00F5C23F /* OCFileDto.m in Sources */,
2CBF82AE1FC888FC00636459 /* NCPushNotification.m in Sources */,
2C86DB8B2135B910008770C3 /* NCFilePreviewSessionManager.m in Sources */,
2CC7159420C54D080045C789 /* ChatTableViewCell.m in Sources */,
2CA1CCAA1F02D1A4002FE6A2 /* NCAPIController.m in Sources */,
2C3780C3210F49DC003F9AE8 /* HeaderWithButton.m in Sources */,

Просмотреть файл

@ -11,7 +11,6 @@
#import "DirectoryTableViewCell.h"
#import "OCFileDto.h"
#import "NCAPIController.h"
#import "NCFilePreviewSessionManager.h"
#import "NCSettingsController.h"
#import "NCUtils.h"
#import "PlaceholderView.h"
@ -329,7 +328,7 @@
cell.fileImageView.image = [UIImage imageNamed:@"folder"];
} else if (item.hasPreview) {
NSString *fileId = [NSString stringWithFormat:@"%f", item.id];
[cell.fileImageView setImageWithURLRequest:[[NCFilePreviewSessionManager sharedInstance] createPreviewRequestForFile:fileId width:40 height:40]
[cell.fileImageView setImageWithURLRequest:[[NCAPIController sharedInstance] createPreviewRequestForFile:fileId width:40 height:40 usingAccount:[[NCDatabaseManager sharedInstance] activeAccount]]
placeholderImage:filePreviewImage success:nil failure:nil];
} else {
cell.fileImageView.image = filePreviewImage;

Просмотреть файл

@ -8,7 +8,6 @@
#import "FileMessageTableViewCell.h"
#import "SLKUIConstants.h"
#import "NCFilePreviewSessionManager.h"
#import "NCSettingsController.h"
#import "NCUtils.h"
#import "OpenInFirefoxControllerObjC.h"

Просмотреть файл

@ -130,6 +130,9 @@ typedef void (^UnsubscribeToPushProxyCompletionBlock)(NSError *error);
// User avatars
- (NSURLRequest *)createAvatarRequestForUser:(NSString *)userId andSize:(NSInteger)size usingAccount:(TalkAccount *)account;
// File previews
- (NSURLRequest *)createPreviewRequestForFile:(NSString *)fileId width:(NSInteger)width height:(NSInteger)height usingAccount:(TalkAccount *)account;
// User Profile
- (NSURLSessionDataTask *)getUserProfileForAccount:(TalkAccount *)account withCompletionBlock:(GetUserProfileCompletionBlock)block;

Просмотреть файл

@ -11,7 +11,6 @@
#import "CCCertificate.h"
#import "NCAPISessionManager.h"
#import "NCDatabaseManager.h"
#import "NCFilePreviewSessionManager.h"
#import "NCPushProxySessionManager.h"
#import "NCSettingsController.h"
@ -61,15 +60,18 @@ NSString * const kNCSpreedAPIVersion = @"/apps/spreed/api/v1";
- (void)createAPISessionManagerForAccount:(TalkAccount *)account
{
NCAPISessionManager *sessionManager = [[NCAPISessionManager alloc] init];
NCAPISessionManager *apiSessionManager = [[NCAPISessionManager alloc] init];
[apiSessionManager.requestSerializer setValue:[self authHeaderForAccount:account] forHTTPHeaderField:@"Authorization"];
[_apiSessionManagers setObject:apiSessionManager forKey:account.account];
}
- (NSString *)authHeaderForAccount:(TalkAccount *)account
{
NSString *userTokenString = [NSString stringWithFormat:@"%@:%@", account.user, [[NCSettingsController sharedInstance] tokenForAccount:account.account]];
NSData *data = [userTokenString dataUsingEncoding:NSUTF8StringEncoding];
NSString *base64Encoded = [data base64EncodedStringWithOptions:0];
NSString *authHeader = [[NSString alloc]initWithFormat:@"Basic %@",base64Encoded];
[sessionManager.requestSerializer setValue:authHeader forHTTPHeaderField:@"Authorization"];
[_apiSessionManagers setObject:sessionManager forKey:account.account];
return [[NSString alloc]initWithFormat:@"Basic %@",base64Encoded];
}
- (NSString *)getRequestURLForAccount:(TalkAccount *)account withEndpoint:(NSString *)endpoint
@ -1017,6 +1019,16 @@ NSString * const kNCSpreedAPIVersion = @"/apps/spreed/api/v1";
timeoutInterval:60];
}
#pragma mark - File previews
- (NSURLRequest *)createPreviewRequestForFile:(NSString *)fileId width:(NSInteger)width height:(NSInteger)height usingAccount:(TalkAccount *)account
{
NSString *urlString = [NSString stringWithFormat:@"%@/index.php/core/preview?fileId=%@&x=%ld&y=%ld&forceIcon=1", account.server, fileId, (long)width, (long)height];
NSMutableURLRequest *previewRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString] cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:60];
[previewRequest setValue:[self authHeaderForAccount:account] forHTTPHeaderField:@"Authorization"];
return previewRequest;
}
#pragma mark - User profile
- (NSURLSessionDataTask *)getUserProfileForAccount:(TalkAccount *)account withCompletionBlock:(GetUserProfileCompletionBlock)block

Просмотреть файл

@ -24,7 +24,7 @@
#import "NCMessageParameter.h"
#import "NCChatTitleView.h"
#import "NCMessageTextView.h"
#import "NCFilePreviewSessionManager.h"
#import "NCImageSessionManager.h"
#import "NCRoomsManager.h"
#import "NCRoomController.h"
#import "NCSettingsController.h"
@ -78,7 +78,7 @@
[self registerClassForTextView:[NCMessageTextView class]];
// Set image downloader to file preview imageviews.
AFImageDownloader *imageDownloader = [[AFImageDownloader alloc]
initWithSessionManager:[NCFilePreviewSessionManager sharedInstance]
initWithSessionManager:[NCImageSessionManager sharedInstance]
downloadPrioritization:AFImageDownloadPrioritizationFIFO
maximumActiveDownloads:4
imageCache:[[AFAutoPurgingImageCache alloc] init]];
@ -1099,12 +1099,13 @@
fileCell.filePath = message.file.path;
NSDate *date = [[NSDate alloc] initWithTimeIntervalSince1970:message.timestamp];
fileCell.dateLabel.text = [self getTimeFromDate:date];
[fileCell.avatarView setImageWithURLRequest:[[NCAPIController sharedInstance] createAvatarRequestForUser:message.actorId andSize:96 usingAccount:[[NCDatabaseManager sharedInstance] activeAccount]]
TalkAccount *activeAccount = [[NCDatabaseManager sharedInstance] activeAccount];
[fileCell.avatarView setImageWithURLRequest:[[NCAPIController sharedInstance] createAvatarRequestForUser:message.actorId andSize:96 usingAccount:activeAccount]
placeholderImage:nil success:nil failure:nil];
NSString *imageName = [[NCUtils previewImageForFileMIMEType:message.file.mimetype] stringByAppendingString:@"-chat-preview"];
UIImage *filePreviewImage = [UIImage imageNamed:imageName];
__weak FilePreviewImageView *weakPreviewImageView = fileCell.previewImageView;
[fileCell.previewImageView setImageWithURLRequest:[[NCFilePreviewSessionManager sharedInstance] createPreviewRequestForFile:message.file.parameterId width:120 height:120]
[fileCell.previewImageView setImageWithURLRequest:[[NCAPIController sharedInstance] createPreviewRequestForFile:message.file.parameterId width:120 height:120 usingAccount:activeAccount]
placeholderImage:filePreviewImage success:^(NSURLRequest * _Nonnull request, NSHTTPURLResponse * _Nullable response, UIImage * _Nonnull image) {
[weakPreviewImageView setImage:image];
weakPreviewImageView.layer.borderColor = [[UIColor colorWithWhite:0.9 alpha:1.0] CGColor];

Просмотреть файл

@ -1,25 +0,0 @@
//
// NCFilePreviewSessionManager.h
// VideoCalls
//
// Created by Ivan Sein on 28.08.18.
// Copyright © 2018 struktur AG. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "AFNetworking.h"
typedef void (^GetFilePreviewCompletionBlock)(UIImage *preview, NSError *error);
@interface NCFilePreviewSessionManager : AFHTTPSessionManager
@property (nonatomic, strong) NSString *userAgent;
+ (instancetype)sharedInstance;
- (void)setNCServer:(NSString *)serverUrl;
- (void)setAuthHeaderWithUser:(NSString *)user andToken:(NSString *)token;
- (NSURLSessionDataTask *)getFilePreview:(NSString *)fileId width:(NSInteger)width height:(NSInteger)height withCompletionBlock:(GetFilePreviewCompletionBlock)block;
- (NSURLRequest *)createPreviewRequestForFile:(NSString *)fileId width:(NSInteger)width height:(NSInteger)height;
@end

Просмотреть файл

@ -1,109 +0,0 @@
//
// NCFilePreviewSessionManager.m
// VideoCalls
//
// Created by Ivan Sein on 28.08.18.
// Copyright © 2018 struktur AG. All rights reserved.
//
#import "NCFilePreviewSessionManager.h"
#import "CCCertificate.h"
@interface NCFilePreviewSessionManager () <NSURLSessionTaskDelegate, NSURLSessionDelegate>
{
NSString *_serverUrl;
NSString *_authHeader;
NSString *_userAgent;
}
@end
@implementation NCFilePreviewSessionManager
+ (NCFilePreviewSessionManager *)sharedInstance
{
static dispatch_once_t once;
static NCFilePreviewSessionManager *sharedInstance;
dispatch_once(&once, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
- (void)setNCServer:(NSString *)serverUrl
{
_serverUrl = serverUrl;
}
- (void)setAuthHeaderWithUser:(NSString *)user andToken:(NSString *)token
{
NSString *userTokenString = [NSString stringWithFormat:@"%@:%@", user, token];
NSData *data = [userTokenString dataUsingEncoding:NSUTF8StringEncoding];
NSString *base64Encoded = [data base64EncodedStringWithOptions:0];
NSString *authHeader = [[NSString alloc]initWithFormat:@"Basic %@",base64Encoded];
[[NCFilePreviewSessionManager sharedInstance].requestSerializer setValue:authHeader forHTTPHeaderField:@"Authorization"];
_authHeader = authHeader;
}
- (id)init
{
// Set ephemeralSessionConfiguration and just use AFAutoPurgingImageCache for caching images.
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration ephemeralSessionConfiguration];
self = [super initWithSessionConfiguration:configuration];
if (self) {
_userAgent = [NSString stringWithFormat:@"Mozilla/5.0 (iOS) Nextcloud-Talk v%@",
[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]];
self.responseSerializer = [[AFImageResponseSerializer alloc] init];
self.requestSerializer = [[AFHTTPRequestSerializer alloc] init];
AFSecurityPolicy* policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
self.securityPolicy = policy;
self.responseSerializer.acceptableContentTypes = [self.responseSerializer.acceptableContentTypes setByAddingObject:@"image/jpg"];
[self.requestSerializer setValue:_userAgent forHTTPHeaderField:@"User-Agent"];
}
return self;
}
- (NSURLSessionDataTask *)getFilePreview:(NSString *)fileId width:(NSInteger)width height:(NSInteger)height withCompletionBlock:(GetFilePreviewCompletionBlock)block
{
NSString *URLString = [NSString stringWithFormat:@"%@/index.php/core/preview", _serverUrl];
NSDictionary *parameters = @{@"fileId" : fileId,
@"x" : @(width),
@"y" : @(height),
@"forceIcon" : @(1)};
NSURLSessionDataTask *task = [[NCFilePreviewSessionManager sharedInstance] GET:URLString parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
if (block) {
block(responseObject, nil);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if (block) {
block(nil, error);
}
}];
return task;
}
- (NSURLRequest *)createPreviewRequestForFile:(NSString *)fileId width:(NSInteger)width height:(NSInteger)height
{
NSString *urlString = [NSString stringWithFormat:@"%@/index.php/core/preview?fileId=%@&x=%ld&y=%ld&forceIcon=1", _serverUrl, fileId, (long)width, (long)height];
NSMutableURLRequest *previewRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString] cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:60];
[previewRequest setValue:_authHeader forHTTPHeaderField:@"Authorization"];
return previewRequest;
}
-(void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler
{
if ([[CCCertificate sharedManager] checkTrustedChallenge:challenge]) {
completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]);
} else {
completionHandler(NSURLSessionAuthChallengePerformDefaultHandling, nil);
}
}
@end