Skip to content

Commit d90f7d7

Browse files
committed
MOBILE-1325 folder: Support prefetch folder
1 parent ca86532 commit d90f7d7

File tree

5 files changed

+213
-4
lines changed

5 files changed

+213
-4
lines changed

www/addons/mod_folder/main.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414

1515
angular.module('mm.addons.mod_folder', ['mm.core'])
1616

17+
.constant('mmaModFolderComponent', 'mmaModFolder')
18+
1719
.config(function($stateProvider) {
1820

1921
$stateProvider
@@ -36,6 +38,7 @@ angular.module('mm.addons.mod_folder', ['mm.core'])
3638

3739
})
3840

39-
.config(function($mmCourseDelegateProvider) {
41+
.config(function($mmCourseDelegateProvider, $mmCoursePrefetchDelegateProvider) {
4042
$mmCourseDelegateProvider.registerContentHandler('mmaModFolder', 'folder', '$mmaModFolderCourseContentHandler');
43+
$mmCoursePrefetchDelegateProvider.registerPrefetchHandler('mmaModFolder', 'folder', '$mmaModFolderPrefetchHandler');
4144
});

www/addons/mod_folder/services/course_content_handler.js

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ angular.module('mm.addons.mod_folder')
2121
* @ngdoc service
2222
* @name $mmaModFolderCourseContentHandler
2323
*/
24-
.factory('$mmaModFolderCourseContentHandler', function($mmCourse, $mmaModFolder, $state) {
24+
.factory('$mmaModFolderCourseContentHandler', function($mmCourse, $mmaModFolder, $mmEvents, $state, $mmSite, $mmUtil, $mmFilepool,
25+
$mmCoursePrefetchDelegate, mmCoreDownloading, mmCoreNotDownloaded, mmCoreOutdated, mmCoreEventPackageStatusChanged,
26+
mmaModFolderComponent) {
2527
var self = {};
2628

2729
/**
@@ -49,11 +51,67 @@ angular.module('mm.addons.mod_folder')
4951
*/
5052
self.getController = function(module, courseid, sectionid) {
5153
return function($scope) {
54+
var downloadBtn,
55+
refreshBtn,
56+
revision = $mmFilepool.getRevisionFromFileList(module.contents),
57+
timemodified = $mmFilepool.getTimemodifiedFromFileList(module.contents);
58+
59+
// Prefetch folder contents.
60+
function prefetchFolder(e) {
61+
e.preventDefault();
62+
e.stopPropagation();
63+
$mmaModFolder.prefetchContent(module).catch(function() {
64+
$mmUtil.showErrorModal('mm.core.errordownloading', true);
65+
});
66+
}
67+
68+
downloadBtn = {
69+
hidden: true,
70+
icon: 'ion-ios-cloud-download',
71+
label: 'mm.core.download',
72+
action: prefetchFolder
73+
};
74+
75+
refreshBtn = {
76+
hidden: true,
77+
icon: 'ion-android-refresh',
78+
label: 'mm.core.refresh',
79+
action: prefetchFolder
80+
};
81+
5282
$scope.icon = $mmCourse.getModuleIconSrc('folder');
5383
$scope.title = module.name;
84+
$scope.buttons = [downloadBtn, refreshBtn];
85+
$scope.spinner = false;
86+
5487
$scope.action = function(e) {
88+
e.preventDefault();
89+
e.stopPropagation();
5590
$state.go('site.mod_folder', {module: module, courseid: courseid, sectionid: sectionid});
5691
};
92+
93+
// Show buttons according to module status.
94+
function showStatus(status) {
95+
if (status) {
96+
$scope.spinner = status === mmCoreDownloading;
97+
downloadBtn.hidden = status !== mmCoreNotDownloaded;
98+
refreshBtn.hidden = status !== mmCoreOutdated;
99+
}
100+
}
101+
102+
// Listen for changes on this module status.
103+
var statusObserver = $mmEvents.on(mmCoreEventPackageStatusChanged, function(data) {
104+
if (data.siteid === $mmSite.getId() && data.componentId === module.id && data.component === mmaModFolderComponent) {
105+
showStatus(data.status);
106+
}
107+
});
108+
109+
// Get current status to decide which icon should be shown.
110+
$mmCoursePrefetchDelegate.getModuleStatus(module, revision, timemodified).then(showStatus);
111+
112+
$scope.$on('$destroy', function() {
113+
statusObserver && statusObserver.off && statusObserver.off();
114+
});
57115
};
58116
};
59117

www/addons/mod_folder/services/folder.js

Lines changed: 70 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,32 @@ angular.module('mm.addons.mod_folder')
2020
* @module mm.addons.mod_folder
2121
* @ngdoc service
2222
* @name $mmaModFolder
23+
* @todo Adding a new file in a folder updates the revision of all the files, so they're all shown as outdated.
24+
* To ignore revision in folders we'll have to modify $mmCoursePrefetchDelegate, mm-file and $mmFilepool.
2325
*/
24-
.factory('$mmaModFolder', function($mmSite, $mmUtil, $mmCourse, $q) {
26+
.factory('$mmaModFolder', function($mmSite, $mmCourse, $q, $mmFilepool, mmaModFolderComponent) {
2527
var self = {};
2628

29+
/**
30+
* Download all the content.
31+
*
32+
* @module mm.addons.mod_folder
33+
* @ngdoc method
34+
* @name $mmaModFolder#downloadAllContent
35+
* @param {Object} module The module object.
36+
* @return {Promise} Promise resolved when all content is downloaded. Data returned is not reliable.
37+
*/
38+
self.downloadAllContent = function(module) {
39+
var files = self.getDownloadableFiles(module),
40+
revision = $mmFilepool.getRevisionFromFileList(module.contents),
41+
timemod = $mmFilepool.getTimemodifiedFromFileList(module.contents);
42+
return $mmFilepool.downloadPackage($mmSite.getId(), files, mmaModFolderComponent, module.id, revision, timemod);
43+
};
44+
2745
/**
2846
* Format folder contents, creating directory structure.
2947
*
30-
* @module mm.addons.mod_url
48+
* @module mm.addons.mod_folder
3149
* @ngdoc method
3250
* @name $mmaModFolder#formatContents
3351
* @param {Object[]} contents Folder contents.
@@ -94,6 +112,40 @@ angular.module('mm.addons.mod_folder')
94112
return folders.concat(files);
95113
};
96114

115+
/**
116+
* Returns a list of files that can be downloaded.
117+
*
118+
* @module mm.addons.mod_folder
119+
* @ngdoc method
120+
* @name $mmaModFolder#getDownloadableFiles
121+
* @param {Object} module The module object returned by WS.
122+
* @return {Object[]} List of files.
123+
*/
124+
self.getDownloadableFiles = function(module) {
125+
var files = [];
126+
127+
angular.forEach(module.contents, function(content) {
128+
if (self.isFileDownloadable(content)) {
129+
files.push(content);
130+
}
131+
});
132+
133+
return files;
134+
};
135+
136+
/**
137+
* Check if a file is downloadable. The file param must have a 'type' attribute like in core_course_get_contents response.
138+
*
139+
* @module mm.addons.mod_folder
140+
* @ngdoc method
141+
* @name $mmaModFolder#isFileDownloadable
142+
* @param {Object} file File to check.
143+
* @return {Boolean} True if downloadable, false otherwise.
144+
*/
145+
self.isFileDownloadable = function(file) {
146+
return file.type === 'file';
147+
};
148+
97149
/**
98150
* Report a folder as being viewed.
99151
*
@@ -113,5 +165,21 @@ angular.module('mm.addons.mod_folder')
113165
return $q.reject();
114166
};
115167

168+
/**
169+
* Prefetch the content.
170+
*
171+
* @module mm.addons.mod_folder
172+
* @ngdoc method
173+
* @name $mmaModFolder#prefetchContent
174+
* @param {Object} module The module object.
175+
* @return {Promise} Promise resolved when all content is downloaded. Data returned is not reliable.
176+
*/
177+
self.prefetchContent = function(module) {
178+
var files = self.getDownloadableFiles(module),
179+
revision = $mmFilepool.getRevisionFromFileList(module.contents),
180+
timemod = $mmFilepool.getTimemodifiedFromFileList(module.contents);
181+
return $mmFilepool.prefetchPackage($mmSite.getId(), files, mmaModFolderComponent, module.id, revision, timemod);
182+
};
183+
116184
return self;
117185
});
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
// (C) Copyright 2015 Martin Dougiamas
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
angular.module('mm.addons.mod_folder')
16+
17+
/**
18+
* Mod folder prefetch handler.
19+
*
20+
* @module mm.addons.mod_folder
21+
* @ngdoc service
22+
* @name $mmaModFolderPrefetchHandler
23+
*/
24+
.factory('$mmaModFolderPrefetchHandler', function($mmaModFolder, $mmSite, mmaModFolderComponent) {
25+
26+
var self = {};
27+
28+
self.component = mmaModFolderComponent;
29+
30+
/**
31+
* Get the download size of a module.
32+
*
33+
* @module mm.addons.mod_folder
34+
* @ngdoc method
35+
* @name $mmaModFolderPrefetchHandler#getDownloadSize
36+
* @param {Object} module Module to get the size.
37+
* @return {Number} Size.
38+
*/
39+
self.getDownloadSize = function(module) {
40+
var size = 0;
41+
angular.forEach(module.contents, function(content) {
42+
if ($mmaModFolder.isFileDownloadable(content) && content.filesize) {
43+
size = size + content.filesize;
44+
}
45+
});
46+
return size;
47+
};
48+
49+
/**
50+
* Whether or not the module is enabled for the site.
51+
*
52+
* @module mm.addons.mod_folder
53+
* @ngdoc method
54+
* @name $mmaModFolderPrefetchHandler#isEnabled
55+
* @return {Boolean}
56+
*/
57+
self.isEnabled = function() {
58+
return true;
59+
};
60+
61+
/**
62+
* Prefetch the module.
63+
*
64+
* @module mm.addons.mod_folder
65+
* @ngdoc method
66+
* @name $mmaModFolderPrefetchHandler#prefetch
67+
* @param {Object} module The module object returned by WS.
68+
* @return {Promise} Promise resolved when all files have been downloaded. Data returned is not reliable.
69+
*/
70+
self.prefetch = function(module) {
71+
return $mmaModFolder.prefetchContent(module);
72+
};
73+
74+
return self;
75+
});

www/core/components/course/services/prefetchdelegate.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,11 @@ angular.module('mm.core')
170170
if (handler.getFiles) { // If the handler defines its own function to determine the files, use it.
171171
files = handler.getFiles(module);
172172
}
173+
174+
if (files.length === 0) { // No files, treat is as downloaded.
175+
return $q.when(mmCoreDownloaded);
176+
}
177+
173178
revision = revision || $mmFilepool.getRevisionFromFileList(files);
174179
timemodified = timemodified || $mmFilepool.getTimemodifiedFromFileList(files);
175180

0 commit comments

Comments
 (0)