зеркало из https://github.com/nextcloud/talk-ios.git
Use shared image downloader session for file previews.
Signed-off-by: Ivan Sein <ivan@nextcloud.com>
This commit is contained in:
Родитель
4dda280462
Коммит
724b8724bc
|
@ -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
|
Загрузка…
Ссылка в новой задаче