{"id":6685,"date":"2017-02-06T18:34:51","date_gmt":"2017-02-06T16:34:51","guid":{"rendered":"https:\/\/www.talentlms.com\/blog\/?p=6685"},"modified":"2022-05-09T15:23:07","modified_gmt":"2022-05-09T12:23:07","slug":"talentlms-mobile-app-design","status":"publish","type":"post","link":"https:\/\/www.talentlms.com\/blog\/talentlms-mobile-app-design\/","title":{"rendered":"TalentLMS for Android: The Content Downloader &#8211; Part 1, Design"},"content":{"rendered":"<p><strong><a href=\"https:\/\/www.talentlms.com\/blog\/talentlms-mobile-app\/\" target=\"_blank\" rel=\"noopener\">TalentLMS for Android<\/a><\/strong> has been out for a while now and its user base is growing steadily. Following the example of the popular TalentLMS web-based platform, it offers a rich-content learning experience, optimized for Android devices. Version 2 of the app was released on <a href=\"https:\/\/play.google.com\/store\/apps\/details?id=com.talentlms.android\" target=\"_blank\" rel=\"noopener\"><strong>Google Play<\/strong><\/a> a few of weeks ago, adding new features and multiple improvements to the previous version.<\/p>\n<p><!--more--><\/p>\n<h2>TalentLMS for Android<\/h2>\n<p>The most important of these features is deceptively subtle and perhaps not immediately noticeable to most users. In fact, if its implementation is as good as we would like to think, it should go unnoticed by everyone.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-6693 aligncenter\" src=\"https:\/\/www.talentlms.com\/blog\/wp-content\/uploads\/2017\/02\/talentlms-android-app.png\" alt=\"TalentLMS for Android: The Content Downloader - Part 1, Design - TalentLMS Blog\" width=\"225\" height=\"453\" \/><\/p>\n<p><strong>The internal name for this feature is the Content Downloader<\/strong> and, as the name suggests, it makes sure that content from the user\u2019s <a href=\"https:\/\/www.talentlms.com\/blog\/7-steps-towards-rapid-elearning\/\" target=\"_blank\" rel=\"noopener\"><strong>Courses<\/strong><\/a> is always made available on the mobile device (for both online and <strong><a href=\"https:\/\/www.talentlms.com\/blog\/talentlms-mobile-app\/\" target=\"_blank\" rel=\"noopener\">offline consumption<\/a><\/strong> when possible) as soon as the user looks for it.<\/p>\n<p>Despite it being planned as a core feature during the app\u2019s conception stage, its complex nature only allowed us to ship it months later, in version 2 &#8211; teaching our development team a few lessons along the way.<\/p>\n<h3>TalentLMS\u2019 content structure<\/h3>\n<p>If you have used <strong><a href=\"https:\/\/www.talentlms.com\/\" target=\"_blank\" rel=\"noopener\">TalentLMS<\/a><\/strong> before, you might know that content is organised in Units, which are in turn grouped in Courses. You could think of Courses as books and Units as chapters in each book.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-6694 aligncenter\" src=\"https:\/\/www.talentlms.com\/blog\/wp-content\/uploads\/2017\/02\/content-organization.png\" alt=\"TalentLMS for Android: The Content Downloader - Part 1, Design - TalentLMS Blog\" width=\"196\" height=\"146\" \/><\/p>\n<h3>Content organization<\/h3>\n<p>Each Unit is characterized by a type that depends on the content it contains, such as Audio, Video, Text, Test, Survey, and others. TalentLMS for Android does not yet support all of the Unit types available in the web version of TalentLMS, but we are gradually getting there.<\/p>\n<p>Some Unit \/ content types, such as uploaded video, audio and PDF files, can be made available offline, while others, such as <a href=\"https:\/\/www.youtube.com\/channel\/UCRKZko6gzZm1ps5mzc4Mi_w\" target=\"_blank\" rel=\"noopener\"><strong>Youtube<\/strong><\/a> or Vimeo videos, cannot. If a Unit can be made available offline, it is the Content Downloader\u2019s job to download its metadata and content as soon as the user expresses interest in it, via their actions on the UI.<\/p>\n<h3>Design goals<\/h3>\n<p>When we first started designing the <strong><a href=\"https:\/\/www.talentlms.com\/mobile\" target=\"_blank\" rel=\"noopener\">TalentLMS mobile app<\/a><\/strong>, we knew that enabling our users to have access to their content on all their devices, even when they were offline, was of utmost importance. While developing the architecture of the Android app, we set a few goals that would make content consumption, and the intermediate downloading process, as seamless and transparent to the end user as possible.<\/p>\n<p>Below is an overview of those goals:<\/p>\n<h5><strong><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-6695\" src=\"https:\/\/www.talentlms.com\/blog\/wp-content\/uploads\/2017\/02\/short-waiting-times.png\" alt=\"TalentLMS for Android: The Content Downloader - Part 1, Design - TalentLMS Blog\" width=\"50\" height=\"50\" \/>\u00a0<\/strong>Short waiting times<\/h5>\n<p>All screens must be populated with useful content as soon as possible. Content downloading should happen automatically and progress indicators should be a last resort!<\/p>\n<h5><strong><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-6696\" src=\"https:\/\/www.talentlms.com\/blog\/wp-content\/uploads\/2017\/02\/offline-content.png\" alt=\"TalentLMS for Android: The Content Downloader - Part 1, Design - TalentLMS Blog\" width=\"50\" height=\"50\" \/><\/strong>\u00a0Offline content<\/h5>\n<p>Users must have offline access to as many Units as possible, provided that they have indicated interest in those Units via their use of the app.<\/p>\n<h5><strong><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-6697\" src=\"https:\/\/www.talentlms.com\/blog\/wp-content\/uploads\/2017\/02\/redundancy-and-error-handling.png\" alt=\"TalentLMS for Android: The Content Downloader - Part 1, Design - TalentLMS Blog\" width=\"50\" height=\"50\" \/>\u00a0<\/strong>Redundancy and error handling<\/h5>\n<p>Large content must be downloaded as soon as possible, no matter how many errors occur due to poor, intermittent network connections or other unexpected events.<\/p>\n<h5><strong><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-6698\" src=\"https:\/\/www.talentlms.com\/blog\/wp-content\/uploads\/2017\/02\/download-stopping-resuming.png\" alt=\"TalentLMS for Android: The Content Downloader - Part 1, Design - TalentLMS Blog\" width=\"50\" height=\"50\" \/><\/strong>\u00a0Download stopping and resuming<\/h5>\n<p>No part of a file has to be downloaded more than once. Furthermore, downloads can be stopped and resumed either through user input or due to external factors (e.g. network or application state changes).<\/p>\n<h5><strong><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-6699\" src=\"https:\/\/www.talentlms.com\/blog\/wp-content\/uploads\/2017\/02\/simple-ui.png\" alt=\"TalentLMS for Android: The Content Downloader - Part 1, Design - TalentLMS Blog\" width=\"50\" height=\"50\" \/>\u00a0<\/strong>Simple UI<\/h5>\n<p>One-button Course download and queuing of content when a user expresses interest in it via their actions.<\/p>\n<h5><strong><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-6700\" src=\"https:\/\/www.talentlms.com\/blog\/wp-content\/uploads\/2017\/02\/realtime-progress-reporting.png\" alt=\"TalentLMS for Android: The Content Downloader - Part 1, Design - TalentLMS Blog\" width=\"50\" height=\"50\" \/>\u00a0<\/strong>Realtime progress reporting<\/h5>\n<p>The user must always be informed of the current progress of all downloading content they encounter in a non-intrusive way.<\/p>\n<h5><strong><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-6701\" src=\"https:\/\/www.talentlms.com\/blog\/wp-content\/uploads\/2017\/02\/reduce-data-usage.png\" alt=\"TalentLMS for Android: The Content Downloader - Part 1, Design - TalentLMS Blog\" width=\"64\" height=\"64\" \/><\/strong>Reduced data usage<\/h5>\n<p>Non-essential content is only downloaded when the device uses Wi-Fi, unless the user has indicated otherwise via the app settings.<\/p>\n<h5><strong><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-6702\" src=\"https:\/\/www.talentlms.com\/blog\/wp-content\/uploads\/2017\/02\/lightweight.png\" alt=\"TalentLMS for Android: The Content Downloader - Part 1, Design - TalentLMS Blog\" width=\"50\" height=\"50\" \/><\/strong>Lightweight<\/h5>\n<p>Content downloading must not affect the overall perceived speed of the application.<\/p>\n<h5><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-6703\" src=\"https:\/\/www.talentlms.com\/blog\/wp-content\/uploads\/2017\/02\/reduced-storage-space.png\" alt=\"TalentLMS for Android: The Content Downloader - Part 1, Design - TalentLMS Blog\" width=\"50\" height=\"50\" \/>\u00a0Reduced storage space \/ Offline content management<\/h5>\n<p>Allow the user to selectively delete offline content to free up space.<\/p>\n<h5><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-6704\" src=\"https:\/\/www.talentlms.com\/blog\/wp-content\/uploads\/2017\/02\/low-battery-consumption.png\" alt=\"TalentLMS for Android: The Content Downloader - Part 1, Design - TalentLMS Blog\" width=\"50\" height=\"50\" \/>\u00a0Low battery consumption<\/h5>\n<p>All of the above must take place without abusing the network or other subsystems of the device.<\/p>\n<h3>Component features<\/h3>\n<p>When development began, the Content Downloader infrastructure and the rest of the app had to provide a complex set of features, in order to achieve all of the goals mentioned above. More specificaly, these features:<\/p>\n<h5>a) Efficient background function<\/h5>\n<p>The downloading of content should in no way interfere with the user\u2019s actions. The app should remain quick and responsive at all times and the user should be able to resume the tasks they were performing before downloading was initiated.<\/p>\n<h5>b) Download queueing<\/h5>\n<p>Downloading many files at the same time is extremely inefficient, particularly on poor Wi-Fi or mobile data connections. <strong>The number of concurrent download slots should be limited<\/strong> depending on factors such as network quality and device capabilities. This should happen transparently, without making users to experience any effects of this limitation.<\/p>\n<p>The user should be able to ask the app to download an entire Course, or even multiple Courses at any time, without having to think about how many files are actually being concurrently downloaded. In order to achieve that, the downloader has to maintain a queue of Units to be downloaded and the order of those Units should reflect their priority. Whenever a download slot is freed, the Unit at the top of the queue should begin downloading.<\/p>\n<h5>c) Stopping of active Downloads<\/h5>\n<p>At first, this feature might not seem very important, but in reality, it is one of the core ingredients for the successful implementation of the downloader! Without it, the download priorities of Units cannot be changed fast enough for a smooth <a href=\"https:\/\/www.talentlms.com\/blog\/tips-boost-ux-design-for-elearning\/\" target=\"_blank\" rel=\"noopener\"><strong>user experience<\/strong><\/a>. Even if the downloads queue priorities are updated, they cannot be enforced before new download slots are available. New download slots will only become available once an active download finishes or fails.<\/p>\n<p>The reason that content priorities might change is that the user is continuously navigating the app. Due to that fact, old content that is currently being downloaded can rapidly become less important than new content that is being requested by the user right now.<\/p>\n<p><strong>Furthermore, even if download slots are available and priorities do change<\/strong>, the only way to ensure that high-priority downloads are completed quickly enough, is to allocate more bandwidth to them, by stopping lower-priority downloads.<\/p>\n<p>You can read more about the downloading strategies used in Part 2 of this series.<\/p>\n<h5>d) Download resuming<\/h5>\n<p>Partially downloaded files should not be deleted from the disk. Instead, when their turn to be downloaded comes again, they should be resumed using <strong><a href=\"https:\/\/zoompf.com\/blog\/2010\/03\/performance-tip-for-http-downloads\" target=\"_blank\" rel=\"noopener\">HTTP 1.1 Range requests<\/a><\/strong> to the server. Downloads should only be restarted from scratch if the server does not support Range requests, or if a request fails with a <strong><a href=\"https:\/\/httpstatuses.com\/416\" target=\"_blank\" rel=\"noopener\">416 (Range Not Satisfiable) HTTP status code<\/a><\/strong>.<\/p>\n<h5>e) Progress reporting<\/h5>\n<p>No matter how well prioritized the downloading of content is, it is very bad UX for users to be staring at endless spinners. Once a download has been started, the app should be able to provide constant progress updates to the UI so that the user knows what\u2019s going on.<\/p>\n<h5>f) Failed download retrying<\/h5>\n<p>Downloads may fail for various reasons, particularly when they are taking place on a mobile device which could be situated anywhere, from a speeding car to an underground metro station. That, however, is nothing the user should be bothered about. If the failure is not due to a critical error, the downloader should try to resume and complete the download.<\/p>\n<h5>g) Error reporting<\/h5>\n<p>Whenever a download fails and cannot be resumed (for example, if there is no more space on the device or a file is no longer available on the server) the relevant exception should be propagated from the Content Downloader infrastructure to the higher layers of the app. If the user should be notified, the presentation layer will decide what to do.<\/p>\n<h5>h) Network state awareness<\/h5>\n<p>T<strong>he app should be aware of the state of the network<\/strong> in order to adjust the Content Downloader settings as soon as a change occurs. For example, whenever the device switches to mobile data, the Content Downloader should stop downloading all non-essential content (unless the user has given explicit permission) to avoid unnecessary service charges.<\/p>\n<p>Also, the Content Downloader should stop trying to resume failed downloads whenever the internet connection is offline, to save battery.<\/p>\n<h5>i) Save content state in persistent storage.<\/h5>\n<p>The status of each Unit\u2019s download progress should be saved in persistent storage as often as possible, so that its state can be maintained, even in cases when the app is stopped unexpectedly. This way, no additional network requests have to be made before the user is notified about the actual state of their content on the device.<\/p>\n<h5>j) Post-processing for certain types of content<\/h5>\n<p>Since file decompression was a requirement for the upcoming SCORM functionality of the app, we decided to add a post-processing aspect to the Content Downloader, as well. Once the content has finished downloading to the device, an extra post-processing step should take place, for content types that require it.<\/p>\n<p><strong>Although it was added for decompression, we decided it should be easily extensible to support all kinds of time-consuming processing<\/strong> that should happen in the background and would benefit from features such as progress and error reporting and state preservation.<\/p>\n<h3>Implementation<\/h3>\n<p>Although the implementation of all the above features was more time-demanding than we had initially anticipated, we managed to achieve all the goals we had set in the initial design and keep a clean and extensible codebase. We were, of course, stepping on the shoulders of giants, since a lot of open-source projects helped make our lives much easier, by simplifying the code required to solve complex projects.<\/p>\n<p>You can read more about the technologies used in Part 3 of this series, but first, you might want to know more about how the downloader component was integrated into the existing application flow in Part 2.<\/p>\n<h2>In Place Of A Cliffhanger<\/h2>\n<p>This is part one, a more general overview of this new feature. It may seem quite technical but there\u2019s a good reason for that: by design, you wouldn\u2019t have noticed it! Stop by for Part 2 of this discussion on the Content Downloader, its capabilities and the tech that makes it possible.<\/p>\n<p>&nbsp;<\/p>\n<p><em>About the author:<\/em> Manolis is currently obsessing over the architecture and development of the team\u2019s mobile applications. He has been talking to computers for the better part of his life and has (ab)used all kinds of technologies, ranging from 68K asm to JS.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>TalentLMS for Android has been out for a while now and its user base is growing steadily. Following the example of the popular TalentLMS web-based platform, it offers a rich-content learning experience, optimized for Android devices. Version 2 of the app was released on Google Play a few of weeks ago, adding new features and [&hellip;]<\/p>\n","protected":false},"author":34,"featured_media":6712,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[252],"tags":[237,244],"class_list":["post-6685","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-interviews-opinions","tag-talentlms-android-app","tag-team"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.9 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>TalentLMS mobile app for Android: The Content Downloader Design<\/title>\n<meta name=\"description\" content=\"How does the Content Downloader feature help you access your courses\u2019 content both online and offline on your TalentLMS mobile app for Android seamlessly?\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.talentlms.com\/blog\/talentlms-mobile-app-design\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"TalentLMS for Android: The Content Downloader - Part 1, Design\" \/>\n<meta property=\"og:description\" content=\"How does the Content Downloader feature help you access your courses\u2019 content both online and offline on your TalentLMS mobile app for Android seamlessly?\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.talentlms.com\/blog\/talentlms-mobile-app-design\/\" \/>\n<meta property=\"og:site_name\" content=\"TalentLMS Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/talentlms\" \/>\n<meta property=\"article:published_time\" content=\"2017-02-06T16:34:51+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-05-09T12:23:07+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.talentlms.com\/blog\/wp-content\/uploads\/2017\/02\/mobile-app-design-talentlms.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Manolis Katsifarakis\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@talentlms\" \/>\n<meta name=\"twitter:site\" content=\"@talentlms\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Manolis Katsifarakis\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.talentlms.com\/blog\/talentlms-mobile-app-design\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.talentlms.com\/blog\/talentlms-mobile-app-design\/\"},\"author\":{\"name\":\"Manolis Katsifarakis\",\"@id\":\"https:\/\/www.talentlms.com\/blog\/#\/schema\/person\/d414b9e0e7f92e6528df6b61790e85e3\"},\"headline\":\"TalentLMS for Android: The Content Downloader &#8211; Part 1, Design\",\"datePublished\":\"2017-02-06T16:34:51+00:00\",\"dateModified\":\"2022-05-09T12:23:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.talentlms.com\/blog\/talentlms-mobile-app-design\/\"},\"wordCount\":1741,\"commentCount\":0,\"image\":{\"@id\":\"https:\/\/www.talentlms.com\/blog\/talentlms-mobile-app-design\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.talentlms.com\/blog\/wp-content\/uploads\/2017\/02\/mobile-app-design-talentlms.jpg\",\"keywords\":[\"TalentLMS Android App\",\"Team\"],\"articleSection\":[\"Interviews \/ Opinions\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.talentlms.com\/blog\/talentlms-mobile-app-design\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.talentlms.com\/blog\/talentlms-mobile-app-design\/\",\"url\":\"https:\/\/www.talentlms.com\/blog\/talentlms-mobile-app-design\/\",\"name\":\"TalentLMS mobile app for Android: The Content Downloader Design\",\"isPartOf\":{\"@id\":\"https:\/\/www.talentlms.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.talentlms.com\/blog\/talentlms-mobile-app-design\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.talentlms.com\/blog\/talentlms-mobile-app-design\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.talentlms.com\/blog\/wp-content\/uploads\/2017\/02\/mobile-app-design-talentlms.jpg\",\"datePublished\":\"2017-02-06T16:34:51+00:00\",\"dateModified\":\"2022-05-09T12:23:07+00:00\",\"author\":{\"@id\":\"https:\/\/www.talentlms.com\/blog\/#\/schema\/person\/d414b9e0e7f92e6528df6b61790e85e3\"},\"description\":\"How does the Content Downloader feature help you access your courses\u2019 content both online and offline on your TalentLMS mobile app for Android seamlessly?\",\"breadcrumb\":{\"@id\":\"https:\/\/www.talentlms.com\/blog\/talentlms-mobile-app-design\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.talentlms.com\/blog\/talentlms-mobile-app-design\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.talentlms.com\/blog\/talentlms-mobile-app-design\/#primaryimage\",\"url\":\"https:\/\/www.talentlms.com\/blog\/wp-content\/uploads\/2017\/02\/mobile-app-design-talentlms.jpg\",\"contentUrl\":\"https:\/\/www.talentlms.com\/blog\/wp-content\/uploads\/2017\/02\/mobile-app-design-talentlms.jpg\",\"width\":1200,\"height\":628,\"caption\":\"TalentLMS for Android: The Content Downloader - Part 1, Design - TalentLMS Blog\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.talentlms.com\/blog\/talentlms-mobile-app-design\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.talentlms.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"TalentLMS for Android: The Content Downloader &#8211; Part 1, Design\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.talentlms.com\/blog\/#website\",\"url\":\"https:\/\/www.talentlms.com\/blog\/\",\"name\":\"TalentLMS Blog\",\"description\":\"Top eLearning blog by TalentLMS with articles about Instructional Design and Development, Online Courses, Gamification, Tin Can API, SCORM, mLearning\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.talentlms.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.talentlms.com\/blog\/#\/schema\/person\/d414b9e0e7f92e6528df6b61790e85e3\",\"name\":\"Manolis Katsifarakis\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.talentlms.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/5fb87a65e7ba02bb2a234958f73e01ca6308fe9aacecff20a54db98c4cc04674?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/5fb87a65e7ba02bb2a234958f73e01ca6308fe9aacecff20a54db98c4cc04674?s=96&d=mm&r=g\",\"caption\":\"Manolis Katsifarakis\"},\"url\":\"https:\/\/www.talentlms.com\/blog\/author\/manolis-katsifarakis\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"TalentLMS mobile app for Android: The Content Downloader Design","description":"How does the Content Downloader feature help you access your courses\u2019 content both online and offline on your TalentLMS mobile app for Android seamlessly?","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.talentlms.com\/blog\/talentlms-mobile-app-design\/","og_locale":"en_US","og_type":"article","og_title":"TalentLMS for Android: The Content Downloader - Part 1, Design","og_description":"How does the Content Downloader feature help you access your courses\u2019 content both online and offline on your TalentLMS mobile app for Android seamlessly?","og_url":"https:\/\/www.talentlms.com\/blog\/talentlms-mobile-app-design\/","og_site_name":"TalentLMS Blog","article_publisher":"https:\/\/www.facebook.com\/talentlms","article_published_time":"2017-02-06T16:34:51+00:00","article_modified_time":"2022-05-09T12:23:07+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/www.talentlms.com\/blog\/wp-content\/uploads\/2017\/02\/mobile-app-design-talentlms.jpg","type":"image\/jpeg"}],"author":"Manolis Katsifarakis","twitter_card":"summary_large_image","twitter_creator":"@talentlms","twitter_site":"@talentlms","twitter_misc":{"Written by":"Manolis Katsifarakis","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.talentlms.com\/blog\/talentlms-mobile-app-design\/#article","isPartOf":{"@id":"https:\/\/www.talentlms.com\/blog\/talentlms-mobile-app-design\/"},"author":{"name":"Manolis Katsifarakis","@id":"https:\/\/www.talentlms.com\/blog\/#\/schema\/person\/d414b9e0e7f92e6528df6b61790e85e3"},"headline":"TalentLMS for Android: The Content Downloader &#8211; Part 1, Design","datePublished":"2017-02-06T16:34:51+00:00","dateModified":"2022-05-09T12:23:07+00:00","mainEntityOfPage":{"@id":"https:\/\/www.talentlms.com\/blog\/talentlms-mobile-app-design\/"},"wordCount":1741,"commentCount":0,"image":{"@id":"https:\/\/www.talentlms.com\/blog\/talentlms-mobile-app-design\/#primaryimage"},"thumbnailUrl":"https:\/\/www.talentlms.com\/blog\/wp-content\/uploads\/2017\/02\/mobile-app-design-talentlms.jpg","keywords":["TalentLMS Android App","Team"],"articleSection":["Interviews \/ Opinions"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.talentlms.com\/blog\/talentlms-mobile-app-design\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.talentlms.com\/blog\/talentlms-mobile-app-design\/","url":"https:\/\/www.talentlms.com\/blog\/talentlms-mobile-app-design\/","name":"TalentLMS mobile app for Android: The Content Downloader Design","isPartOf":{"@id":"https:\/\/www.talentlms.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.talentlms.com\/blog\/talentlms-mobile-app-design\/#primaryimage"},"image":{"@id":"https:\/\/www.talentlms.com\/blog\/talentlms-mobile-app-design\/#primaryimage"},"thumbnailUrl":"https:\/\/www.talentlms.com\/blog\/wp-content\/uploads\/2017\/02\/mobile-app-design-talentlms.jpg","datePublished":"2017-02-06T16:34:51+00:00","dateModified":"2022-05-09T12:23:07+00:00","author":{"@id":"https:\/\/www.talentlms.com\/blog\/#\/schema\/person\/d414b9e0e7f92e6528df6b61790e85e3"},"description":"How does the Content Downloader feature help you access your courses\u2019 content both online and offline on your TalentLMS mobile app for Android seamlessly?","breadcrumb":{"@id":"https:\/\/www.talentlms.com\/blog\/talentlms-mobile-app-design\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.talentlms.com\/blog\/talentlms-mobile-app-design\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.talentlms.com\/blog\/talentlms-mobile-app-design\/#primaryimage","url":"https:\/\/www.talentlms.com\/blog\/wp-content\/uploads\/2017\/02\/mobile-app-design-talentlms.jpg","contentUrl":"https:\/\/www.talentlms.com\/blog\/wp-content\/uploads\/2017\/02\/mobile-app-design-talentlms.jpg","width":1200,"height":628,"caption":"TalentLMS for Android: The Content Downloader - Part 1, Design - TalentLMS Blog"},{"@type":"BreadcrumbList","@id":"https:\/\/www.talentlms.com\/blog\/talentlms-mobile-app-design\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.talentlms.com\/blog\/"},{"@type":"ListItem","position":2,"name":"TalentLMS for Android: The Content Downloader &#8211; Part 1, Design"}]},{"@type":"WebSite","@id":"https:\/\/www.talentlms.com\/blog\/#website","url":"https:\/\/www.talentlms.com\/blog\/","name":"TalentLMS Blog","description":"Top eLearning blog by TalentLMS with articles about Instructional Design and Development, Online Courses, Gamification, Tin Can API, SCORM, mLearning","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.talentlms.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.talentlms.com\/blog\/#\/schema\/person\/d414b9e0e7f92e6528df6b61790e85e3","name":"Manolis Katsifarakis","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.talentlms.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/5fb87a65e7ba02bb2a234958f73e01ca6308fe9aacecff20a54db98c4cc04674?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5fb87a65e7ba02bb2a234958f73e01ca6308fe9aacecff20a54db98c4cc04674?s=96&d=mm&r=g","caption":"Manolis Katsifarakis"},"url":"https:\/\/www.talentlms.com\/blog\/author\/manolis-katsifarakis\/"}]}},"jetpack_featured_media_url":"https:\/\/www.talentlms.com\/blog\/wp-content\/uploads\/2017\/02\/mobile-app-design-talentlms.jpg","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.talentlms.com\/blog\/wp-json\/wp\/v2\/posts\/6685","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.talentlms.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.talentlms.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.talentlms.com\/blog\/wp-json\/wp\/v2\/users\/34"}],"replies":[{"embeddable":true,"href":"https:\/\/www.talentlms.com\/blog\/wp-json\/wp\/v2\/comments?post=6685"}],"version-history":[{"count":22,"href":"https:\/\/www.talentlms.com\/blog\/wp-json\/wp\/v2\/posts\/6685\/revisions"}],"predecessor-version":[{"id":17903,"href":"https:\/\/www.talentlms.com\/blog\/wp-json\/wp\/v2\/posts\/6685\/revisions\/17903"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.talentlms.com\/blog\/wp-json\/wp\/v2\/media\/6712"}],"wp:attachment":[{"href":"https:\/\/www.talentlms.com\/blog\/wp-json\/wp\/v2\/media?parent=6685"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.talentlms.com\/blog\/wp-json\/wp\/v2\/categories?post=6685"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.talentlms.com\/blog\/wp-json\/wp\/v2\/tags?post=6685"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}