diff --git a/app/js/directives.js b/app/js/directives.js index 554e8d5b..5fa5d6bd 100644 --- a/app/js/directives.js +++ b/app/js/directives.js @@ -791,7 +791,7 @@ angular.module('myApp.directives', ['myApp.filters']) \
\
\ -
{{error.text}}
\ +
\
\ ', scope: { @@ -819,7 +819,7 @@ angular.module('myApp.directives', ['myApp.filters']) } } - MtpApiFileManager.downloadFile($scope.video.dc_id, inputLocation, $scope.video.size, null, {mime: 'video/mp4'}).then(function (url) { + var promise = MtpApiFileManager.downloadFile($scope.video.dc_id, inputLocation, $scope.video.size, null, {mime: 'video/mp4'}).then(function (url) { $scope.progress.enabled = false; // $scope.progress = {enabled: true, percent: 50}; $scope.player.hasQuicktime = hasQt; @@ -839,6 +839,10 @@ angular.module('myApp.directives', ['myApp.filters']) }, function (progress) { $scope.progress.percent = Math.max(1, Math.floor(100 * progress.done / progress.total)); }); + + $scope.$on('$destroy', function () { + promise.cancel(); + }); } }) diff --git a/app/js/lib/mtproto.js b/app/js/lib/mtproto.js index 353fd3da..2ff499af 100644 --- a/app/js/lib/mtproto.js +++ b/app/js/lib/mtproto.js @@ -2927,6 +2927,8 @@ factory('MtpApiFileManager', function (MtpApiManager, $q, $window) { } var deferred = $q.defer(), + canceled = false, + resolved = false, cacheFileWriter, errorHandler = function (error) { console.error(error); @@ -2948,7 +2950,10 @@ factory('MtpApiFileManager', function (MtpApiManager, $q, $window) { writeFileDeferred = $q.defer(); (function (isFinal, offset, writeFileDeferred, writeFilePromise) { return downloadRequest(dcID, function () { - // console.log('next big promise'); + // console.log('next big promise'); + if (canceled) { + return $q.when(); + } return MtpApiManager.invokeApi('upload.getFile', { location: location, offset: offset, @@ -2964,6 +2969,9 @@ factory('MtpApiFileManager', function (MtpApiManager, $q, $window) { // console.log('waiting for file promise', offset); writeFilePromise.then(function () { // console.log('resolved file promise', offset); + if (canceled) { + return $q.when(); + } return fileWriteBytes(fileWriter, result.bytes).then(function () { @@ -2974,6 +2982,7 @@ factory('MtpApiFileManager', function (MtpApiManager, $q, $window) { if (isFinal) { // console.timeEnd(fileName + ' ' + (size / 1024)); + resolved = true; deferred.resolve(cachedDownloads[fileName] = fileEntry.toURL(options.mime || 'image/jpeg')); } else { // console.log('notify', {done: offset + limit, total: size}); @@ -3003,6 +3012,7 @@ factory('MtpApiFileManager', function (MtpApiManager, $q, $window) { fileEntry.file(function(file) { // console.log(dT(), 'Check size', file.size, size); if (file.size >= size/* && false*/) { + resolved = true; deferred.resolve(cachedDownloads[fileName] = fileEntry.toURL()); } else { console.log('File bad size', file, size); @@ -3022,6 +3032,9 @@ factory('MtpApiFileManager', function (MtpApiManager, $q, $window) { writeBlobDeferred = $q.defer(); (function (isFinal, offset, writeBlobDeferred, writeBlobPromise) { return downloadRequest(dcID, function () { + if (canceled) { + return $q.when(); + } return MtpApiManager.invokeApi('upload.getFile', { location: location, offset: offset, @@ -3033,6 +3046,9 @@ factory('MtpApiFileManager', function (MtpApiManager, $q, $window) { }); }, 6).then(function (result) { writeBlobPromise.then(function () { + if (canceled) { + return $q.when(); + } try { blobParts.push(bytesToArrayBuffer(result.bytes)); writeBlobDeferred.resolve(); @@ -3049,8 +3065,8 @@ factory('MtpApiFileManager', function (MtpApiManager, $q, $window) { var blob = bb.getBlob(options.mime || 'image/jpeg'); } - window.URL = window.URL || window.webkitURL; + resolved = true; deferred.resolve(cachedDownloads[fileName] = URL.createObjectURL(blob)); } else { deferred.notify({done: offset + limit, total: size}); @@ -3071,6 +3087,14 @@ factory('MtpApiFileManager', function (MtpApiManager, $q, $window) { }); } + deferred.promise.cancel = function () { + if (!canceled && !resolved) { + canceled = true; + delete cachedDownloadPromises[fileName]; + errorHandler({type: 'DOWNLOAD_CANCELED'}); + } + } + return cachedDownloadPromises[fileName] = deferred.promise; } @@ -3106,8 +3130,11 @@ factory('MtpApiFileManager', function (MtpApiManager, $q, $window) { function uploadFile (file) { var fileSize = file.size, // partSize = fileSize > 102400 ? 65536 : 4096, - partSize = fileSize > 102400 ? 524288 : 4096, + // partSize = fileSize > 102400 ? 524288 : 4096, + partSize = fileSize > 102400 ? 524288 : 30720, totalParts = Math.ceil(fileSize / partSize), + canceled = false, + resolved = false, doneParts = 0; if (totalParts > 1500) { @@ -3143,7 +3170,7 @@ factory('MtpApiFileManager', function (MtpApiManager, $q, $window) { var blob = file.slice(offset, offset + partSize); reader.onloadend = function (e) { - if (e.target.readyState != FileReader.DONE) { + if (canceled || e.target.readyState != FileReader.DONE) { return; } var apiCurPromise = apiUploadPromise = apiUploadPromise.then(function () { @@ -3162,6 +3189,7 @@ factory('MtpApiFileManager', function (MtpApiManager, $q, $window) { fileReadDeferred.resolve(); if (doneParts >= totalParts) { deferred.resolve(resultInputFile); + resolved = true; } else { console.log(dT(), 'Progress', doneParts * partSize / fileSize); deferred.notify({done: doneParts * partSize, total: fileSize}); @@ -3176,6 +3204,13 @@ factory('MtpApiFileManager', function (MtpApiManager, $q, $window) { })(offset, part++); } + deferred.promise.cancel = function () { + if (!canceled && !resolved) { + canceled = true; + errorHandler({type: 'UPLOAD_CANCELED'}); + } + } + return deferred.promise; } diff --git a/app/js/services.js b/app/js/services.js index b81ebeff..31fa575a 100644 --- a/app/js/services.js +++ b/app/js/services.js @@ -1214,7 +1214,9 @@ angular.module('myApp.services', []) } message.send = function () { - MtpApiFileManager.uploadFile(file).then(function (inputFile) { + var uploaded = false; + var promise = MtpApiFileManager.uploadFile(file).then(function (inputFile) { + uploaded = true; var inputMedia; switch (attachType) { case 'photo': @@ -1274,6 +1276,13 @@ angular.module('myApp.services', []) $rootScope.$broadcast('history_update', {peerID: peerID}); } }); + + media.progress.cancel = function () { + if (!uploaded) { + promise.cancel(); + cancelPendingMessage(randomID); + } + } }; saveMessages([message]); @@ -1395,6 +1404,36 @@ angular.module('myApp.services', []) }); }; + function cancelPendingMessage (randomID) { + var pendingData = pendingByRandomID[randomID]; + + if (pendingData) { + var peerID = pendingData[0], + tempID = pendingData[1], + historyStorage = historiesStorage[peerID], + i; + + for (i = 0; i < historyStorage.pending.length; i++) { + if (historyStorage.pending[i] == tempID) { + historyStorage.pending.splice(i, 1); + break; + } + } + + delete messagesForHistory[tempID]; + delete messagesStorage[tempID]; + + ApiUpdatesManager.saveUpdate({ + _: 'updateDeleteMessages', + messages: [tempID] + }); + + return true; + } + + return false; + } + function finalizePendingMessage(randomID, finalMessage) { var pendingData = pendingByRandomID[randomID]; // console.log('pdata', randomID, pendingData); @@ -1494,6 +1533,10 @@ angular.module('myApp.services', []) var message = angular.copy(messagesStorage[msgID]) || {id: msgID}; + if (message.progress) { + message.progress = messagesStorage[msgID].progress; + } + message.fromUser = AppUsersManager.getUser(message.from_id); message.fromPhoto = AppUsersManager.getUserPhoto(message.from_id, 'User'); diff --git a/app/partials/message.html b/app/partials/message.html index c7499740..dcfeee7a 100644 --- a/app/partials/message.html +++ b/app/partials/message.html @@ -221,6 +221,7 @@ +