{"id":6902,"date":"2017-02-22T18:07:18","date_gmt":"2017-02-22T16:07:18","guid":{"rendered":"https:\/\/www.talentlms.com\/blog\/?p=6902"},"modified":"2017-03-15T11:05:16","modified_gmt":"2017-03-15T09:05:16","slug":"talentlms-android-content-downloader-integration","status":"publish","type":"post","link":"https:\/\/www.talentlms.com\/blog\/talentlms-android-content-downloader-integration\/","title":{"rendered":"TalentLMS For Android: The Content Downloader &#8211; Part 2, Integration"},"content":{"rendered":"<p>Once the difficult task of developing and testing the Content Downloader was completed, integrating it into the existing app was straightforward. Almost all content-related tasks can be performed using a handful of public methods inside a single ContentDownloader class. Those methods are called by the main app, depending on the actions the user performs while using the app. Almost all actions the user can perform have an effect on the downloader\u2019s behavior.<\/p>\n<p><!--more--><\/p>\n<h2>Content presentation<\/h2>\n<p>In order to understand how the user\u2019s behavior affects downloading, a quick overview of the app\u2019s presentation is required. TalentLMS for<a href=\"https:\/\/play.google.com\/store\/apps\/details?id=com.talentlms.android&amp;hl=en\" target=\"_blank\"> <strong>Android<\/strong><\/a> presents content hierarchically, starting with the Course List Screen which is presented to the user right after they sign in.<\/p>\n<p>When a Course in this list is tapped, the Course Details Screen is presented. This screen contains all information about the Course, as well as a list of its Units. When the user taps on a Unit, they are presented with the Unit Screen, which contains the actual content.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-6904 aligncenter\" src=\"https:\/\/www.talentlms.com\/blog\/wp-content\/uploads\/2017\/02\/course-list-screen.gif\" alt=\"TalentLMS for Android: The Content Downloader Integration \u2013 TalentLMS Blog\" width=\"207\" height=\"320\" \/><\/p>\n<p style=\"text-align: center;\"><em>Courses list screen -&gt; Course details screen -&gt; Unit screen<\/em><\/p>\n<p>As the user navigates between screens and provided that the device is online, Unit content, and Unit and Course metadata have to be continuously fetched and updated from both <a href=\"https:\/\/www.talentlms.com\/\" target=\"_blank\"><strong>TalentLMS<\/strong><\/a> and third-party servers.<\/p>\n<p>Metadata are transferred from various endpoints of the TalentLMS <a href=\"https:\/\/www.talentlms.com\/blog\/talentlms-api-automation-made-easy\/\" target=\"_blank\"><strong>REST API<\/strong><\/a> as JSON messages which are relatively small in size, but the actual multimedia content of Units can be anything from a few kilobytes to multiple gigabytes of data.<\/p>\n<h2>Downloading strategy<\/h2>\n<p>While most metadata for the Course List and Course Details screens are downloaded automatically, <strong>Unit content downloading is only triggered by user actions<\/strong> <strong>that indicate interest towards a certain Course or Unit<\/strong>. That way, the network, CPU and storage subsystems are not utilized unnecessarily for content that the user might not need.<\/p>\n<p>Before a Unit download actually starts, it is added to the downloads queue. The downloader sorts this queue by priority and checks it whenever new Units are added, or the status of previously-queued Units changes (status changes can occur due to failures, download completion or stopping etc.). Whenever a new download slot becomes available, the Unit with the highest priority begins downloading.<\/p>\n<h2>Queueing<\/h2>\n<p>Units are queued for downloading via two different user actions:<\/p>\n<h3>1) User taps on the SYNC ALL button in the Course Details screen<\/h3>\n<p><strong>This action adds all not-yet-downloaded Course Units to the top of the queue.<\/strong> Their relative order is determined by their types and their order of appearance in the Course list. Units with large <a href=\"https:\/\/www.talentlms.com\/blog\/how-use-multimedia-elearning\/\" target=\"_blank\"><strong>multimedia<\/strong><\/a> content are downloaded after Units with small content and Units higher up in the Course list are downloaded before Units further down the list.<\/p>\n<p>This type of prioritization improves the UX greatly in many situations because it increases the perceived speed of the app. Unless the Course is comprised mostly of Units with large content, all smaller Units will finish downloading soon, giving the impression that a lot of progress has been made quickly.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-6905 aligncenter\" src=\"https:\/\/www.talentlms.com\/blog\/wp-content\/uploads\/2017\/02\/Download-course-units-via-sync-all-units.gif\" alt=\"TalentLMS for Android: The Content Downloader Integration \u2013 TalentLMS Blog\" width=\"206\" height=\"320\" \/><\/p>\n<p style=\"text-align: center;\"><i>Downloading of all course units via SYNC ALL UNITS button<\/i><\/p>\n<p>While download prioritization is important, it won\u2019t matter at all unless the downloads queued are actually started soon. <strong>To ensure that downloading starts and finishes as soon as possible<\/strong>, previous Units that are currently being downloaded and do not belong to the newly queued list of units are paused. The result is that content which the user has most recently requested and is most likely to view next will become available as soon as possible.<\/p>\n<h3>2) User taps on a Unit<\/h3>\n<p>When the user is attempting to view a single Unit, it is imperative that they do not have to wait any longer than necessary. If the Unit\u2019s content has not been downloaded, that is ensured by pausing all Units currently downloading before enqueuing the Unit, giving it full priority.<\/p>\n<p>When that happens, the downloader is limited to one concurrent download, so that all available bandwidth is allocated for the current content only. Once the download has finished, the number of concurrent downloads is restored to their maximum values and all downloads are resumed.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-6906 aligncenter\" src=\"https:\/\/www.talentlms.com\/blog\/wp-content\/uploads\/2017\/02\/Download-single-unit.gif\" alt=\"TalentLMS for Android: The Content Downloader Integration \u2013 TalentLMS Blog\" width=\"208\" height=\"320\" \/><\/p>\n<p style=\"text-align: center;\"><em>Downloading a single unit by tapping on it from the list<\/em><\/p>\n<p>&nbsp;<\/p>\n<p>Units that only support streaming content such as <a href=\"https:\/\/www.youtube.com\/channel\/UCRKZko6gzZm1ps5mzc4Mi_w\" target=\"_blank\"><strong>YouTube<\/strong><\/a> and Vimeo videos, also have the effect of pausing all downloads to free up bandwidth and provide smooth playback.<\/p>\n<p>Every time the user navigates to the previous or next Unit via the Unit screen arrow buttons, the above rules are enforced again.<\/p>\n<h2>Priority changes<\/h2>\n<p>Although Unit priorities are set when they are first added to the downloads queue, they do not remain unaffected. Whenever the user expresses interest in different content by navigating closer to it, priorities are updated to make sure that content will become available as soon as possible.<\/p>\n<p>Specifically, when a user navigates to a Course that has Units queued but not yet downloaded, these <strong>Units get the highest possible priority<\/strong> in the same way as if the user had just pressed the SYNC ALL button. Additionally, all actively downloaded Units not belonging to the Course are paused. Finally, when the user navigates to a Unit that is queued or is still downloading, all other currently downloading Units are paused.<\/p>\n<h2>Handling network state<\/h2>\n<p>Network state changes also affect the Content Downloader behavior. Three different states are handled:<\/p>\n<h3>No Internet access<\/h3>\n<p>The <a href=\"https:\/\/www.talentlms.com\/blog\/talentlms-mobile-app-design\/\" target=\"_blank\"><strong>Content Downloader<\/strong><\/a> is paused so as to avoid retrying queued downloads and conserve battery. The user is served offline content and is notified when that is not available.<\/p>\n<h3>Mobile data<\/h3>\n<p>There are two possible ways to handle this state in TalentLMS for Android. <strong>The default state is to avoid downloading any large content<\/strong> when that is not absolutely necessary. That means that when the user taps on the SYNC ALL button of a course, only the course metadata and small content is downloaded. Larger content files such as video or audio are only downloaded when the user attempts to view those specific units.<\/p>\n<p>The above behavior can be changed by the &#8220;Wi-Fi Download Only&#8221; option in the Settings Screen. When this option is disabled, the behavior of Wi-Fi and mobile data connections are the same.<\/p>\n<h2>Wi-Fi<\/h2>\n<p>The downloader attempts to download all queued content following the rules described in the previous sections.<\/p>\n<p>You can read more about the architecture of the TalentLMS for Android Content Downloader in part 3 of this series of articles on the behind-the-scenes power that makes our mobile app faster and more efficient that ever.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Once the difficult task of developing and testing the Content Downloader was completed, integrating it into the existing app was straightforward. Almost all content-related tasks can be performed using a handful of public methods inside a single ContentDownloader class. Those methods are called by the main app, depending on the actions the user performs while [&hellip;]<\/p>\n","protected":false},"author":34,"featured_media":6911,"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-6902","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 for Android: The Content Downloader Integration<\/title>\n<meta name=\"description\" content=\"How does the Content Downloader handle priorities and speed in TalentLMS for Android? Read the 2nd post on the TalentLMS Android apps\u2019 Content Downloader.\" \/>\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-android-content-downloader-integration\/\" \/>\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 2, Integration\" \/>\n<meta property=\"og:description\" content=\"How does the Content Downloader handle priorities and speed in TalentLMS for Android? Read the 2nd post on the TalentLMS Android apps\u2019 Content Downloader.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.talentlms.com\/blog\/talentlms-android-content-downloader-integration\/\" \/>\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-22T16:07:18+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2017-03-15T09:05:16+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.talentlms.com\/blog\/wp-content\/uploads\/2017\/02\/talentlms-android-content-downloader-integration-blog.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=\"5 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-android-content-downloader-integration\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.talentlms.com\/blog\/talentlms-android-content-downloader-integration\/\"},\"author\":{\"name\":\"Manolis Katsifarakis\",\"@id\":\"https:\/\/www.talentlms.com\/blog\/#\/schema\/person\/d414b9e0e7f92e6528df6b61790e85e3\"},\"headline\":\"TalentLMS For Android: The Content Downloader &#8211; Part 2, Integration\",\"datePublished\":\"2017-02-22T16:07:18+00:00\",\"dateModified\":\"2017-03-15T09:05:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.talentlms.com\/blog\/talentlms-android-content-downloader-integration\/\"},\"wordCount\":1086,\"commentCount\":0,\"image\":{\"@id\":\"https:\/\/www.talentlms.com\/blog\/talentlms-android-content-downloader-integration\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.talentlms.com\/blog\/wp-content\/uploads\/2017\/02\/talentlms-android-content-downloader-integration-blog.jpg\",\"keywords\":[\"TalentLMS Android App\",\"Team\"],\"articleSection\":[\"Interviews \/ Opinions\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.talentlms.com\/blog\/talentlms-android-content-downloader-integration\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.talentlms.com\/blog\/talentlms-android-content-downloader-integration\/\",\"url\":\"https:\/\/www.talentlms.com\/blog\/talentlms-android-content-downloader-integration\/\",\"name\":\"TalentLMS for Android: The Content Downloader Integration\",\"isPartOf\":{\"@id\":\"https:\/\/www.talentlms.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.talentlms.com\/blog\/talentlms-android-content-downloader-integration\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.talentlms.com\/blog\/talentlms-android-content-downloader-integration\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.talentlms.com\/blog\/wp-content\/uploads\/2017\/02\/talentlms-android-content-downloader-integration-blog.jpg\",\"datePublished\":\"2017-02-22T16:07:18+00:00\",\"dateModified\":\"2017-03-15T09:05:16+00:00\",\"author\":{\"@id\":\"https:\/\/www.talentlms.com\/blog\/#\/schema\/person\/d414b9e0e7f92e6528df6b61790e85e3\"},\"description\":\"How does the Content Downloader handle priorities and speed in TalentLMS for Android? Read the 2nd post on the TalentLMS Android apps\u2019 Content Downloader.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.talentlms.com\/blog\/talentlms-android-content-downloader-integration\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.talentlms.com\/blog\/talentlms-android-content-downloader-integration\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.talentlms.com\/blog\/talentlms-android-content-downloader-integration\/#primaryimage\",\"url\":\"https:\/\/www.talentlms.com\/blog\/wp-content\/uploads\/2017\/02\/talentlms-android-content-downloader-integration-blog.jpg\",\"contentUrl\":\"https:\/\/www.talentlms.com\/blog\/wp-content\/uploads\/2017\/02\/talentlms-android-content-downloader-integration-blog.jpg\",\"width\":1200,\"height\":628,\"caption\":\"TalentLMS for Android: The Content Downloader Integration \u2013 TalentLMS Blog\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.talentlms.com\/blog\/talentlms-android-content-downloader-integration\/#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 2, Integration\"}]},{\"@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 for Android: The Content Downloader Integration","description":"How does the Content Downloader handle priorities and speed in TalentLMS for Android? Read the 2nd post on the TalentLMS Android apps\u2019 Content Downloader.","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-android-content-downloader-integration\/","og_locale":"en_US","og_type":"article","og_title":"TalentLMS For Android: The Content Downloader - Part 2, Integration","og_description":"How does the Content Downloader handle priorities and speed in TalentLMS for Android? Read the 2nd post on the TalentLMS Android apps\u2019 Content Downloader.","og_url":"https:\/\/www.talentlms.com\/blog\/talentlms-android-content-downloader-integration\/","og_site_name":"TalentLMS Blog","article_publisher":"https:\/\/www.facebook.com\/talentlms","article_published_time":"2017-02-22T16:07:18+00:00","article_modified_time":"2017-03-15T09:05:16+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/www.talentlms.com\/blog\/wp-content\/uploads\/2017\/02\/talentlms-android-content-downloader-integration-blog.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":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.talentlms.com\/blog\/talentlms-android-content-downloader-integration\/#article","isPartOf":{"@id":"https:\/\/www.talentlms.com\/blog\/talentlms-android-content-downloader-integration\/"},"author":{"name":"Manolis Katsifarakis","@id":"https:\/\/www.talentlms.com\/blog\/#\/schema\/person\/d414b9e0e7f92e6528df6b61790e85e3"},"headline":"TalentLMS For Android: The Content Downloader &#8211; Part 2, Integration","datePublished":"2017-02-22T16:07:18+00:00","dateModified":"2017-03-15T09:05:16+00:00","mainEntityOfPage":{"@id":"https:\/\/www.talentlms.com\/blog\/talentlms-android-content-downloader-integration\/"},"wordCount":1086,"commentCount":0,"image":{"@id":"https:\/\/www.talentlms.com\/blog\/talentlms-android-content-downloader-integration\/#primaryimage"},"thumbnailUrl":"https:\/\/www.talentlms.com\/blog\/wp-content\/uploads\/2017\/02\/talentlms-android-content-downloader-integration-blog.jpg","keywords":["TalentLMS Android App","Team"],"articleSection":["Interviews \/ Opinions"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.talentlms.com\/blog\/talentlms-android-content-downloader-integration\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.talentlms.com\/blog\/talentlms-android-content-downloader-integration\/","url":"https:\/\/www.talentlms.com\/blog\/talentlms-android-content-downloader-integration\/","name":"TalentLMS for Android: The Content Downloader Integration","isPartOf":{"@id":"https:\/\/www.talentlms.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.talentlms.com\/blog\/talentlms-android-content-downloader-integration\/#primaryimage"},"image":{"@id":"https:\/\/www.talentlms.com\/blog\/talentlms-android-content-downloader-integration\/#primaryimage"},"thumbnailUrl":"https:\/\/www.talentlms.com\/blog\/wp-content\/uploads\/2017\/02\/talentlms-android-content-downloader-integration-blog.jpg","datePublished":"2017-02-22T16:07:18+00:00","dateModified":"2017-03-15T09:05:16+00:00","author":{"@id":"https:\/\/www.talentlms.com\/blog\/#\/schema\/person\/d414b9e0e7f92e6528df6b61790e85e3"},"description":"How does the Content Downloader handle priorities and speed in TalentLMS for Android? Read the 2nd post on the TalentLMS Android apps\u2019 Content Downloader.","breadcrumb":{"@id":"https:\/\/www.talentlms.com\/blog\/talentlms-android-content-downloader-integration\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.talentlms.com\/blog\/talentlms-android-content-downloader-integration\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.talentlms.com\/blog\/talentlms-android-content-downloader-integration\/#primaryimage","url":"https:\/\/www.talentlms.com\/blog\/wp-content\/uploads\/2017\/02\/talentlms-android-content-downloader-integration-blog.jpg","contentUrl":"https:\/\/www.talentlms.com\/blog\/wp-content\/uploads\/2017\/02\/talentlms-android-content-downloader-integration-blog.jpg","width":1200,"height":628,"caption":"TalentLMS for Android: The Content Downloader Integration \u2013 TalentLMS Blog"},{"@type":"BreadcrumbList","@id":"https:\/\/www.talentlms.com\/blog\/talentlms-android-content-downloader-integration\/#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 2, Integration"}]},{"@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\/talentlms-android-content-downloader-integration-blog.jpg","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.talentlms.com\/blog\/wp-json\/wp\/v2\/posts\/6902","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=6902"}],"version-history":[{"count":8,"href":"https:\/\/www.talentlms.com\/blog\/wp-json\/wp\/v2\/posts\/6902\/revisions"}],"predecessor-version":[{"id":6915,"href":"https:\/\/www.talentlms.com\/blog\/wp-json\/wp\/v2\/posts\/6902\/revisions\/6915"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.talentlms.com\/blog\/wp-json\/wp\/v2\/media\/6911"}],"wp:attachment":[{"href":"https:\/\/www.talentlms.com\/blog\/wp-json\/wp\/v2\/media?parent=6902"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.talentlms.com\/blog\/wp-json\/wp\/v2\/categories?post=6902"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.talentlms.com\/blog\/wp-json\/wp\/v2\/tags?post=6902"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}