Improve attachment upload progress indicator.

* Should never show up for attachments in the failed state.
* Show show up without delay for attachments being sent.
* Show disappear when attachment upload fails in any way.

// FREEBIE
pull/1/head
Matthew Chen 9 years ago
parent 74ade28173
commit e28a81e6ad

@ -17,6 +17,10 @@ NSString *const kAttachmentUploadProgressNotification = @"kAttachmentUploadProgr
NSString *const kAttachmentUploadProgressKey = @"kAttachmentUploadProgressKey";
NSString *const kAttachmentUploadAttachmentIDKey = @"kAttachmentUploadAttachmentIDKey";
// Use a slightly non-zero value to ensure that the progress
// indicator shows up as quickly as possible.
static const CGFloat kAttachmentUploadProgressTheta = 0.001f;
@interface OWSUploadingService ()
@property (nonatomic, readonly) TSNetworkManager *networkManager;
@ -42,12 +46,26 @@ NSString *const kAttachmentUploadAttachmentIDKey = @"kAttachmentUploadAttachment
success:(void (^)())successHandler
failure:(RetryableFailureHandler)failureHandler
{
void (^successHandlerWrapper)() = ^{
[self fireProgressNotification:1 attachmentId:attachmentStream.uniqueId];
successHandler();
};
RetryableFailureHandler failureHandlerWrapper = ^(NSError *_Nonnull error, BOOL isRetryable) {
[self fireProgressNotification:0 attachmentId:attachmentStream.uniqueId];
failureHandler(error, isRetryable);
};
if (attachmentStream.serverId) {
DDLogDebug(@"%@ Attachment previously uploaded.", self.tag);
successHandler(outgoingMessage);
successHandlerWrapper(outgoingMessage);
return;
}
[self fireProgressNotification:kAttachmentUploadProgressTheta attachmentId:attachmentStream.uniqueId];
TSRequest *allocateAttachment = [[TSAllocAttachmentRequest alloc] init];
[self.networkManager makeRequest:allocateAttachment
success:^(NSURLSessionDataTask *task, id responseObject) {
@ -55,7 +73,7 @@ NSString *const kAttachmentUploadAttachmentIDKey = @"kAttachmentUploadAttachment
if (![responseObject isKindOfClass:[NSDictionary class]]) {
DDLogError(@"%@ unexpected response from server: %@", self.tag, responseObject);
NSError *error = OWSErrorMakeUnableToProcessServerResponseError();
return failureHandler(error, YES);
return failureHandlerWrapper(error, YES);
}
NSDictionary *responseDict = (NSDictionary *)responseObject;
@ -66,7 +84,7 @@ NSString *const kAttachmentUploadAttachmentIDKey = @"kAttachmentUploadAttachment
NSData *attachmentData = [attachmentStream readDataFromFileWithError:&error];
if (error) {
DDLogError(@"%@ Failed to read attachment data with error:%@", self.tag, error);
return failureHandler(error, YES);
return failureHandlerWrapper(error, YES);
}
NSData *encryptionKey;
@ -88,15 +106,15 @@ NSString *const kAttachmentUploadAttachmentIDKey = @"kAttachmentUploadAttachment
attachmentStream.isUploaded = YES;
[attachmentStream save];
successHandler();
successHandlerWrapper();
}
failure:failureHandler];
failure:failureHandlerWrapper];
});
}
failure:^(NSURLSessionDataTask *task, NSError *error) {
DDLogError(@"%@ Failed to allocate attachment with error: %@", self.tag, error);
failureHandler(error, YES);
failureHandlerWrapper(error, YES);
}];
}
@ -115,18 +133,16 @@ NSString *const kAttachmentUploadAttachmentIDKey = @"kAttachmentUploadAttachment
AFURLSessionManager *manager = [[AFURLSessionManager alloc]
initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
[self fireProgressNotification:0 attachmentId:attachmentId];
NSURLSessionUploadTask *uploadTask;
uploadTask = [manager uploadTaskWithRequest:request
fromData:cipherText
progress:^(NSProgress *_Nonnull uploadProgress) {
[self fireProgressNotification:uploadProgress.fractionCompleted attachmentId:attachmentId];
[self fireProgressNotification:MAX(kAttachmentUploadProgressTheta, uploadProgress.fractionCompleted)
attachmentId:attachmentId];
}
completionHandler:^(NSURLResponse *_Nonnull response, id _Nullable responseObject, NSError *_Nullable error) {
OWSAssert([NSThread isMainThread]);
if (error) {
[self fireProgressNotification:0 attachmentId:attachmentId];
return failureHandler(error, YES);
}
@ -139,8 +155,6 @@ NSString *const kAttachmentUploadAttachmentIDKey = @"kAttachmentUploadAttachment
}
successHandler();
[self fireProgressNotification:1 attachmentId:attachmentId];
}];
[uploadTask resume];

Loading…
Cancel
Save