Index: lams_admin/conf/language/lams/ApplicationResources_en_AU.properties =================================================================== diff -u -ra36f413754bbde42e4371d11364d7b9fb9f05078 -rebb598b9d631fa479aef19110dc7b8c2cce0575b --- lams_admin/conf/language/lams/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision a36f413754bbde42e4371d11364d7b9fb9f05078) +++ lams_admin/conf/language/lams/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision ebb598b9d631fa479aef19110dc7b8c2cce0575b) @@ -644,6 +644,6 @@ sysadmin.alternative.user.id.name =Use alternative parameter name "lis_person_sourcedid" to get user id config.header.privacy.settings =Privacy settings config.restricted.displaying.user.names.in.groupings =Groupings: only display names for learners within own group +config.enable.collapsing.subcourses =Enable collapsing of subcourses - #======= End labels: Exported 638 labels for en AU ===== Index: lams_central/src/java/org/lamsfoundation/lams/web/DisplayGroupController.java =================================================================== diff -u -r679782834f99e7e2699f9f34ae8bf1c75abc7bb5 -rebb598b9d631fa479aef19110dc7b8c2cce0575b --- lams_central/src/java/org/lamsfoundation/lams/web/DisplayGroupController.java (.../DisplayGroupController.java) (revision 679782834f99e7e2699f9f34ae8bf1c75abc7bb5) +++ lams_central/src/java/org/lamsfoundation/lams/web/DisplayGroupController.java (.../DisplayGroupController.java) (revision ebb598b9d631fa479aef19110dc7b8c2cce0575b) @@ -49,15 +49,16 @@ import org.lamsfoundation.lams.usermanagement.OrganisationType; import org.lamsfoundation.lams.usermanagement.Role; import org.lamsfoundation.lams.usermanagement.User; +import org.lamsfoundation.lams.usermanagement.UserOrganisationCollapsed; import org.lamsfoundation.lams.usermanagement.UserOrganisationRole; import org.lamsfoundation.lams.usermanagement.service.IUserManagementService; import org.lamsfoundation.lams.util.Configuration; import org.lamsfoundation.lams.util.ConfigurationKeys; import org.lamsfoundation.lams.util.IndexUtils; -import org.lamsfoundation.lams.util.WebUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; /** * @author jliew @@ -77,11 +78,8 @@ private ILearnerService learnerService; @RequestMapping("") - @SuppressWarnings({ "unchecked" }) - public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception { - - Integer orgId = WebUtil.readIntParam(request, "orgId", false); - + public String execute(HttpServletRequest request, HttpServletResponse response, @RequestParam Integer orgId) + throws Exception { Organisation org = null; if (orgId != null) { org = (Organisation) userManagementService.findById(Organisation.class, orgId); @@ -228,22 +226,29 @@ @SuppressWarnings("unchecked") private IndexOrgBean populateContentsOrgBean(IndexOrgBean orgBean, Organisation org, List roles, String username, boolean isSysAdmin) throws SQLException, NamingException { + Integer userId = getUser(username).getUserId(); + // set lesson beans - Map map = populateLessonBeans(getUser(username).getUserId(), org.getOrganisationId(), + Map map = populateLessonBeans(userId, org.getOrganisationId(), roles); List lessonBeans = IndexUtils.sortLessonBeans(org.getOrderedLessonIds(), map); orgBean.setLessons(lessonBeans); // create subgroup beans if (orgBean.getType().equals(OrganisationType.COURSE_TYPE)) { - Set children = org.getChildOrganisations(); + Set childOrganisations = org.getChildOrganisations(); + boolean isCollapsingSubcoursesEnabled = Configuration + .getAsBoolean(ConfigurationKeys.ENABLE_COLLAPSING_SUBCOURSES); + List userOrganisationsCollapsed = isCollapsingSubcoursesEnabled + ? userManagementService.getChildOrganisationsCollapsedByUser(org.getOrganisationId(), userId) + : null; List childOrgBeans = new ArrayList<>(); - for (Organisation organisation : children) { - if (OrganisationState.ACTIVE.equals(organisation.getOrganisationState().getOrganisationStateId())) { + for (Organisation childOrganisation : childOrganisations) { + if (OrganisationState.ACTIVE.equals(childOrganisation.getOrganisationState().getOrganisationStateId())) { List classRoles = new ArrayList<>(); List userOrganisationRoles = userManagementService - .getUserOrganisationRoles(organisation.getOrganisationId(), username); + .getUserOrganisationRoles(childOrganisation.getOrganisationId(), username); // don't list the subgroup if user is not a member, and not a group admin/manager if (((userOrganisationRoles == null) || userOrganisationRoles.isEmpty()) && !isSysAdmin && !roles.contains(Role.ROLE_GROUP_MANAGER)) { @@ -256,7 +261,19 @@ if (roles.contains(Role.ROLE_GROUP_MANAGER)) { classRoles.add(Role.ROLE_GROUP_MANAGER); } - IndexOrgBean childOrgBean = createOrgBean(organisation, classRoles, username, isSysAdmin); + IndexOrgBean childOrgBean = createOrgBean(childOrganisation, classRoles, username, isSysAdmin); + + //check whether organisation was collapsed by the user + if (isCollapsingSubcoursesEnabled) { + for (UserOrganisationCollapsed userOrganisationCollapsed : userOrganisationsCollapsed) { + if (userOrganisationCollapsed.getOrganisation().getOrganisationId() + .equals(childOrganisation.getOrganisationId())) { + childOrgBean.setCollapsed(userOrganisationCollapsed.getCollapsed()); + break; + } + } + } + childOrgBeans.add(childOrgBean); } } Index: lams_central/src/java/org/lamsfoundation/lams/web/controller/CollapseOrganisationController.java =================================================================== diff -u --- lams_central/src/java/org/lamsfoundation/lams/web/controller/CollapseOrganisationController.java (revision 0) +++ lams_central/src/java/org/lamsfoundation/lams/web/controller/CollapseOrganisationController.java (revision ebb598b9d631fa479aef19110dc7b8c2cce0575b) @@ -0,0 +1,51 @@ +package org.lamsfoundation.lams.web.controller; + +import javax.servlet.http.HttpServletRequest; + +import org.lamsfoundation.lams.usermanagement.Organisation; +import org.lamsfoundation.lams.usermanagement.Role; +import org.lamsfoundation.lams.usermanagement.User; +import org.lamsfoundation.lams.usermanagement.UserOrganisation; +import org.lamsfoundation.lams.usermanagement.UserOrganisationCollapsed; +import org.lamsfoundation.lams.usermanagement.service.IUserManagementService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseStatus; + +/** + * Stores user collapsed organisation. + * + * @author Andrey Balan + */ +@Controller +@RequestMapping("collapseOrganisation") +public class CollapseOrganisationController { + + @Autowired + private IUserManagementService userManagementService; + + @RequestMapping("") + @ResponseStatus(HttpStatus.OK) + public void execute(HttpServletRequest request, @RequestParam Integer orgId, @RequestParam boolean collapsed) { + User user = userManagementService.getUserByLogin(request.getRemoteUser()); + UserOrganisationCollapsed userOrganisationCollapsed = userManagementService + .getUserOrganisationCollapsed(user.getUserId(), orgId); + + // insert or update userorg's collapsed status + if (userOrganisationCollapsed == null) { + // new row in lams_user_organisation_collapsed + userOrganisationCollapsed = new UserOrganisationCollapsed(); + Organisation organisation = userManagementService.getOrganisationById(orgId); + userOrganisationCollapsed.setOrganisation(organisation); + userOrganisationCollapsed.setUser(user); + userOrganisationCollapsed.setCollapsed(collapsed); + + } else { + userOrganisationCollapsed.setCollapsed(collapsed); + } + userManagementService.save(userOrganisationCollapsed); + } +} \ No newline at end of file Index: lams_central/web/css/_main_base.scss =================================================================== diff -u -r7475d08afc280b5e2e5ddf04e8bf35e3166aaf80 -rebb598b9d631fa479aef19110dc7b8c2cce0575b --- lams_central/web/css/_main_base.scss (.../_main_base.scss) (revision 7475d08afc280b5e2e5ddf04e8bf35e3166aaf80) +++ lams_central/web/css/_main_base.scss (.../_main_base.scss) (revision ebb598b9d631fa479aef19110dc7b8c2cce0575b) @@ -461,6 +461,7 @@ .group-name { margin-top: 20px; margin-left: 30px; + min-height: 25px; } .group-name p { @@ -482,7 +483,12 @@ .course-header i{ font-size: 15px; } +a.subcourse-title { + text-decoration: none; + cursor: pointer; +} .j-course-contents { border-bottom: $border-thin-default; + padding-bottom: 15px; } Index: lams_central/web/group.jsp =================================================================== diff -u -r7475d08afc280b5e2e5ddf04e8bf35e3166aaf80 -rebb598b9d631fa479aef19110dc7b8c2cce0575b --- lams_central/web/group.jsp (.../group.jsp) (revision 7475d08afc280b5e2e5ddf04e8bf35e3166aaf80) +++ lams_central/web/group.jsp (.../group.jsp) (revision ebb598b9d631fa479aef19110dc7b8c2cce0575b) @@ -1,9 +1,18 @@ <%@ page contentType="text/html; charset=utf-8" language="java"%> +<%@ page import="org.lamsfoundation.lams.util.Configuration"%> +<%@ page import="org.lamsfoundation.lams.util.ConfigurationKeys"%> <%@ taglib uri="tags-fmt" prefix="fmt"%> <%@ taglib uri="tags-core" prefix="c"%> <%@ taglib uri="tags-lams" prefix="lams"%> +<%=Configuration.getAsBoolean(ConfigurationKeys.ENABLE_COLLAPSING_SUBCOURSES)%> + +
@@ -37,18 +46,46 @@
- + + + + + + + + + + + + + + + + ( )
<%@ include file="groupHeader.jsp"%> - -
+ +
in"> <%@ include file="groupContents.jsp"%>
+
Index: lams_central/web/includes/javascript/main.js =================================================================== diff -u -r8e438e0446b9c5c3470ee3044fa15360307416a1 -rebb598b9d631fa479aef19110dc7b8c2cce0575b --- lams_central/web/includes/javascript/main.js (.../main.js) (revision 8e438e0446b9c5c3470ee3044fa15360307416a1) +++ lams_central/web/includes/javascript/main.js (.../main.js) (revision ebb598b9d631fa479aef19110dc7b8c2cce0575b) @@ -101,7 +101,26 @@ railOpacity: 0.9 }); }); + + //collapse subcourse. (Doing it manually instead of using bootstrap collapse in order to prevent bootstrap choppiness) + $(document).on('click', '.subcourse-title', function() { + var orgId = $(this).data("groupid"); + var collapsed = $("#" + orgId + "-lessons").hasClass("in"); + + $("#" + orgId + "-lessons").toggleClass("in"); + $(this).toggleClass("collapsed"); + $("i", $(this)).toggleClass("fa-minus-square-o fa-plus-square-o"); + //store course collapse in DB + $.ajax({ + url: LAMS_URL + "/collapseOrganisation.do", + data: { + orgId: orgId, + collapsed: collapsed + } + }); + }); + }); Index: lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20191202.sql =================================================================== diff -u --- lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20191202.sql (revision 0) +++ lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20191202.sql (revision ebb598b9d631fa479aef19110dc7b8c2cce0575b) @@ -0,0 +1,29 @@ +SET AUTOCOMMIT = 0; +set FOREIGN_KEY_CHECKS = 0; + +-- LDEV-4918 Collapsible subcourses + +CREATE TABLE `lams_user_organisation_collapsed` ( + `uid` bigint(20) NOT NULL AUTO_INCREMENT, + `organisation_id` bigint(20) NOT NULL, + `user_id` bigint(20) NOT NULL, + `collapsed` TINYINT(1) NOT NULL DEFAULT 0, + PRIMARY KEY (`uid`), + KEY `organisation_id` (`organisation_id`), + KEY `user_id` (`user_id`), + CONSTRAINT `FK_lams_user_organisation_collapsed_1` FOREIGN KEY (`organisation_id`) REFERENCES `lams_organisation` (`organisation_id`), + CONSTRAINT `FK_lams_user_organisation_collapsed_2` FOREIGN KEY (`user_id`) REFERENCES `lams_user` (`user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + + +-- Add "Enable collapsing subcourses" to system settings and organisation +INSERT INTO lams_configuration (config_key, config_value, description_key, header_name, format, required) +VALUES ('EnableCollapsingSubcourses','false', 'config.enable.collapsing.subcourses', 'config.header.features', 'BOOLEAN', 0); + + + + +COMMIT; +SET AUTOCOMMIT = 1; +set FOREIGN_KEY_CHECKS = 1; + Index: lams_common/src/java/org/lamsfoundation/lams/index/IndexOrgBean.java =================================================================== diff -u -r7475d08afc280b5e2e5ddf04e8bf35e3166aaf80 -rebb598b9d631fa479aef19110dc7b8c2cce0575b --- lams_common/src/java/org/lamsfoundation/lams/index/IndexOrgBean.java (.../IndexOrgBean.java) (revision 7475d08afc280b5e2e5ddf04e8bf35e3166aaf80) +++ lams_common/src/java/org/lamsfoundation/lams/index/IndexOrgBean.java (.../IndexOrgBean.java) (revision ebb598b9d631fa479aef19110dc7b8c2cce0575b) @@ -42,6 +42,7 @@ private Date archivedDate; private Integer type; private boolean favorite = false; + private boolean collapsed = false; private List links; private List moreLinks; private List lessons; @@ -210,5 +211,13 @@ public void setFavorite(boolean favorite) { this.favorite = favorite; } + + public boolean getCollapsed() { + return this.collapsed; + } + public void setCollapsed(boolean collapsed) { + this.collapsed = collapsed; + } + } Fisheye: Tag 353fe07604639c2166ed68fbf832810959f3f3cf refers to a dead (removed) revision in file `lams_common/src/java/org/lamsfoundation/lams/usermanagement/UserOrganisationCollapsed.java'. Fisheye: No comparison available. Pass `N' to diff? Index: lams_common/src/java/org/lamsfoundation/lams/usermanagement/dao/IOrganisationDAO.java =================================================================== diff -u -r7475d08afc280b5e2e5ddf04e8bf35e3166aaf80 -rebb598b9d631fa479aef19110dc7b8c2cce0575b --- lams_common/src/java/org/lamsfoundation/lams/usermanagement/dao/IOrganisationDAO.java (.../IOrganisationDAO.java) (revision 7475d08afc280b5e2e5ddf04e8bf35e3166aaf80) +++ lams_common/src/java/org/lamsfoundation/lams/usermanagement/dao/IOrganisationDAO.java (.../IOrganisationDAO.java) (revision ebb598b9d631fa479aef19110dc7b8c2cce0575b) @@ -27,6 +27,7 @@ import org.lamsfoundation.lams.dao.IBaseDAO; import org.lamsfoundation.lams.usermanagement.Organisation; +import org.lamsfoundation.lams.usermanagement.UserOrganisationCollapsed; import org.lamsfoundation.lams.usermanagement.dto.OrganisationDTO; /** @@ -79,5 +80,14 @@ */ int getCountCoursesByParentCourseAndTypeAndState(final Integer parentOrgId, final Integer typeId, final Integer stateId, String searchString); + + /** + * Returns list of UserOrganisationCollapsed, indicating which sub-courses was collapsed by the given user. + * + * @param parentOrganisationId + * @param userId + * @return + */ + List getChildOrganisationsCollapsedByUser(Integer parentOrganisationId, Integer userId); } Index: lams_common/src/java/org/lamsfoundation/lams/usermanagement/dao/hibernate/OrganisationDAO.java =================================================================== diff -u -r7475d08afc280b5e2e5ddf04e8bf35e3166aaf80 -rebb598b9d631fa479aef19110dc7b8c2cce0575b --- lams_common/src/java/org/lamsfoundation/lams/usermanagement/dao/hibernate/OrganisationDAO.java (.../OrganisationDAO.java) (revision 7475d08afc280b5e2e5ddf04e8bf35e3166aaf80) +++ lams_common/src/java/org/lamsfoundation/lams/usermanagement/dao/hibernate/OrganisationDAO.java (.../OrganisationDAO.java) (revision ebb598b9d631fa479aef19110dc7b8c2cce0575b) @@ -31,6 +31,7 @@ import org.lamsfoundation.lams.usermanagement.Organisation; import org.lamsfoundation.lams.usermanagement.OrganisationState; import org.lamsfoundation.lams.usermanagement.OrganisationType; +import org.lamsfoundation.lams.usermanagement.UserOrganisationCollapsed; import org.lamsfoundation.lams.usermanagement.dao.IOrganisationDAO; import org.lamsfoundation.lams.usermanagement.dto.OrganisationDTO; import org.springframework.stereotype.Repository; @@ -97,8 +98,22 @@ return orgDtos; } - @SuppressWarnings("unchecked") @Override + public List getChildOrganisationsCollapsedByUser(Integer parentOrganisationId, Integer userId) { + final String GET_USER_ORGANISATION_COLLAPSED_BY_USER_AND_PARENT_ORGANISATION = "SELECT uoc FROM UserOrganisationCollapsed uoc " + + " WHERE uoc.organisation.organisationType.organisationTypeId = " + OrganisationType.CLASS_TYPE + + " AND uoc.organisation.organisationState.organisationStateId = " + OrganisationState.ACTIVE + + " AND uoc.organisation.parentOrganisation.organisationId = :organisationId " + + " AND uoc.user.userId = :userId "; + + Query query = getSession().createQuery( + GET_USER_ORGANISATION_COLLAPSED_BY_USER_AND_PARENT_ORGANISATION, UserOrganisationCollapsed.class); + query.setInteger("organisationId", parentOrganisationId); + query.setInteger("userId", userId); + return query.list(); + } + + @Override public int getCountActiveCoursesByUser(Integer userId, boolean isSysadmin, String searchString) { final String GET_ALL_ACTIVE_COURSE_IDS = "SELECT COUNT(o) FROM Organisation o" Index: lams_common/src/java/org/lamsfoundation/lams/usermanagement/service/IUserManagementService.java =================================================================== diff -u -r29a37489a63e5a95f42a5ef5fd8a7daeb65c53c5 -rebb598b9d631fa479aef19110dc7b8c2cce0575b --- lams_common/src/java/org/lamsfoundation/lams/usermanagement/service/IUserManagementService.java (.../IUserManagementService.java) (revision 29a37489a63e5a95f42a5ef5fd8a7daeb65c53c5) +++ lams_common/src/java/org/lamsfoundation/lams/usermanagement/service/IUserManagementService.java (.../IUserManagementService.java) (revision ebb598b9d631fa479aef19110dc7b8c2cce0575b) @@ -40,6 +40,8 @@ import org.lamsfoundation.lams.usermanagement.Role; import org.lamsfoundation.lams.usermanagement.User; import org.lamsfoundation.lams.usermanagement.UserOrganisation; +import org.lamsfoundation.lams.usermanagement.UserOrganisationCollapsed; +import org.lamsfoundation.lams.usermanagement.UserOrganisationRole; import org.lamsfoundation.lams.usermanagement.dto.OrganisationDTO; import org.lamsfoundation.lams.usermanagement.dto.UserDTO; import org.lamsfoundation.lams.usermanagement.dto.UserManageBean; @@ -171,6 +173,12 @@ * @return true or false */ boolean isUserInRole(Integer userId, Integer orgId, String roleName); + + /** + * @param organisationId + * @return organisation by its id + */ + Organisation getOrganisationById(Integer organisationId); /** * @param typeId @@ -215,7 +223,16 @@ * user's login * @return a list of UserOrganisationRoles */ - List getUserOrganisationRoles(Integer orgId, String login); + List getUserOrganisationRoles(Integer orgId, String login); + + /** + * Returns list of UserOrganisationCollapsed, indicating which sub-courses was collapsed by the given user. + * + * @param parentOrganisationId + * @param userId + * @return + */ + List getChildOrganisationsCollapsedByUser(Integer parentOrganisationId, Integer userId); /** * Returns mapping org ID -> role IDs @@ -262,6 +279,13 @@ * @return UserOrganisation */ UserOrganisation getUserOrganisation(Integer userId, Integer orgId); + + /** + * @param userId + * @param orgId + * @return + */ + UserOrganisationCollapsed getUserOrganisationCollapsed(Integer userId, Integer orgId); /** * Save an organisation. If it is a new course organisation then it will create a workspace and its workspace Index: lams_common/src/java/org/lamsfoundation/lams/usermanagement/service/UserManagementService.java =================================================================== diff -u -redcdba5baa8cda12d133c66ad0aebebfe44acb2b -rebb598b9d631fa479aef19110dc7b8c2cce0575b --- lams_common/src/java/org/lamsfoundation/lams/usermanagement/service/UserManagementService.java (.../UserManagementService.java) (revision edcdba5baa8cda12d133c66ad0aebebfe44acb2b) +++ lams_common/src/java/org/lamsfoundation/lams/usermanagement/service/UserManagementService.java (.../UserManagementService.java) (revision ebb598b9d631fa479aef19110dc7b8c2cce0575b) @@ -61,6 +61,7 @@ import org.lamsfoundation.lams.usermanagement.Role; import org.lamsfoundation.lams.usermanagement.User; import org.lamsfoundation.lams.usermanagement.UserOrganisation; +import org.lamsfoundation.lams.usermanagement.UserOrganisationCollapsed; import org.lamsfoundation.lams.usermanagement.UserOrganisationRole; import org.lamsfoundation.lams.usermanagement.WorkspaceFolder; import org.lamsfoundation.lams.usermanagement.dao.IFavoriteOrganisationDAO; @@ -305,6 +306,11 @@ } return true; } + + @Override + public Organisation getOrganisationById(Integer organisationId) { + return (Organisation) findById(Organisation.class, organisationId); + } @Override public List getOrganisationsByTypeAndStatus(Integer typeId, Integer stateId) { @@ -328,7 +334,8 @@ } @Override - public List getUserOrganisationRoles(Integer orgId, String login) { + @SuppressWarnings("unchecked") + public List getUserOrganisationRoles(Integer orgId, String login) { Map properties = new HashMap<>(); properties.put("userOrganisation.organisation.organisationId", orgId); properties.put("userOrganisation.user.login", login); @@ -364,6 +371,20 @@ properties.put("organisation.parentOrganisation.organisationId", parentOrgId); return baseDAO.findByProperties(UserOrganisation.class, properties); } + + @Override + public UserOrganisationCollapsed getUserOrganisationCollapsed(Integer userId, Integer orgId) { + Map properties = new HashMap<>(); + properties.put("user.userId", userId); + properties.put("organisation.organisationId", orgId); + List results = baseDAO.findByProperties(UserOrganisationCollapsed.class, properties); + return results.isEmpty() ? null : (UserOrganisationCollapsed) results.get(0); + } + + @Override + public List getChildOrganisationsCollapsedByUser(Integer parentOrganisationId, Integer userId) { + return organisationDAO.getChildOrganisationsCollapsedByUser(parentOrganisationId, userId); + } @Override public User getUserByLogin(String login) { Index: lams_common/src/java/org/lamsfoundation/lams/util/ConfigurationKeys.java =================================================================== diff -u -re325f88e2e856294ed9cde0f90303f84e2ceea8d -rebb598b9d631fa479aef19110dc7b8c2cce0575b --- lams_common/src/java/org/lamsfoundation/lams/util/ConfigurationKeys.java (.../ConfigurationKeys.java) (revision e325f88e2e856294ed9cde0f90303f84e2ceea8d) +++ lams_common/src/java/org/lamsfoundation/lams/util/ConfigurationKeys.java (.../ConfigurationKeys.java) (revision ebb598b9d631fa479aef19110dc7b8c2cce0575b) @@ -118,6 +118,8 @@ public static String ALLOW_KUMALIVE = "AllowKumalive"; + public static String ENABLE_COLLAPSING_SUBCOURSES = "EnableCollapsingSubcourses"; + public static String DISPLAY_PORTRAIT = "DisplayPortrait"; public static String ENABLE_PORTRAIT_EDITING = "EnablePortraitEditing";