MOBILE-1764 prefetch: Improve prefetch size calculation

main
Pau Ferrer Ocaña 2018-11-30 16:05:39 +01:00
parent 62a37720da
commit 012c08ded9
3 changed files with 72 additions and 9 deletions

View File

@ -80,12 +80,15 @@ export class AddonModForumPrefetchHandler extends CoreCourseActivityPrefetchHand
*/
protected getPostsFiles(posts: any[]): any[] {
let files = [];
const getInlineFiles = this.sitesProvider.getCurrentSite().isVersionGreaterEqualThan('3.2');
posts.forEach((post) => {
if (post.attachments && post.attachments.length) {
files = files.concat(post.attachments);
}
if (post.message) {
if (getInlineFiles && post.messageinlinefiles && post.messageinlinefiles.length) {
files = files.concat(post.messageinlinefiles);
} else if (post.message && !getInlineFiles) {
files = files.concat(this.domUtils.extractDownloadableFilesFromHtmlAsFakeFileObjects(post.message));
}
});

View File

@ -77,10 +77,17 @@ export class AddonModGlossaryPrefetchHandler extends CoreCourseActivityPrefetchH
*/
protected getFilesFromGlossaryAndEntries(module: any, glossary: any, entries: any[]): any[] {
let files = this.getIntroFilesFromInstance(module, glossary);
const getInlineFiles = this.sitesProvider.getCurrentSite().isVersionGreaterEqualThan('3.2');
// Get entries files.
entries.forEach((entry) => {
files = files.concat(this.domUtils.extractDownloadableFilesFromHtmlAsFakeFileObjects(entry.definition));
files = files.concat(entry.attachments);
if (getInlineFiles && entry.definitioninlinefiles && entry.definitioninlinefiles.length) {
files = files.concat(entry.definitioninlinefiles);
} else if (entry.definition && !getInlineFiles) {
files = files.concat(this.domUtils.extractDownloadableFilesFromHtmlAsFakeFileObjects(entry.definition));
}
});
return files;

View File

@ -51,18 +51,62 @@ export class AddonModQuizPrefetchHandler extends CoreCourseActivityPrefetchHandl
}
/**
* Get the download size of a module.
* Get list of files. If not defined, we'll assume they're in module.contents.
*
* @param {any} module Module.
* @param {Number} courseId Course ID the module belongs to.
* @param {boolean} [single] True if we're downloading a single module, false if we're downloading a whole section.
* @return {Promise<{size: number, total: boolean}>} Promise resolved with the size and a boolean indicating if it was able
* to calculate the total size.
* @return {Promise<any[]>} Promise resolved with the list of files.
*/
getDownloadSize(module: any, courseId: any, single?: boolean): Promise<{ size: number, total: boolean }> {
return Promise.resolve({
size: -1,
total: false
getFiles(module: any, courseId: number, single?: boolean): Promise<any[]> {
return this.quizProvider.getQuiz(courseId, module.id).then((quiz) => {
const files = this.getIntroFilesFromInstance(module, quiz);
return this.quizProvider.getUserAttempts(quiz.id, 'all', true, false, true).then((attempts) => {
return this.getAttemptsFeedbackFiles(quiz, attempts).then((attemptFiles) => {
return files.concat(attemptFiles);
});
});
}).catch(() => {
// Quiz not found, return empty list.
return [];
});
}
/**
* Get the list of downloadable files on feedback attemptss.
*
* @param {any} quiz Quiz.
* @param {any[]} attempts Quiz user attempts.
* @return {Promise<any[]>} List of Files.
*/
protected getAttemptsFeedbackFiles(quiz: any, attempts: any[]): Promise<any[]> {
// We have quiz data, now we'll get specific data for each attempt.
const promises = [],
getInlineFiles = this.sitesProvider.getCurrentSite().isVersionGreaterEqualThan('3.2');
let files = [];
attempts.forEach((attempt) => {
if (this.quizProvider.isAttemptFinished(attempt.state)) {
// Attempt is finished, get feedback and review data.
const attemptGrade = this.quizProvider.rescaleGrade(attempt.sumgrades, quiz, false);
if (typeof attemptGrade != 'undefined') {
promises.push(this.quizProvider.getFeedbackForGrade(quiz.id, Number(attemptGrade), true)
.then((feedback) => {
if (getInlineFiles && feedback.feedbackinlinefiles && feedback.feedbackinlinefiles.length) {
files = files.concat(feedback.feedbackinlinefiles);
} else if (feedback.feedbacktext && !getInlineFiles) {
files = files.concat(
this.domUtils.extractDownloadableFilesFromHtmlAsFakeFileObjects(feedback.feedbacktext));
}
}));
}
}
});
return Promise.all(promises).then(() => {
return files;
});
}
@ -213,6 +257,10 @@ export class AddonModQuizPrefetchHandler extends CoreCourseActivityPrefetchHandl
promises.push(this.quizProvider.getQuizRequiredQtypes(quiz.id, true, siteId));
promises.push(this.quizProvider.getUserAttempts(quiz.id, 'all', true, false, true, siteId).then((atts) => {
attempts = atts;
return this.getAttemptsFeedbackFiles(quiz, attempts).then((attemptFiles) => {
return this.filepoolProvider.addFilesToQueue(siteId, attemptFiles, AddonModQuizProvider.COMPONENT, module.id);
});
}));
promises.push(this.quizProvider.getAttemptAccessInformation(quiz.id, 0, false, true, siteId).then((info) => {
attemptAccessInfo = info;
@ -246,6 +294,11 @@ export class AddonModQuizPrefetchHandler extends CoreCourseActivityPrefetchHandl
// Re-fetch user attempts since we created a new one.
promises.push(this.quizProvider.getUserAttempts(quiz.id, 'all', true, false, true, siteId).then((atts) => {
attempts = atts;
return this.getAttemptsFeedbackFiles(quiz, attempts).then((attemptFiles) => {
return this.filepoolProvider.addFilesToQueue(siteId, attemptFiles, AddonModQuizProvider.COMPONENT,
module.id);
});
}));
// Update the download time to prevent detecting the new attempt as an update.