From a451569c20e1e4f42b270bbdccb9d721d35eaf21 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Fri, 26 Feb 2016 12:22:10 +0100 Subject: [PATCH] MOBILE-1439 prefetch: Check size in all resources and mmFile --- www/addons/mod_book/services/handlers.js | 21 ++++--------- www/addons/mod_folder/services/handlers.js | 13 ++++---- www/addons/mod_imscp/services/handlers.js | 20 ++++--------- www/addons/mod_page/services/handlers.js | 20 ++++--------- www/addons/mod_resource/services/handlers.js | 20 ++++--------- www/core/components/course/services/helper.js | 30 +++++++++++++++++++ www/core/directives/file.js | 17 +++++++---- 7 files changed, 72 insertions(+), 69 deletions(-) diff --git a/www/addons/mod_book/services/handlers.js b/www/addons/mod_book/services/handlers.js index ece656381dc..0a9a18790d1 100644 --- a/www/addons/mod_book/services/handlers.js +++ b/www/addons/mod_book/services/handlers.js @@ -21,9 +21,9 @@ angular.module('mm.addons.mod_book') * @ngdoc service * @name $mmaModBookHandlers */ -.factory('$mmaModBookHandlers', function($mmCourse, $mmaModBook, $mmEvents, $state, $mmSite, $mmUtil, $mmFilepool, +.factory('$mmaModBookHandlers', function($mmCourse, $mmaModBook, $mmEvents, $state, $mmSite, $mmCourseHelper, $mmFilepool, $mmCoursePrefetchDelegate, mmCoreDownloading, mmCoreNotDownloaded, mmCoreOutdated, mmCoreDownloaded, - mmCoreEventPackageStatusChanged, mmaModBookComponent, $mmContentLinksHelper, $q) { + mmCoreEventPackageStatusChanged, mmaModBookComponent, $mmContentLinksHelper, $q, $mmaModBookPrefetchHandler) { var self = {}; @@ -67,11 +67,8 @@ angular.module('mm.addons.mod_book') action: function(e) { e.preventDefault(); e.stopPropagation(); - $mmaModBook.prefetchContent(module).catch(function() { - if (!$scope.$$destroyed) { - $mmUtil.showErrorModal('mm.core.errordownloading', true); - } - }); + var size = $mmaModBookPrefetchHandler.getDownloadSize(module); + $mmCourseHelper.prefetchModule($mmaModBook, module, size, false); } }; @@ -82,14 +79,8 @@ angular.module('mm.addons.mod_book') action: function(e) { e.preventDefault(); e.stopPropagation(); - - $mmaModBook.invalidateContent(module.id).finally(function() { - $mmaModBook.prefetchContent(module).catch(function() { - if (!$scope.$$destroyed) { - $mmUtil.showErrorModal('mm.core.errordownloading', true); - } - }); - }); + var size = $mmaModBookPrefetchHandler.getDownloadSize(module); + $mmCourseHelper.prefetchModule($mmaModBook, module, size, true); } }; diff --git a/www/addons/mod_folder/services/handlers.js b/www/addons/mod_folder/services/handlers.js index 8fc3759e068..178c8856a1c 100644 --- a/www/addons/mod_folder/services/handlers.js +++ b/www/addons/mod_folder/services/handlers.js @@ -21,9 +21,9 @@ angular.module('mm.addons.mod_folder') * @ngdoc service * @name $mmaModFolderHandlers */ -.factory('$mmaModFolderHandlers', function($mmCourse, $mmaModFolder, $mmEvents, $state, $mmSite, $mmUtil, $mmFilepool, +.factory('$mmaModFolderHandlers', function($mmCourse, $mmaModFolder, $mmEvents, $state, $mmSite, $mmCourseHelper, $mmFilepool, $mmCoursePrefetchDelegate, mmCoreDownloading, mmCoreNotDownloaded, mmCoreOutdated, mmCoreEventPackageStatusChanged, - mmaModFolderComponent, $mmContentLinksHelper, $q) { + mmaModFolderComponent, $mmContentLinksHelper, $q, $mmaModFolderPrefetchHandler) { var self = {}; /** @@ -70,11 +70,10 @@ angular.module('mm.addons.mod_folder') function prefetchFolder(e) { e.preventDefault(); e.stopPropagation(); - $mmaModFolder.prefetchContent(module).catch(function() { - if (!$scope.$$destroyed) { - $mmUtil.showErrorModal('mm.core.errordownloading', true); - } - }); + + // Check size and show confirmation if needed. + var size = $mmaModFolderPrefetchHandler.getDownloadSize(module); + $mmCourseHelper.prefetchModule($mmaModFolder, module, size, false); } downloadBtn = { diff --git a/www/addons/mod_imscp/services/handlers.js b/www/addons/mod_imscp/services/handlers.js index dc03d3ec548..315fd3cd8dc 100644 --- a/www/addons/mod_imscp/services/handlers.js +++ b/www/addons/mod_imscp/services/handlers.js @@ -21,9 +21,9 @@ angular.module('mm.addons.mod_imscp') * @ngdoc service * @name $mmaModImscpHandlers */ -.factory('$mmaModImscpHandlers', function($mmCourse, $mmaModImscp, $mmEvents, $state, $mmSite, $mmUtil, $mmFilepool, +.factory('$mmaModImscpHandlers', function($mmCourse, $mmaModImscp, $mmEvents, $state, $mmSite, $mmCourseHelper, $mmFilepool, $mmCoursePrefetchDelegate, mmCoreDownloading, mmCoreNotDownloaded, mmCoreOutdated, mmCoreEventPackageStatusChanged, - mmaModImscpComponent, $mmContentLinksHelper, $q) { + mmaModImscpComponent, $mmContentLinksHelper, $q, $mmaModImscpPrefetchHandler) { var self = {}; /** @@ -73,11 +73,8 @@ angular.module('mm.addons.mod_imscp') action: function(e) { e.preventDefault(); e.stopPropagation(); - $mmaModImscp.prefetchContent(module).catch(function() { - if (!$scope.$$destroyed) { - $mmUtil.showErrorModal('mm.core.errordownloading', true); - } - }); + var size = $mmaModImscpPrefetchHandler.getDownloadSize(module); + $mmCourseHelper.prefetchModule($mmaModImscp, module, size, false); } }; @@ -88,13 +85,8 @@ angular.module('mm.addons.mod_imscp') action: function(e) { e.preventDefault(); e.stopPropagation(); - $mmaModImscp.invalidateContent(module.id).then(function() { - $mmaModImscp.prefetchContent(module).catch(function() { - if (!$scope.$$destroyed) { - $mmUtil.showErrorModal('mm.core.errordownloading', true); - } - }); - }); + var size = $mmaModImscpPrefetchHandler.getDownloadSize(module); + $mmCourseHelper.prefetchModule($mmaModImscp, module, size, true); } }; diff --git a/www/addons/mod_page/services/handlers.js b/www/addons/mod_page/services/handlers.js index ccc5a3e71f9..1f588587b3f 100644 --- a/www/addons/mod_page/services/handlers.js +++ b/www/addons/mod_page/services/handlers.js @@ -21,9 +21,9 @@ angular.module('mm.addons.mod_page') * @ngdoc service * @name $mmaModPageHandlers */ -.factory('$mmaModPageHandlers', function($mmCourse, $mmaModPage, $mmEvents, $state, $mmSite, $mmUtil, $mmFilepool, +.factory('$mmaModPageHandlers', function($mmCourse, $mmaModPage, $mmEvents, $state, $mmSite, $mmCourseHelper, $mmFilepool, $mmCoursePrefetchDelegate, mmCoreDownloading, mmCoreNotDownloaded, mmCoreOutdated, mmCoreEventPackageStatusChanged, - mmaModPageComponent, $mmContentLinksHelper, $q) { + mmaModPageComponent, $mmContentLinksHelper, $q, $mmaModPagePrefetchHandler) { var self = {}; /** @@ -67,11 +67,8 @@ angular.module('mm.addons.mod_page') action: function(e) { e.preventDefault(); e.stopPropagation(); - $mmaModPage.prefetchContent(module).catch(function() { - if (!$scope.$$destroyed) { - $mmUtil.showErrorModal('mm.core.errordownloading', true); - } - }); + var size = $mmaModPagePrefetchHandler.getDownloadSize(module); + $mmCourseHelper.prefetchModule($mmaModPage, module, size, false); } }; @@ -82,13 +79,8 @@ angular.module('mm.addons.mod_page') action: function(e) { e.preventDefault(); e.stopPropagation(); - $mmaModPage.invalidateContent(module.id).finally(function() { - $mmaModPage.prefetchContent(module).catch(function() { - if (!$scope.$$destroyed) { - $mmUtil.showErrorModal('mm.core.errordownloading', true); - } - }); - }); + var size = $mmaModPagePrefetchHandler.getDownloadSize(module); + $mmCourseHelper.prefetchModule($mmaModPage, module, size, true); } }; diff --git a/www/addons/mod_resource/services/handlers.js b/www/addons/mod_resource/services/handlers.js index 4cc33dab696..847993f08cd 100644 --- a/www/addons/mod_resource/services/handlers.js +++ b/www/addons/mod_resource/services/handlers.js @@ -21,9 +21,9 @@ angular.module('mm.addons.mod_resource') * @ngdoc service * @name $mmaModResourceHandlers */ -.factory('$mmaModResourceHandlers', function($mmCourse, $mmaModResource, $mmEvents, $state, $mmSite, $mmUtil, +.factory('$mmaModResourceHandlers', function($mmCourse, $mmaModResource, $mmEvents, $state, $mmSite, $mmCourseHelper, $mmCoursePrefetchDelegate, $mmFilepool, $mmFS, mmCoreDownloading, mmCoreNotDownloaded, mmCoreOutdated, - mmCoreEventPackageStatusChanged, mmaModResourceComponent, $q, $mmContentLinksHelper) { + mmCoreEventPackageStatusChanged, mmaModResourceComponent, $q, $mmContentLinksHelper, $mmaModResourcePrefetchHandler) { var self = {}; /** @@ -67,11 +67,8 @@ angular.module('mm.addons.mod_resource') action: function(e) { e.preventDefault(); e.stopPropagation(); - $mmaModResource.prefetchContent(module).catch(function() { - if (!$scope.$$destroyed) { - $mmUtil.showErrorModal('mm.core.errordownloading', true); - } - }); + var size = $mmaModResourcePrefetchHandler.getDownloadSize(module); + $mmCourseHelper.prefetchModule($mmaModResource, module, size, false); } }; @@ -82,13 +79,8 @@ angular.module('mm.addons.mod_resource') action: function(e) { e.preventDefault(); e.stopPropagation(); - $mmaModResource.invalidateContent(module.id).finally(function() { - $mmaModResource.prefetchContent(module).catch(function() { - if (!$scope.$$destroyed) { - $mmUtil.showErrorModal('mm.core.errordownloading', true); - } - }); - }); + var size = $mmaModResourcePrefetchHandler.getDownloadSize(module); + $mmCourseHelper.prefetchModule($mmaModResource, module, size, true); } }; diff --git a/www/core/components/course/services/helper.js b/www/core/components/course/services/helper.js index 7db7d01c81c..ed419e32142 100644 --- a/www/core/components/course/services/helper.js +++ b/www/core/components/course/services/helper.js @@ -299,6 +299,36 @@ angular.module('mm.core.course') } }; + /** + * Helper function to prefetch a module, showing a confirmation modal if the size is big + * and invalidating contents if refreshing. + * + * @module mm.core.course + * @ngdoc method + * @name $mmCourseHelper#prefetchModule + * @param {Object} service Service implementing 'invalidateContent' and 'prefetchContent'. + * @param {Object} module Module to download. + * @param {Number} size Size of the module. + * @param {Boolean} refresh True if refreshing, false otherwise. + * @return {Promise} Promise resolved when downloaded. + */ + self.prefetchModule = function(service, module, size, refresh) { + // Show confirmation if needed. + return $mmUtil.confirmDownloadSize(size).then(function() { + // Invalidate content if refreshing and download the data. + var promise = refresh ? service.invalidateContent(module.id) : $q.when(); + return promise.catch(function() { + // Ignore errors. + }).then(function() { + return service.prefetchContent(module).catch(function() { + if (!$scope.$$destroyed) { + $mmUtil.showErrorModal('mm.core.errordownloading', true); + } + }); + }); + }); + }; + /** * Prefetch or restore the prefetch of a certain section if it needs to be prefetched. * If the section is "All sections" it will be ignored. diff --git a/www/core/directives/file.js b/www/core/directives/file.js index 7a9c640ba37..a209929245e 100644 --- a/www/core/directives/file.js +++ b/www/core/directives/file.js @@ -28,6 +28,7 @@ angular.module('mm.core') * @param {Object} file Required. Object with the following attributes: * 'filename': Name of the file. * 'fileurl' or 'url': File URL. + * 'filesize': Optional. Size of the file. * @param {String} [component] Component the file belongs to. * @param {Number} [componentId] Component ID. * @param {Boolean} [timemodified] If set, the value will be used to check if the file is outdated. @@ -94,6 +95,7 @@ angular.module('mm.core') link: function(scope, element, attrs) { var fileurl = scope.file.fileurl || scope.file.url, filename = scope.file.filename, + filesize = scope.file.filesize, timemodified = attrs.timemodified || 0, siteid = $mmSite.getId(), component = attrs.component, @@ -116,6 +118,7 @@ angular.module('mm.core') scope.download = function(e, openAfterDownload) { e.preventDefault(); e.stopPropagation(); + var promise; if (scope.isDownloading) { return; @@ -134,13 +137,17 @@ angular.module('mm.core') }); }); } else { - // File doesn't need to be opened, add it to queue. - $mmFilepool.invalidateFileByUrl(siteid, fileurl).finally(function() { - scope.isDownloading = true; - $mmFilepool.addToQueueByUrl(siteid, fileurl, component, componentid, timemodified); + // File doesn't need to be opened (it's a prefetch). Show confirm modal if file size is defined and it's big. + promise = filesize ? $mmUtil.confirmDownloadSize(filesize) : $q.when(); + promise.then(function() { + // User confirmed, add the file to queue. + $mmFilepool.invalidateFileByUrl(siteid, fileurl).finally(function() { + scope.isDownloading = true; + $mmFilepool.addToQueueByUrl(siteid, fileurl, component, componentid, timemodified); + }); }); } - } + }; scope.$on('$destroy', function() { if (observer && observer.off) {