From 41eeace2b82271c8b5ea569ffe286a8a2f25216f Mon Sep 17 00:00:00 2001 From: Jesse Morgan Date: Sat, 9 Nov 2013 21:21:44 -0800 Subject: Enforcing the viewing order of videos. Also made the Outline links more noticeable. --- .../grow/frontend/TrainingPageResource.java | 88 +++++++++++++++------- src/templates/templates/training.ftl | 15 +++- 2 files changed, 72 insertions(+), 31 deletions(-) (limited to 'src') diff --git a/src/com/p4square/grow/frontend/TrainingPageResource.java b/src/com/p4square/grow/frontend/TrainingPageResource.java index bf08a1a..311bc2c 100644 --- a/src/com/p4square/grow/frontend/TrainingPageResource.java +++ b/src/com/p4square/grow/frontend/TrainingPageResource.java @@ -5,9 +5,12 @@ package com.p4square.grow.frontend; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.HashMap; import freemarker.template.Template; @@ -44,6 +47,24 @@ import com.p4square.grow.provider.Provider; public class TrainingPageResource extends FreeMarkerPageResource { private static Logger cLog = Logger.getLogger(TrainingPageResource.class); + private static final String[] CHAPTERS = { "introduction", "seeker", "believer", "disciple", "teacher" }; + private static final Comparator> VIDEO_COMPARATOR = new Comparator>() { + @Override + public int compare(Map left, Map right) { + String leftNumberStr = (String) left.get("number"); + String rightNumberStr = (String) right.get("number"); + + if (leftNumberStr == null || rightNumberStr == null) { + return -1; + } + + int leftNumber = Integer.valueOf(leftNumberStr); + int rightNumber = Integer.valueOf(rightNumberStr); + + return leftNumber - rightNumber; + } + }; + private Config mConfig; private Template mTrainingTemplate; private JsonRequestClient mJsonClient; @@ -93,29 +114,51 @@ public class TrainingPageResource extends FreeMarkerPageResource { Playlist playlist = trainingRecord.getPlaylist(); Map chapters = playlist.getChapterStatuses(); - - // Get the current chapter (the lowest, incomplete chapter) - if (mChapter == null) { - int min = Integer.MAX_VALUE; - for (Map.Entry chapter : chapters.entrySet()) { - int index = chapterIndex(chapter.getKey()); - if (!chapter.getValue() && index < min) { - min = index; - mChapter = chapter.getKey(); + Map allowedChapters = new LinkedHashMap(); + + // The user is not allowed to view chapters after his highest completed chapter. + // In this loop we find which chapters are allowed and check if the user tried + // to skip ahead. + String defaultChapter = null; + boolean userTriedToSkip = false; + + boolean foundRequired = false; + for (String chapterId : CHAPTERS) { + boolean allowed = true; + + if (!foundRequired) { + if (!chapters.get(chapterId)) { + // The first incomplete chapter is the highest allowed chapter. + foundRequired = true; + defaultChapter = chapterId; + } + + } else { + allowed = false; + + if (chapterId.equals(mChapter)) { + userTriedToSkip = true; } } - if (mChapter == null) { - // Everything is completed... send them back to introduction. - mChapter = "introduction"; - } + allowedChapters.put(chapterId, allowed); + } + + if (defaultChapter == null) { + // Everything is completed... send them back to introduction. + defaultChapter = "introduction"; + } + if (mChapter == null || userTriedToSkip) { + // No chapter was specified or the user tried to skip ahead. + // Either case, redirect. String nextPage = mConfig.getString("dynamicRoot", ""); - nextPage += "/account/training/" + mChapter; + nextPage += "/account/training/" + defaultChapter; getResponse().redirectSeeOther(nextPage); return new StringRepresentation("Redirecting to " + nextPage); } + // Get videos for the chapter. List> videos = null; { @@ -125,6 +168,7 @@ public class TrainingPageResource extends FreeMarkerPageResource { return null; } videos = (List>) response.getMap().get("videos"); + Collections.sort(videos, VIDEO_COMPARATOR); } // Mark the completed videos as completed @@ -147,6 +191,7 @@ public class TrainingPageResource extends FreeMarkerPageResource { Map root = getRootObject(); root.put("chapter", mChapter); + root.put("isChapterAllowed", allowedChapters); root.put("chapterProgress", chapterProgress); root.put("videos", videos); @@ -181,17 +226,4 @@ public class TrainingPageResource extends FreeMarkerPageResource { return response; } - int chapterIndex(String chapter) { - if ("teacher".equals(chapter)) { - return 4; - } else if ("disciple".equals(chapter)) { - return 3; - } else if ("believer".equals(chapter)) { - return 2; - } else if ("seeker".equals(chapter)) { - return 1; - } else { - return 0; - } - } } diff --git a/src/templates/templates/training.ftl b/src/templates/templates/training.ftl index c560622..80c5ca4 100644 --- a/src/templates/templates/training.ftl +++ b/src/templates/templates/training.ftl @@ -24,7 +24,12 @@ @@ -36,14 +41,18 @@
+ <#assign allowed = true> <#list videos as video>
-
${video.title}
-

${video.title}

+
${video.title}
+

${video.number}. ${video.title}

<@hms seconds=video.length /> <#if (video.pdf!"") != ""> Outline + <#if allowed && !video.completed> + <#assign allowed = false> +
-- cgit v1.2.3